import 'package:flutter/material.dart'; import '../../../core/l10n/l10n.dart'; enum MessageSender { user, ai } class ChatBubble extends StatelessWidget { final MessageSender sender; final String content; final DateTime timestamp; final bool showTimestamp; final Widget? extraContent; const ChatBubble({ super.key, required this.sender, required this.content, required this.timestamp, this.showTimestamp = true, this.extraContent, }); @override Widget build(BuildContext context) { final isUser = sender == MessageSender.user; final colorScheme = Theme.of(context).colorScheme; return Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 6), child: Column( crossAxisAlignment: isUser ? CrossAxisAlignment.end : CrossAxisAlignment.start, children: [ if (showTimestamp) Padding( padding: const EdgeInsets.only(bottom: 6), child: Text( _formatTimestamp(timestamp), style: TextStyle( fontSize: 11, color: colorScheme.onSurfaceVariant.withValues(alpha: 0.7), ), ), ), Container( constraints: BoxConstraints( maxWidth: MediaQuery.of(context).size.width * 0.82, ), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), decoration: BoxDecoration( color: isUser ? colorScheme.primary : colorScheme.surface, borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow( color: colorScheme.shadow.withValues(alpha: 0.08), blurRadius: 8, offset: const Offset(0, 2), ), ], ), child: content.isNotEmpty ? Text( content, style: TextStyle( fontSize: 15, color: isUser ? colorScheme.onPrimary : colorScheme.onSurface, height: 1.45, ), ) : (extraContent ?? const SizedBox.shrink()), ), ], ), ); } String _formatTimestamp(DateTime time) { final now = DateTime.now(); final today = DateTime(now.year, now.month, now.day); final msgDate = DateTime(time.year, time.month, time.day); String dateStr; if (msgDate == today) { dateStr = L10n.current.chatTimestampToday; } else if (msgDate == today.subtract(const Duration(days: 1))) { dateStr = L10n.current.chatTimestampYesterday; } else { dateStr = L10n.current.chatTimestampMonthDay(time.month, time.day); } final timeStr = '${time.hour.toString().padLeft(2, '0')}:${time.minute.toString().padLeft(2, '0')}'; return '$dateStr $timeStr'; } }