diff --git a/FuelBoard/ContentView.swift b/FuelBoard/ContentView.swift index a605b31..17d04d8 100644 --- a/FuelBoard/ContentView.swift +++ b/FuelBoard/ContentView.swift @@ -322,13 +322,21 @@ struct ContentView: View { fuel: alertsFuel, radiusKM: effectiveAlertsRadiusKM) } } + .onChange(of: priceDisplayStyle) { _, newValue in + // The pill carries its own display style in content state — push + // an update so the running activity re-renders in the new style + // immediately. Pass the style explicitly: SettingsView saves it + // in its own onChange, whose ordering vs this one isn't guaranteed, + // so reading storage here could push the OLD style. + updateLiveActivity(priceDisplayStyleOverride: newValue) + } } /// Pushes the current best-in-radius station into the Live Activity. /// No-op (or ends the activity) when the toggle is off or there's no /// location/data yet. Uses the Live Activity's OWN fuel + radius (set in /// Settings) — independent of the Stations-tab fuel/distance. - private func updateLiveActivity() { + private func updateLiveActivity(priceDisplayStyleOverride: PriceDisplayStyle? = nil) { // "Follow search" mirrors the Stations-tab distance exactly (no cap — // the pill only displays, it doesn't geofence). let radiusKM = liveActivityFollowsSearch @@ -339,7 +347,8 @@ struct ContentView: View { fuel: liveActivityFuel, radiusKM: radiusKM, location: location, - enabled: liveActivityEnabled + enabled: liveActivityEnabled, + priceDisplayStyle: priceDisplayStyleOverride ) } diff --git a/FuelBoard/LiveActivityManager.swift b/FuelBoard/LiveActivityManager.swift index cc9daf5..936d054 100644 --- a/FuelBoard/LiveActivityManager.swift +++ b/FuelBoard/LiveActivityManager.swift @@ -28,12 +28,15 @@ enum LiveActivityManager { /// Recomputes the cheapest-in-radius station and updates the activity. /// Passing `enabled: false` (or no usable data) ends any running activity. + /// `priceDisplayStyle` overrides the saved style (used when the setting + /// just changed and the save may not have landed yet); nil = read storage. static func update( stations: [FuelStation], fuel: FuelType, radiusKM: Double, location: Coordinate?, - enabled: Bool + enabled: Bool, + priceDisplayStyle: PriceDisplayStyle? = nil ) { guard enabled, let location else { end() @@ -53,6 +56,7 @@ enum LiveActivityManager { stationName: best.name, brand: best.brand, pricePence: price, + priceDisplayStyle: priceDisplayStyle ?? FuelStore.loadPriceDisplayStyle(), distanceKM: best.distanceKM(to: location.lat, lng2: location.lng), lat: best.lat, lng: best.lng, diff --git a/FuelBoardWidgets/FuelBoardLiveActivityView.swift b/FuelBoardWidgets/FuelBoardLiveActivityView.swift index ee38808..11e8025 100644 --- a/FuelBoardWidgets/FuelBoardLiveActivityView.swift +++ b/FuelBoardWidgets/FuelBoardLiveActivityView.swift @@ -70,7 +70,9 @@ private struct FuelBoardLiveActivityView: View { // RIGHT — price VStack(alignment: .trailing, spacing: 2) { - FuelStore.priceTextAttributed(context.state.pricePence, size: 22, weight: .bold) + FuelStore.priceTextAttributed(context.state.pricePence, + style: context.state.priceDisplayStyle, + size: 22, weight: .bold) Text("Tap for directions") .font(.caption2) .foregroundStyle(.secondary) @@ -86,7 +88,9 @@ private struct FuelBoardLiveActivityPriceView: View { let context: ActivityViewContext var body: some View { - FuelStore.priceTextAttributed(context.state.pricePence, size: 17, weight: .bold) + FuelStore.priceTextAttributed(context.state.pricePence, + style: context.state.priceDisplayStyle, + size: 17, weight: .bold) } } @@ -126,9 +130,10 @@ extension FuelBoardLiveActivityAttributes.ContentState { } /// Price string from pence, in the user's chosen display style - /// (station sign "129.9" or pounds "£1.29⁹/L"). + /// (station sign "129.9" or pounds "£1.29⁹/L"). Uses the style captured + /// in the state at push time. var priceText: String { - FuelStore.priceText(pricePence) + FuelStore.priceText(pricePence, style: priceDisplayStyle) } /// Apple Maps directions URL to the pinned station. diff --git a/Shared/FuelBoardLiveActivity.swift b/Shared/FuelBoardLiveActivity.swift index b24fc17..5b78eb1 100644 --- a/Shared/FuelBoardLiveActivity.swift +++ b/Shared/FuelBoardLiveActivity.swift @@ -25,6 +25,10 @@ struct FuelBoardLiveActivityAttributes: ActivityAttributes { var brand: String /// Price in pence per litre (same unit as `FuelStation.prices`). var pricePence: Double + /// Display style at push time (station sign vs pounds & pence) — carried + /// in the state so the extension renders deterministically instead of + /// re-reading storage that may not be shared on sideloads. + var priceDisplayStyle: PriceDisplayStyle var distanceKM: Double var lat: Double var lng: Double