| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- 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;
- }
- }
- }
|