|
|
@@ -1,5 +1,5 @@
|
|
|
//
|
|
|
-// SaveAsMenu.swift
|
|
|
+// ImportMenu.swift
|
|
|
// Todos
|
|
|
//
|
|
|
// Created by Sam Jaffe on 3/1/26.
|
|
|
@@ -9,29 +9,37 @@ import SwiftUI
|
|
|
import SwiftData
|
|
|
import UniformTypeIdentifiers
|
|
|
|
|
|
-struct ExportMenu: View {
|
|
|
+struct ImportMenu: View {
|
|
|
@Environment(\.modelContext) private var modelContext
|
|
|
@AppStorage(UserDefaultsKeys.Category) var allGroups = CodableArray<Category>()
|
|
|
@AppStorage(UserDefaultsKeys.UrlHints) var allHints = CodableArray<URLHint>()
|
|
|
|
|
|
- @Query private var items: [Project]
|
|
|
@State private var showingExporter = false
|
|
|
|
|
|
var body: some View {
|
|
|
- Button("Export") {
|
|
|
+ Button("Import") {
|
|
|
showingExporter = true
|
|
|
}
|
|
|
- .keyboardShortcut("E", modifiers: [.command])
|
|
|
- .fileExporter(isPresented: $showingExporter, document: StubDocument(),
|
|
|
- contentType: .json) { result in
|
|
|
+ .keyboardShortcut("I", modifiers: [.command, .shift])
|
|
|
+ .fileImporter(isPresented: $showingExporter, allowedContentTypes: [.json]) { result in
|
|
|
switch result {
|
|
|
case .success(let url):
|
|
|
- let transfer = Transfer(projects: items, hints: allHints, categories: allGroups)
|
|
|
- guard let data = try? JSONEncoder().encode(transfer)
|
|
|
+
|
|
|
+ guard let data = try? Data(contentsOf: url),
|
|
|
+ let transfer = try? JSONDecoder().decode(Transfer.self, from: data)
|
|
|
else {
|
|
|
return
|
|
|
}
|
|
|
- SaveController.save(data: data, to: url)
|
|
|
+
|
|
|
+ do {
|
|
|
+ try modelContext.container.erase()
|
|
|
+
|
|
|
+ transfer.projects.forEach(modelContext.insert)
|
|
|
+ allGroups = transfer.categories
|
|
|
+ allHints = transfer.hints
|
|
|
+ } catch {
|
|
|
+ print(error.localizedDescription)
|
|
|
+ }
|
|
|
case .failure(let error):
|
|
|
print(error.localizedDescription)
|
|
|
}
|
|
|
@@ -40,5 +48,5 @@ struct ExportMenu: View {
|
|
|
}
|
|
|
|
|
|
#Preview {
|
|
|
- SaveAsMenu()
|
|
|
+ ImportMenu()
|
|
|
}
|