Add persistence of selected currencies to disk via SQLite

This commit is contained in:
2024-11-20 20:13:54 +02:00
parent 303cad1076
commit da21b78588
6 changed files with 224 additions and 10 deletions

View File

@@ -13,6 +13,8 @@ import Foundation
import SwiftUI
class SatsViewModel: ObservableObject {
let model: SatsPriceModel
@Published var lastUpdated: Date?
@Published var priceSourceInternal: PriceSource = .coinbase
@@ -20,7 +22,6 @@ class SatsViewModel: ObservableObject {
@Published var satsStringInternal: String = ""
@Published var btcStringInternal: String = ""
@Published var selectedCurrency: Locale.Currency = Locale.current.currency ?? Locale.Currency("USD")
@Published var selectedCurrencies = Set<Locale.Currency>()
@Published var currencyValueStrings: [Locale.Currency: String] = [:]
@@ -28,6 +29,10 @@ class SatsViewModel: ObservableObject {
let currentCurrency: Locale.Currency = Locale.current.currency ?? Locale.Currency("USD")
init(model: SatsPriceModel) {
self.model = model
}
var currencies: [Locale.Currency] {
let commonISOCurrencyCodes = Set(Locale.commonISOCurrencyCodes)
if commonISOCurrencyCodes.contains(currentCurrency.identifier) {
@@ -40,6 +45,34 @@ class SatsViewModel: ObservableObject {
}
}
@MainActor
func pullSelectedCurrenciesFromDB() async {
do {
let selectedCurrencies = Set(try await model.selectedCurrencies().compactMap { Locale.Currency($0.currencyCode) })
let currenciesToAdd = selectedCurrencies.subtracting(self.selectedCurrencies)
let currenciesToRemove = self.selectedCurrencies.subtracting(selectedCurrencies)
self.selectedCurrencies.subtract(currenciesToRemove)
self.selectedCurrencies.formUnion(currenciesToAdd)
} catch {
logger.error("Unable to pull selected currencies from DB. Error: \(error)")
}
}
func addSelectedCurrency(_ currency: Locale.Currency) {
selectedCurrencies.insert(currency)
Task {
try await model.insert(SelectedCurrency(currencyCode: currency.identifier))
}
}
func removeSelectedCurrency(_ currency: Locale.Currency) {
selectedCurrencies.remove(currency)
Task {
try await model.deleteSelectedCurrency(currencyCode: currency.identifier)
}
}
var priceSource: PriceSource {
get {
priceSourceInternal