import NetworkImage import SwiftUI struct PostGridThumbnailView: View { @EnvironmentObject var settings: SettingsManager @EnvironmentObject var manager: BooruManager let post: BooruPost let posts: [BooruPost] let isNestedView: Bool let endOfData: Bool let onLoadNextPage: () async -> Void let selectedPost: BooruPost? private var thumbnailURL: URL? { switch settings.thumbnailQuality { case .preview: post.previewURL case .sample: post.sampleURL case .original: post.fileURL } } @ViewBuilder private func primaryImageContent(image: Image) -> some View { let isFiltered = settings.blurRatings.contains(post.rating) && selectedPost?.id != post.id image .resizable() .aspectRatio(contentMode: .fit) .blur(radius: isFiltered ? 8 : 0) .clipped() .animation(.default, value: isFiltered) .clipShape(RoundedRectangle(cornerRadius: 8)) } @ViewBuilder private func imageContent(image: Image) -> some View { if settings.uniformThumbnailGrid { GeometryReader { proxy in primaryImageContent(image: image) .frame(width: proxy.size.width, height: proxy.size.width) } .clipped() .aspectRatio(1, contentMode: .fit) } else { primaryImageContent(image: image) } } var body: some View { VStack { NetworkImage( url: thumbnailURL, transaction: Transaction(animation: .default) ) { image in if #available(iOS 18.0, macOS 15.0, *) { imageContent(image: image) .onScrollVisibilityChange { visible in if posts.count > 4, post == posts[posts.count - (posts.count / 4)], !endOfData, visible { Task(priority: .utility) { await onLoadNextPage() } } } } else { imageContent(image: image) } } placeholder: { PostGridThumbnailPlaceholderView() } } } }