125 lines
4.5 KiB
Markdown
125 lines
4.5 KiB
Markdown
# 🚀 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é
|
|
```dart
|
|
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
|
|
```dart
|
|
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 |