kirakira/lib/presentation/widgets/message/message_tile.dart

102 lines
3.4 KiB
Dart
Raw Normal View History

2024-02-17 20:32:01 +05:30
import "package:auto_route/auto_route.dart";
import "package:flutter/material.dart";
import "package:flutter_riverpod/flutter_riverpod.dart";
2024-02-17 20:32:01 +05:30
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";
2024-02-17 20:32:01 +05:30
class MessageTile extends ConsumerWidget {
final MailRecord record;
2024-02-17 20:32:01 +05:30
const MessageTile({super.key, required this.record});
2024-02-17 20:32:01 +05:30
@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<AppColors>()!;
2024-02-17 20:32:01 +05:30
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 ? "<unreadable>" : 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);
2024-02-17 20:32:01 +05:30
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),
);
},
2024-02-17 20:32:01 +05:30
leading: CircleAvatar(
radius: 25,
backgroundColor: avatarColor,
2024-02-17 20:32:01 +05:30
child: Text(
who.isEmpty ? "?" : who[0].toUpperCase(),
2024-02-17 20:32:01 +05:30
style: Theme.of(context).textTheme.bodyLarge!.copyWith(
color: contrastingTextColor(avatarColor),
2024-02-17 20:32:01 +05:30
fontWeight: FontWeight.w500,
),
),
),
title: Text(
who,
maxLines: 1,
overflow: TextOverflow.ellipsis,
2024-02-17 20:32:01 +05:30
style: Theme.of(context).textTheme.bodyMedium!.copyWith(
fontWeight: unread ? FontWeight.bold : FontWeight.w500,
2024-02-17 20:32:01 +05:30
),
),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
subject,
2024-02-17 20:32:01 +05:30
overflow: TextOverflow.ellipsis,
style: Theme.of(context).textTheme.titleMedium?.copyWith(
fontWeight: unread ? FontWeight.w500 : FontWeight.w300,
2024-02-17 20:32:01 +05:30
),
),
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,
),
)
2024-02-17 20:32:01 +05:30
],
),
trailing: Text(
formatShortTime(folder == "sent" ? record.sentAt : opened.time),
style: Theme.of(context).textTheme.labelSmall,
),
2024-02-17 20:32:01 +05:30
);
}
}