TempTrack-iOS/TempTrack/Views/ExportSheet.swift

82 lines
2.1 KiB
Swift
Raw Normal View History

2025-01-31 13:06:11 +01:00
import SwiftUI
struct ExportSheet: View {
@Binding var isPresented: Bool
@State
private var isCreatingArchive = false
@State var url: URL?
@State var error: String?
@EnvironmentObject
private var storage: PersistentStorage
var body: some View {
VStack {
Text("Export")
.font(.title)
Text("Create a zip file of all stored data and share it.")
if isCreatingArchive {
ProgressView()
Text("Creating archive...")
}
if let error {
Text(error)
.foregroundStyle(.red)
}
Spacer()
Button("Create archive", action: createArchive)
.disabled(isCreatingArchive)
.padding()
if let url {
ShareLink(item: url) {
Label("Share archive", systemImage: "square.and.arrow.up")
}
.padding()
Button("Delete archive", action: deleteArchive)
.padding()
}
}
.padding()
}
private func createArchive() {
guard !isCreatingArchive else {
return
}
isCreatingArchive = true
DispatchQueue.main.async {
do {
let url = try storage.createZip()
DispatchQueue.main.async {
self.url = url
self.error = nil
self.isCreatingArchive = false
}
} catch {
DispatchQueue.main.async {
self.error = "Failed to create archive: \(error.localizedDescription)"
self.isCreatingArchive = false
}
}
}
}
private func deleteArchive() {
do {
try storage.removeZipArchive()
self.error = nil
self.url = nil
} catch {
self.error = "Failed to delete archive: \(error.localizedDescription)"
}
}
}
#Preview {
ExportSheet(isPresented: .constant(true))
}