1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
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 {
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(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 {
let topLevelFolder = settings.folders.first { $0.name == topLevelName }
if let topLevelFolder {
Button(action: {
settings.addFavorite(
post: post, provider: manager.provider, folder: topLevelFolder.id
)
}) {
Text("Uncategorized")
}
.disabled(isFavoritedInFolder(folderId: topLevelFolder.id))
} else {
Button(action: {
let newFolder = SettingsFolder(name: topLevelName)
settings.folders.append(newFolder)
settings.addFavorite(post: post, provider: manager.provider, folder: newFolder.id)
}) {
Text("Uncategorized")
}
}
Divider()
ForEach(topLevelFolders[topLevelName] ?? [], id: \.id) { folder in
Button(action: {
settings.addFavorite(post: post, provider: manager.provider, folder: folder.id)
}) {
Text(folder.shortName)
}
.disabled(isFavoritedInFolder(folderId: folder.id))
}
} label: {
Text(topLevelName)
}
}
Button(action: {
isNewCollectionAlertPresented = true
}) {
Label("New Collection", systemImage: "plus")
}
.disabled(disableNewCollection)
} label: {
if isFavorited {
Label("Favorited", systemImage: "heart.fill")
} else {
Label("Favorite", systemImage: "heart")
}
// if isFavorited {
// Label("Remove from Favorites", systemImage: "heart.fill")
// } else {
// Label("Add to Favorites", systemImage: "heart")
// }
} primaryAction: {
if isFavorited {
settings.removeFavorite(withPostId: post.id, provider: manager.provider)
} else {
settings.addFavorite(post: post, provider: manager.provider)
}
}
.collectionAlerts(
isNewCollectionAlertPresented: $isNewCollectionAlertPresented,
newCollectionName: $newCollectionName,
isCollectionErrorAlertPresented: $isCollectionErrorAlertPresented
) { newCollectionName in
let newFolder = SettingsFolder(name: newCollectionName)
settings.folders.append(newFolder)
settings.addFavorite(post: post, provider: manager.provider, folder: newFolder.id)
}
}
private func isFavoritedInFolder(folderId: UUID) -> Bool {
settings.favorites.contains { favorite in
favorite.folder == folderId && favorite.postId == post.id
&& favorite.provider == manager.provider
}
}
}
|