summaryrefslogtreecommitdiff
path: root/Sora/Views/FavoriteMenuButtonView.swift
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-09-05 19:48:59 -0700
committerFuwn <[email protected]>2025-09-05 19:48:59 -0700
commitd5b81fcbc1a8c009204b2482d490e8d8b96c6c26 (patch)
tree3cf3593d4aa9facf028d4fe40d952f848f5b2b3f /Sora/Views/FavoriteMenuButtonView.swift
parentfeat: Development commit (diff)
downloadsora-testing-d5b81fcbc1a8c009204b2482d490e8d8b96c6c26.tar.xz
sora-testing-d5b81fcbc1a8c009204b2482d490e8d8b96c6c26.zip
feat: Development commit
Diffstat (limited to 'Sora/Views/FavoriteMenuButtonView.swift')
-rw-r--r--Sora/Views/FavoriteMenuButtonView.swift112
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
+ }
+ }
+}