feat: pre-fetch next email body to eliminate loading delay after delete (#381)
## Summary - When viewing an email and then deleting (or archiving/moving/snoozing) it, the app navigates to the next email in the thread list. - `getEmailBody` fetches from the network on a cache miss, causing the hourglass / loading spinner the issue describes. - `EmailDetailNotifier` now fires a background `getEmailBody` call for the next thread's `latestEmailId` as soon as the current email finishes loading. - `getEmailBody` already caches results in the `EmailBodies` table with a 7-day TTL, so by the time the user triggers a navigation action the body is pre-warmed and renders instantly. ## What changed `lib/di.dart` — `EmailDetailNotifier.build()` calls `_prefetchNextEmailBody` (fire-and-forget via `unawaited`) after loading the current email. The helper respects the `afterMailViewAction` user preference: if set to `showMailbox` it does nothing. ## Test plan - [ ] Open an email, delete it — next email should appear without the spinner - [ ] Verify the same for archive, move, and snooze actions - [ ] Verify behaviour is unchanged when `afterMailViewAction` is set to `showMailbox` - [ ] Verify the last email in the list still pops back to the mailbox list correctly Closes #367 Co-authored-by: Thomas SharedInbox <sharedinbox@thomas-guettler.de> Reviewed-on: https://codeberg.org/guettli/sharedinbox/pulls/381
This commit was merged in pull request #381.
This commit is contained in:
committed by
guettli
co-authored by
guettli
Thomas SharedInbox
parent
692fa14d4d
commit
f92f3debd7
+24
@@ -211,8 +211,32 @@ class EmailDetailNotifier extends AsyncNotifier<(Email?, EmailBody)> {
|
||||
repo.getEmailBody(_emailId),
|
||||
]);
|
||||
unawaited(repo.setFlag(_emailId, seen: true));
|
||||
final header = results[0] as Email?;
|
||||
if (header != null) {
|
||||
unawaited(_prefetchNextEmailBody(repo, header));
|
||||
}
|
||||
return (results[0] as Email?, results[1] as EmailBody);
|
||||
}
|
||||
|
||||
Future<void> _prefetchNextEmailBody(
|
||||
EmailRepository repo,
|
||||
Email header,
|
||||
) async {
|
||||
final prefs = ref.read(userPreferencesProvider).value;
|
||||
final action =
|
||||
prefs?.afterMailViewAction ?? AfterMailViewAction.nextMessage;
|
||||
if (action != AfterMailViewAction.nextMessage) return;
|
||||
|
||||
final threads =
|
||||
await repo.observeThreads(header.accountId, header.mailboxPath).first;
|
||||
final currentIndex = threads.indexWhere(
|
||||
(t) => t.emailIds.contains(_emailId),
|
||||
);
|
||||
if (currentIndex < 0 || currentIndex + 1 >= threads.length) return;
|
||||
|
||||
final nextId = threads[currentIndex + 1].latestEmailId;
|
||||
await repo.getEmailBody(nextId);
|
||||
}
|
||||
}
|
||||
|
||||
final accountByIdProvider =
|
||||
|
||||
Reference in New Issue
Block a user