// Version: 1.0.0 | Created: 2026-04-01 // Individual room list tile. Kept under 100 lines. import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:timeago/timeago.dart' as timeago; import '../domain/room_model.dart'; class RoomTile extends StatelessWidget { const RoomTile({super.key, required this.room, required this.onTap}); final RoomModel room; final VoidCallback onTap; @override Widget build(BuildContext context) { final theme = Theme.of(context); final hasUnread = room.unreadCount > 0; return ListTile( leading: _RoomAvatar(room: room), title: Text( room.displayName, style: theme.textTheme.bodyLarge?.copyWith( fontWeight: hasUnread ? FontWeight.w600 : FontWeight.normal, ), maxLines: 1, overflow: TextOverflow.ellipsis, ), subtitle: room.lastMessagePreview != null ? Text( room.lastMessagePreview!, maxLines: 1, overflow: TextOverflow.ellipsis, style: theme.textTheme.bodySmall?.copyWith( color: theme.colorScheme.onSurface.withAlpha(153), ), ) : null, trailing: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.end, children: [ if (room.lastActivityAt != null) Text( timeago.format(room.lastActivityAt!, locale: 'en_short'), style: theme.textTheme.labelSmall?.copyWith( color: hasUnread ? theme.colorScheme.primary : theme.colorScheme.onSurface.withAlpha(102), ), ), if (hasUnread) ...[ const SizedBox(height: 4), _UnreadBadge(count: room.unreadCount), ], ], ), onTap: onTap, ); } } class _RoomAvatar extends StatelessWidget { const _RoomAvatar({required this.room}); final RoomModel room; @override Widget build(BuildContext context) { final theme = Theme.of(context); final initials = room.displayName.isNotEmpty ? room.displayName[0].toUpperCase() : '?'; if (room.avatarUrl != null) { return CircleAvatar( radius: 24, backgroundImage: CachedNetworkImageProvider(room.avatarUrl!), backgroundColor: theme.colorScheme.surfaceContainerHighest, ); } return CircleAvatar( radius: 24, backgroundColor: theme.colorScheme.primary.withAlpha(51), child: Text( initials, style: TextStyle( color: theme.colorScheme.primary, fontWeight: FontWeight.bold, ), ), ); } } class _UnreadBadge extends StatelessWidget { const _UnreadBadge({required this.count}); final int count; @override Widget build(BuildContext context) { final label = count > 99 ? '99+' : count.toString(); return Container( padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2), decoration: BoxDecoration( color: Theme.of(context).colorScheme.primary, borderRadius: BorderRadius.circular(10), ), child: Text( label, style: const TextStyle( color: Colors.white, fontSize: 11, fontWeight: FontWeight.bold, ), ), ); } }