diff --git a/lib/data/repositories/email_repository_impl.dart b/lib/data/repositories/email_repository_impl.dart index 2744f98..c9a2de5 100644 --- a/lib/data/repositories/email_repository_impl.dart +++ b/lib/data/repositories/email_repository_impl.dart @@ -238,7 +238,12 @@ class EmailRepositoryImpl implements EmailRepository { try { await client.selectMailboxByPath(emailRow.mailboxPath); final fetch = await client.uidFetchMessage(emailRow.uid, '(BODY.PEEK[])'); - final msg = fetch.messages.first; + final msg = fetch.messages.firstOrNull; + if (msg == null) { + throw StateError( + 'IMAP server returned no message for UID ${emailRow.uid}.', + ); + } final textBody = msg.decodeTextPlainPart(); final rawHtml = msg.decodeTextHtmlPart(); final htmlBody = @@ -2813,7 +2818,12 @@ class EmailRepositoryImpl implements EmailRepository { emailRow.uid, 'BODY.PEEK[]', ); - final msg = fetch.messages.first; + final msg = fetch.messages.firstOrNull; + if (msg == null) { + throw StateError( + 'IMAP server returned no message for UID ${emailRow.uid}.', + ); + } final part = msg.getPart(attachment.fetchPartId) ?? msg; final bytes = part.decodeContentBinary(); if (bytes == null) { @@ -2879,7 +2889,13 @@ class EmailRepositoryImpl implements EmailRepository { emailRow.uid, 'BODY.PEEK[]', ); - return fetch.messages.first.renderMessage(); + final msg = fetch.messages.firstOrNull; + if (msg == null) { + throw StateError( + 'IMAP server returned no message for UID ${emailRow.uid}.', + ); + } + return msg.renderMessage(); } finally { await client.logout(); } diff --git a/lib/ui/screens/thread_detail_screen.dart b/lib/ui/screens/thread_detail_screen.dart index 6f6549c..2bddb64 100644 --- a/lib/ui/screens/thread_detail_screen.dart +++ b/lib/ui/screens/thread_detail_screen.dart @@ -163,6 +163,17 @@ class _EmailMessageCardState extends ConsumerState<_EmailMessageCard> { FutureBuilder( future: _bodyFuture, builder: (context, snapshot) { + if (snapshot.hasError) { + return Padding( + padding: const EdgeInsets.all(16), + child: Text( + 'Failed to load email: ${snapshot.error}', + style: TextStyle( + color: Theme.of(context).colorScheme.error, + ), + ), + ); + } if (!snapshot.hasData) { return const Center( child: Padding(