Don't save preview data to keychain + get rid of shared controller instances

This commit is contained in:
Milan Stute
2021-03-11 08:57:44 +01:00
parent fab6cf8b55
commit c57b4c9545
5 changed files with 44 additions and 39 deletions
@@ -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)
}
@@ -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
}
}
@@ -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
}
@@ -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)
}
}
@@ -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()