ImportMenu.swift 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. //
  2. // ImportMenu.swift
  3. // Todos
  4. //
  5. // Created by Sam Jaffe on 3/1/26.
  6. //
  7. import SwiftUI
  8. import SwiftData
  9. import UniformTypeIdentifiers
  10. struct ImportMenu: View {
  11. @Environment(\.modelContext) private var modelContext
  12. @AppStorage(UserDefaultsKeys.Category) var allGroups = CodableArray<Category>()
  13. @AppStorage(UserDefaultsKeys.UrlHints) var allHints = CodableArray<URLHint>()
  14. @State private var showingExporter = false
  15. var body: some View {
  16. Button("Import", systemImage: "square.and.arrow.down.on.square") {
  17. showingExporter = true
  18. }
  19. .keyboardShortcut("I", modifiers: [.command, .shift])
  20. .fileImporter(isPresented: $showingExporter, allowedContentTypes: [.json]) { result in
  21. switch result {
  22. case .success(let url):
  23. guard let data = try? Data(contentsOf: url),
  24. let transfer = try? JSONDecoder().decode(Transfer.self, from: data)
  25. else {
  26. return
  27. }
  28. do {
  29. try modelContext.container.erase()
  30. transfer.projects.forEach(modelContext.insert)
  31. allGroups = transfer.categories
  32. allHints = transfer.hints
  33. } catch {
  34. print(error.localizedDescription)
  35. }
  36. case .failure(let error):
  37. print(error.localizedDescription)
  38. }
  39. }
  40. }
  41. }
  42. #Preview {
  43. ImportMenu()
  44. }