The relay's price_updated is the maximum price_last_updated across the grades it maps, so it cannot vouch for the selected grade: stop using it to score, gate or warn about Best Value. - FuelPriceFreshness is now station-level and display-only: one age per station, fresh/outdated/unknown/invalid, "May be outdated" past 30 days, with future-tolerance and non-finite guards. - Best Value restores the closest-station-selling-the-selected-fuel baseline and its savings ranking; eligibility gating, eligible-first sorting and the unavailable banner are gone. - Price age appears in the More info sheet only - no listing-row warnings, no extra banners. - Copy reverted from "closest eligible station" to "closest station"; stale price-confidence strings removed, "May be outdated" added. - Dormant per-grade timestamp plumbing removed, and regression tests added for every fuel type, missing/invalid/future stamps and the bundled offline dump.
32 lines
1.2 KiB
Swift
32 lines
1.2 KiB
Swift
import SwiftUI
|
|
|
|
/// The More info sheet's price-age row.
|
|
///
|
|
/// Station-level by design: the relay publishes a single `price_updated` per
|
|
/// station (the newest grade it maps), so the copy says "Price updated" and
|
|
/// never claims the selected grade itself was updated.
|
|
///
|
|
/// Past `FuelPriceFreshness.outdatedAge` a discreet note flags the information
|
|
/// as possibly out of date. It is informational only — it gates nothing, and
|
|
/// the station's own price row above it is unaffected.
|
|
///
|
|
/// Its own view rather than inlined into `StationDetailView`: that body sits at
|
|
/// the compiler's type-checking limit, so one extra statement there fails the
|
|
/// build. One statement here, one there.
|
|
struct StationPriceAgeView: View {
|
|
let assessment: FuelPriceFreshness.Assessment
|
|
|
|
var body: some View {
|
|
VStack(alignment: .leading, spacing: 2) {
|
|
LabeledContent("Price updated", value: assessment.updateAgeLabel)
|
|
.monospacedDigit()
|
|
if let notice = assessment.outdatedNotice {
|
|
Text(notice)
|
|
.font(.caption2)
|
|
.foregroundStyle(.secondary)
|
|
.accessibilityLabel(notice)
|
|
}
|
|
}
|
|
}
|
|
}
|