'use client'; import React, { useEffect, useRef } from 'react'; import { Toast } from 'primereact/toast'; import { apiService } from '../services/api'; interface GlobalErrorHandlerProps { children?: React.ReactNode; } export const GlobalErrorHandler: React.FC = ({ children }) => { const toast = useRef(null); const lastErrorTime = useRef(0); useEffect(() => { // Gestionnaire global d'erreurs non capturées const handleUnhandledRejection = (event: PromiseRejectionEvent) => { const error = event.reason; // Éviter de spammer les notifications (max 1 par seconde) const now = Date.now(); if (now - lastErrorTime.current < 1000) { return; } lastErrorTime.current = now; let message = 'Une erreur inattendue s\'est produite'; let severity: 'error' | 'warn' | 'info' = 'error'; if (error?.statusCode === 'NETWORK_ERROR' || error?.statusCode === 'SERVER_UNAVAILABLE') { message = error.userMessage || 'Serveur indisponible'; severity = 'error'; toast.current?.show({ severity, summary: 'Serveur backend inaccessible', detail: message, sticky: true, content: (props) => (
{props.summary}
{message}
• Démarrez le serveur backend : mvn quarkus:dev
• Vérifiez que le port 8080 est libre
• Contrôlez votre connexion internet
• Testez l'accès : http://localhost:8080
) }); } else if (error?.statusCode === 'TIMEOUT') { message = error.userMessage || 'Délai d\'attente dépassé'; severity = 'warn'; toast.current?.show({ severity, summary: 'Délai dépassé', detail: message, life: 6000 }); } else if (error?.userMessage) { toast.current?.show({ severity: 'error', summary: 'Erreur', detail: error.userMessage, life: 5000 }); } }; // Gestionnaire de statut serveur const handleServerStatusChange = (isOnline: boolean) => { if (isOnline) { // Nettoyer les messages d'erreur précédents toast.current?.clear(); toast.current?.show({ severity: 'success', summary: 'Serveur backend reconnecté', detail: 'Le serveur backend est de nouveau accessible', life: 3000 }); } }; // Enregistrer les listeners window.addEventListener('unhandledrejection', handleUnhandledRejection); const unsubscribe = apiService.onServerStatusChange(handleServerStatusChange); return () => { window.removeEventListener('unhandledrejection', handleUnhandledRejection); if (unsubscribe) { unsubscribe(); } }; }, []); return ( <> {children} ); }; export default GlobalErrorHandler;