import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../controllers/notifications_controller.dart'; class NotificationsView extends StatelessWidget { const NotificationsView({super.key}); @override Widget build(BuildContext context) { final controller = Get.put(NotificationsController()); final isDark = Theme.of(context).brightness == Brightness.dark; return Scaffold( backgroundColor: isDark ? const Color(0xFF121212) : const Color(0xFFF5F7FA), appBar: AppBar( title: const Text('الإشعارات', style: TextStyle(fontWeight: FontWeight.bold)), backgroundColor: const Color(0xFF0F4C81), foregroundColor: Colors.white, actions: [ Obx(() => controller.unreadCount.value > 0 ? TextButton.icon( onPressed: () => controller.markAllRead(), icon: const Icon(Icons.done_all, color: Colors.white, size: 18), label: const Text('قراءة الكل', style: TextStyle(color: Colors.white, fontSize: 12)), ) : const SizedBox.shrink()), ], ), body: Obx(() { if (controller.isLoading.value) { return const Center(child: CircularProgressIndicator(color: Color(0xFF0F4C81))); } if (controller.notifications.isEmpty) { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon(Icons.notifications_none, size: 72, color: isDark ? Colors.white12 : Colors.grey.shade300), const SizedBox(height: 12), Text('لا توجد إشعارات', style: TextStyle(color: isDark ? Colors.white38 : Colors.grey, fontSize: 16)), ], ), ); } return RefreshIndicator( onRefresh: controller.fetchNotifications, child: ListView.builder( padding: const EdgeInsets.all(12), itemCount: controller.notifications.length, itemBuilder: (context, index) { final notif = controller.notifications[index]; return _buildNotifItem(notif, controller, isDark); }, ), ); }), ); } Widget _buildNotifItem(Map notif, NotificationsController ctrl, bool isDark) { final isRead = notif['is_read'] == 1; final type = notif['type']?.toString() ?? 'info'; final category = notif['category']?.toString() ?? 'general'; final IconData icon; final Color color; switch (type) { case 'success': icon = Icons.check_circle; color = const Color(0xFF10B981); break; case 'warning': icon = Icons.warning_amber_rounded; color = const Color(0xFFF59E0B); break; case 'error': icon = Icons.error; color = const Color(0xFFEF4444); break; default: icon = _categoryIcon(category); color = const Color(0xFF3B82F6); } return GestureDetector( onTap: () { if (!isRead) ctrl.markAsRead(notif['id']); if (notif['entity_type'] == 'invoice' && notif['entity_id'] != null) { Get.toNamed('/invoice-detail', arguments: {'id': notif['entity_id']}); } }, child: Container( margin: const EdgeInsets.only(bottom: 8), padding: const EdgeInsets.all(14), decoration: BoxDecoration( color: isRead ? (isDark ? const Color(0xFF1E1E2E) : Colors.white) : (isDark ? const Color(0xFF1A2332) : const Color(0xFFF0F7FF)), borderRadius: BorderRadius.circular(12), border: Border.all( color: isRead ? (isDark ? Colors.white10 : Colors.grey.shade200) : const Color(0xFF3B82F6).withValues(alpha: 0.2), ), ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( width: 42, height: 42, decoration: BoxDecoration( color: color.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(10), ), child: Icon(icon, color: color, size: 20), ), const SizedBox(width: 12), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: Text( notif['title'] ?? '', style: TextStyle( fontWeight: isRead ? FontWeight.w500 : FontWeight.w700, fontSize: 14, color: isDark ? Colors.white : Colors.black87, ), ), ), if (!isRead) Container( width: 8, height: 8, decoration: const BoxDecoration(shape: BoxShape.circle, color: Color(0xFF3B82F6)), ), ], ), if (notif['body'] != null && notif['body'].toString().isNotEmpty) ...[ const SizedBox(height: 4), Text( notif['body'], style: TextStyle(fontSize: 13, color: isDark ? Colors.white54 : Colors.grey.shade600), maxLines: 2, overflow: TextOverflow.ellipsis, ), ], const SizedBox(height: 6), Text( notif['created_at'] ?? '', style: TextStyle(fontSize: 11, color: isDark ? Colors.white24 : Colors.grey.shade400, fontFamily: 'monospace'), ), ], ), ), ], ), ), ); } IconData _categoryIcon(String category) { return switch (category) { 'invoice' => Icons.receipt_long, 'payment' => Icons.payment, 'subscription' => Icons.workspace_premium, 'system' => Icons.settings, _ => Icons.notifications, }; } }