import SwiftUI import WaterfallGrid struct PostGridView: View { @EnvironmentObject var settings: Settings @ObservedObject var manager: BooruManager @Environment(\.isSearching) private var isSearching var filteredPosts: [BooruPost] { (settings.showNSFWPosts ? manager.posts : manager.posts.filter { $0.rating == "s" || $0.rating == "q" }) .sorted(by: { $0.id > $1.id }) } 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) .navigationDestination(for: BooruPost.self) { post in PostDetailsView(post: post) } .onChange(of: manager.searchText) { _, _ in if manager.searchText.isEmpty && !isSearching { Task { manager.performSearch() } } } .toolbar { #if os(macOS) ToolbarItem { Button(action: { Task { await manager.fetchPosts(page: 1, tags: manager.tags, replace: true) } }) { Label("Refresh", systemImage: "arrow.clockwise") } } #endif if !manager.tags.isEmpty { #if os(macOS) ToolbarItem { PostGridBookmarkButtonView() } #else ToolbarItem(placement: .bottomBar) { PostGridBookmarkButtonView() } #endif } } .navigationTitle("Posts") .refreshable { await manager.fetchPosts(page: 1, tags: manager.tags, replace: true) } } } }