FuelBoard Contributor
8646521176
Small widget: fuel-only relay fetch when no location, so default/Cheapest/Closest faces populate with real stations instead of sample data. Root cause of the persistent skeleton: favourites mode reads keychain (works on free accounts), but the non-favourites path needs stations — the app-group cache can be absent on free accounts and keychain can't hold the station dump, so with no location fix the widget fell through to SampleFuelProvider and never populated. Now when location is nil the widget fetches /api/v1/stations?fuel=X&limit=500 (fuel-only, cheapest-first, verified against the relay).
2026-08-13 18:51:41 +01:00
FuelBoard Contributor
38b47eea38
Widget gallery order + default-widget skeleton fix. (1) Register FuelPriceSmallWidget BEFORE FuelPriceWidget so the gallery lists small, then medium (bundle order = gallery order). (2) Revert entity resolution to LENIENT: the timeline request resolves the full configuration through the entity queries, and the b1765b5 strict entities(for:) (nil for the empty default favourite 'fuel|') failed resolution for default-config small widgets, stranding them on the iOS skeleton placeholder. entities(for:) now always returns a value; defaultResult() still auto-populates fresh widgets to the first fuel with a favourite / first favourite of that fuel.
2026-08-13 18:39:30 +01:00
FuelBoard Contributor
b1765b5611
Widget favourites defaults: auto-populate Fuel and Favourite rows when Sort = Favourites. FavouriteFuelQuery gains defaultResult() (first fuel with a favourite, Unleaded→Diesel order) and strict entities(for:) — a stored fuel that no longer has favourites fails resolution and falls back to the default. WidgetFavouriteQuery gains defaultResult() (first favourite of the Fuel row's fuel, else first favourite overall) and strict entities(for:) — the empty static default ('fuel|') and removed favourites now resolve to nil so the sheet pre-selects a real favourite instead of showing a placeholder. Provider fallback (cheapest favourite of the fuel) unchanged.
2026-08-13 18:28:23 +01:00
FuelBoard Contributor
906f8a8429
Small widget: declare config params in display order for every summary branch. If iOS falls back to declaration order when re-rendering the sheet after a parameter change, the favourites branch previously re-ordered to Sort by first (sort was declared before favouriteFuel). Now favouriteFuel, fuel, sort, favourite, distance — Favourites mode reads Fuel · Sort by · Favourite under either ordering mechanism. No encoding change (config keys are identifiers, order-independent).
2026-08-13 18:21:03 +01:00
FuelBoard Contributor
926317236a
Widget config sheets: unify row layout across both widgets — Fuel type first, then Sort by, then Favourite (Favourites sort only). Small widget's Favourites branch reordered from Sort/Fuel/Favourite to Fuel/Sort/Favourite, and the favourites-scoped fuel param retitled 'Fuel' so the row reads identically in every mode. Medium widget was already Fuel-first. No parameter type changes, so no stored-config reset beyond the normal reinstall.
2026-08-13 18:02:53 +01:00
FuelBoard Contributor
3e2d3775f2
Widget config sheet: revert WidgetSort to String-backed AppEnum. parameterSummary When(\.$sort, .equalTo, …) silently falls back to the otherwise branch for AppEntity parameters (iOS 17+ bug FB13263902), which hid the Favourite/Favourite Fuel rows on the small widget — the metadata compared against a literal 'WidgetSort.favourites' string instead of the enum case. String AppEnums match reliably (the d8506a0 form). Tradeoff: the Sort picker always offers Favourites; picking it with no favourites shows the empty state. FavouriteFuel entity + IntentParameterDependency filtering unchanged.
2026-08-13 17:48:33 +01:00
FuelBoard Contributor
d0bd4e7a8e
Small widget favourites config: fuel dictates the favourite list (@IntentParameterDependency filters picker options by the chosen fuel), fuel picker shows only fuels with favourites (FavouriteFuel entity), Favourites sort hidden when no favourites exist (WidgetSort → dynamic AppEntity), fuel tags removed from favourite rows
2026-08-13 17:14:14 +01:00
FuelBoard Contributor
d8506a035f
Small widget favourite picker: embed station name + multi-fuel flag in the WidgetFavourite entity so picker rows render with no storage read (config-sheet resolution can run without keychain/app-group access, which made every row show the 'Favourite' placeholder)
2026-08-13 17:00:17 +01:00
FuelBoard Contributor
7357eb98c3
Small widget favourites: fuel row returns to the config sheet (picks the default favourite); pinned favourite wins, fuel-tagged picker rows when favourites span >1 fuel; fallback = selected fuel's cheapest favourite
2026-08-13 16:51:21 +01:00
FuelBoard Contributor
1bdef59d78
Small widget: Favourites gains a picker to pin which favourite to show (separate FuelPriceWidgetSmall kind + AppEntity picker; medium keeps the list, no picker). Backlog: dual-unit widget picker labels
2026-08-13 15:49:18 +01:00
FuelBoard Contributor
26e724f48a
Widget config: Distance picker as AppEntity so labels resolve dynamically from the app's units (AppEnum labels are static)
2026-08-13 15:33:24 +01:00
FuelBoard Contributor
64330f96a8
Widget config: Distance picker mirrors the app's units setting (5 mi = 8 km) via dynamic AppEnum displayRepresentation
2026-08-13 15:25:20 +01:00
FuelBoard Contributor
2409b71f2f
Labels: pluralize miles (1 mile) and show true distances in the chosen unit (5 mi = 8 km) across Alerts/Stations pickers + captions
2026-08-13 15:10:23 +01:00
FuelBoard Contributor
490c343fd5
Alerts: mile-friendly radius 1/2/3/5/8 + Follow search (capped 8 mi); Live Activity Follow search; legacy radii clamped
2026-08-13 15:00:53 +01:00
FuelBoard Contributor
bb48995fac
Onboarding copy: tighten values (daily refresh, widget line, alert line)
2026-08-13 14:22:12 +01:00
FuelBoard Contributor
61bb61d802
Backlog: add GitHub production-data mirror (P3); mark API switch, unit tests, backoff done
2026-08-13 14:04:58 +01:00
FuelBoard Contributor
2d070fa3ba
Fuel colours: align with wheel palette — Unleaded #30D158, Premium #FFD60A, Diesel #64D2FF
2026-08-13 13:09:22 +01:00
FuelBoard Contributor
3fe2a7f03c
Onboarding copy: drop premium fuel mention, 'updated daily'
2026-08-13 13:02:50 +01:00
FuelBoard Contributor
0d91c82bb1
Localize all app copy via Localizable.strings
2026-08-13 10:57:36 +01:00
FuelBoard Contributor
bbe43a6149
Onboarding: Local Network confirmation matches other pages
...
Granted label now reads just 'Connected' with the green tick and uses
the same .subheadline confirmation styling as the Location and
Notifications pages.
2026-08-13 10:35:18 +01:00
FuelBoard Contributor
a1fa0f9998
Onboarding: silent Local Network pre-flight on replay
...
Replaying onboarding showed a visible probe on the 4th page because
iOS exposes no status API for the Local Network permission — the
connection attempt IS the only detector. Location and Notifications
query their status at init, so their ticks are already known when the
page appears; Local Network could only be known by probing.
Now, when onboarding is re-opened (already completed), a pre-flight
probe runs silently at open: granted connects in ms, denied reports
.waiting/.localNetworkDenied immediately, and a plain .waiting
(permission undetermined after a reinstall) cancels so page 4's
Continue still fires the prompt in context. By the time the data page
appears its tick (or denied text) is already on screen, matching the
other permission pages. First run is unchanged.
2026-08-13 10:29:20 +01:00
FuelBoard Contributor
ed243fae9e
Onboarding: show green tick on Local Network page before advancing
...
The probe result landed while the Local Network prompt was still
dismissing, so the granted tick was skipped and the page jumped
straight to the final slide. Hold 'Connected — prices will load'
on screen for a beat before auto-advancing, matching the visible
tick flow of the Location and Notifications pages.
2026-08-13 10:11:57 +01:00
FuelBoard Contributor
cb174f66fa
Settings About: drop redundant 'FuelBoard x.y(z)' footer
...
Version already shown in the Version row; the footer just duplicated it.
2026-08-13 10:06:51 +01:00