BusinessCard/BusinessCardWatch Watch App/State/WatchCardStore.swift

87 lines
2.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")
// Set up callback for when cards are received from iPhone
WatchConnectivityService.shared.onCardsReceived = { [weak self] cards in
self?.updateCards(cards)
}
#if targetEnvironment(simulator)
// Load sample data on simulator since WatchConnectivity often doesn't work
if cards.isEmpty {
loadSimulatorSampleData()
}
#endif
}
#if targetEnvironment(simulator)
private func loadSimulatorSampleData() {
WatchDesign.debugLog("WatchCardStore: Loading simulator sample data")
cards = [
WatchCard(
id: UUID(),
displayName: "Test User",
role: "iOS Developer",
company: "Sample Corp",
email: "test@example.com",
phone: "+1 555-0123",
website: "example.com",
location: "San Francisco, CA",
isDefault: true,
qrCodeImageData: nil
)
]
defaultCardID = cards.first?.id
}
#endif
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
}
}
}