diff options
| author | Fuwn <[email protected]> | 2025-10-05 05:25:36 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-10-05 05:25:36 -0700 |
| commit | 890e65f187624d6604f5102acf4dc3d1931b848f (patch) | |
| tree | 21b9345a8dcfa301787f3eac166ced81186efef3 | |
| parent | feat: Development commit (diff) | |
| download | sora-testing-890e65f187624d6604f5102acf4dc3d1931b848f.tar.xz sora-testing-890e65f187624d6604f5102acf4dc3d1931b848f.zip | |
feat: Development commit
| -rw-r--r-- | Sora/Data/CollectionPickerOption.swift | 7 | ||||
| -rw-r--r-- | Sora/Views/BookmarkMenuButtonView.swift | 22 | ||||
| -rw-r--r-- | Sora/Views/FavoriteMenuButtonView.swift | 22 | ||||
| -rw-r--r-- | Sora/Views/FavoritesView.swift | 55 | ||||
| -rw-r--r-- | Sora/Views/Generic/GenericListView.swift | 67 |
5 files changed, 172 insertions, 1 deletions
diff --git a/Sora/Data/CollectionPickerOption.swift b/Sora/Data/CollectionPickerOption.swift index a0bd9f9..3b7641f 100644 --- a/Sora/Data/CollectionPickerOption.swift +++ b/Sora/Data/CollectionPickerOption.swift @@ -4,6 +4,7 @@ enum CollectionPickerOption: Identifiable, Hashable { case all case folder(UUID) case topLevelFolder(String) + case topLevelUncategorized(String) case uncategorized var id: String { @@ -17,6 +18,9 @@ enum CollectionPickerOption: Identifiable, Hashable { case .topLevelFolder(let name): return "topLevel_\(name)" + case .topLevelUncategorized(let name): + return "topLevelUncategorized_\(name)" + case .uncategorized: return "uncategorized" } @@ -34,6 +38,9 @@ enum CollectionPickerOption: Identifiable, Hashable { case .topLevelFolder(let name): return name + case .topLevelUncategorized(let name): + return "Uncategorized" + case .uncategorized: return "Uncategorized" } diff --git a/Sora/Views/BookmarkMenuButtonView.swift b/Sora/Views/BookmarkMenuButtonView.swift index 339854f..0d61b9d 100644 --- a/Sora/Views/BookmarkMenuButtonView.swift +++ b/Sora/Views/BookmarkMenuButtonView.swift @@ -34,6 +34,28 @@ struct BookmarkMenuButtonView: View { ForEach(topLevelFolders.keys.sorted(), id: \.self) { topLevelName in Menu { + let topLevelFolder = settings.folders.first(where: { $0.name == topLevelName }) + + if let topLevelFolder { + Button(action: { + settings.addBookmark(provider: provider, tags: tags, folder: topLevelFolder.id) + }) { + Text("Uncategorized") + } + .disabled(isBookmarkedInFolder(folderId: topLevelFolder.id)) + } else { + Button(action: { + let newFolder = SettingsFolder(name: topLevelName) + + settings.folders.append(newFolder) + settings.addBookmark(provider: provider, tags: tags, folder: newFolder.id) + }) { + Text("Uncategorized") + } + } + + Divider() + ForEach(topLevelFolders[topLevelName] ?? [], id: \.id) { folder in Button(action: { settings.addBookmark(provider: provider, tags: tags, folder: folder.id) diff --git a/Sora/Views/FavoriteMenuButtonView.swift b/Sora/Views/FavoriteMenuButtonView.swift index aeb360b..ce442e2 100644 --- a/Sora/Views/FavoriteMenuButtonView.swift +++ b/Sora/Views/FavoriteMenuButtonView.swift @@ -32,6 +32,28 @@ struct FavoriteMenuButtonView: View { ForEach(topLevelFolders.keys.sorted(), id: \.self) { topLevelName in Menu { + let topLevelFolder = settings.folders.first(where: { $0.name == topLevelName }) + + if let topLevelFolder { + Button(action: { + settings.addFavorite(post: post, provider: manager.provider, folder: topLevelFolder.id) + }) { + Text("Uncategorized") + } + .disabled(isFavoritedInFolder(folderId: topLevelFolder.id)) + } else { + Button(action: { + let newFolder = SettingsFolder(name: topLevelName) + + settings.folders.append(newFolder) + settings.addFavorite(post: post, provider: manager.provider, folder: newFolder.id) + }) { + Text("Uncategorized") + } + } + + Divider() + ForEach(topLevelFolders[topLevelName] ?? [], id: \.id) { folder in Button(action: { settings.addFavorite(post: post, provider: manager.provider, folder: folder.id) diff --git a/Sora/Views/FavoritesView.swift b/Sora/Views/FavoritesView.swift index f74a84e..30fb2e0 100644 --- a/Sora/Views/FavoritesView.swift +++ b/Sora/Views/FavoritesView.swift @@ -44,6 +44,15 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length } return favoriteFolder.topLevelName == topLevelName + + case .topLevelUncategorized(let topLevelName): + guard let favoriteFolderId = favorite.folder, + let favoriteFolder = settings.folders.first(where: { $0.id == favoriteFolderId }) + else { + return false + } + + return favoriteFolder.name == topLevelName } }() let matchesSearch = @@ -128,6 +137,22 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length ForEach(topLevelFolders.keys.sorted(), id: \.self) { topLevelName in Menu { + Button(action: { + selectedCollectionOption = .topLevelFolder(topLevelName) + }) { + Text("All \(topLevelName)") + } + + if settings.folders.contains(where: { $0.name == topLevelName }) { + Button(action: { + selectedCollectionOption = .topLevelUncategorized(topLevelName) + }) { + Text("Uncategorized") + } + } + + Divider() + ForEach(topLevelFolders[topLevelName] ?? [], id: \.id) { folder in Button(action: { selectedCollectionOption = .folder(folder.id) @@ -252,6 +277,14 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length Label("All \(topLevelName)", systemImage: "folder.fill") } + if settings.folders.contains(where: { $0.name == topLevelName }) { + Button(action: { + selectedCollectionOption = .topLevelUncategorized(topLevelName) + }) { + Label("Uncategorized", systemImage: "folder.badge.questionmark") + } + } + Divider() ForEach(topLevelFolders[topLevelName] ?? [], id: \.id) { folder in @@ -525,6 +558,28 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length ForEach(topLevelFolders.keys.sorted(), id: \.self) { topLevelName in Menu { + let topLevelFolder = settings.folders.first(where: { $0.name == topLevelName }) + + if let topLevelFolder { + Button(action: { + settings.updateFavoriteFolder(withID: favorite.id, folder: topLevelFolder.id) + }) { + Text("Uncategorized") + } + .disabled(favorite.folder == topLevelFolder.id) + } else { + Button(action: { + let newFolder = SettingsFolder(name: topLevelName) + + settings.folders.append(newFolder) + settings.updateFavoriteFolder(withID: favorite.id, folder: newFolder.id) + }) { + Text("Uncategorized") + } + } + + Divider() + ForEach(topLevelFolders[topLevelName] ?? [], id: \.id) { folder in Button(action: { settings.updateFavoriteFolder(withID: favorite.id, folder: folder.id) diff --git a/Sora/Views/Generic/GenericListView.swift b/Sora/Views/Generic/GenericListView.swift index 8465570..79d4142 100644 --- a/Sora/Views/Generic/GenericListView.swift +++ b/Sora/Views/Generic/GenericListView.swift @@ -52,6 +52,15 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View { } return itemFolder.topLevelName == topLevelName + + case .topLevelUncategorized(let topLevelName): + guard let itemFolderId = item.folder, + let itemFolder = settings.folders.first(where: { $0.id == itemFolderId }) + else { + return false + } + + return itemFolder.name == topLevelName } }() let matchesSearch = @@ -164,7 +173,33 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View { } ForEach(topLevelFolders.keys.sorted(), id: \.self) { topLevelName in - Text(topLevelName).tag(CollectionPickerOption.topLevelFolder(topLevelName)) + Menu { + Button(action: { + selectedCollectionOption = .topLevelFolder(topLevelName) + }) { + Text("All \(topLevelName)") + } + + if settings.folders.contains(where: { $0.name == topLevelName }) { + Button(action: { + selectedCollectionOption = .topLevelUncategorized(topLevelName) + }) { + Text("Uncategorized") + } + } + + Divider() + + ForEach(topLevelFolders[topLevelName] ?? [], id: \.id) { folder in + Button(action: { + selectedCollectionOption = .folder(folder.id) + }) { + Text(folder.shortName) + } + } + } label: { + Text(topLevelName) + } } } .padding(.bottom) @@ -274,6 +309,14 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View { Label("All \(topLevelName)", systemImage: "folder.fill") } + if settings.folders.contains(where: { $0.name == topLevelName }) { + Button(action: { + selectedCollectionOption = .topLevelUncategorized(topLevelName) + }) { + Label("Uncategorized", systemImage: "folder.badge.questionmark") + } + } + Divider() ForEach(topLevelFolders[topLevelName] ?? [], id: \.id) { folder in @@ -427,6 +470,28 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View { ForEach(topLevelFolders.keys.sorted(), id: \.self) { topLevelName in Menu { + let topLevelFolder = settings.folders.first(where: { $0.name == topLevelName }) + + if let topLevelFolder { + Button(action: { + settings.updateBookmarkFolder(withID: item.id, folder: topLevelFolder.id) + }) { + Text("Uncategorized") + } + .disabled(item.folder == topLevelFolder.id) + } else { + Button(action: { + let newFolder = SettingsFolder(name: topLevelName) + + settings.folders.append(newFolder) + settings.updateBookmarkFolder(withID: item.id, folder: newFolder.id) + }) { + Text("Uncategorized") + } + } + + Divider() + ForEach(topLevelFolders[topLevelName] ?? [], id: \.id) { folder in Button(action: { settings.updateBookmarkFolder(withID: item.id, folder: folder.id) |