From 4b03f632491b2f988f1acf07a257cc23ef4f395b Mon Sep 17 00:00:00 2001 From: Fuwn Date: Mon, 17 Feb 2025 19:59:40 -0800 Subject: feat: Initial commit --- Sora/Views/Post/PostDetailView.swift | 75 ++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 Sora/Views/Post/PostDetailView.swift (limited to 'Sora/Views/Post/PostDetailView.swift') 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)) + } + } +} -- cgit v1.2.3