When the most recent background sync fails, a MaterialBanner now appears at the top of the email list showing the error with Retry and Dismiss actions. It disappears automatically once a subsequent sync succeeds.
Changes:
SyncLogRepository.observeLastError() — lightweight stream returning the last error message or null when the last sync was successful.
syncLastErrorProvider — StreamProvider.family wiring it into Riverpod.
EmailListScreen — new _buildSyncErrorBanner() widget; tracks dismissed error per session so users aren't nagged after dismissing.
When the most recent background sync fails, a `MaterialBanner` now appears at the top of the email list showing the error with **Retry** and **Dismiss** actions. It disappears automatically once a subsequent sync succeeds.
**Changes:**
- `SyncLogRepository.observeLastError()` — lightweight stream returning the last error message or null when the last sync was successful.
- `syncLastErrorProvider` — `StreamProvider.family` wiring it into Riverpod.
- `EmailListScreen` — new `_buildSyncErrorBanner()` widget; tracks dismissed error per session so users aren't nagged after dismissing.
Closes part of #19
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
When the most recent background sync fails, a
MaterialBannernow appears at the top of the email list showing the error with Retry and Dismiss actions. It disappears automatically once a subsequent sync succeeds.Changes:
SyncLogRepository.observeLastError()— lightweight stream returning the last error message or null when the last sync was successful.syncLastErrorProvider—StreamProvider.familywiring it into Riverpod.EmailListScreen— new_buildSyncErrorBanner()widget; tracks dismissed error per session so users aren't nagged after dismissing.Closes part of #19