diff options
| author | Fuwn <[email protected]> | 2025-02-18 23:39:51 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-02-19 00:00:29 -0800 |
| commit | 320ce31337ed60cae24a0374fa2d6d79237a6bfe (patch) | |
| tree | ad1e93799efeb8e7a16521e3ab958c911f73f617 /Sora/Views/Post/PostGridView.swift | |
| parent | feat: Initial commit (diff) | |
| download | sora-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.swift | 77 |
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 + } + } +} |