import 'package:flutter/material.dart'; import 'package:geosector_app/shared/app_theme.dart'; import 'package:geosector_app/presentation/widgets/chat/chat_sidebar.dart'; import 'package:geosector_app/presentation/widgets/chat/chat_messages.dart'; import 'package:geosector_app/presentation/widgets/chat/chat_input.dart'; class AdminCommunicationPage extends StatefulWidget { const AdminCommunicationPage({Key? key}) : super(key: key); @override State createState() => _AdminCommunicationPageState(); } class _AdminCommunicationPageState extends State { int selectedContactId = 0; String selectedContactName = ''; bool isTeamChat = true; String messageText = ''; bool isReplying = false; Map? replyingTo; // Données simulées pour les conversations d'équipe final List> teamContacts = [ { 'id': 1, 'name': 'Équipe', 'isGroup': true, 'lastMessage': 'Réunion à 14h aujourd\'hui', 'time': DateTime.now().subtract(const Duration(minutes: 30)), 'unread': 2, 'online': true, 'avatar': 'assets/images/team.png', }, { 'id': 2, 'name': 'Jean Dupont', 'isGroup': false, 'lastMessage': 'Je serai présent demain', 'time': DateTime.now().subtract(const Duration(hours: 1)), 'unread': 0, 'online': true, 'avatar': 'assets/images/avatar1.png', }, { 'id': 3, 'name': 'Marie Martin', 'isGroup': false, 'lastMessage': 'Secteur Sud terminé', 'time': DateTime.now().subtract(const Duration(hours: 3)), 'unread': 1, 'online': false, 'avatar': 'assets/images/avatar2.png', }, { 'id': 4, 'name': 'Pierre Legrand', 'isGroup': false, 'lastMessage': 'J\'ai une question sur mon secteur', 'time': DateTime.now().subtract(const Duration(days: 1)), 'unread': 0, 'online': false, 'avatar': 'assets/images/avatar3.png', }, ]; // Données simulées pour les conversations clients final List> clientContacts = [ { 'id': 101, 'name': 'Martin Durand', 'isGroup': false, 'lastMessage': 'Merci pour votre passage', 'time': DateTime.now().subtract(const Duration(hours: 5)), 'unread': 0, 'online': false, 'avatar': null, 'email': 'martin.durand@example.com', }, { 'id': 102, 'name': 'Sophie Lambert', 'isGroup': false, 'lastMessage': 'Question concernant le reçu', 'time': DateTime.now().subtract(const Duration(days: 1)), 'unread': 3, 'online': false, 'avatar': null, 'email': 'sophie.lambert@example.com', }, { 'id': 103, 'name': 'Thomas Bernard', 'isGroup': false, 'lastMessage': 'Rendez-vous manqué', 'time': DateTime.now().subtract(const Duration(days: 2)), 'unread': 0, 'online': false, 'avatar': null, 'email': 'thomas.bernard@example.com', }, ]; // Messages simulés pour la conversation sélectionnée final Map>> chatMessages = { 1: [ { 'id': 1, 'senderId': 2, 'senderName': 'Jean Dupont', 'message': 'Bonjour à tous, comment avance la collecte dans vos secteurs ?', 'time': DateTime.now().subtract(const Duration(days: 1, hours: 3)), 'isRead': true, 'avatar': 'assets/images/avatar1.png', }, { 'id': 2, 'senderId': 3, 'senderName': 'Marie Martin', 'message': 'J\'ai terminé le secteur Sud avec 45 passages réalisés !', 'time': DateTime.now() .subtract(const Duration(days: 1, hours: 2, minutes: 30)), 'isRead': true, 'avatar': 'assets/images/avatar2.png', }, { 'id': 3, 'senderId': 4, 'senderName': 'Pierre Legrand', 'message': 'Secteur Est en cours, j\'ai réalisé 28 passages pour l\'instant.', 'time': DateTime.now().subtract(const Duration(days: 1, hours: 2)), 'isRead': true, 'avatar': 'assets/images/avatar3.png', }, { 'id': 4, 'senderId': 0, 'senderName': 'Vous', 'message': 'Parfait, n\'oubliez pas la réunion de demain à 14h pour faire le point !', 'time': DateTime.now().subtract(const Duration(hours: 1)), 'isRead': true, }, { 'id': 5, 'senderId': 2, 'senderName': 'Jean Dupont', 'message': 'Je serai présent 👍', 'time': DateTime.now().subtract(const Duration(minutes: 30)), 'isRead': false, 'avatar': 'assets/images/avatar1.png', }, ], 2: [ { 'id': 101, 'senderId': 2, 'senderName': 'Jean Dupont', 'message': 'Bonjour, est-ce que je peux commencer le secteur Ouest demain ?', 'time': DateTime.now().subtract(const Duration(days: 2)), 'isRead': true, 'avatar': 'assets/images/avatar1.png', }, { 'id': 102, 'senderId': 0, 'senderName': 'Vous', 'message': 'Bonjour Jean, oui bien sûr. Les documents sont prêts.', 'time': DateTime.now() .subtract(const Duration(days: 2)) .add(const Duration(minutes: 15)), 'isRead': true, }, { 'id': 103, 'senderId': 2, 'senderName': 'Jean Dupont', 'message': 'Merci ! Je passerai les récupérer ce soir.', 'time': DateTime.now() .subtract(const Duration(days: 2)) .add(const Duration(minutes: 20)), 'isRead': true, 'avatar': 'assets/images/avatar1.png', }, { 'id': 104, 'senderId': 2, 'senderName': 'Jean Dupont', 'message': 'Je serai présent à la réunion de demain.', 'time': DateTime.now().subtract(const Duration(hours: 1)), 'isRead': true, 'avatar': 'assets/images/avatar1.png', }, ], 101: [ { 'id': 201, 'senderId': 101, 'senderName': 'Martin Durand', 'message': 'Bonjour, je voulais vous remercier pour votre passage. J\'ai bien reçu le reçu par email.', 'time': DateTime.now().subtract(const Duration(days: 1, hours: 5)), 'isRead': true, }, { 'id': 202, 'senderId': 0, 'senderName': 'Vous', 'message': 'Bonjour M. Durand, je vous remercie pour votre contribution. N\'hésitez pas si vous avez des questions.', 'time': DateTime.now().subtract(const Duration(days: 1, hours: 4)), 'isRead': true, }, { 'id': 203, 'senderId': 101, 'senderName': 'Martin Durand', 'message': 'Tout est parfait, merci !', 'time': DateTime.now().subtract(const Duration(hours: 5)), 'isRead': true, }, ], 102: [ { 'id': 301, 'senderId': 102, 'senderName': 'Sophie Lambert', 'message': 'Bonjour, je n\'ai pas reçu le reçu suite à mon paiement d\'hier. Pouvez-vous vérifier ?', 'time': DateTime.now().subtract(const Duration(days: 1, hours: 3)), 'isRead': true, }, { 'id': 302, 'senderId': 0, 'senderName': 'Vous', 'message': 'Bonjour Mme Lambert, je m\'excuse pour ce désagrément. Je vérifie cela immédiatement.', 'time': DateTime.now().subtract(const Duration(days: 1, hours: 2)), 'isRead': true, }, { 'id': 303, 'senderId': 0, 'senderName': 'Vous', 'message': 'Il semble qu\'il y ait eu un problème technique. Je viens de renvoyer le reçu à votre adresse email. Pourriez-vous vérifier si vous l\'avez bien reçu ?', 'time': DateTime.now().subtract(const Duration(days: 1, hours: 1)), 'isRead': true, }, { 'id': 304, 'senderId': 102, 'senderName': 'Sophie Lambert', 'message': 'Je n\'ai toujours rien reçu. Mon email est-il correct ? C\'est sophie.lambert@example.com', 'time': DateTime.now().subtract(const Duration(days: 1)), 'isRead': true, }, { 'id': 305, 'senderId': 102, 'senderName': 'Sophie Lambert', 'message': 'Est-ce que vous pouvez réessayer ?', 'time': DateTime.now().subtract(const Duration(hours: 5)), 'isRead': false, }, { 'id': 306, 'senderId': 102, 'senderName': 'Sophie Lambert', 'message': 'Toujours pas de nouvelles...', 'time': DateTime.now().subtract(const Duration(hours: 3)), 'isRead': false, }, { 'id': 307, 'senderId': 102, 'senderName': 'Sophie Lambert', 'message': 'Pouvez-vous me contacter dès que possible ?', 'time': DateTime.now().subtract(const Duration(hours: 1)), 'isRead': false, }, ], }; @override Widget build(BuildContext context) { final screenWidth = MediaQuery.of(context).size.width; final isDesktop = screenWidth > 800; return Row( children: [ // Sidebar des contacts (fixe sur desktop, conditional sur mobile) if (isDesktop || selectedContactId == 0) SizedBox( width: isDesktop ? 320 : screenWidth, child: ChatSidebar( teamContacts: teamContacts, clientContacts: clientContacts, isTeamChat: isTeamChat, selectedContactId: selectedContactId, onContactSelected: (contactId, contactName, isTeam) { setState(() { selectedContactId = contactId; selectedContactName = contactName; isTeamChat = isTeam; replyingTo = null; isReplying = false; }); }, onToggleGroup: (isTeam) { setState(() { isTeamChat = isTeam; selectedContactId = 0; selectedContactName = ''; }); }, ), ), // Vue des messages (conditionnelle sur mobile) if (isDesktop || selectedContactId != 0) Expanded( child: selectedContactId == 0 ? const Center( child: Text('Sélectionnez une conversation pour commencer'), ) : Column( children: [ // En-tête de la conversation Container( padding: const EdgeInsets.symmetric( horizontal: AppTheme.spacingL, vertical: AppTheme.spacingM, ), decoration: BoxDecoration( color: Colors.white, boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.05), blurRadius: 5, offset: const Offset(0, 2), ), ], ), child: Row( children: [ if (!isDesktop) IconButton( icon: const Icon(Icons.arrow_back), onPressed: () { setState(() { selectedContactId = 0; selectedContactName = ''; }); }, ), CircleAvatar( radius: 20, backgroundColor: AppTheme.primaryColor.withOpacity(0.2), backgroundImage: _getAvatarForContact(selectedContactId), child: _getAvatarForContact(selectedContactId) == null ? Text( selectedContactName.isNotEmpty ? selectedContactName[0].toUpperCase() : '', style: const TextStyle( color: AppTheme.primaryColor, fontWeight: FontWeight.bold, ), ) : null, ), const SizedBox(width: AppTheme.spacingM), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( selectedContactName, style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 16, ), ), if (!isTeamChat && selectedContactId > 100) Text( _getEmailForContact(selectedContactId), style: TextStyle( color: Colors.grey[600], fontSize: 12, ), ), ], ), ), IconButton( icon: const Icon(Icons.info_outline), onPressed: () { // Afficher les détails du contact }, ), ], ), ), // Messages Expanded( child: ChatMessages( messages: chatMessages[selectedContactId] ?? [], currentUserId: 0, onReply: (message) { setState(() { isReplying = true; replyingTo = message; }); }, ), ), // Zone de réponse if (isReplying) Container( padding: const EdgeInsets.all(AppTheme.spacingM), color: Colors.grey[100], child: Row( children: [ Container( width: 4, height: 40, decoration: BoxDecoration( color: AppTheme.primaryColor, borderRadius: BorderRadius.circular(2), ), ), const SizedBox(width: AppTheme.spacingM), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Réponse à ${replyingTo?['senderName']}', style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 12, color: AppTheme.primaryColor, ), ), Text( replyingTo?['message'] ?? '', maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 12, color: Colors.grey[600], ), ), ], ), ), IconButton( icon: const Icon(Icons.close), onPressed: () { setState(() { isReplying = false; replyingTo = null; }); }, ), ], ), ), // Zone de saisie du message ChatInput( onMessageSent: (text) { setState(() { // Ajouter le message à la conversation if (chatMessages[selectedContactId] != null) { final newMessageId = chatMessages[selectedContactId]!.last['id'] + 1; chatMessages[selectedContactId]!.add({ 'id': newMessageId, 'senderId': 0, 'senderName': 'Vous', 'message': text, 'time': DateTime.now(), 'isRead': false, 'replyTo': isReplying ? replyingTo : null, }); // Mise à jour du dernier message pour le contact final contactsList = isTeamChat ? teamContacts : clientContacts; final contactIndex = contactsList.indexWhere( (c) => c['id'] == selectedContactId); if (contactIndex != -1) { contactsList[contactIndex]['lastMessage'] = text; contactsList[contactIndex]['time'] = DateTime.now(); contactsList[contactIndex]['unread'] = 0; } isReplying = false; replyingTo = null; } }); }, ), ], ), ), ], ); } ImageProvider? _getAvatarForContact(int contactId) { String? avatarPath; if (isTeamChat) { final contact = teamContacts.firstWhere( (c) => c['id'] == contactId, orElse: () => {'avatar': null}, ); avatarPath = contact['avatar']; } else { final contact = clientContacts.firstWhere( (c) => c['id'] == contactId, orElse: () => {'avatar': null}, ); avatarPath = contact['avatar']; } return avatarPath != null ? AssetImage(avatarPath) : null; } String _getEmailForContact(int contactId) { if (!isTeamChat) { final contact = clientContacts.firstWhere( (c) => c['id'] == contactId, orElse: () => {'email': ''}, ); return contact['email'] ?? ''; } return ''; } }