From 0917354dc0b79d1ac414392ae036f784eb397113 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Wed, 18 Feb 2026 12:29:25 -0800 Subject: refactor: share folder menu hierarchy across views --- Sora/Views/FavoriteMenuButtonView.swift | 66 +++++++-------------------------- 1 file changed, 14 insertions(+), 52 deletions(-) (limited to 'Sora/Views/FavoriteMenuButtonView.swift') 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 -- cgit v1.2.3