Compare commits
10
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
05f3ef0a70 | ||
|
|
313fe84037 | ||
|
|
24fffe1e8f | ||
|
|
ec191d77aa | ||
|
|
cf69350472 | ||
|
|
8d24de401d | ||
|
|
644342ae63 | ||
|
|
12cb3707b6 | ||
|
|
39b310d68d | ||
|
|
c1edd4d52d |
@@ -47,7 +47,7 @@ struct StationsView: View {
|
|||||||
Section("Fuel type") {
|
Section("Fuel type") {
|
||||||
Picker("Fuel type", selection: $selectedFuel) {
|
Picker("Fuel type", selection: $selectedFuel) {
|
||||||
ForEach(FuelType.allCases) { fuel in
|
ForEach(FuelType.allCases) { fuel in
|
||||||
Text(fuel.displayName).tag(fuel)
|
Text(fuel.shortName).tag(fuel)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.pickerStyle(.segmented)
|
.pickerStyle(.segmented)
|
||||||
@@ -180,7 +180,36 @@ struct StationsView: View {
|
|||||||
// New fetch or filter switch → back to the first page.
|
// New fetch or filter switch → back to the first page.
|
||||||
visibleCount = pageSize
|
visibleCount = pageSize
|
||||||
}
|
}
|
||||||
|
// Native large-title behaviour (Mail-style): the system shows the
|
||||||
|
// large title at rest, scrolls it away and fades the compact
|
||||||
|
// inline title in. No custom toolbar needed — the native mechanism
|
||||||
|
// only renders text, which is exactly what we want here.
|
||||||
.navigationTitle("FuelBoard")
|
.navigationTitle("FuelBoard")
|
||||||
|
.navigationBarTitleDisplayMode(.large)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Fuel-type iconography (app target only — FuelStore.swift is Foundation-only)
|
||||||
|
|
||||||
|
extension FuelType {
|
||||||
|
/// Short segment label ("Unleaded (E10)" / "Premium (E5)" / "Diesel") for
|
||||||
|
/// the picker and description.
|
||||||
|
var shortName: String {
|
||||||
|
switch self {
|
||||||
|
case .e10: return "Unleaded (E10)"
|
||||||
|
case .e5: return "Premium (E5)"
|
||||||
|
case .diesel: return "Diesel"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Pump-handle colour convention (UK): green = unleaded, blue = premium,
|
||||||
|
/// dark grey = diesel. Used for the fuel-type tab icons and the title icon.
|
||||||
|
var tintColor: Color {
|
||||||
|
switch self {
|
||||||
|
case .e10: return .green
|
||||||
|
case .e5: return .blue
|
||||||
|
case .diesel: return Color(red: 0.35, green: 0.38, blue: 0.42)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,11 +84,15 @@ private struct RelayResponse: Codable {
|
|||||||
let prices: [String: Double]?
|
let prices: [String: Double]?
|
||||||
|
|
||||||
/// Map relay grade keys (E5/E10/DIESEL) to FuelType for ALL fuels the
|
/// Map relay grade keys (E5/E10/DIESEL) to FuelType for ALL fuels the
|
||||||
/// station sells — one fetch populates every fuel tab.
|
/// station sells — one fetch populates every fuel tab. Defensive guard:
|
||||||
|
/// any grade outside the 50–500 pence/litre band is dropped, so a relay
|
||||||
|
/// regression (e.g. the band being removed server-side) can't re-poison
|
||||||
|
/// the nationwide cheapest reference with 1.3p / 1589p garbage.
|
||||||
var allPrices: [FuelType: Double] {
|
var allPrices: [FuelType: Double] {
|
||||||
var result: [FuelType: Double] = [:]
|
var result: [FuelType: Double] = [:]
|
||||||
if let prices {
|
if let prices {
|
||||||
for (grade, value) in prices {
|
for (grade, value) in prices {
|
||||||
|
guard (50...500).contains(value) else { continue }
|
||||||
switch grade.uppercased() {
|
switch grade.uppercased() {
|
||||||
case "E10": result[.e10] = value
|
case "E10": result[.e10] = value
|
||||||
case "E5": result[.e5] = value
|
case "E5": result[.e5] = value
|
||||||
@@ -98,7 +102,7 @@ private struct RelayResponse: Codable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Backwards-compat: relay versions without `prices` still send `price`.
|
// Backwards-compat: relay versions without `prices` still send `price`.
|
||||||
if result.isEmpty, let price {
|
if result.isEmpty, let price, (50...500).contains(price) {
|
||||||
result[.e10] = price
|
result[.e10] = price
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -56,8 +56,8 @@ enum FuelType: String, Codable, CaseIterable, Identifiable {
|
|||||||
|
|
||||||
var displayName: String {
|
var displayName: String {
|
||||||
switch self {
|
switch self {
|
||||||
case .e10: return "E10 Unleaded"
|
case .e10: return "Unleaded (E10)"
|
||||||
case .e5: return "E5 Premium"
|
case .e5: return "Premium (E5)"
|
||||||
case .diesel: return "Diesel"
|
case .diesel: return "Diesel"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user