54 lines
1.8 KiB
Swift
54 lines
1.8 KiB
Swift
import Foundation
|
|
import Observation
|
|
|
|
@Observable
|
|
@MainActor
|
|
final class WatchCardStore {
|
|
private static let defaultCardIDKey = "WatchDefaultCardID"
|
|
|
|
private(set) var cards: [WatchCard] = []
|
|
var defaultCardID: UUID? {
|
|
didSet {
|
|
persistDefaultID()
|
|
}
|
|
}
|
|
|
|
init() {
|
|
loadDefaultID()
|
|
WatchDesign.debugLog("WatchCardStore: Initialized, waiting for cards from iPhone")
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
/// Called by WatchConnectivityService when cards are received from iPhone
|
|
func updateCards(_ newCards: [WatchCard]) {
|
|
WatchDesign.debugLog("WatchCardStore: Received \(newCards.count) cards from iPhone")
|
|
cards = newCards
|
|
|
|
// Update default card ID if current selection is no longer valid
|
|
if let currentDefault = defaultCardID, !cards.contains(where: { $0.id == currentDefault }) {
|
|
defaultCardID = cards.first(where: { $0.isDefault })?.id ?? cards.first?.id
|
|
} else if defaultCardID == nil {
|
|
defaultCardID = cards.first(where: { $0.isDefault })?.id ?? cards.first?.id
|
|
}
|
|
}
|
|
|
|
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) {
|
|
defaultCardID = id
|
|
}
|
|
}
|
|
}
|