summaryrefslogtreecommitdiff
path: root/Sora/Views/Post
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-02-17 19:59:40 -0800
committerFuwn <[email protected]>2025-02-17 19:59:40 -0800
commit4b03f632491b2f988f1acf07a257cc23ef4f395b (patch)
treeb9f5093fdfbdf93d19266463a608d892776803b5 /Sora/Views/Post
downloadsora-testing-4b03f632491b2f988f1acf07a257cc23ef4f395b.tar.xz
sora-testing-4b03f632491b2f988f1acf07a257cc23ef4f395b.zip
feat: Initial commit
Diffstat (limited to 'Sora/Views/Post')
-rw-r--r--Sora/Views/Post/PostDetailView.swift75
-rw-r--r--Sora/Views/Post/PostLoadingStage.swift5
-rw-r--r--Sora/Views/Post/PostThumbnailMode.swift5
-rw-r--r--Sora/Views/Post/PostView.swift30
4 files changed, 115 insertions, 0 deletions
diff --git a/Sora/Views/Post/PostDetailView.swift b/Sora/Views/Post/PostDetailView.swift
new file mode 100644
index 0000000..799339c
--- /dev/null
+++ b/Sora/Views/Post/PostDetailView.swift
@@ -0,0 +1,75 @@
+import SwiftUI
+
+struct PostDetailView: View {
+ let post: MoebooruPost
+ @State var loadingStage: PostLoadingState = .loadingPreview
+
+ var body: some View {
+ VStack {
+ Link(destination: URL(string: "https://yande.re/post/show/\(post.id)")!) {
+ AsyncImage(url: post.sampleURL) { image in
+ image
+ .resizable()
+ .scaledToFit()
+ .onAppear {
+ self.loadingStage = .loaded
+ }
+ } placeholder: {
+ AsyncImage(url: post.previewURL) { image in
+ image
+ .resizable()
+ .scaledToFit()
+ .onAppear {
+ self.loadingStage = .loadingFile
+ }
+ } placeholder: {
+ ProgressView()
+ .progressViewStyle(LinearProgressViewStyle())
+ .padding()
+ .onAppear {
+ self.loadingStage = .loadingPreview
+ }
+ }
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
+ .id(post.fileURL)
+ }
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
+ .id(post.fileURL)
+ }
+ .buttonStyle(PlainButtonStyle())
+
+ Spacer()
+
+ VStack(spacing: 5) {
+ HStack {
+ Text(post.tags.joined(separator: ", "))
+ }
+ .frame(maxWidth: .infinity, alignment: .leading)
+
+ HStack {
+ Text(post.createdAt.formatted())
+ .frame(maxWidth: .infinity, alignment: .leading)
+
+ Group {
+ switch loadingStage {
+ case .loadingPreview:
+ Text("Loading preview …")
+ case .loadingFile:
+ Text("Loading file …")
+ case .loaded:
+ EmptyView()
+ }
+ }
+ .padding(.trailing, 5)
+ }
+ .frame(maxWidth: .infinity, alignment: .leading)
+ .foregroundStyle(.secondary)
+ }
+ .padding(.horizontal, 10)
+ .padding(.vertical, 10 / 1.33)
+ .textSelection(.enabled)
+ .font(.footnote)
+ .background(.opacity(0.1))
+ }
+ }
+}
diff --git a/Sora/Views/Post/PostLoadingStage.swift b/Sora/Views/Post/PostLoadingStage.swift
new file mode 100644
index 0000000..4a8c7f3
--- /dev/null
+++ b/Sora/Views/Post/PostLoadingStage.swift
@@ -0,0 +1,5 @@
+enum PostLoadingState {
+ case loadingPreview
+ case loadingFile
+ case loaded
+}
diff --git a/Sora/Views/Post/PostThumbnailMode.swift b/Sora/Views/Post/PostThumbnailMode.swift
new file mode 100644
index 0000000..1e6c3b3
--- /dev/null
+++ b/Sora/Views/Post/PostThumbnailMode.swift
@@ -0,0 +1,5 @@
+enum PostThumbnailMode {
+ case preview
+ case sample
+ case file
+}
diff --git a/Sora/Views/Post/PostView.swift b/Sora/Views/Post/PostView.swift
new file mode 100644
index 0000000..97e311c
--- /dev/null
+++ b/Sora/Views/Post/PostView.swift
@@ -0,0 +1,30 @@
+import SwiftUI
+
+struct PostView: View {
+ let post: MoebooruPost
+ var softLimit: CGFloat
+ var thumbnailMode: PostThumbnailMode = .preview
+ private var thumbnailURL: URL? {
+ switch thumbnailMode {
+ case .preview:
+ return post.previewURL
+ case .sample:
+ return post.sampleURL
+ case .file:
+ return post.fileURL
+ }
+ }
+
+ var body: some View {
+ VStack {
+ AsyncImage(url: thumbnailURL) { image in
+ image
+ .resizable()
+ .scaledToFit()
+ } placeholder: {
+ ProgressView()
+ }
+ .frame(width: softLimit, height: softLimit)
+ }
+ }
+}