Newer Older
92 lines | 3.285kb
Bogdan Timofte authored 2 weeks ago
1
//
2
//  DataStore.swift
3
//  USB Meter
4
//
5
//  Created by Bogdan Timofte on 03/03/2020.
6
//  Copyright © 2020 Bogdan Timofte. All rights reserved.
7
//
8

            
9
import SwiftUI
10
import Combine
11
import CoreBluetooth
12

            
13
final class AppData : ObservableObject {
Bogdan Timofte authored 2 weeks ago
14
    private var bluetoothManagerNotification: AnyCancellable?
Bogdan Timofte authored a week ago
15
    private var meterStoreObserver: AnyCancellable?
16
    private var meterStoreCloudObserver: AnyCancellable?
17
    private let meterStore = MeterNameStore.shared
Bogdan Timofte authored 2 weeks ago
18

            
Bogdan Timofte authored 2 weeks ago
19
    init() {
Bogdan Timofte authored 2 weeks ago
20
        bluetoothManagerNotification = bluetoothManager.objectWillChange.sink { [weak self] _ in
Bogdan Timofte authored 2 weeks ago
21
            self?.scheduleObjectWillChange()
Bogdan Timofte authored 2 weeks ago
22
        }
Bogdan Timofte authored a week ago
23
        meterStoreObserver = NotificationCenter.default.publisher(for: .meterNameStoreDidChange)
24
            .receive(on: DispatchQueue.main)
25
            .sink { [weak self] _ in
26
                self?.refreshMeterMetadata()
27
            }
28
        meterStoreCloudObserver = NotificationCenter.default.publisher(for: .meterNameStoreCloudStatusDidChange)
29
            .receive(on: DispatchQueue.main)
30
            .sink { [weak self] _ in
31
                self?.scheduleObjectWillChange()
32
            }
Bogdan Timofte authored 2 weeks ago
33
    }
Bogdan Timofte authored a week ago
34

            
Bogdan Timofte authored 2 weeks ago
35
    let bluetoothManager = BluetoothManager()
Bogdan Timofte authored a week ago
36

            
Bogdan Timofte authored 2 weeks ago
37
    @Published var enableRecordFeature: Bool = true
Bogdan Timofte authored a week ago
38

            
Bogdan Timofte authored 2 weeks ago
39
    @Published var meters: [UUID:Meter] = [UUID:Meter]()
Bogdan Timofte authored a week ago
40

            
41
    var cloudAvailability: MeterNameStore.CloudAvailability {
42
        meterStore.currentCloudAvailability
43
    }
44

            
45
    func meterName(for macAddress: String) -> String? {
46
        meterStore.name(for: macAddress)
47
    }
48

            
49
    func setMeterName(_ name: String, for macAddress: String) {
50
        meterStore.upsert(macAddress: macAddress, name: name, temperatureUnitRawValue: nil)
51
    }
52

            
53
    func temperatureUnitPreference(for macAddress: String) -> TemperatureUnitPreference {
54
        let rawValue = meterStore.temperatureUnitRawValue(for: macAddress) ?? TemperatureUnitPreference.celsius.rawValue
55
        return TemperatureUnitPreference(rawValue: rawValue) ?? .celsius
56
    }
57

            
58
    func setTemperatureUnitPreference(_ preference: TemperatureUnitPreference, for macAddress: String) {
59
        meterStore.upsert(macAddress: macAddress, name: nil, temperatureUnitRawValue: preference.rawValue)
Bogdan Timofte authored 2 weeks ago
60
    }
Bogdan Timofte authored 2 weeks ago
61

            
62
    private func scheduleObjectWillChange() {
63
        DispatchQueue.main.async { [weak self] in
64
            self?.objectWillChange.send()
65
        }
66
    }
Bogdan Timofte authored a week ago
67

            
68
    private func refreshMeterMetadata() {
69
        DispatchQueue.main.async { [weak self] in
70
            guard let self else { return }
71
            var didUpdateAnyMeter = false
72
            for meter in self.meters.values {
73
                let mac = meter.btSerial.macAddress.description
74
                let displayName = self.meterName(for: mac) ?? mac
75
                if meter.name != displayName {
76
                    meter.updateNameFromStore(displayName)
77
                    didUpdateAnyMeter = true
78
                }
79

            
80
                let previousTemperaturePreference = meter.tc66TemperatureUnitPreference
81
                meter.reloadTemperatureUnitPreference()
82
                if meter.tc66TemperatureUnitPreference != previousTemperaturePreference {
83
                    didUpdateAnyMeter = true
84
                }
85
            }
86

            
87
            if didUpdateAnyMeter {
88
                self.scheduleObjectWillChange()
89
            }
90
        }
91
    }
Bogdan Timofte authored 2 weeks ago
92
}