import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:shamsi_date/shamsi_date.dart'; import 'notification_provider.dart'; import 'waiter_notification.dart'; class NotificationsScreen extends ConsumerWidget { const NotificationsScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final state = ref.watch(notificationProvider); final notifier = ref.read(notificationProvider.notifier); final theme = Theme.of(context); return Scaffold( appBar: AppBar( title: const Text('اعلان‌ها'), actions: [ if (state.unreadCount > 0) TextButton( onPressed: notifier.markAllRead, child: const Text('همه خوانده شد'), ), IconButton( icon: const Icon(Icons.refresh), tooltip: 'بارگذاری مجدد', onPressed: notifier.refresh, ), ], ), body: state.isLoading ? const Center(child: CircularProgressIndicator()) : state.items.isEmpty ? Center( child: Column( mainAxisSize: MainAxisSize.min, children: [ Icon(Icons.notifications_none, size: 56, color: theme.colorScheme.onSurface.withOpacity(0.3)), const SizedBox(height: 12), const Text('اعلانی وجود ندارد', style: TextStyle(fontSize: 15)), ], ), ) : RefreshIndicator( onRefresh: notifier.refresh, child: ListView.builder( padding: const EdgeInsets.symmetric(vertical: 8), itemCount: state.items.length, itemBuilder: (_, i) { final n = state.items[i]; return _NotificationTile( notification: n, onTap: () => notifier.markRead(n.id), ); }, ), ), ); } } class _NotificationTile extends StatelessWidget { const _NotificationTile({ required this.notification, required this.onTap, }); final WaiterNotification notification; final VoidCallback onTap; IconData get _icon { if (notification.isCallWaiter) return Icons.notifications_active; if (notification.isNewOrder) return Icons.restaurant; if (notification.isOrderReady) return Icons.check_circle_outline; return Icons.notifications; } Color _iconColor(BuildContext context) { final cs = Theme.of(context).colorScheme; if (notification.isCallWaiter) return cs.error; if (notification.isNewOrder) return cs.primary; if (notification.isOrderReady) return Colors.green; return cs.onSurfaceVariant; } String get _timeLabel { try { final j = Jalali.fromDateTime(notification.createdAt.toLocal()); final f = j.formatter; return '${f.d} ${f.mN} — ${notification.createdAt.toLocal().hour.toString().padLeft(2, '0')}:${notification.createdAt.toLocal().minute.toString().padLeft(2, '0')}'; } catch (_) { return ''; } } @override Widget build(BuildContext context) { final theme = Theme.of(context); final isUnread = !notification.isRead; return Padding( padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4), child: Material( color: isUnread ? theme.colorScheme.primaryContainer.withOpacity(0.25) : theme.colorScheme.surface, borderRadius: BorderRadius.circular(16), child: InkWell( borderRadius: BorderRadius.circular(16), onTap: onTap, child: Padding( padding: const EdgeInsets.all(14), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( width: 42, height: 42, decoration: BoxDecoration( color: _iconColor(context).withOpacity(0.12), borderRadius: BorderRadius.circular(12), ), child: Icon(_icon, color: _iconColor(context), size: 22), ), const SizedBox(width: 12), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: Text( notification.title, style: theme.textTheme.bodyMedium?.copyWith( fontWeight: isUnread ? FontWeight.bold : FontWeight.normal, ), ), ), if (isUnread) Container( width: 8, height: 8, decoration: BoxDecoration( color: theme.colorScheme.primary, shape: BoxShape.circle, ), ), ], ), if (notification.body != null) ...[ const SizedBox(height: 3), Text( notification.body!, style: theme.textTheme.bodySmall?.copyWith( color: theme.colorScheme.onSurfaceVariant, ), maxLines: 2, overflow: TextOverflow.ellipsis, ), ], const SizedBox(height: 4), Row( children: [ if (notification.tableNumber != null) ...[ Container( padding: const EdgeInsets.symmetric( horizontal: 8, vertical: 2), decoration: BoxDecoration( color: theme.colorScheme.surfaceContainerHighest, borderRadius: BorderRadius.circular(20), ), child: Text( 'میز ${notification.tableNumber}', style: theme.textTheme.labelSmall, ), ), const SizedBox(width: 6), ], Text( _timeLabel, style: theme.textTheme.labelSmall?.copyWith( color: theme.colorScheme.onSurfaceVariant, ), ), ], ), ], ), ), ], ), ), ), ), ); } }