diff options
| author | Fuwn <[email protected]> | 2025-07-05 05:59:04 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-07-05 05:59:04 -0700 |
| commit | 6381fe585268bda17d0859937568290205575e2c (patch) | |
| tree | 2db111ba87535288d75e785b92e5277b5632c09f | |
| parent | feat: Development commit (diff) | |
| download | sora-testing-6381fe585268bda17d0859937568290205575e2c.tar.xz sora-testing-6381fe585268bda17d0859937568290205575e2c.zip | |
feat: Development commit
| -rw-r--r-- | Localizable.xcstrings | 21 | ||||
| -rw-r--r-- | Sora/Data/Settings/SettingsFolder.swift | 2 | ||||
| -rw-r--r-- | Sora/Data/Settings/SettingsManager.swift | 6 | ||||
| -rw-r--r-- | Sora/Views/Settings/Collections/SettingsCollectionsListView.swift | 16 | ||||
| -rw-r--r-- | Sora/Views/Settings/Collections/SettingsCollectionsView.swift | 61 | ||||
| -rw-r--r-- | Sora/Views/Settings/SettingsView.swift | 6 |
6 files changed, 111 insertions, 1 deletions
diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 5d77f1f..98923c1 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -10,6 +10,9 @@ "%lld" : { }, + "Actions" : { + + }, "Add" : { }, @@ -31,6 +34,9 @@ "API Key" : { }, + "Are you sure you want to delete this collection?" : { + + }, "Are you sure you want to remove all bookmarks? This action cannot be undone." : { }, @@ -81,6 +87,9 @@ "Collection name cannot be empty." : { }, + "Collections" : { + + }, "Content Filtering" : { "localizations" : { "ja" : { @@ -110,6 +119,9 @@ "Debug" : { }, + "Delete" : { + + }, "Details" : { "localizations" : { "ja" : { @@ -181,6 +193,9 @@ "Loading Preview…" : { }, + "Manage Collections" : { + + }, "Manually Load Next Page" : { }, @@ -307,6 +322,12 @@ "Remove from Collection" : { }, + "Rename" : { + + }, + "Rename Collection" : { + + }, "Reset to Defaults" : { "localizations" : { "ja" : { diff --git a/Sora/Data/Settings/SettingsFolder.swift b/Sora/Data/Settings/SettingsFolder.swift index ce19561..84543c1 100644 --- a/Sora/Data/Settings/SettingsFolder.swift +++ b/Sora/Data/Settings/SettingsFolder.swift @@ -2,7 +2,7 @@ import Foundation struct SettingsFolder: Codable, Identifiable, Hashable { let id: UUID - let name: String + var name: String let createdAt: Date init(name: String, id: UUID = UUID()) { diff --git a/Sora/Data/Settings/SettingsManager.swift b/Sora/Data/Settings/SettingsManager.swift index d24929b..b63c7b3 100644 --- a/Sora/Data/Settings/SettingsManager.swift +++ b/Sora/Data/Settings/SettingsManager.swift @@ -615,6 +615,12 @@ class SettingsManager: ObservableObject { // swiftlint:disable:this type_body_l folders.first { $0.id == id }?.name } + func renameFolder(_ folder: SettingsFolder, to newName: String) { + guard let index = folders.firstIndex(where: { $0.id == folder.id }) else { return } + + folders[index].name = newName + } + // MARK: Search History Management func removeSearchHistoryEntry(at offsets: IndexSet) { searchHistory.remove(atOffsets: offsets) diff --git a/Sora/Views/Settings/Collections/SettingsCollectionsListView.swift b/Sora/Views/Settings/Collections/SettingsCollectionsListView.swift new file mode 100644 index 0000000..c474b79 --- /dev/null +++ b/Sora/Views/Settings/Collections/SettingsCollectionsListView.swift @@ -0,0 +1,16 @@ +import SwiftUI + +struct SettingsCollectionsListView: View { + @EnvironmentObject private var settings: SettingsManager + + var body: some View { + List { + ForEach(settings.folders) { folder in + NavigationLink(destination: SettingsCollectionsView(folder: folder)) { + Text(folder.name) + } + } + } + .navigationTitle("Collections") + } +} diff --git a/Sora/Views/Settings/Collections/SettingsCollectionsView.swift b/Sora/Views/Settings/Collections/SettingsCollectionsView.swift new file mode 100644 index 0000000..a7ce5a7 --- /dev/null +++ b/Sora/Views/Settings/Collections/SettingsCollectionsView.swift @@ -0,0 +1,61 @@ +import SwiftUI + +struct SettingsCollectionsView: View { + @EnvironmentObject private var settings: SettingsManager + + @State private var isDeleteConfirmationPresented = false + @State private var isRenameAlertPresented = false + @State private var newCollectionName = "" + let folder: SettingsFolder + + var body: some View { + Form { + Section(header: Text("Actions")) { + Button(action: { + newCollectionName = folder.name + isRenameAlertPresented = true + }) { + Label("Rename", systemImage: "pencil") + } + + Button( + role: .destructive, + action: { + isDeleteConfirmationPresented = true + } + ) { + Label("Delete", systemImage: "trash") + } + } + } + .navigationTitle(folder.name) + .alert( + "Rename Collection", + isPresented: $isRenameAlertPresented + ) { + TextField("Collection Name", text: $newCollectionName) + + Button("Cancel", role: .cancel) { + newCollectionName = "" + isRenameAlertPresented = false + } + + Button("Rename") { + settings.renameFolder(folder, to: newCollectionName) + + newCollectionName = "" + isRenameAlertPresented = false + } + } + .alert( + "Are you sure you want to delete this collection?", + isPresented: $isDeleteConfirmationPresented + ) { + Button("Delete", role: .destructive) { + settings.folders.removeAll { $0.id == folder.id } + } + + Button("Cancel", role: .cancel) { () } + } + } +} diff --git a/Sora/Views/Settings/SettingsView.swift b/Sora/Views/Settings/SettingsView.swift index 1cd5255..3315301 100644 --- a/Sora/Views/Settings/SettingsView.swift +++ b/Sora/Views/Settings/SettingsView.swift @@ -20,6 +20,12 @@ struct SettingsView: View { SettingsSearchView() } + Section(header: Text("Collections")) { + NavigationLink(destination: SettingsCollectionsListView()) { + Text("Manage Collections") + } + } + Section(header: Text("Settings")) { SettingsSettingsView() } |