59 lines
1.7 KiB
Swift
59 lines
1.7 KiB
Swift
import Foundation
|
|
import Observation
|
|
|
|
@Observable
|
|
@MainActor
|
|
final class WatchCardStore {
|
|
private static let appGroupID = "group.com.mbrucedogs.BusinessCard"
|
|
private static let cardsKey = "SyncedCards"
|
|
private static let defaultCardIDKey = "WatchDefaultCardID"
|
|
|
|
private(set) var cards: [WatchCard] = []
|
|
var defaultCardID: UUID? {
|
|
didSet {
|
|
persistDefaultID()
|
|
}
|
|
}
|
|
|
|
private var sharedDefaults: UserDefaults? {
|
|
UserDefaults(suiteName: Self.appGroupID)
|
|
}
|
|
|
|
init() {
|
|
loadCards()
|
|
loadDefaultID()
|
|
}
|
|
|
|
var defaultCard: WatchCard? {
|
|
guard let defaultCardID else { return cards.first(where: { $0.isDefault }) ?? cards.first }
|
|
return cards.first(where: { $0.id == defaultCardID }) ?? cards.first(where: { $0.isDefault }) ?? cards.first
|
|
}
|
|
|
|
func loadCards() {
|
|
guard let defaults = sharedDefaults,
|
|
let data = defaults.data(forKey: Self.cardsKey),
|
|
let decoded = try? JSONDecoder().decode([WatchCard].self, from: data) else {
|
|
cards = []
|
|
return
|
|
}
|
|
cards = decoded
|
|
}
|
|
|
|
func setDefault(_ card: WatchCard) {
|
|
defaultCardID = card.id
|
|
}
|
|
|
|
private func persistDefaultID() {
|
|
UserDefaults.standard.set(defaultCardID?.uuidString ?? "", forKey: Self.defaultCardIDKey)
|
|
}
|
|
|
|
private func loadDefaultID() {
|
|
let storedValue = UserDefaults.standard.string(forKey: Self.defaultCardIDKey) ?? ""
|
|
if let id = UUID(uuidString: storedValue), cards.contains(where: { $0.id == id }) {
|
|
defaultCardID = id
|
|
} else {
|
|
defaultCardID = cards.first(where: { $0.isDefault })?.id ?? cards.first?.id
|
|
}
|
|
}
|
|
}
|