Widget: per-widget distance, sanitised names, £ prices

- New Distance picker in Edit Widget (5/10/15 miles), independent of the
  app's distance filter; used for both the relay fetch radius and the
  strict in-widget filter.
- Brand text is now title-cased via sanitizedStationTitle (relay sends
  all-caps brands like SHELL/TESCO/MORRISONS).
- Prices now show as £1.399 (monospaced) matching the app, instead of
  139.9p.
- Directions deep-link (mapsDirectionsURL) already per-row on medium and
  whole-widget on small; unchanged. 35 tests pass.
This commit is contained in:
FuelBoard Contributor
2026-08-12 12:25:30 +01:00
parent 5ae0f945b3
commit 2a8de27571
2 changed files with 34 additions and 15 deletions
+26 -1
View File
@@ -33,13 +33,38 @@ enum WidgetSort: String, AppEnum, CaseIterable, Codable {
]
}
enum WidgetDistance: String, AppEnum, CaseIterable, Codable {
case five
case ten
case fifteen
static var typeDisplayRepresentation: TypeDisplayRepresentation = "Distance"
static var caseDisplayRepresentations: [WidgetDistance: DisplayRepresentation] = [
.five: "5 miles",
.ten: "10 miles",
.fifteen: "15 miles",
]
var miles: Int {
switch self {
case .five: return 5
case .ten: return 10
case .fifteen: return 15
}
}
}
struct FuelBoardWidgetConfigurationIntent: WidgetConfigurationIntent {
static var title: LocalizedStringResource = "Fuel & Sort"
static var description = IntentDescription("Which fuel and ordering this widget shows.")
static var description = IntentDescription("Which fuel, ordering and search radius this widget shows.")
@Parameter(title: "Fuel", default: .e10)
var fuel: WidgetFuel
@Parameter(title: "Sort by", default: .cheapest)
var sort: WidgetSort
@Parameter(title: "Distance", default: .five)
var distance: WidgetDistance
}