BusinessCard/BusinessCardWatch Watch App/State/WatchCardStore.swift

60 lines
1.8 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 {
// Fall back to sample data if no synced data available
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
}
}
}