summaryrefslogtreecommitdiff
path: root/Sora/Views/FavoriteMenuButtonView.swift
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-02-18 12:29:25 -0800
committerFuwn <[email protected]>2026-02-18 12:29:29 -0800
commit0917354dc0b79d1ac414392ae036f784eb397113 (patch)
treeede2a5b3935eed05607f6a493d8a34ce74d9834d /Sora/Views/FavoriteMenuButtonView.swift
parentperf: eliminate repeated favorites sort map and grid recompute (diff)
downloadsora-testing-0917354dc0b79d1ac414392ae036f784eb397113.tar.xz
sora-testing-0917354dc0b79d1ac414392ae036f784eb397113.zip
refactor: share folder menu hierarchy across views
Diffstat (limited to 'Sora/Views/FavoriteMenuButtonView.swift')
-rw-r--r--Sora/Views/FavoriteMenuButtonView.swift66
1 files changed, 14 insertions, 52 deletions
diff --git a/Sora/Views/FavoriteMenuButtonView.swift b/Sora/Views/FavoriteMenuButtonView.swift
index 5cfecbd..a29b2b0 100644
--- a/Sora/Views/FavoriteMenuButtonView.swift
+++ b/Sora/Views/FavoriteMenuButtonView.swift
@@ -12,62 +12,24 @@ struct FavoriteMenuButtonView: View {
var body: some View {
let isFavorited = settings.isFavorite(postId: post.id, provider: manager.provider)
+ let folderHierarchy = FolderHierarchy(folders: settings.folders)
Menu {
- ForEach(settings.folders.filter { $0.topLevelName == nil }, id: \.id) { folder in
- Button(action: {
- settings.addFavorite(post: post, provider: manager.provider, folder: folder.id)
- }) {
- Label(folder.name, systemImage: "folder")
- }
- .disabled(isFavoritedInFolder(folderId: folder.id))
- }
-
- let topLevelFolders = settings.folders
- .reduce(into: [String: [SettingsFolder]]()) { result, folder in
- guard let topLevelName = folder.topLevelName else { return }
-
- result[topLevelName, default: []].append(folder)
- }
+ FolderMenuView(
+ folderHierarchy: folderHierarchy,
+ onSelectFolder: { folderIdentifier in
+ settings.addFavorite(post: post, provider: manager.provider, folder: folderIdentifier)
+ },
+ onCreateTopLevelUncategorized: { topLevelName in
+ let newFolder = SettingsFolder(name: topLevelName)
- ForEach(topLevelFolders.keys.sorted(), id: \.self) { topLevelName in
- Menu {
- let topLevelFolder = settings.folders.first { $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)
- }) {
- Text(folder.shortName)
- }
- .disabled(isFavoritedInFolder(folderId: folder.id))
- }
- } label: {
- Text(topLevelName)
+ settings.folders.append(newFolder)
+ settings.addFavorite(post: post, provider: manager.provider, folder: newFolder.id)
+ },
+ isFolderDisabled: { folderIdentifier in
+ isFavoritedInFolder(folderId: folderIdentifier)
}
- }
+ )
Button(action: {
isNewCollectionAlertPresented = true