From 6381fe585268bda17d0859937568290205575e2c Mon Sep 17 00:00:00 2001 From: Fuwn Date: Sat, 5 Jul 2025 05:59:04 -0700 Subject: feat: Development commit --- Localizable.xcstrings | 21 ++++++++ Sora/Data/Settings/SettingsFolder.swift | 2 +- Sora/Data/Settings/SettingsManager.swift | 6 +++ .../Collections/SettingsCollectionsListView.swift | 16 ++++++ .../Collections/SettingsCollectionsView.swift | 61 ++++++++++++++++++++++ Sora/Views/Settings/SettingsView.swift | 6 +++ 6 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 Sora/Views/Settings/Collections/SettingsCollectionsListView.swift create mode 100644 Sora/Views/Settings/Collections/SettingsCollectionsView.swift diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 5d77f1f..98923c1 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -9,6 +9,9 @@ }, "%lld" : { + }, + "Actions" : { + }, "Add" : { @@ -30,6 +33,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." : { @@ -80,6 +86,9 @@ }, "Collection name cannot be empty." : { + }, + "Collections" : { + }, "Content Filtering" : { "localizations" : { @@ -109,6 +118,9 @@ }, "Debug" : { + }, + "Delete" : { + }, "Details" : { "localizations" : { @@ -180,6 +192,9 @@ }, "Loading Preview…" : { + }, + "Manage Collections" : { + }, "Manually Load Next Page" : { @@ -306,6 +321,12 @@ }, "Remove from Collection" : { + }, + "Rename" : { + + }, + "Rename Collection" : { + }, "Reset to Defaults" : { "localizations" : { 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() } -- cgit v1.2.3