Files
geo/app/lib/presentation/chat/chat_communication_page.dart
Pierre f7baa7492c feat: Mise à jour des interfaces mobiles v3.2.3
- Amélioration des interfaces utilisateur sur mobile
- Optimisation de la responsivité des composants Flutter
- Mise à jour des widgets de chat et communication
- Amélioration des formulaires et tableaux
- Ajout de nouveaux composants pour l'administration
- Optimisation des thèmes et styles visuels

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-02 20:35:40 +02:00

166 lines
5.3 KiB
Dart

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<ChatCommunicationPage> createState() => _ChatCommunicationPageState();
}
class _ChatCommunicationPageState extends State<ChatCommunicationPage> {
final GlobalKey<RoomsPageEmbeddedState> _roomsPageKey = GlobalKey<RoomsPageEmbeddedState>();
// 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(() {});
}
}
}