import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import '../models/notification_model.dart'; import '../services/notification_manager.dart'; class NotificationScreen extends StatefulWidget { const NotificationScreen({super.key}); @override NotificationScreenState createState() => NotificationScreenState(); } class NotificationScreenState extends State { final NotificationManager _notificationManager = NotificationManager(); @override void initState() { super.initState(); _notificationManager.addListener(_onNotificationsChanged); } @override void dispose() { _notificationManager.removeListener(_onNotificationsChanged); super.dispose(); } void _onNotificationsChanged() { if (mounted) { setState(() {}); } } @override Widget build(BuildContext context) { final notifications = _notificationManager.notifications; final unreadCount = _notificationManager.unreadCount; return Scaffold( backgroundColor: Colors.grey.shade50, appBar: AppBar( backgroundColor: Colors.white, elevation: 0, title: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Notifikasi', style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: Colors.black, ), ), Text( '${notifications.length} notifikasi', style: const TextStyle( fontSize: 11, color: Colors.grey, ), ), ], ), actions: [ if (unreadCount > 0) TextButton( onPressed: () => _notificationManager.markAllAsRead(), child: const Text( 'Tandai Semua', style: TextStyle( fontSize: 12, color: Colors.blue, ), ), ), PopupMenuButton( icon: const Icon(Icons.more_vert, color: Colors.black), itemBuilder: (context) => [ const PopupMenuItem( value: 'clear', child: Row( children: [ Icon(Icons.delete_outline, size: 20, color: Colors.red), SizedBox(width: 8), Text('Hapus Semua'), ], ), ), ], onSelected: (value) { if (value == 'clear') { showDialog( context: context, builder: (context) => AlertDialog( title: const Text('Hapus Semua Notifikasi?'), content: const Text('Semua notifikasi akan dihapus permanen.'), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: const Text('Batal'), ), TextButton( onPressed: () { _notificationManager.clearAll(); Navigator.pop(context); }, child: const Text( 'Hapus', style: TextStyle(color: Colors.red), ), ), ], ), ); } }, ), ], ), body: notifications.isEmpty ? _buildEmptyState() : ListView.builder( padding: const EdgeInsets.all(12), itemCount: notifications.length, itemBuilder: (context, index) { final notification = notifications[index]; return _buildNotificationCard(notification); }, ), ); } Widget _buildEmptyState() { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( Icons.notifications_none, size: 80, color: Colors.grey.shade300, ), const SizedBox(height: 16), Text( 'Tidak Ada Notifikasi', style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: Colors.grey.shade600, ), ), const SizedBox(height: 8), Text( 'Semua notifikasi akan muncul di sini', style: TextStyle( fontSize: 14, color: Colors.grey.shade500, ), ), ], ), ); } Widget _buildNotificationCard(NotificationItem notification) { final iconColor = NotificationHelper.getColor(notification.type); final iconData = NotificationHelper.getIcon(notification.type); final bgColor = NotificationHelper.getBackgroundColor(notification.type); return Dismissible( key: Key(notification.id), direction: DismissDirection.endToStart, background: Container( margin: const EdgeInsets.only(bottom: 10), decoration: BoxDecoration( color: Colors.red, borderRadius: BorderRadius.circular(12), ), alignment: Alignment.centerRight, padding: const EdgeInsets.only(right: 20), child: const Icon( Icons.delete, color: Colors.white, size: 28, ), ), onDismissed: (direction) { _notificationManager.deleteNotification(notification.id); ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Notifikasi dihapus'), duration: Duration(seconds: 2), ), ); }, child: GestureDetector( onTap: () { if (!notification.isRead) { _notificationManager.markAsRead(notification.id); } }, child: Container( margin: const EdgeInsets.only(bottom: 10), padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: notification.isRead ? Colors.white : bgColor.withOpacity(0.3), borderRadius: BorderRadius.circular(12), border: Border.all( color: notification.isRead ? Colors.grey.shade200 : iconColor.withOpacity(0.3), width: 1, ), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.03), blurRadius: 8, offset: const Offset(0, 2), ), ], ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Icon Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: bgColor, borderRadius: BorderRadius.circular(8), ), child: Icon( iconData, color: iconColor, size: 20, ), ), const SizedBox(width: 12), // Content Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: Text( notification.title, style: TextStyle( fontSize: 13, fontWeight: notification.isRead ? FontWeight.w600 : FontWeight.bold, color: Colors.black87, ), maxLines: 1, overflow: TextOverflow.ellipsis, ), ), if (!notification.isRead) Container( width: 8, height: 8, decoration: const BoxDecoration( color: Colors.blue, shape: BoxShape.circle, ), ), ], ), const SizedBox(height: 4), Text( notification.message, style: TextStyle( fontSize: 12, color: Colors.grey.shade700, height: 1.3, ), maxLines: 2, overflow: TextOverflow.ellipsis, ), const SizedBox(height: 6), Row( children: [ Icon( Icons.access_time, size: 12, color: Colors.grey.shade500, ), const SizedBox(width: 4), Text( _formatTimestamp(notification.timestamp), style: TextStyle( fontSize: 11, color: Colors.grey.shade500, ), ), ], ), ], ), ), ], ), ), ), ); } String _formatTimestamp(DateTime timestamp) { final now = DateTime.now(); final difference = now.difference(timestamp); if (difference.inMinutes < 1) { return 'Baru saja'; } else if (difference.inMinutes < 60) { return '${difference.inMinutes} menit lalu'; } else if (difference.inHours < 24) { return '${difference.inHours} jam lalu'; } else if (difference.inDays < 7) { return '${difference.inDays} hari lalu'; } else { return DateFormat('dd MMM yyyy, HH:mm').format(timestamp); } } }