import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:tdesign_flutter/tdesign_flutter.dart'; import '../../core/theme/app_colors.dart'; import '../../shared/widgets/empty_state.dart'; import '../../shared/widgets/loading_widget.dart'; import 'message_controller.dart'; import 'message_model.dart'; class MessageListPage extends ConsumerWidget { const MessageListPage({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final messagesAsync = ref.watch(messageListProvider); return Scaffold( appBar: TDNavBar( title: '消息', titleColor: Colors.white, backgroundColor: const Color(0xFF00ABF3), centerTitle: false, useDefaultBack: false, ), body: messagesAsync.when( loading: () => const LoadingWidget(), error: (_, __) => const EmptyState(message: '加载失败'), data: (messages) => messages.isEmpty ? const EmptyState(message: '暂无消息') : ListView.separated( itemCount: messages.length, separatorBuilder: (_, __) => const TDDivider(), itemBuilder: (_, i) => _buildItem(context, messages[i]), ), ), ); } Widget _buildItem(BuildContext context, MessageModel msg) { return TDCell( imageWidget: TDAvatar( type: TDAvatarType.icon, size: TDAvatarSize.medium, shape: TDAvatarShape.circle, icon: msg.msgType == 'announcement' ? Icons.campaign : msg.msgType == 'approval_result' ? Icons.check_circle_outline : Icons.assignment_outlined, backgroundColor: msg.isRead ? const Color(0xFFF0F0F0) : AppColors.primaryLight, ), title: msg.title, description: msg.content, note: _formatTime(msg.createTime), arrow: true, onClick: (_) => _navigateToBiz(context, msg), ); } String _formatTime(DateTime time) { final now = DateTime.now(); final diff = now.difference(time); if (diff.inMinutes < 60) return '${diff.inMinutes}分钟前'; if (diff.inHours < 24) return '${diff.inHours}小时前'; if (diff.inDays < 7) return '${diff.inDays}天前'; return '${time.month}/${time.day}'; } void _navigateToBiz(BuildContext context, MessageModel msg) { if (msg.bizType == null || msg.bizId == null) return; switch (msg.bizType) { case 'expense': context.push('/expense/detail/${msg.bizId}'); break; case 'overtime': context.push('/overtime/detail/${msg.bizId}'); break; case 'vehicle': context.push('/vehicle/detail/${msg.bizId}'); break; case 'announcement': context.push('/announcement/detail/${msg.bizId}'); break; case 'expense_application': context.push('/expense-apply/detail/${msg.bizId}'); break; } } }