Skip to content

Latest commit

 

History

History
237 lines (185 loc) · 6.62 KB

File metadata and controls

237 lines (185 loc) · 6.62 KB

🎯 Améliorations de la Gestion d'Erreurs et du Chargement

📋 Problèmes résolus

1. ❌ Erreur JSON du Proxy

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

2. 🔗 Doubles Slashes dans les URLs

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(/\/$/, '')

3. 💬 Messages d'Erreur Peu Clairs

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)

4. ⏳ États de Chargement Non Informatifs

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

🛠️ Fichiers modifiés

1. /src/app/api/proxy/[...path]/route.ts

Améliorations apportées :

// ✅ 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);

Méthodes HTTP couvertes :

  • ✅ GET
  • ✅ POST
  • ✅ PUT
  • ✅ DELETE
  • ✅ OPTIONS (CORS preflight)

2. /src/features/home/location/components/search-results.tsx

États de chargement améliorés :

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>
)}

Erreurs améliorées :

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>

🎨 Améliorations UX

1. États de Chargement Clairs

  • ✅ 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

2. Messages d'Erreur Informatifs

  • ✅ Icônes visuelles (triangle d'alerte, X)
  • ✅ Titres clairs et descriptifs
  • ✅ Messages détaillés avec contexte
  • ✅ Actions possibles (Réessayer, Retour, Contacter support)

3. Design Moderne

  • ✅ Cartes avec border-radius: 1rem
  • ✅ Ombres portées pour la profondeur
  • ✅ Couleurs cohérentes avec la charte graphique
  • ✅ Responsive (fonctionne sur mobile et desktop)

🧪 Comment tester

1. Test du Proxy

Terminal du serveur :

# Redémarrer le serveur
npm run dev

Vérifier les logs :

🔄 Proxy GET request to: https://api.miswa.ci/api/v1/municipalities
✅ Proxy GET success: 200

2. Test des États de Chargement

  1. Ouvrir /recherche
  2. Observer : Message "Chargement des filtres de recherche"
  3. Cliquer sur "Rechercher"
  4. Observer : Message "Recherche en cours..."
  5. Résultat : Grille de propriétés ou message "Aucune propriété trouvée"

3. Test des Erreurs

Simuler une erreur réseau :

  1. Désactiver temporairement l'API
  2. Recharger la page
  3. Observer : Message d'erreur clair avec options

📊 Avant / Après

AVANT ❌

  • Erreur : "Unexpected token 'I'..." (incompréhensible)
  • URLs : //municipalities (double slash)
  • Chargement : Spinner simple sans contexte
  • Erreur : Message générique

APRÈS ✅

  • 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

🚀 Prochaines Étapes (Optionnel)

1. Toast Notifications

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');

2. Retry Automatique

Implémenter un retry automatique avec backoff exponentiel :

retry: 3,
retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000)

3. Cache Optimisé

Configurer un cache plus agressif pour les données de référence :

staleTime: 10 * 60 * 1000, // 10 minutes
cacheTime: 30 * 60 * 1000  // 30 minutes

4. Fallback Data

Fournir des données de fallback en cas d'erreur :

placeholderData: previousData

📞 Support

Si vous rencontrez des problèmes :

  1. Vérifier les logs du terminal
  2. Vérifier la console du navigateur (F12)
  3. Tester l'API directement : https://api.miswa.ci/api/v1/municipalities
  4. 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 !