summaryrefslogtreecommitdiff
path: root/Sora/Views/FavoritePostThumbnailView.swift
diff options
context:
space:
mode:
Diffstat (limited to 'Sora/Views/FavoritePostThumbnailView.swift')
-rw-r--r--Sora/Views/FavoritePostThumbnailView.swift91
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())
+}