Files
geo/app/docs/CHAT-LOADING-OPTIMIZATION.md

4.5 KiB

🚀 Optimisation du Chargement des Conversations Chat

📋 Problème résolu

Les utilisateurs rencontraient des temps d'attente importants lors de la création de conversations avec des groupes prédéfinis comme "Toute l'amicale" ou "Support GEOSECTOR", sans indicateur visuel ni protection contre les doubles clics.

Solutions implémentées

1. 🔄 LoadingOverlay pour les opérations longues

  • Indicateur visuel : Affichage d'un spinner avec message pendant le traitement
  • Messages personnalisés :
    • "Création de la conversation avec toute l'amicale..."
    • "Création de la conversation avec le support GEOSECTOR..."
    • "Création de la conversation avec les administrateurs..."
    • "Création de l'annonce pour tous les administrateurs..."
  • Feedback immédiat : L'utilisateur sait que l'action est en cours

2. 🛡️ Protection contre les doubles clics

  • État _isProcessingAction : Empêche le déclenchement multiple de la même action
  • Désactivation des boutons : Les boutons deviennent inactifs pendant le traitement
  • Réactivation automatique : Une fois l'action terminée (succès ou erreur)

3. 🎯 Refactoring des méthodes d'action rapide

  • Séparation des responsabilités :
    • _handleQuickActionXxx() : Gère l'UI et le LoadingOverlay
    • _createXxxRoom() : Effectue la création réelle de la conversation
  • Gestion d'erreurs améliorée : Utilisation de rethrow pour propager les erreurs au LoadingOverlay

📝 Fichiers modifiés

lib/chat/pages/rooms_page_embedded.dart

  • Ajout de l'import : LoadingOverlay
  • Nouvelle variable d'état : bool _isProcessingAction = false
  • Méthodes modifiées :
    • _handleQuickActionAmicale() + _createAmicaleRoom()
    • _handleQuickActionGeosector() + _createGeosectorRoom()
    • _handleQuickActionAdmins() + _createAdminsRoom()
    • _handleQuickActionAllAdmins() + _createAllAdminsRoom()
  • Boutons modifiés : Ajout de la condition _isProcessingAction pour désactiver

🔧 Détails techniques

Pattern utilisé

Future<void> _handleQuickActionXxx() async {
  // Protection contre les doubles clics
  if (_isProcessingAction) return;
  
  setState(() {
    _isProcessingAction = true;
  });
  
  try {
    // Utiliser LoadingOverlay pour l'opération longue
    await LoadingOverlay.show(
      context: context,
      message: 'Message de chargement...',
      future: _createXxxRoom(),
    );
  } catch (e) {
    // Gestion d'erreur
    if (mounted) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: Text('Erreur: ${e.toString()}'),
          backgroundColor: Colors.red,
        ),
      );
    }
  } finally {
    // Réactivation des boutons
    if (mounted) {
      setState(() {
        _isProcessingAction = false;
      });
    }
  }
}

Protection des boutons

onPressed: (_isProcessingAction || autreCondition) 
  ? null 
  : () => _handleQuickAction(),

📈 Bénéfices

  • Meilleure UX : L'utilisateur voit que l'action est en cours
  • Pas de duplications : Impossible de créer plusieurs fois la même conversation
  • Feedback clair : Messages explicites pendant le chargement
  • Gestion d'erreurs robuste : Les erreurs sont capturées et affichées proprement
  • Code plus maintenable : Séparation claire entre UI et logique métier

🎨 Expérience utilisateur

Avant

  • Clic sur "Toute l'amicale"
  • Rien ne se passe pendant 3-5 secondes
  • Possibilité de cliquer plusieurs fois
  • Création de conversations en double

Après

  • Clic sur "Toute l'amicale"
  • Spinner immédiat avec message "Création de la conversation..."
  • Bouton désactivé pendant le traitement
  • Conversation créée et affichée automatiquement
  • Message d'erreur clair en cas de problème

🚦 État des boutons

Bouton Condition de désactivation
Toute l'amicale hasAmicaleRoom || _isProcessingAction
Support GEOSECTOR hasGeosectorRoom || _isProcessingAction
Contacter les admins _isProcessingAction
Annonce à tous les admins _isProcessingAction

🔍 Points de vigilance

  1. Mounted checks : Toujours vérifier mounted avant setState
  2. Finally block : Toujours réactiver les boutons dans finally
  3. Rethrow : Utiliser rethrow dans les méthodes _createXxxRoom() pour que LoadingOverlay capture l'erreur
  4. Protection double : Vérifier à la fois _isProcessingAction et les conditions métier