63 lines
2.4 KiB
Swift
63 lines
2.4 KiB
Swift
import SwiftUI
|
|
import PDFKit
|
|
|
|
struct LeadPDFPreview: View {
|
|
let document: LeadDocument
|
|
let leadID: String
|
|
let salesCode: String
|
|
let repository: any LeadDetailRepository
|
|
let onLogout: () -> Void
|
|
var signedURL: URL? = nil
|
|
@State private var model = LeadFileViewModel()
|
|
@State private var retryID = 0
|
|
@State private var showsPreview = false
|
|
@Environment(\.dismiss) private var dismiss
|
|
|
|
var body: some View {
|
|
NavigationStack {
|
|
ZStack {
|
|
if let url = signedURL ?? model.url {
|
|
LeadPDFView(url: url)
|
|
.fullScreenCover(isPresented: $showsPreview) {
|
|
LeadDocumentPreview(url: url)
|
|
}
|
|
} else if let message = model.message {
|
|
ContentUnavailableView {
|
|
Label("PDF konnte nicht geöffnet werden", systemImage: "doc.badge.ellipsis")
|
|
} description: { Text(message) } actions: {
|
|
if model.needsLogin {
|
|
Button("Erneut anmelden", action: onLogout)
|
|
} else if model.allowsRetry {
|
|
Button("Erneut versuchen") { retryID += 1 }
|
|
}
|
|
}
|
|
} else {
|
|
ProgressView("PDF wird heruntergeladen …")
|
|
}
|
|
}
|
|
.navigationTitle(document.title)
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
.toolbar {
|
|
ToolbarItem(placement: .cancellationAction) {
|
|
Button(role: .cancel) { dismiss() }
|
|
.labelStyle(.iconOnly)
|
|
}
|
|
ToolbarItem(placement: .topBarTrailing) {
|
|
Button("In Vorschau öffnen", systemImage: "arrow.up.left.and.arrow.down.right") {
|
|
showsPreview = true
|
|
}
|
|
.labelStyle(.iconOnly)
|
|
.disabled(signedURL == nil && model.url == nil)
|
|
}
|
|
}
|
|
.task(id: retryID) {
|
|
guard signedURL == nil else { return }
|
|
await model.load {
|
|
try await DownloadLeadDocumentUseCase(repository: repository)
|
|
.execute(document, leadID: leadID, salesCode: salesCode)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|