/** * Indicador de Status Offline * * Componente sempre visível que mostra: * - Status online/offline * - Operações pendentes * - Progresso de sincronização */ import React, { useEffect, useState } from 'react'; import { Wifi, WifiOff, RefreshCw, AlertCircle, CheckCircle } from 'lucide-react'; import { syncService, type SyncStatus, type SyncStats } from '../services/syncService'; export const OfflineIndicator: React.FC = () => { const [isOnline, setIsOnline] = useState(navigator.onLine); const [syncStatus, setSyncStatus] = useState({ status: 'idle', message: '', progress: 0 }); const [stats, setStats] = useState({ pendingRDOs: 0, pendingOperations: 0, unresolvedConflicts: 0, isOnline: true, isSyncing: false }); const [isExpanded, setIsExpanded] = useState(false); useEffect(() => { // Atualizar status online/offline const handleOnline = () => setIsOnline(true); const handleOffline = () => setIsOnline(false); window.addEventListener('online', handleOnline); window.addEventListener('offline', handleOffline); // Escutar mudanças de sincronização const unsubscribe = syncService.onSyncStatusChange((status) => { setSyncStatus(status); }); // Atualizar estatísticas a cada 5 segundos const interval = setInterval(async () => { const newStats = await syncService.getSyncStats(); setStats(newStats); }, 5000); // Carregar estatísticas iniciais syncService.getSyncStats().then(setStats); return () => { window.removeEventListener('online', handleOnline); window.removeEventListener('offline', handleOffline); unsubscribe(); clearInterval(interval); }; }, []); const handleSync = async () => { await syncService.forceSync(); }; const hasPendingData = stats.pendingRDOs > 0 || stats.pendingOperations > 0; const hasConflicts = stats.unresolvedConflicts > 0; return (
{/* Indicador compacto */} {/* Painel expandido */} {isExpanded && (
{/* Header */}
{isOnline ? ( ) : ( )} {isOnline ? 'Online' : 'Offline'}
{/* Conteúdo */}
{/* Status de sincronização */} {stats.isSyncing && (
{syncStatus.message}
)} {/* Estatísticas */}
{stats.pendingRDOs > 0 && (
RDOs pendentes {stats.pendingRDOs}
)} {stats.pendingOperations > 0 && (
Operações pendentes {stats.pendingOperations}
)} {hasConflicts && (
Conflitos não resolvidos {stats.unresolvedConflicts}
)} {!hasPendingData && !hasConflicts && isOnline && (
Tudo sincronizado
)}
{/* Botão de sincronização manual */} {isOnline && hasPendingData && !stats.isSyncing && ( )} {/* Mensagem offline */} {!isOnline && (

Modo Offline

Seus dados serão sincronizados automaticamente quando a conexão for restabelecida.

)} {/* Link para logs */} {hasConflicts && ( Ver detalhes dos conflitos )}
)}
); };