From 0ba1af420f9b7e05b3500aa64d25a5e63f3f612f Mon Sep 17 00:00:00 2001 From: Fuwn Date: Thu, 18 Sep 2025 04:18:46 -0700 Subject: feat: Development commit --- Sora/Views/Post/Grid/PostGridView.swift | 59 +++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/Sora/Views/Post/Grid/PostGridView.swift b/Sora/Views/Post/Grid/PostGridView.swift index 25b21d6..9070396 100644 --- a/Sora/Views/Post/Grid/PostGridView.swift +++ b/Sora/Views/Post/Grid/PostGridView.swift @@ -494,6 +494,65 @@ struct PostGridView: View { // swiftlint:disable:this type_body_length ) } .buttonStyle(PlainButtonStyle()) + .contextMenu { + let isFavorited = settings.isFavorite(postId: post.id, provider: manager.provider) + + 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: { + settings.addFavorite(post: post, provider: manager.provider, folder: folder.id) + }) { + Label(folder.name, systemImage: "folder") + } + .disabled(isFavoritedInFolder(post: post, 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.addFavorite(post: post, provider: manager.provider, folder: folder.id) + }) { + Text(folder.shortName) + } + .disabled(isFavoritedInFolder(post: post, folderId: folder.id)) + } + } label: { + Text(topLevelName) + } + } + } label: { + Label("Add to Collection", systemImage: "folder.badge.plus") + } + } + } + + private func isFavoritedInFolder(post: BooruPost, folderId: UUID) -> Bool { + settings.favorites.contains { favorite in + favorite.folder == folderId && favorite.postId == post.id + && favorite.provider == manager.provider + } } private func searchSuggestionsItems() -> [Either] { -- cgit v1.2.3