Combined Inbox #376

Closed
opened 2026-06-03 20:32:14 +00:00 by guettli · 3 comments
guettli commented 2026-06-03 20:32:14 +00:00 (Migrated from codeberg.org)

Create a combined inbox which shows the combined messages from the inboxes of all accounts.

This view should be the fefu, when the app starts. Except there is no account yet, then show the account list, so a new account can be added.

Create a combined inbox which shows the combined messages from the inboxes of all accounts. This view should be the fefu, when the app starts. Except there is no account yet, then show the account list, so a new account can be added.
guettlibot commented 2026-06-03 22:05:03 +00:00 (Migrated from codeberg.org)

The PR is open at https://codeberg.org/guettli/sharedinbox/pulls/379.


Here's a summary of what was implemented for issue #376:

New screen: CombinedInboxScreen

  • Shows threads from the INBOX mailbox of every account, sorted by date
  • Per-account name label on each thread tile (when multiple accounts configured)
  • Swipe left to archive, swipe right to delete (with undo support)
  • Pull-to-refresh triggers sync on all accounts
  • Load-more pagination (50 threads at a time)
  • FAB to compose, drawer with links to accounts and per-account mailbox navigation
  • On startup with no accounts: automatically redirects to /accounts so the user can add one

Data layer: observeAllInboxThreads()

  • New method in EmailRepository (interface + implementation)
  • Uses a Drift SQL JOIN between threads and mailboxes filtered to role = 'inbox', covering both IMAP and JMAP accounts
  • All 5 test fakes and 2 auto-generated mocks updated to implement the new abstract method

Routing

  • New /inbox route in the router
  • initialLocation changed from /accounts to /inbox
The PR is open at https://codeberg.org/guettli/sharedinbox/pulls/379. --- Here's a summary of what was implemented for issue #376: **New screen: `CombinedInboxScreen`** - Shows threads from the INBOX mailbox of every account, sorted by date - Per-account name label on each thread tile (when multiple accounts configured) - Swipe left to archive, swipe right to delete (with undo support) - Pull-to-refresh triggers sync on all accounts - Load-more pagination (50 threads at a time) - FAB to compose, drawer with links to accounts and per-account mailbox navigation - On startup with no accounts: automatically redirects to `/accounts` so the user can add one **Data layer: `observeAllInboxThreads()`** - New method in `EmailRepository` (interface + implementation) - Uses a Drift SQL JOIN between `threads` and `mailboxes` filtered to `role = 'inbox'`, covering both IMAP and JMAP accounts - All 5 test fakes and 2 auto-generated mocks updated to implement the new abstract method **Routing** - New `/inbox` route in the router - `initialLocation` changed from `/accounts` to `/inbox`
guettli commented 2026-06-04 00:28:35 +00:00 (Migrated from codeberg.org)

Fix CI

Fix CI
guettlibot commented 2026-06-04 00:35:02 +00:00 (Migrated from codeberg.org)

PR opened at https://codeberg.org/guettli/sharedinbox/pulls/392.


Here's what was implemented for issue #376:

Combined Inbox screen (lib/ui/screens/combined_inbox_screen.dart):

  • Shows threads from the INBOX mailbox of every configured account, merged and sorted by latest date
  • On startup with no accounts → automatically redirects to the account list
  • Swipe left to archive, swipe right to delete (with undo)
  • Pull-to-refresh syncs all accounts
  • "Load more" pagination (50 per page)
  • Per-account name label on each thread tile when multiple accounts are set up
  • Compose FAB; drawer with links to account mailboxes, add account, preferences, etc.

Data layerEmailRepository.observeAllInboxThreads() joins the threads table with mailboxes on role = 'inbox', so it works for both IMAP (RFC 6154 special-use attributes) and JMAP accounts.

Routing/inbox added as a new route; initialLocation changed from /accounts to /inbox.

Tests — all five hand-written fakes and two Mockito-generated mocks updated to implement the new abstract method.

PR opened at https://codeberg.org/guettli/sharedinbox/pulls/392. --- Here's what was implemented for issue #376: **Combined Inbox screen** (`lib/ui/screens/combined_inbox_screen.dart`): - Shows threads from the INBOX mailbox of every configured account, merged and sorted by latest date - On startup with no accounts → automatically redirects to the account list - Swipe left to archive, swipe right to delete (with undo) - Pull-to-refresh syncs all accounts - "Load more" pagination (50 per page) - Per-account name label on each thread tile when multiple accounts are set up - Compose FAB; drawer with links to account mailboxes, add account, preferences, etc. **Data layer** — `EmailRepository.observeAllInboxThreads()` joins the `threads` table with `mailboxes` on `role = 'inbox'`, so it works for both IMAP (RFC 6154 special-use attributes) and JMAP accounts. **Routing** — `/inbox` added as a new route; `initialLocation` changed from `/accounts` to `/inbox`. **Tests** — all five hand-written fakes and two Mockito-generated mocks updated to implement the new abstract method.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: guettli/sharedinbox#376