Onboarding: first-run navigation scaffold + welcome #26

Closed
opened 2026-07-01 03:49:14 +00:00 by JMR-dev · 0 comments
JMR-dev commented 2026-07-01 03:49:14 +00:00 (Migrated from github.com)

Part of #9.

Context

Today the app opens straight to MAILBOX; with no accounts it shows NoAccountState
(a blank inbox with an "Add account" button) in MailboxScreen.kt. The onboarding epic
replaces that with a guided flow. This ticket builds the navigation skeleton the other
onboarding tickets plug into.

Scope

  • Add an onboarding route/graph and a welcome screen that invites the user to add
    their email accounts (replaces the blank-inbox + "Add account" experience).
  • Gate the start destination: when there are no accounts, the app opens onboarding
    instead of MAILBOX; when accounts exist, it opens MAILBOX as today. Observe the
    account count and avoid a flash of the wrong screen on cold start (hold the splash /
    render nothing until the count is known).
  • Wire the flow shape: welcome → vendor picker (#27) → setup path → "add another?"
    (#30) → inbox.
  • Own the onboarding-session state that #30 needs (e.g. a nav-graph-scoped ViewModel
    or saved-state holder) so the "first account added this session" can be tracked.
  • Keep "Add account" reachable later from Settings and the mailbox, re-entering the
    same picker/setup screens (reuse, don't duplicate).
  • Remove/replace NoAccountState now that onboarding covers the empty case.

Acceptance criteria

  • Fresh install with zero accounts lands on the onboarding welcome, not a blank inbox.
  • Launching with >= 1 account still opens the mailbox directly, with no onboarding flash.
  • Completing onboarding lands on a real inbox (first-account landing handled in #30).

Relevant files

  • app/src/main/kotlin/org/libremail/ui/LibreMailApp.kt (NavHost, startDestination)
  • app/src/main/kotlin/org/libremail/ui/navigation/Routes.kt
  • app/src/main/kotlin/org/libremail/ui/mailbox/MailboxScreen.kt (NoAccountState)

Dependencies

Foundational — unblocks #27 and #30.

Part of #9. ## Context Today the app opens straight to `MAILBOX`; with no accounts it shows `NoAccountState` (a blank inbox with an "Add account" button) in `MailboxScreen.kt`. The onboarding epic replaces that with a guided flow. This ticket builds the navigation skeleton the other onboarding tickets plug into. ## Scope - [ ] Add an onboarding route/graph and a **welcome screen** that invites the user to add their email accounts (replaces the blank-inbox + "Add account" experience). - [ ] Gate the start destination: when there are **no accounts**, the app opens onboarding instead of `MAILBOX`; when accounts exist, it opens `MAILBOX` as today. Observe the account count and avoid a flash of the wrong screen on cold start (hold the splash / render nothing until the count is known). - [ ] Wire the flow shape: welcome → vendor picker (#27) → setup path → "add another?" (#30) → inbox. - [ ] Own the onboarding-session state that #30 needs (e.g. a nav-graph-scoped ViewModel or saved-state holder) so the "first account added this session" can be tracked. - [ ] Keep "Add account" reachable later from Settings and the mailbox, re-entering the **same** picker/setup screens (reuse, don't duplicate). - [ ] Remove/replace `NoAccountState` now that onboarding covers the empty case. ## Acceptance criteria - Fresh install with zero accounts lands on the onboarding welcome, not a blank inbox. - Launching with >= 1 account still opens the mailbox directly, with no onboarding flash. - Completing onboarding lands on a real inbox (first-account landing handled in #30). ## Relevant files - `app/src/main/kotlin/org/libremail/ui/LibreMailApp.kt` (NavHost, `startDestination`) - `app/src/main/kotlin/org/libremail/ui/navigation/Routes.kt` - `app/src/main/kotlin/org/libremail/ui/mailbox/MailboxScreen.kt` (`NoAccountState`) ## Dependencies Foundational — unblocks #27 and #30.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: JMR-dev/LibreMail#26