import SwiftUI struct FavoriteMenuButtonView: View { @EnvironmentObject var settings: SettingsManager @EnvironmentObject var manager: BooruManager let post: BooruPost var disableNewCollection = false @State private var isNewCollectionAlertPresented = false @State private var newCollectionName = "" @State private var itemPendingCollectionAssignment: UUID? @State private var isCollectionErrorAlertPresented = false var body: some View { let isFavorited = settings.isFavorite(postId: post.id, provider: manager.provider) 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) } 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) } } Button(action: { isNewCollectionAlertPresented = true }) { Label("New Collection", systemImage: "plus") } .disabled(disableNewCollection) } label: { if isFavorited { Label("Favorited", systemImage: "heart.fill") } else { Label("Favorite", systemImage: "heart") } // if isFavorited { // Label("Remove from Favorites", systemImage: "heart.fill") // } else { // Label("Add to Favorites", systemImage: "heart") // } } primaryAction: { if isFavorited { settings.removeFavorite(withPostId: post.id, provider: manager.provider) } else { settings.addFavorite(post: post, provider: manager.provider) } } .collectionAlerts( isNewCollectionAlertPresented: $isNewCollectionAlertPresented, newCollectionName: $newCollectionName, isCollectionErrorAlertPresented: $isCollectionErrorAlertPresented ) { newCollectionName in let newFolder = SettingsFolder(name: newCollectionName) settings.folders.append(newFolder) settings.addFavorite(post: post, provider: manager.provider, folder: newFolder.id) } } private func isFavoritedInFolder(folderId: UUID) -> Bool { settings.favorites.contains { favorite in favorite.folder == folderId && favorite.postId == post.id && favorite.provider == manager.provider } } }