import SwiftUI struct PostDetailsView: View { @EnvironmentObject var settings: SettingsManager @State private var loadingStage: BooruPostLoadingState = .loadingPreview private var imageURL: URL? { guard let post = selectedPost.post else { return nil } switch settings.detailViewQuality { case .preview: return post.previewURL case .sample: return post.sampleURL case .original: return post.fileURL } } @State private var isTagsSheetPresented = false @Binding var selectedPost: (post: BooruPost?, manager: BooruManager?) var filteredPosts: [BooruPost] { selectedPost.manager!.posts .filter { settings.displayRatings.contains($0.rating) } } var body: some View { if let post = selectedPost.post { VStack(spacing: 0) { #if os(macOS) PostDetailsImageView( url: imageURL, loadingStage: $loadingStage, selectedPost: $selectedPost, finalLoadingState: .loaded ) { PostDetailsImageView( url: post.previewURL, loadingStage: $loadingStage, selectedPost: $selectedPost ) .id(post.previewURL) } .id(imageURL) #else PostDetailsCarouselView( posts: filteredPosts, loadingStage: $loadingStage, focusedPost: post, selectedPost: $selectedPost ) .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center) #endif if settings.displayDetailsInformationBar { VStack(spacing: 5) { HStack { Text(post.createdAt.formatted()) .frame(maxWidth: .infinity, alignment: .leading) Group { switch loadingStage { case .loadingPreview: Text("Loading Preview…") case .loadingFile: Text("Loading \(settings.detailViewQuality.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 .toolbar { #if !os(macOS) if selectedPost.manager?.isLoading != false || loadingStage != .loaded { ToolbarItem { ProgressView() } } #endif ToolbarItem { Button(action: { isTagsSheetPresented.toggle() }) { Label("Tags", systemImage: "tag") } } #if os(macOS) if settings.enableShareShortcut { ToolbarItem { ShareLink(item: imageURL!) { Label("Share", systemImage: "square.and.arrow.up") } } } #endif } .sheet(isPresented: $isTagsSheetPresented) { PostDetailsTagsView( isPresented: $isTagsSheetPresented, tags: post.tags, selectedPost: $selectedPost ) .frame(minHeight: 250) } } } }