diff options
| author | Fuwn <[email protected]> | 2025-09-05 19:48:59 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-09-05 19:48:59 -0700 |
| commit | d5b81fcbc1a8c009204b2482d490e8d8b96c6c26 (patch) | |
| tree | 3cf3593d4aa9facf028d4fe40d952f848f5b2b3f /Sora/Views/FavoriteMenuButtonView.swift | |
| parent | feat: Development commit (diff) | |
| download | sora-testing-d5b81fcbc1a8c009204b2482d490e8d8b96c6c26.tar.xz sora-testing-d5b81fcbc1a8c009204b2482d490e8d8b96c6c26.zip | |
feat: Development commit
Diffstat (limited to 'Sora/Views/FavoriteMenuButtonView.swift')
| -rw-r--r-- | Sora/Views/FavoriteMenuButtonView.swift | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/Sora/Views/FavoriteMenuButtonView.swift b/Sora/Views/FavoriteMenuButtonView.swift new file mode 100644 index 0000000..6fee55a --- /dev/null +++ b/Sora/Views/FavoriteMenuButtonView.swift @@ -0,0 +1,112 @@ +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 { + Button(action: { + if isFavorited { + settings.removeFavorite(withPostId: post.id, provider: manager.provider) + } else { + settings.addFavorite(post: post, provider: manager.provider) + } + }) { + if isFavorited { + Label("Remove from Favorites", systemImage: "heart.fill") + } else { + Label("Add to Favorites", systemImage: "heart") + } + } + + Menu { + ForEach(settings.folders.filter { $0.topLevelName == nil }, id: \.id) { folder in + Button(action: { + let newFavorite = SettingsFavoritePost( + post: post, provider: manager.provider, folder: folder.id + ) + + settings.favorites.append(newFavorite) + }) { + 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 { + ForEach(topLevelFolders[topLevelName] ?? [], id: \.id) { folder in + Button(action: { + let newFavorite = SettingsFavoritePost( + post: post, + provider: manager.provider, + folder: folder.id + ) + + settings.favorites.append(newFavorite) + }) { + Text(folder.shortName) + } + .disabled(isFavoritedInFolder(folderId: folder.id)) + } + } label: { + Text(topLevelName) + } + } + + Button(action: { + isNewCollectionAlertPresented = true + }) { + Label("New Collection", systemImage: "plus") + } + .disabled(disableNewCollection) + } label: { + Label("Favorite to Collection", systemImage: "folder.badge.plus") + } + } label: { + if isFavorited { + Label("Favorited", systemImage: "heart.fill") + } else { + Label("Favorite", systemImage: "heart") + } + } + .collectionAlerts( + isNewCollectionAlertPresented: $isNewCollectionAlertPresented, + newCollectionName: $newCollectionName, + isCollectionErrorAlertPresented: $isCollectionErrorAlertPresented + ) { newCollectionName in + let newFolder = SettingsFolder(name: newCollectionName) + + settings.folders.append(newFolder) + + let newFavorite = SettingsFavoritePost( + post: post, provider: manager.provider, folder: newFolder.id + ) + + settings.favorites.append(newFavorite) + } + } + + private func isFavoritedInFolder(folderId: UUID) -> Bool { + settings.favorites.contains { favorite in + favorite.folder == folderId && favorite.postId == post.id + && favorite.provider == manager.provider + } + } +} |