summaryrefslogtreecommitdiff
path: root/Sora/Views/Post/PostGridView.swift
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-02-18 23:39:51 -0800
committerFuwn <[email protected]>2025-02-19 00:00:29 -0800
commit320ce31337ed60cae24a0374fa2d6d79237a6bfe (patch)
treead1e93799efeb8e7a16521e3ab958c911f73f617 /Sora/Views/Post/PostGridView.swift
parentfeat: Initial commit (diff)
downloadsora-testing-320ce31337ed60cae24a0374fa2d6d79237a6bfe.tar.xz
sora-testing-320ce31337ed60cae24a0374fa2d6d79237a6bfe.zip
feat: Development commit
Diffstat (limited to 'Sora/Views/Post/PostGridView.swift')
-rw-r--r--Sora/Views/Post/PostGridView.swift77
1 files changed, 77 insertions, 0 deletions
diff --git a/Sora/Views/Post/PostGridView.swift b/Sora/Views/Post/PostGridView.swift
new file mode 100644
index 0000000..4c43eeb
--- /dev/null
+++ b/Sora/Views/Post/PostGridView.swift
@@ -0,0 +1,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
+ }
+ }
+}