summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-10-05 05:25:36 -0700
committerFuwn <[email protected]>2025-10-05 05:25:36 -0700
commit890e65f187624d6604f5102acf4dc3d1931b848f (patch)
tree21b9345a8dcfa301787f3eac166ced81186efef3
parentfeat: Development commit (diff)
downloadsora-testing-890e65f187624d6604f5102acf4dc3d1931b848f.tar.xz
sora-testing-890e65f187624d6604f5102acf4dc3d1931b848f.zip
feat: Development commit
-rw-r--r--Sora/Data/CollectionPickerOption.swift7
-rw-r--r--Sora/Views/BookmarkMenuButtonView.swift22
-rw-r--r--Sora/Views/FavoriteMenuButtonView.swift22
-rw-r--r--Sora/Views/FavoritesView.swift55
-rw-r--r--Sora/Views/Generic/GenericListView.swift67
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)