Preview diagram and PDF before sharing (iOS + Android)

iOS: route exports through QLPreviewController so users can inspect
before sharing. Android: add a zoomable full-screen diagram preview
with a share button; PDF still goes straight to the share sheet.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-29 15:21:07 +02:00
parent 022e309873
commit ff955b35fe
4 changed files with 142 additions and 26 deletions

View File

@@ -29,7 +29,8 @@ struct LoadsView: View {
@State private var overviewExportRequested = false
@State private var diagramExportRequested = false
@State private var isExportingOverview = false
@State private var overviewShareItem: OverviewShareItem?
@State private var previewURL: URL?
@State private var previewTempURL: URL?
@State private var overviewExportError: OverviewExportError?
let system: ElectricalSystem
@@ -219,11 +220,12 @@ struct LoadsView: View {
}
)
}
.sheet(item: $overviewShareItem, onDismiss: {
cleanupOverviewShareItem()
ReviewPrompt.registerSuccessfulExport()
}) { item in
ShareSheet(items: item.shareItems)
.quickLookPreview($previewURL)
.onChange(of: previewURL) { _, newValue in
if newValue == nil {
cleanupPreview()
ReviewPrompt.registerSuccessfulExport()
}
}
.alert(
String(localized: "overview.share.error.title", defaultValue: "Export Failed"),
@@ -1106,12 +1108,6 @@ struct LoadsView: View {
// MARK: - PDF Export
private struct OverviewShareItem: Identifiable {
let id = UUID()
let shareItems: [Any]
let tempURL: URL?
}
private struct OverviewExportError: Identifiable {
let message: String
var id: String { message }
@@ -1134,7 +1130,8 @@ struct LoadsView: View {
"system": snapshot.systemName,
])
await MainActor.run {
overviewShareItem = OverviewShareItem(shareItems: [url], tempURL: url)
previewURL = url
previewTempURL = url
isExportingOverview = false
}
} catch {
@@ -1164,7 +1161,8 @@ struct LoadsView: View {
AnalyticsTracker.log("Diagram Image Shared", properties: [
"system": snapshot.systemName,
])
overviewShareItem = OverviewShareItem(shareItems: [url], tempURL: url)
previewURL = url
previewTempURL = url
} else {
overviewExportError = OverviewExportError(
message: String(localized: "overview.share.diagram.error", defaultValue: "Could not generate diagram. Check your internet connection.")
@@ -1284,11 +1282,10 @@ struct LoadsView: View {
)
}
private func cleanupOverviewShareItem() {
guard let item = overviewShareItem else { return }
overviewShareItem = nil
if let url = item.tempURL {
private func cleanupPreview() {
if let url = previewTempURL {
try? FileManager.default.removeItem(at: url)
previewTempURL = nil
}
}
}