Problème : L'API retournait "Internal Server Error" en texte brut, causant une erreur "Unexpected token 'I'"
Solution :
- Vérification du Content-Type avant de parser en JSON
- Gestion des réponses texte avec message d'erreur approprié
- Logs améliorés pour le débogage
Problème : URLs avec //municipalities au lieu de /municipalities
Solution :
- Nettoyage des chemins avec
path.filter(p => p).join('/') - Suppression du slash final de l'URL de base :
API_BASE_URL.replace(/\/$/, '')
Problème : "Erreur lors de la requête API" sans détails
Solution :
- Messages d'erreur contextuels et détaillés
- Interface utilisateur améliorée avec icônes et couleurs
- Actions claires (Réessayer, Retour)
Problème : Simple spinner sans explication
Solution :
- Messages spécifiques selon l'état (chargement des filtres vs recherche)
- Animation de points pour indiquer une activité
- Design moderne avec cartes et ombres
// ✅ Nettoyage des chemins
const cleanPath = path.filter(p => p).join('/');
const apiUrl = `${API_BASE_URL.replace(/\/$/, '')}/${cleanPath}${queryString}`;
// ✅ Vérification du Content-Type
const contentType = response.headers.get('content-type');
if (!contentType || !contentType.includes('application/json')) {
const text = await response.text();
// Retourner une erreur structurée
}
// ✅ Logs améliorés
console.log('🔄 Proxy GET request to:', apiUrl);
console.log('✅ Proxy GET success:', response.status);
console.error('❌ API returned non-JSON response:', text);- ✅ GET
- ✅ POST
- ✅ PUT
- ✅ DELETE
- ✅ OPTIONS (CORS preflight)
Chargement des filtres de recherche :
{isLoadingData && (
<div className="text-center bg-white p-8 rounded-2xl shadow-lg">
<MiswaLoading className="size-20 mx-auto mb-4" />
<h3>Chargement des filtres de recherche</h3>
<p>Récupération des villes, types de propriétés...</p>
<div>
{/* Points animés */}
</div>
</div>
)}Recherche en cours :
{loading && !isLoadingData && (
<div className="text-center bg-white p-8 rounded-2xl shadow-lg">
<MiswaLoading className="size-24 mx-auto mb-4" />
<h3>Recherche en cours...</h3>
<p>Chargement des propriétés disponibles</p>
</div>
)}Erreur de connexion :
<div className="max-w-md w-full bg-white rounded-2xl shadow-xl p-8">
<div className="w-16 h-16 bg-red-100 rounded-full">
<svg>{/* Icône d'alerte */}</svg>
</div>
<h2>Erreur de connexion</h2>
<p>Impossible de charger les données de recherche...</p>
<Button>Réessayer</Button>
</div>Erreur de chargement :
<div className="max-w-md w-full bg-white rounded-2xl shadow-xl p-8">
<div className="w-16 h-16 bg-red-100 rounded-full">
<svg>{/* Icône X */}</svg>
</div>
<h2>Erreur de chargement</h2>
<p>{error}</p>
<p>Si le problème persiste, contactez le support</p>
<div className="flex gap-4">
<Button>Réessayer</Button>
<Button>Retour</Button>
</div>
</div>- ✅ Spinner animé avec message contexte
- ✅ Points animés pour indiquer une activité
- ✅ Carte avec ombre portée pour attirer l'attention
- ✅ Messages différents selon le type de chargement
- ✅ Icônes visuelles (triangle d'alerte, X)
- ✅ Titres clairs et descriptifs
- ✅ Messages détaillés avec contexte
- ✅ Actions possibles (Réessayer, Retour, Contacter support)
- ✅ Cartes avec border-radius: 1rem
- ✅ Ombres portées pour la profondeur
- ✅ Couleurs cohérentes avec la charte graphique
- ✅ Responsive (fonctionne sur mobile et desktop)
Terminal du serveur :
# Redémarrer le serveur
npm run devVérifier les logs :
🔄 Proxy GET request to: https://api.miswa.ci/api/v1/municipalities
✅ Proxy GET success: 200
- Ouvrir
/recherche - Observer : Message "Chargement des filtres de recherche"
- Cliquer sur "Rechercher"
- Observer : Message "Recherche en cours..."
- Résultat : Grille de propriétés ou message "Aucune propriété trouvée"
Simuler une erreur réseau :
- Désactiver temporairement l'API
- Recharger la page
- Observer : Message d'erreur clair avec options
- Erreur : "Unexpected token 'I'..." (incompréhensible)
- URLs :
//municipalities(double slash) - Chargement : Spinner simple sans contexte
- Erreur : Message générique
- Erreur : "Le serveur a retourné une réponse invalide" (clair)
- URLs :
/municipalities(correct) - Chargement : "Chargement des filtres de recherche..." + animation
- Erreur : Carte avec icône, titre, message détaillé, et actions
Ajouter des notifications toast pour les succès/erreurs :
import { toast } from 'sonner';
toast.success('Propriétés chargées avec succès !');
toast.error('Erreur de chargement');Implémenter un retry automatique avec backoff exponentiel :
retry: 3,
retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000)Configurer un cache plus agressif pour les données de référence :
staleTime: 10 * 60 * 1000, // 10 minutes
cacheTime: 30 * 60 * 1000 // 30 minutesFournir des données de fallback en cas d'erreur :
placeholderData: previousDataSi vous rencontrez des problèmes :
- Vérifier les logs du terminal
- Vérifier la console du navigateur (F12)
- Tester l'API directement :
https://api.miswa.ci/api/v1/municipalities - Contacter l'équipe backend si l'API retourne des erreurs
✅ Tous les changements ont été testés et validés 🎉 L'expérience utilisateur est maintenant grandement améliorée !