import "package:auto_route/auto_route.dart"; import "package:flutter/material.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:smol_mail/data/providers/providers.dart"; import "package:smol_mail/presentation/routes/app_router.gr.dart"; import "package:smol_mail/presentation/theme/app_colors.dart"; import "package:smol_mail/shared/utils/avatar_color.dart"; import "package:smol_mail/shared/utils/format.dart"; import "package:smol_mail/smol/proto.dart"; import "package:smol_mail/smol/store.dart"; class MessageTile extends ConsumerWidget { final MailRecord record; const MessageTile({super.key, required this.record}); @override Widget build(BuildContext context, WidgetRef ref) { final folder = ref.watch(folderProvider); final store = ref.watch(storeProvider); final opened = ref.read(clientProvider).describe(record); final appColors = Theme.of(context).extension()!; String who; if (folder == "sent") { who = record.recipient ?? ""; } else if (opened.sender != null) { final known = store.addressForKey(opened.sender!); who = known ?? "unknown ยท ${b32encode(opened.sender!).substring(0, 4)}"; } else { who = "?"; } final unread = folder == "inbox" && !store.isRead(record.id); final errorText = opened.error != null ? "" : null; final subject = errorText ?? (opened.subject.isEmpty ? "(no subject)" : opened.subject); final snippet = errorText == null ? opened.body.replaceAll(RegExp(r"\s+"), " ").trim() : ""; final avatarColor = colorForKey(who, appColors.avatarPalette); return ListTile( splashColor: appColors.highlight, focusColor: appColors.cardFill, onTap: () { if (folder == "inbox") { store.markRead(record.id); ref.read(revisionProvider.notifier).bump(); } AutoRouter.of(context).push( MessageDetailRoute(folder: folder, id: record.id), ); }, leading: CircleAvatar( radius: 25, backgroundColor: avatarColor, child: Text( who.isEmpty ? "?" : who[0].toUpperCase(), style: Theme.of(context).textTheme.bodyLarge!.copyWith( color: contrastingTextColor(avatarColor), fontWeight: FontWeight.w500, ), ), ), title: Text( who, maxLines: 1, overflow: TextOverflow.ellipsis, style: Theme.of(context).textTheme.bodyMedium!.copyWith( fontWeight: unread ? FontWeight.bold : FontWeight.w500, ), ), subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( subject, overflow: TextOverflow.ellipsis, style: Theme.of(context).textTheme.titleMedium?.copyWith( fontWeight: unread ? FontWeight.w500 : FontWeight.w300, ), ), if (snippet.isNotEmpty) Text( snippet.length > 140 ? snippet.substring(0, 140) : snippet, overflow: TextOverflow.ellipsis, style: Theme.of(context).textTheme.titleMedium?.copyWith( color: appColors.snippetText, ), ) ], ), trailing: Text( formatShortTime(folder == "sent" ? record.sentAt : opened.time), style: Theme.of(context).textTheme.labelSmall, ), ); } }