From 3befd8554c23196750c94b16776a261ca4fe7f5b Mon Sep 17 00:00:00 2001 From: AgentSeal Date: Thu, 9 Jul 2026 22:38:46 +0200 Subject: [PATCH] fix(menubar): Usage Refresh picker label now reflects the selection The computed Binding wrote UserDefaults but nothing invalidated the view, so the picker visually stayed on Auto while the value silently landed. Back it with AppStorage so selection updates render. Refs #647 --- mac/Sources/CodeBurnMenubar/Views/SettingsView.swift | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mac/Sources/CodeBurnMenubar/Views/SettingsView.swift b/mac/Sources/CodeBurnMenubar/Views/SettingsView.swift index 94be4eec..494e1f9e 100644 --- a/mac/Sources/CodeBurnMenubar/Views/SettingsView.swift +++ b/mac/Sources/CodeBurnMenubar/Views/SettingsView.swift @@ -46,6 +46,12 @@ private struct GeneralSettingsTab: View { @State private var costText = "" @State private var tokenText = "" + // AppStorage (not a computed Binding over UsageRefreshCadence.current): + // a plain UserDefaults write does not invalidate the view, so the picker + // label would never reflect the selection even though the value landed. + @AppStorage(UsageRefreshCadence.defaultsKey) + private var usageRefreshSeconds: Int = UsageRefreshCadence.default.rawValue + private let costPresets: Set = [25, 50, 100, 200, 500] private let tokenPresets: Set = [1_000_000, 5_000_000, 10_000_000, 25_000_000, 50_000_000, 100_000_000] @@ -124,8 +130,8 @@ private struct GeneralSettingsTab: View { Section("Usage Refresh") { Picker("Update every", selection: Binding( - get: { UsageRefreshCadence.current }, - set: { UsageRefreshCadence.current = $0 } + get: { UsageRefreshCadence(rawValue: usageRefreshSeconds) ?? .default }, + set: { usageRefreshSeconds = $0.rawValue } )) { ForEach(UsageRefreshCadence.allCases) { cadence in Text(cadence.label).tag(cadence)