mirror of
https://github.com/seemoo-lab/openhaystack.git
synced 2026-08-20 20:16:18 +00:00
Save changes to accessories immediately
This commit is contained in:
@@ -13,32 +13,41 @@ class AccessoryController: ObservableObject {
|
||||
static let shared = AccessoryController()
|
||||
|
||||
@Published var accessories: [Accessory]
|
||||
var cancellables = [AnyCancellable]()
|
||||
var saveCancellable: AnyCancellable?
|
||||
|
||||
var accessoryObserver: AnyCancellable?
|
||||
var selfObserver: AnyCancellable?
|
||||
var listElementsObserver = [AnyCancellable]()
|
||||
|
||||
init() {
|
||||
self.accessories = KeychainController.loadAccessoriesFromKeychain()
|
||||
initAccessoryObserver()
|
||||
initObserver()
|
||||
}
|
||||
|
||||
func initAccessoryObserver() {
|
||||
self.selfObserver = self.objectWillChange.sink { _ in
|
||||
// objectWillChange is called before the values are actually changed,
|
||||
// so we dispatch the call to save()
|
||||
DispatchQueue.main.async {
|
||||
self.initObserver()
|
||||
try? self.save()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func initObserver() {
|
||||
self.listElementsObserver.forEach({
|
||||
$0.cancel()
|
||||
})
|
||||
self.accessories.forEach({
|
||||
let c = $0.objectWillChange.sink(receiveValue: { self.objectWillChange.send() })
|
||||
|
||||
// Important: You have to keep the returned value allocated,
|
||||
// otherwise the sink subscription gets cancelled
|
||||
self.cancellables.append(c)
|
||||
self.listElementsObserver.append(c)
|
||||
})
|
||||
self.saveCancellable = self.$accessories.sink { _ in
|
||||
// FIXME: accessories actually don't change
|
||||
try? self.save()
|
||||
}
|
||||
}
|
||||
|
||||
init(accessories: [Accessory]) {
|
||||
self.accessories = accessories
|
||||
initAccessoryObserver()
|
||||
initObserver()
|
||||
}
|
||||
|
||||
@@ -46,10 +55,6 @@ class AccessoryController: ObservableObject {
|
||||
try KeychainController.storeInKeychain(accessories: self.accessories)
|
||||
}
|
||||
|
||||
func load() {
|
||||
self.accessories = KeychainController.loadAccessoriesFromKeychain()
|
||||
}
|
||||
|
||||
func updateWithDecryptedReports(devices: [FindMyDevice]) {
|
||||
// Assign last locations
|
||||
for device in FindMyController.shared.devices {
|
||||
@@ -76,20 +81,13 @@ class AccessoryController: ObservableObject {
|
||||
withAnimation {
|
||||
self.accessories = accessories
|
||||
}
|
||||
try self.save()
|
||||
}
|
||||
|
||||
func addAccessory(with name: String, color: Color, icon: String) throws -> Accessory {
|
||||
let accessory = try Accessory(name: name, color: color, iconName: icon)
|
||||
|
||||
let accessories = self.accessories + [accessory]
|
||||
|
||||
withAnimation {
|
||||
self.accessories = accessories
|
||||
self.accessories.append(accessory)
|
||||
}
|
||||
|
||||
try self.save()
|
||||
|
||||
return accessory
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user