import SwiftUI import WaterfallGrid struct PostGridView: View { @EnvironmentObject var settings: Settings @ObservedObject var manager: MoebooruManager var filteredPosts: [MoebooruPost] { settings.showNSFWPosts ? manager.posts : manager.posts.filter { $0.rating == "s" } } var body: some View { ScrollViewReader { _ in ScrollView { if filteredPosts.isEmpty { ProgressView() .padding() } WaterfallGrid(filteredPosts, id: \.id) { post in Group { #if os(macOS) Button { manager.selectedPost = post } label: { PostView( post: post, manager: manager, posts: filteredPosts ) } .buttonStyle(PlainButtonStyle()) #else NavigationLink(value: post) { PostView( post: post, manager: manager, posts: filteredPosts ) } #endif } } .gridStyle(columns: settings.columns) } .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 } } }