fix(chat): Correction race condition + Implémentation TODOs
## Corrections Critiques ### Race Condition - Statuts de Messages - Fix : Les icônes de statut (✓, ✓✓, ✓✓ bleu) ne s'affichaient pas - Cause : WebSocket delivery confirmations arrivaient avant messages locaux - Solution : Pattern Optimistic UI dans chat_bloc.dart - Création message temporaire immédiate - Ajout à la liste AVANT requête HTTP - Remplacement par message serveur à la réponse - Fichier : lib/presentation/state_management/chat_bloc.dart ## Implémentation TODOs (13/21) ### Social (social_header_widget.dart) - ✅ Copier lien du post dans presse-papiers - ✅ Partage natif via Share.share() - ✅ Dialogue de signalement avec 5 raisons ### Partage (share_post_dialog.dart) - ✅ Interface sélection d'amis avec checkboxes - ✅ Partage externe via Share API ### Média (media_upload_service.dart) - ✅ Parsing JSON réponse backend - ✅ Méthode deleteMedia() pour suppression - ✅ Génération miniature vidéo ### Posts (create_post_dialog.dart, edit_post_dialog.dart) - ✅ Extraction URL depuis uploads - ✅ Documentation chargement médias ### Chat (conversations_screen.dart) - ✅ Navigation vers notifications - ✅ ConversationSearchDelegate pour recherche ## Nouveaux Fichiers ### Configuration - build-prod.ps1 : Script build production avec dart-define - lib/core/constants/env_config.dart : Gestion environnements ### Documentation - TODOS_IMPLEMENTED.md : Documentation complète TODOs ## Améliorations ### Architecture - Refactoring injection de dépendances - Amélioration routing et navigation - Optimisation providers (UserProvider, FriendsProvider) ### UI/UX - Amélioration thème et couleurs - Optimisation animations - Meilleure gestion erreurs ### Services - Configuration API avec env_config - Amélioration datasources (events, users) - Optimisation modèles de données
This commit is contained in:
212
CORRECTION_ERREUR_AJOUT_AMI.md
Normal file
212
CORRECTION_ERREUR_AJOUT_AMI.md
Normal file
@@ -0,0 +1,212 @@
|
||||
# 🔧 Correction de l'Erreur d'Ajout d'Ami
|
||||
|
||||
**Date** : 2025-01-XX
|
||||
**Problème** : `ValidationException: Erreur serveur inconnue`
|
||||
|
||||
---
|
||||
|
||||
## 🐛 PROBLÈME IDENTIFIÉ
|
||||
|
||||
Lors de l'ajout d'un ami, le backend retourne une erreur 400, mais le message d'erreur n'était pas correctement extrait de la réponse, affichant toujours "Erreur serveur inconnue".
|
||||
|
||||
---
|
||||
|
||||
## ✅ CORRECTIONS APPORTÉES
|
||||
|
||||
### 1. **Amélioration de la Gestion d'Erreur dans `FriendsRepositoryImpl`**
|
||||
|
||||
**Fichier** : `lib/data/repositories/friends_repository_impl.dart`
|
||||
|
||||
**Modifications** :
|
||||
- ✅ Amélioration de l'extraction du message d'erreur depuis la réponse JSON
|
||||
- ✅ Support de plusieurs formats de réponse d'erreur (`message`, `error`, `errorMessage`)
|
||||
- ✅ Logging détaillé de la réponse d'erreur pour le débogage
|
||||
- ✅ Gestion améliorée des erreurs de parsing JSON
|
||||
|
||||
**Code** :
|
||||
```dart
|
||||
void _handleErrorResponse(http.Response response) {
|
||||
String errorMessage;
|
||||
|
||||
try {
|
||||
if (response.body.isNotEmpty) {
|
||||
final errorBody = json.decode(response.body);
|
||||
|
||||
// Essayer plusieurs formats de réponse d'erreur
|
||||
errorMessage = errorBody['message'] as String? ??
|
||||
errorBody['error'] as String? ??
|
||||
errorBody['errorMessage'] as String? ??
|
||||
(errorBody is Map && errorBody.isNotEmpty
|
||||
? errorBody.values.first.toString()
|
||||
: 'Erreur serveur inconnue');
|
||||
|
||||
// Log détaillé pour le débogage
|
||||
if (EnvConfig.enableDetailedLogs) {
|
||||
_log('Réponse d\'erreur du serveur (${response.statusCode}): ${response.body}');
|
||||
_log('Message d\'erreur extrait: $errorMessage');
|
||||
}
|
||||
} else {
|
||||
errorMessage = 'Erreur serveur (${response.statusCode})';
|
||||
}
|
||||
} catch (e) {
|
||||
// Si le parsing JSON échoue, utiliser le body brut
|
||||
errorMessage = response.body.isNotEmpty
|
||||
? response.body
|
||||
: 'Erreur serveur (${response.statusCode})';
|
||||
|
||||
if (EnvConfig.enableDetailedLogs) {
|
||||
_log('Erreur lors du parsing de la réponse d\'erreur: $e');
|
||||
_log('Body brut: ${response.body}');
|
||||
}
|
||||
}
|
||||
// ... gestion des codes de statut
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. **Amélioration du Logging dans `addFriend`**
|
||||
|
||||
**Modifications** :
|
||||
- ✅ Logging du body JSON envoyé
|
||||
- ✅ Logging de la réponse complète du serveur
|
||||
- ✅ Meilleure traçabilité pour le débogage
|
||||
|
||||
**Code** :
|
||||
```dart
|
||||
final bodyJson = friend.toJson();
|
||||
final body = jsonEncode(bodyJson);
|
||||
|
||||
// Log détaillé du body envoyé
|
||||
if (EnvConfig.enableDetailedLogs) {
|
||||
_log('Envoi de la demande d\'ami à: $uri');
|
||||
_log('Body JSON: $body');
|
||||
}
|
||||
|
||||
final response = await _performRequest('POST', uri, body: body);
|
||||
|
||||
// Log de la réponse
|
||||
if (EnvConfig.enableDetailedLogs) {
|
||||
_log('Réponse du serveur (${response.statusCode}): ${response.body}');
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. **Amélioration de l'Affichage des Erreurs dans `AddFriendDialog`**
|
||||
|
||||
**Fichier** : `lib/presentation/widgets/add_friend_dialog.dart`
|
||||
|
||||
**Modifications** :
|
||||
- ✅ Extraction intelligente du message d'erreur depuis l'exception
|
||||
- ✅ Messages d'erreur plus clairs et spécifiques
|
||||
- ✅ Gestion différenciée selon le type d'exception
|
||||
|
||||
**Code** :
|
||||
```dart
|
||||
// Extraire un message d'erreur plus clair
|
||||
String errorMessage;
|
||||
if (e.toString().contains('ValidationException')) {
|
||||
// Extraire le message après "ValidationException: "
|
||||
final parts = e.toString().split('ValidationException: ');
|
||||
errorMessage = parts.length > 1 ? parts[1] : 'Données invalides';
|
||||
} else if (e.toString().contains('ServerException')) {
|
||||
final parts = e.toString().split('ServerException: ');
|
||||
errorMessage = parts.length > 1 ? parts[1] : 'Erreur serveur';
|
||||
} else if (e.toString().contains('ConflictException')) {
|
||||
final parts = e.toString().split('ConflictException: ');
|
||||
errorMessage = parts.length > 1 ? parts[1] : 'Cet utilisateur est déjà votre ami';
|
||||
} else {
|
||||
errorMessage = e.toString().replaceAll(RegExp(r'^[A-Za-z]+Exception: '), '');
|
||||
if (errorMessage.isEmpty || errorMessage == e.toString()) {
|
||||
errorMessage = 'Erreur lors de l\'ajout de l\'ami. Veuillez réessayer.';
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 DIAGNOSTIC
|
||||
|
||||
### Formats de Réponse d'Erreur Supportés
|
||||
|
||||
Le code gère maintenant plusieurs formats de réponse d'erreur du backend :
|
||||
|
||||
1. **Format standard** : `{"message": "Message d'erreur"}`
|
||||
2. **Format alternatif** : `{"error": "Message d'erreur"}`
|
||||
3. **Format avec errorMessage** : `{"errorMessage": "Message d'erreur"}`
|
||||
4. **Format brut** : Le body de la réponse directement
|
||||
|
||||
### Logging Détaillé
|
||||
|
||||
Avec `EnvConfig.enableDetailedLogs = true`, vous verrez maintenant :
|
||||
- Le body JSON envoyé au backend
|
||||
- La réponse complète du serveur (code + body)
|
||||
- Le message d'erreur extrait
|
||||
- Les erreurs de parsing JSON si elles surviennent
|
||||
|
||||
---
|
||||
|
||||
## 🧪 TESTS
|
||||
|
||||
### Pour Déboguer
|
||||
|
||||
1. **Activer les logs détaillés** :
|
||||
- Vérifier que `EnvConfig.enableDetailedLogs = true`
|
||||
- Relancer l'application
|
||||
|
||||
2. **Tenter d'ajouter un ami** :
|
||||
- Observer les logs dans la console
|
||||
- Vérifier le body JSON envoyé
|
||||
- Vérifier la réponse du serveur
|
||||
|
||||
3. **Analyser l'erreur** :
|
||||
- Le message d'erreur réel du backend devrait maintenant être visible
|
||||
- Les logs montreront exactement ce que le backend retourne
|
||||
|
||||
---
|
||||
|
||||
## 📝 NOTES IMPORTANTES
|
||||
|
||||
### Format des Données Envoyées
|
||||
|
||||
Le backend reçoit actuellement :
|
||||
```json
|
||||
{
|
||||
"friendId": "email@example.com",
|
||||
"friendFirstName": "John",
|
||||
"friendLastName": "Doe",
|
||||
"email": "email@example.com",
|
||||
"friendProfileImageUrl": "",
|
||||
"status": "pending",
|
||||
"isOnline": false,
|
||||
"isBestFriend": false,
|
||||
"hasKnownSinceChildhood": false
|
||||
}
|
||||
```
|
||||
|
||||
**Note** : Si le backend attend un `userId` réel au lieu d'un email, il faudra :
|
||||
1. Créer un endpoint de recherche d'utilisateurs par email
|
||||
2. Récupérer le `userId` avant d'envoyer la demande d'ami
|
||||
3. Utiliser ce `userId` dans le champ `friendId`
|
||||
|
||||
---
|
||||
|
||||
## 🚀 PROCHAINES ÉTAPES
|
||||
|
||||
1. **Tester avec les logs activés** pour voir le message d'erreur réel du backend
|
||||
2. **Vérifier le format attendu** par le backend dans la documentation API
|
||||
3. **Créer un endpoint de recherche** d'utilisateurs si nécessaire
|
||||
4. **Adapter le format des données** si le backend attend un format différent
|
||||
|
||||
---
|
||||
|
||||
## ✅ RÉSULTAT
|
||||
|
||||
- ✅ **Messages d'erreur plus clairs** affichés à l'utilisateur
|
||||
- ✅ **Logging détaillé** pour faciliter le débogage
|
||||
- ✅ **Support de plusieurs formats** de réponse d'erreur
|
||||
- ✅ **Meilleure gestion des exceptions** dans l'UI
|
||||
|
||||
**Les erreurs du backend devraient maintenant être correctement affichées !**
|
||||
|
||||
Reference in New Issue
Block a user