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 { ForEach(settings.folders.filter { $0.topLevelName == nil }, id: \.id) { folder in Button(action: { settings.addBookmark(provider: provider, tags: tags) if let bookmarkId = settings.bookmarks.first(where: { bookmark in bookmark.provider == provider && Set(bookmark.tags) == Set(tags.map { $0.lowercased() }) })?.id { settings.updateBookmarkFolder(withID: bookmarkId, folder: folder.id) } }) { 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: { settings.addBookmark(provider: provider, tags: tags) if let bookmarkId = settings.bookmarks.first(where: { bookmark in bookmark.provider == provider && Set(bookmark.tags) == Set(tags.map { $0.lowercased() }) })?.id { settings.updateBookmarkFolder(withID: bookmarkId, folder: folder.id) } }) { Text(folder.shortName) } .disabled(isBookmarkedInFolder(folderId: folder.id)) } } label: { Text(topLevelName) } } Button(action: { isNewCollectionAlertPresented = true }) { Label("New Collection", systemImage: "plus") } .disabled(disableNewCollection) } label: { if isBookmarked { Label("Bookmarked", systemImage: "bookmark.fill") } else { Label("Bookmark", systemImage: "bookmark") } // if isBookmarked { // Label("Remove Bookmark", systemImage: "bookmark.fill") // } else { // Label("Bookmark Tag\(tags.count == 1 ? "" : "s")", systemImage: "bookmark") // } } primaryAction: { if isBookmarked { settings.removeBookmark(withTags: tags) } else { settings.addBookmark(provider: provider, tags: tags) } } .collectionAlerts( isNewCollectionAlertPresented: $isNewCollectionAlertPresented, newCollectionName: $newCollectionName, isCollectionErrorAlertPresented: $isCollectionErrorAlertPresented ) { newCollectionName in let newFolder = SettingsFolder(name: newCollectionName) settings.folders.append(newFolder) settings.addBookmark(provider: provider, tags: tags) if let bookmarkId = settings.bookmarks.first(where: { bookmark in bookmark.provider == provider && Set(bookmark.tags) == Set(tags.map { $0.lowercased() }) })?.id { settings.updateBookmarkFolder(withID: bookmarkId, folder: newFolder.id) } } } private func isBookmarkedInFolder(folderId: UUID) -> Bool { settings.bookmarks.contains { bookmark in bookmark.folder == folderId && Set(bookmark.tags) == Set(tags) && bookmark.provider == provider } } }