Release v26.04.18.1 — Offline-aware launch #28

Merged
bvandeusen merged 0 commits from dev into main 2026-04-18 12:58:55 -04:00
bvandeusen commented 2026-04-18 12:58:49 -04:00 (Migrated from git.fabledsword.com)

Summary

  • Add AuthStatus.offline and distinguish NetworkException from HTTP 401 in AuthNotifier.verify()
  • Persist has_ever_logged_in flag; splash lands returning users on the briefing (not login) when the server is unreachable
  • New OfflineBanner widget with retry button, mounted in _Shell for both narrow and wide layouts
  • Router redirect updated to treat offline + ever-logged-in as allowed navigation

Why

Previously, if the backend was unreachable at launch, the splash screen routed to the login screen. The server URL stayed in SharedPreferences but visually appeared lost — frustrating for any user who isn't the service operator.

Tier 2 followup

Real offline mode (local store, per-provider last-good caching, edit reconciliation) is tracked as Fable task #147 and is explicitly out of scope for this PR.

Test plan

  • Launch app with backend reachable, logged-in cookies → briefing opens (no banner)
  • Kill backend, relaunch app → briefing opens with offline banner, Retry button responds
  • Fresh install with backend unreachable → login screen (no banner, has_ever_logged_in = false)
  • Backend returns 401 on verify → login screen (not offline banner)
## Summary - Add `AuthStatus.offline` and distinguish `NetworkException` from HTTP 401 in `AuthNotifier.verify()` - Persist `has_ever_logged_in` flag; splash lands returning users on the briefing (not login) when the server is unreachable - New `OfflineBanner` widget with retry button, mounted in `_Shell` for both narrow and wide layouts - Router redirect updated to treat `offline + ever-logged-in` as allowed navigation ## Why Previously, if the backend was unreachable at launch, the splash screen routed to the login screen. The server URL stayed in SharedPreferences but visually appeared lost — frustrating for any user who isn't the service operator. ## Tier 2 followup Real offline mode (local store, per-provider last-good caching, edit reconciliation) is tracked as Fable task #147 and is explicitly out of scope for this PR. ## Test plan - [ ] Launch app with backend reachable, logged-in cookies → briefing opens (no banner) - [ ] Kill backend, relaunch app → briefing opens with offline banner, Retry button responds - [ ] Fresh install with backend unreachable → login screen (no banner, `has_ever_logged_in = false`) - [ ] Backend returns 401 on verify → login screen (not offline banner)
This repo is archived. You cannot comment on pull requests.
No Reviewers
No Label
1 Participants
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: bvandeusen/FabledApp#28