diff options
Diffstat (limited to 'Sora/Views/FavoritePostThumbnailView.swift')
| -rw-r--r-- | Sora/Views/FavoritePostThumbnailView.swift | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/Sora/Views/FavoritePostThumbnailView.swift b/Sora/Views/FavoritePostThumbnailView.swift new file mode 100644 index 0000000..661f34a --- /dev/null +++ b/Sora/Views/FavoritePostThumbnailView.swift @@ -0,0 +1,91 @@ +import NetworkImage +import SwiftUI + +struct FavoritePostThumbnailView: View { + @EnvironmentObject var settings: SettingsManager + let favorite: SettingsFavoritePost + let onRemove: () -> Void + + private var thumbnailURL: URL? { + switch settings.thumbnailQuality { + case .preview: + favorite.previewUrl.flatMap(URL.init) + + case .sample: + favorite.previewUrl.flatMap(URL.init) + + case .original: + favorite.fileUrl.flatMap(URL.init) + } + } + + @ViewBuilder + private func primaryImageContent(image: Image) -> some View { + let isFiltered = settings.blurRatings.contains(favorite.rating) + + 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 { + NetworkImage( + url: thumbnailURL, + transaction: Transaction(animation: .default) + ) { image in + imageContent(image: image) + } placeholder: { + PostGridThumbnailPlaceholderView() + } + } +} + +#Preview { + let sampleFavorite = SettingsFavoritePost( + post: BooruPost( + id: "123", + height: 100, + score: "10", + fileURL: URL(string: "https://example.com/file.jpg")!, + parentID: "0", + sampleURL: URL(string: "https://example.com/sample.jpg")!, + sampleWidth: 100, + sampleHeight: 100, + previewURL: URL(string: "https://example.com/preview.jpg")!, + rating: .safe, + tags: ["sample", "test"], + width: 100, + change: nil, + md5: "abc123", + creatorID: "1", + authorID: nil, + createdAt: Date(), + status: "active", + source: "", + previewWidth: 100, + previewHeight: 100 + ), + provider: .yandere + ) + + FavoritePostThumbnailView(favorite: sampleFavorite) { () } + .environmentObject(SettingsManager()) +} |