import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:geosector_app/chat/pages/rooms_page_embedded.dart'; import 'package:geosector_app/core/services/chat_manager.dart'; import 'package:geosector_app/core/services/current_user_service.dart'; /// Page de communication adaptative qui s'ajuste selon le rôle de l'utilisateur /// et la plateforme (Web vs Mobile) class ChatCommunicationPage extends StatefulWidget { const ChatCommunicationPage({super.key}); @override State createState() => _ChatCommunicationPageState(); } class _ChatCommunicationPageState extends State { final GlobalKey _roomsPageKey = GlobalKey(); // Récupération du rôle de l'utilisateur int get _userRole => CurrentUserService.instance.currentUser?.role ?? 1; // Configuration selon le rôle MaterialColor get _themeColor { switch (_userRole) { case 1: return Colors.green; // Membre case 2: return Colors.red; // Admin Amicale case 9: return Colors.blue; // Super Admin default: return Colors.grey; } } @override Widget build(BuildContext context) { // Détection de la plateforme final isWeb = kIsWeb; // Construction adaptative if (isWeb) { return _buildWebLayout(context); } else { return _buildMobileLayout(context); } } /// Layout pour Web (Desktop) Widget _buildWebLayout(BuildContext context) { final theme = Theme.of(context); return Scaffold( backgroundColor: Colors.transparent, body: _buildContent(theme, isWeb: true), ); } /// Layout pour Mobile (iOS/Android) Widget _buildMobileLayout(BuildContext context) { final theme = Theme.of(context); return Scaffold( body: _buildContent(theme, isWeb: false), floatingActionButton: FloatingActionButton( onPressed: _handleNewConversation, backgroundColor: _themeColor, foregroundColor: Colors.white, child: const Icon(Icons.add), tooltip: 'Nouvelle conversation', ), ); } /// Contenu principal commun Widget _buildContent(ThemeData theme, {required bool isWeb}) { // Vérifier si le chat est initialisé if (!ChatManager.instance.isReady) { return Center( child: Padding( padding: const EdgeInsets.all(24.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( Icons.chat_bubble_outline, size: 80, color: _themeColor.withValues(alpha: 0.3), ), const SizedBox(height: 24), Text( 'Module de communication non disponible', style: theme.textTheme.titleLarge?.copyWith( color: theme.colorScheme.onSurface.withValues(alpha: 0.5), ), textAlign: TextAlign.center, ), const SizedBox(height: 8), Text( _getUnavailableMessage(), style: theme.textTheme.bodyMedium?.copyWith( color: theme.colorScheme.onSurface.withValues(alpha: 0.4), ), textAlign: TextAlign.center, ), if (_userRole == 9) ...[ const SizedBox(height: 16), ElevatedButton.icon( onPressed: _handleRetryInit, icon: const Icon(Icons.refresh), label: const Text('Réessayer'), style: ElevatedButton.styleFrom( backgroundColor: _themeColor, foregroundColor: Colors.white, ), ), ], ], ), ), ); } // Le chat est initialisé if (isWeb) { // Version Web sans en-tête return RoomsPageEmbedded( key: _roomsPageKey, onRefreshPressed: () { debugPrint('Conversations actualisées'); }, ); } else { // Version Mobile, contenu direct return RoomsPageEmbedded( key: _roomsPageKey, onRefreshPressed: () { debugPrint('Conversations actualisées'); }, ); } } /// Message personnalisé selon le rôle quand le chat n'est pas disponible String _getUnavailableMessage() { switch (_userRole) { case 1: return 'Le service de messagerie n\'est pas disponible actuellement.\nVous pourrez bientôt contacter les membres de votre amicale.'; case 2: return 'Le service de messagerie administration n\'est pas disponible.\nVous pourrez bientôt gérer les communications de votre amicale.'; case 9: return 'Le centre de communication GEOSECTOR est temporairement indisponible.\nVérifiez la connexion au serveur.'; default: return 'Le service de messagerie n\'est pas disponible actuellement.'; } } /// Gestionnaires d'événements void _handleNewConversation() { _roomsPageKey.currentState?.createNewConversation(); } void _handleRetryInit() async { // Réessayer l'initialisation du chat (pour Super Admin) await ChatManager.instance.reinitialize(); if (mounted) { setState(() {}); } } }