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() .padding() } 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 } } }