diff --git a/OpenHaystack/OpenHaystack/FindMy/FindMyController.swift b/OpenHaystack/OpenHaystack/FindMy/FindMyController.swift index c08d92d..4418f60 100755 --- a/OpenHaystack/OpenHaystack/FindMy/FindMyController.swift +++ b/OpenHaystack/OpenHaystack/FindMy/FindMyController.swift @@ -11,10 +11,13 @@ import OSLog import SwiftUI class FindMyController: ObservableObject { - static let shared = FindMyController() - @Published var error: Error? @Published var devices = [FindMyDevice]() + var accessories: AccessoryController + + init(accessories: AccessoryController) { + self.accessories = accessories + } func loadPrivateKeys(from data: Data, with searchPartyToken: Data, completion: @escaping (Error?) -> Void) { do { @@ -97,9 +100,9 @@ class FindMyController: ObservableObject { self.fetchReports(with: token) { error in - let reports = FindMyController.shared.devices.compactMap({ $0.reports }).flatMap({ $0 }) + let reports = self.devices.compactMap({ $0.reports }).flatMap({ $0 }) if reports.isEmpty == false { - AccessoryController.shared.updateWithDecryptedReports(devices: FindMyController.shared.devices) + self.accessories.updateWithDecryptedReports(devices: self.devices) } if let error = error { @@ -231,17 +234,6 @@ class FindMyController: ObservableObject { } -struct FindMyControllerKey: EnvironmentKey { - static var defaultValue: FindMyController = .shared -} - -extension EnvironmentValues { - var findMyController: FindMyController { - get { self[FindMyControllerKey.self] } - set { self[FindMyControllerKey.self] = newValue } - } -} - enum FindMyErrors: Error { case decodingPlistFailed(message: String) } diff --git a/OpenHaystack/OpenHaystack/HaystackApp/AccessoryController.swift b/OpenHaystack/OpenHaystack/HaystackApp/AccessoryController.swift index 8496c53..0f92f39 100644 --- a/OpenHaystack/OpenHaystack/HaystackApp/AccessoryController.swift +++ b/OpenHaystack/OpenHaystack/HaystackApp/AccessoryController.swift @@ -10,18 +10,20 @@ import Foundation import SwiftUI class AccessoryController: ObservableObject { - static let shared = AccessoryController() - @Published var accessories: [Accessory] var selfObserver: AnyCancellable? var listElementsObserver = [AnyCancellable]() - init() { - self.accessories = KeychainController.loadAccessoriesFromKeychain() + init(accessories: [Accessory]) { + self.accessories = accessories initAccessoryObserver() initObserver() } + convenience init() { + self.init(accessories: KeychainController.loadAccessoriesFromKeychain()) + } + func initAccessoryObserver() { self.selfObserver = self.objectWillChange.sink { _ in // objectWillChange is called before the values are actually changed, @@ -45,19 +47,13 @@ class AccessoryController: ObservableObject { }) } - init(accessories: [Accessory]) { - self.accessories = accessories - initAccessoryObserver() - initObserver() - } - func save() throws { try KeychainController.storeInKeychain(accessories: self.accessories) } func updateWithDecryptedReports(devices: [FindMyDevice]) { // Assign last locations - for device in FindMyController.shared.devices { + for device in devices { if let idx = self.accessories.firstIndex(where: { $0.id == Int(device.deviceId) }) { self.objectWillChange.send() let accessory = self.accessories[idx] @@ -91,3 +87,9 @@ class AccessoryController: ObservableObject { return accessory } } + +class AccessoryControllerPreview: AccessoryController { + override func save() { + // don't allow saving dummy data to keychain + } +} diff --git a/OpenHaystack/OpenHaystack/HaystackApp/Views/ManageAccessoriesView.swift b/OpenHaystack/OpenHaystack/HaystackApp/Views/ManageAccessoriesView.swift index 92424b4..f195ded 100644 --- a/OpenHaystack/OpenHaystack/HaystackApp/Views/ManageAccessoriesView.swift +++ b/OpenHaystack/OpenHaystack/HaystackApp/Views/ManageAccessoriesView.swift @@ -10,7 +10,7 @@ import SwiftUI struct ManageAccessoriesView: View { - @ObservedObject var accessoryController = AccessoryController.shared + @EnvironmentObject var accessoryController: AccessoryController var accessories: [Accessory] { return self.accessoryController.accessories } diff --git a/OpenHaystack/OpenHaystack/HaystackApp/Views/OpenHaystackMainView.swift b/OpenHaystack/OpenHaystack/HaystackApp/Views/OpenHaystackMainView.swift index 1fe93a0..28f1f70 100644 --- a/OpenHaystack/OpenHaystack/HaystackApp/Views/OpenHaystackMainView.swift +++ b/OpenHaystack/OpenHaystack/HaystackApp/Views/OpenHaystackMainView.swift @@ -12,7 +12,8 @@ import SwiftUI struct OpenHaystackMainView: View { @State var loading = false - @ObservedObject var accessoryController = AccessoryController.shared + @EnvironmentObject var accessoryController: AccessoryController + @EnvironmentObject var findMyController: FindMyController var accessories: [Accessory] { return self.accessoryController.accessories } @@ -169,7 +170,7 @@ struct OpenHaystackMainView: View { self.isLoading = true } - FindMyController.shared.fetchReports(for: accessories, with: tokenData) { result in + findMyController.fetchReports(for: accessories, with: tokenData) { result in switch result { case .failure(let error): os_log(.error, "Downloading reports failed %@", error.localizedDescription) @@ -365,12 +366,11 @@ struct OpenHaystackMainView: View { } struct OpenHaystackMainView_Previews: PreviewProvider { - - static var accessories: [Accessory] = PreviewData.accessories - + static var accessoryController = AccessoryControllerPreview(accessories: PreviewData.accessories) as AccessoryController + static var previews: some View { - OpenHaystackMainView(accessoryController: AccessoryController(accessories: accessories)) - .frame(width: 800, height: 600, alignment: .center) + OpenHaystackMainView() + .environmentObject(accessoryController) } } diff --git a/OpenHaystack/OpenHaystack/OpenHaystackApp.swift b/OpenHaystack/OpenHaystack/OpenHaystackApp.swift index d124bc9..e8e3e29 100644 --- a/OpenHaystack/OpenHaystack/OpenHaystackApp.swift +++ b/OpenHaystack/OpenHaystack/OpenHaystackApp.swift @@ -9,14 +9,25 @@ import SwiftUI @main struct OpenHaystackApp: App { + @StateObject var accessoryController: AccessoryController + @StateObject var findMyController: FindMyController + + init() { + var accessoryController: AccessoryController + if ProcessInfo().arguments.contains("-preview") { + accessoryController = AccessoryControllerPreview(accessories: PreviewData.accessories) + } else { + accessoryController = AccessoryController() + } + self._accessoryController = StateObject(wrappedValue: accessoryController) + self._findMyController = StateObject(wrappedValue: FindMyController(accessories: accessoryController)) + } var body: some Scene { WindowGroup { - if ProcessInfo().arguments.contains("-preview") { - OpenHaystackMainView(accessoryController: AccessoryController(accessories: PreviewData.accessories)) - } else { - OpenHaystackMainView() - } + OpenHaystackMainView() + .environmentObject(accessoryController) + .environmentObject(findMyController) } .commands { SidebarCommands()