diff options
| author | Fuwn <[email protected]> | 2025-02-17 19:59:40 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-02-17 19:59:40 -0800 |
| commit | 4b03f632491b2f988f1acf07a257cc23ef4f395b (patch) | |
| tree | b9f5093fdfbdf93d19266463a608d892776803b5 /Sora/Views/Post/PostDetailView.swift | |
| download | sora-testing-4b03f632491b2f988f1acf07a257cc23ef4f395b.tar.xz sora-testing-4b03f632491b2f988f1acf07a257cc23ef4f395b.zip | |
feat: Initial commit
Diffstat (limited to 'Sora/Views/Post/PostDetailView.swift')
| -rw-r--r-- | Sora/Views/Post/PostDetailView.swift | 75 |
1 files changed, 75 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)) + } + } +} |