🐛 Résolution de Bugs - Chat
Développé par Marino ATOHOUN pour Hypee
Bug Résolu : TypeError "Cannot read properties of undefined"
📋 Symptôme
Chat.tsx:22 Uncaught TypeError: Cannot read properties of undefined (reading 'find')
at Chat (Chat.tsx:22:36)
🔍 Cause
L'erreur se produisait car :
- Le state
conversationspouvait devenirundefineden cas d'erreur API - Pas de vérification de sécurité avant d'utiliser
.find() - Pas de fallback en cas d'échec de chargement
✅ Solution Implémentée
1. Optional Chaining
// Avant
const activeChat = conversations.find(c => c.id === selectedChatId);
// Après
const activeChat = conversations?.find(c => c.id === selectedChatId) || null;
2. Gestion d'Erreur Robuste
const loadConversations = async () => {
try {
setLoading(true);
const data = await messagingService.getConversations();
// S'assurer que data.results existe et est un tableau
setConversations(Array.isArray(data.results) ? data.results : []);
} catch (error) {
console.error('Failed to load conversations', error);
// En cas d'erreur, garder un tableau vide
setConversations([]);
} finally {
setLoading(false);
}
};
3. Validation des Données
const loadMessages = async (conversationId: number) => {
try {
const data = await messagingService.getMessages(conversationId.toString());
setMessages(Array.isArray(data.results) ? data.results : []);
} catch (error) {
console.error('Failed to load messages', error);
setMessages([]);
}
};
🎯 Changements Appliqués
Fichier : frontend/pages/Chat.tsx
Ligne 22 :
- ✅ Ajout de l'optional chaining (
?.) - ✅ Fallback vers
nullsi non trouvé
Fonction loadConversations :
- ✅ Vérification que
data.resultsest un tableau - ✅ Fallback vers tableau vide en cas d'erreur
- ✅ Garantie que
conversationsreste toujours un tableau
Fonction loadMessages :
- ✅ Même logique de validation
- ✅ Fallback vers tableau vide
🛡️ Protection Ajoutée
Type Safety
// Le state est toujours un tableau, jamais undefined
const [conversations, setConversations] = useState<Conversation[]>([]);
const [messages, setMessages] = useState<Message[]>([]);
Runtime Safety
// Vérification à l'exécution
Array.isArray(data.results) ? data.results : []
Null Safety
// Optional chaining + fallback
conversations?.find(...) || null
✅ Résultat
- ✅ Plus d'erreur "Cannot read properties of undefined"
- ✅ L'application se charge même si l'API échoue
- ✅ Affichage d'un état vide au lieu d'un crash
- ✅ Messages d'erreur dans la console pour le débogage
🧪 Tests
Scénario 1 : API Fonctionne
- ✅ Les conversations se chargent normalement
- ✅ Les messages s'affichent correctement
Scénario 2 : API Échoue
- ✅ Pas de crash
- ✅ Affichage "Aucune conversation pour le moment"
- ✅ Erreur loggée dans la console
Scénario 3 : Données Invalides
- ✅ Validation avec
Array.isArray() - ✅ Fallback vers tableau vide
- ✅ Pas de crash
📝 Leçons Apprises
1. Toujours Valider les Données API
// ❌ Dangereux
setConversations(data.results);
// ✅ Sûr
setConversations(Array.isArray(data.results) ? data.results : []);
2. Utiliser Optional Chaining
// ❌ Peut crasher
conversations.find(...)
// ✅ Sûr
conversations?.find(...) || null
3. Gérer les Erreurs Proprement
catch (error) {
console.error('Failed to load', error);
// Toujours mettre un fallback
setData([]);
}
🚀 Prochaines Améliorations
- Error Boundary : Ajouter un composant Error Boundary React
- Toast Notifications : Afficher des notifications d'erreur à l'utilisateur
- Retry Logic : Permettre de réessayer en cas d'échec
- Loading States : Améliorer les indicateurs de chargement
Bug résolu et application stabilisée ! ✅
Développé par Marino ATOHOUN pour Hypee ❤️