summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Sora/Views/Post/Grid/PostGridView.swift59
1 files changed, 59 insertions, 0 deletions
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<BooruTag, BooruSearchQuery>] {