83 lines
2.2 KiB
Swift
83 lines
2.2 KiB
Swift
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()
|
|
}
|
|
Button("Dismiss", action: { isPresented = false })
|
|
}
|
|
.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))
|
|
}
|