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 | |
| download | sora-testing-4b03f632491b2f988f1acf07a257cc23ef4f395b.tar.xz sora-testing-4b03f632491b2f988f1acf07a257cc23ef4f395b.zip | |
feat: Initial commit
Diffstat (limited to 'Sora/Views/Post')
| -rw-r--r-- | Sora/Views/Post/PostDetailView.swift | 75 | ||||
| -rw-r--r-- | Sora/Views/Post/PostLoadingStage.swift | 5 | ||||
| -rw-r--r-- | Sora/Views/Post/PostThumbnailMode.swift | 5 | ||||
| -rw-r--r-- | Sora/Views/Post/PostView.swift | 30 |
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) + } + } +} |