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
|
import SwiftUI
import WaterfallGrid
struct PostGridView: View {
@EnvironmentObject var settings: Settings
@ObservedObject var manager: MoebooruManager
var body: some View {
ScrollViewReader { _ in
ScrollView {
if manager.posts.isEmpty {
ProgressView()
.frame(
width: settings.softLimitAsCGFloat(),
height: settings.softLimitAsCGFloat()
)
}
WaterfallGrid(manager.posts, id: \.id) { post in
Group {
#if os(macOS)
Button {
manager.selectedPost = post
} label: {
PostView(post: post, manager: manager)
}
.buttonStyle(PlainButtonStyle())
#else
NavigationLink(value: post) {
PostView(post: post, manager: manager)
}
#endif
}
}
.gridStyle(columns: settings.columns, spacing: 0)
}
.searchable(text: $manager.searchText, prompt: "Tags")
.searchSuggestions {
if settings.searchSuggestions {
SearchSuggestionsView(
tags: manager.allTags,
searchText: $manager.searchText
)
}
}
.onSubmit(of: .search, manager.performSearch)
.task {
if manager.posts.isEmpty {
await manager.fetchPosts(page: manager.currentPage)
}
}
.navigationDestination(for: MoebooruPost.self) { post in
PostDetailsView(post: post)
}
#if os(macOS)
.toolbar {
ToolbarItem {
Button(action: {
Task {
await manager.fetchPosts(page: 1, tags: manager.tags, replace: true)
}
}) {
Label("Refresh", systemImage: "arrow.clockwise")
}
}
}
#endif
.navigationTitle("Posts")
.refreshable {
await manager.fetchPosts(page: 1, tags: manager.tags, replace: true)
}
#if os(iOS)
.navigationBarTitleDisplayMode(.inline)
#endif
}
}
}
|