import SwiftUI struct PostDetailsView: View { @EnvironmentObject var settings: Settings let post: MoebooruPost @State var loadingStage: PostLoadingState = .loadingPreview private var imageURL: URL? { switch settings.detailViewType { case .preview: return post.previewURL case .sample: return post.sampleURL case .original: return post.fileURL case .compressed: return post.jpegURL } } var body: some View { VStack(spacing: 0) { AsyncImageWithPreview( url: imageURL, loadingStage: $loadingStage, finalLoadingState: .loaded, postURL: URL(string: "https://yande.re/post/show/\(post.id)")! ) { AsyncImageWithPreview( url: post.previewURL, loadingStage: $loadingStage ) .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center) .id(post.previewURL) } .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center) .id(imageURL) .padding(0) .zIndex(0) VStack(spacing: 5) { HStack { Text(post.tags.joined(separator: ", ")) } .frame(maxWidth: .infinity, alignment: .leading) HStack { Text( Date( timeIntervalSince1970: TimeInterval(post.createdAt) ).formatted() ) .frame(maxWidth: .infinity, alignment: .leading) Group { switch loadingStage { case .loadingPreview: Text("Loading preview …") case .loadingFile: Text("Loading \(settings.detailViewType.rawValue) …") 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) #if os(iOS) .background(.ultraThinMaterial) #else .background(.opacity(0.1)) #endif .zIndex(1) } .navigationTitle("Details") #if os(iOS) .navigationBarTitleDisplayMode(.inline) .toolbarBackground(.visible, for: .navigationBar) .toolbarBackground(.ultraThinMaterial, for: .navigationBar) #endif } }