diff --git a/Andromida/App/State/SettingsStore.swift b/Andromida/App/State/SettingsStore.swift index fd00813..34fc0d3 100644 --- a/Andromida/App/State/SettingsStore.swift +++ b/Andromida/App/State/SettingsStore.swift @@ -6,6 +6,15 @@ import Bedrock @Observable final class SettingsStore: CloudSyncable { @ObservationIgnored private let cloudSync = CloudSyncManager() + + /// Observable copy of last sync date, updated when sync completes. + private(set) var lastSyncDate: Date? + + /// Observable copy of sync status, updated when sync state changes. + private(set) var syncStatus: String = "" + + /// Observable copy of initial sync state. + private(set) var hasCompletedInitialSync: Bool = false var hapticsEnabled: Bool { get { cloudSync.data.hapticsEnabled } @@ -24,22 +33,33 @@ final class SettingsStore: CloudSyncable { set { cloudSync.iCloudEnabled = newValue } } - var lastSyncDate: Date? { cloudSync.lastSyncDate } - var syncStatus: String { cloudSync.syncStatus } - var hasCompletedInitialSync: Bool { cloudSync.hasCompletedInitialSync } + init() { + // Initialize observable properties from cloudSync + refreshSyncState() + } func forceSync() { cloudSync.sync() + refreshSyncState() } func refresh() { cloudSync.sync() + refreshSyncState() } private func update(_ transform: (inout AppSettingsData) -> Void) { cloudSync.update { data in transform(&data) } + refreshSyncState() + } + + /// Copies sync state from CloudSyncManager to observable properties. + private func refreshSyncState() { + lastSyncDate = cloudSync.lastSyncDate + syncStatus = cloudSync.syncStatus + hasCompletedInitialSync = cloudSync.hasCompletedInitialSync } } diff --git a/Andromida/App/Views/Rituals/Components/RitualMilestonesView.swift b/Andromida/App/Views/Rituals/Components/RitualMilestonesView.swift index 3153b8c..8656592 100644 --- a/Andromida/App/Views/Rituals/Components/RitualMilestonesView.swift +++ b/Andromida/App/Views/Rituals/Components/RitualMilestonesView.swift @@ -38,7 +38,7 @@ struct RitualMilestonesView: View { .frame(width: AppMetrics.Size.milestoneIcon, height: AppMetrics.Size.milestoneIcon) Image(systemName: milestone.symbolName) - .font(.system(size: Design.BaseFontSize.caption)) + .font(.caption) .foregroundStyle(milestone.isAchieved ? AppStatus.success : AppTextColors.tertiary) } diff --git a/Andromida/App/Views/Rituals/RitualDetailView.swift b/Andromida/App/Views/Rituals/RitualDetailView.swift index 233015b..4014f08 100644 --- a/Andromida/App/Views/Rituals/RitualDetailView.swift +++ b/Andromida/App/Views/Rituals/RitualDetailView.swift @@ -200,7 +200,7 @@ struct RitualDetailView: View { private var headerSection: some View { HStack(spacing: Design.Spacing.medium) { Image(systemName: ritual.iconName) - .font(.system(size: Design.BaseFontSize.largeTitle)) + .font(.largeTitle) .foregroundStyle(ritual.hasActiveArc ? AppAccent.primary : AppTextColors.secondary) .frame(width: 56, height: 56) .background((ritual.hasActiveArc ? AppAccent.primary : AppTextColors.secondary).opacity(0.1))