import { useEffect, useState } from 'react'; import { useOnlineStatus } from '@/hooks/useOnlineStatus'; import { offlineQueue } from '@/services/offlineQueue'; import { WifiOff, Loader2, List } from 'lucide-react'; import { hasRecentNetworkError } from '@/utils/networkErrorTracker'; import { OfflineQueueManager } from './OfflineQueueManager'; /** * Composant pour afficher un indicateur de mode hors ligne avec nombre de requêtes en attente */ export function OfflineIndicator() { const isOnline = useOnlineStatus(); const [queueSize, setQueueSize] = useState(0); const [isProcessing, setIsProcessing] = useState(false); const [hasNetworkError, setHasNetworkError] = useState(false); const [showQueueManager, setShowQueueManager] = useState(false); // Mettre à jour la taille de la file d'attente useEffect(() => { const updateQueueSize = () => { setQueueSize(offlineQueue.getQueueSize()); }; // Mettre à jour immédiatement updateQueueSize(); // Mettre à jour toutes les secondes const interval = setInterval(updateQueueSize, 1000); return () => clearInterval(interval); }, []); // Vérifier si la file est en cours de traitement useEffect(() => { if (isOnline && queueSize > 0) { setIsProcessing(true); // Vérifier périodiquement si le traitement est terminé const checkProcessing = setInterval(() => { const currentSize = offlineQueue.getQueueSize(); if (currentSize === 0) { setIsProcessing(false); clearInterval(checkProcessing); } }, 500); return () => clearInterval(checkProcessing); } else { setIsProcessing(false); return undefined; } }, [isOnline, queueSize]); // Check for recent network errors useEffect(() => { const checkNetworkError = () => { setHasNetworkError(hasRecentNetworkError()); }; // Check immediately checkNetworkError(); // Check periodically (every 2 seconds) to update when error expires const interval = setInterval(checkNetworkError, 2000); return () => clearInterval(interval); }, []); // Ne rien afficher si en ligne, aucune requête en attente, et pas d'erreur réseau récente if (isOnline && queueSize === 0 && !isProcessing && !hasNetworkError) { return null; } // Mode hors ligne ou erreur réseau récente if (!isOnline || hasNetworkError) { return ( <>
Mode hors ligne {queueSize > 0 && ( - {queueSize} {queueSize === 1 ? 'requête' : 'requêtes'} en attente )} {queueSize > 0 && ( )}
setShowQueueManager(false)} /> ); } // En ligne mais traitement de la file en cours if (isProcessing && queueSize > 0) { return ( <>
Synchronisation en cours {queueSize > 0 && ( - {queueSize} {queueSize === 1 ? 'requête' : 'requêtes'} restante {queueSize > 1 ? 's' : ''} )} {queueSize > 0 && ( )}
setShowQueueManager(false)} /> ); } return null; }