import SwiftUI struct BookmarkMenuButtonView: View { @EnvironmentObject var settings: SettingsManager let tags: [String] let provider: BooruProvider 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 isBookmarked = settings.bookmarks.contains { bookmark in Set(bookmark.tags) == Set(tags) } Menu { Button(action: { if isBookmarked { settings.removeBookmark(withTags: tags) } else { settings.addBookmark(provider: provider, tags: tags) } }) { if isBookmarked { Label("Remove Bookmark", systemImage: "bookmark.fill") } else { Label("Bookmark Tag\(tags.count == 1 ? "" : "s")", systemImage: "bookmark") } } Menu { ForEach(settings.folders.filter { $0.topLevelName == nil }, id: \.id) { folder in Button(action: { let newBookmark = SettingsBookmark(provider: provider, tags: tags, folder: folder.id) settings.bookmarks.append(newBookmark) }) { Label(folder.name, systemImage: "folder") } .disabled(isBookmarkedInFolder(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 { ForEach(topLevelFolders[topLevelName] ?? [], id: \.id) { folder in Button(action: { let newBookmark = SettingsBookmark( provider: provider, tags: tags, folder: folder.id ) settings.bookmarks.append(newBookmark) }) { Text(folder.shortName) } .disabled(isBookmarkedInFolder(folderId: folder.id)) } } label: { Text(topLevelName) } } Button(action: { isNewCollectionAlertPresented = true }) { Label("New Collection", systemImage: "plus") } .disabled(disableNewCollection) } label: { Label("Bookmark to Collection", systemImage: "folder.badge.plus") } } label: { if isBookmarked { Label("Bookmarked", systemImage: "bookmark.fill") } else { Label("Bookmark", systemImage: "bookmark") } } .collectionAlerts( isNewCollectionAlertPresented: $isNewCollectionAlertPresented, newCollectionName: $newCollectionName, isCollectionErrorAlertPresented: $isCollectionErrorAlertPresented ) { newCollectionName in let newFolder = SettingsFolder(name: newCollectionName) settings.folders.append(newFolder) let newBookmark = SettingsBookmark(provider: provider, tags: tags, folder: newFolder.id) settings.bookmarks.append(newBookmark) } } private func isBookmarkedInFolder(folderId: UUID) -> Bool { settings.bookmarks.contains { bookmark in bookmark.folder == folderId && Set(bookmark.tags) == Set(tags) && bookmark.provider == provider } } }