import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useIdentity } from '../hooks/useIdentity'; import { useErrorHandler } from '../hooks/useErrorHandler'; import { ErrorDisplay } from './ErrorDisplay'; import { getStoredRelays } from '../utils/relay'; import { getStoredPairs } from '../utils/pairing'; import { SyncService } from '../services/syncService'; import { GraphResolver } from '../services/graphResolver'; import { checkPairingConfirmationFromSync } from '../services/pairingConfirm'; export function SyncScreen(): JSX.Element { const navigate = useNavigate(); const { identity } = useIdentity(); const { error, handleError, clearError } = useErrorHandler(); const [isSyncing, setIsSyncing] = useState(false); const [stats, setStats] = useState<{ messages: number; newMessages: number; decrypted: number; validated: number; indechiffrable: number; nonValide: number; relayStatus: Array<{ endpoint: string; ok: boolean }>; } | null>(null); const handleSync = async (): Promise => { if (identity === null) { handleError('Identité requise pour synchroniser', 'MISSING_IDENTITY'); return; } setIsSyncing(true); clearError(); try { const relays = getStoredRelays().filter((r) => r.enabled); if (relays.length === 0) { handleError('Aucun relais activé', 'NO_ENABLED_RELAYS'); return; } const graphResolver = new GraphResolver(); const syncService = new SyncService(relays, graphResolver, identity); await syncService.init(); const start = identity.t0_anniversaire; const end = Date.now(); const result = await syncService.sync(start, end); setStats(result); const pairs = getStoredPairs(); const local = pairs.find((p) => p.is_local); const remote = pairs.find((p) => !p.is_local); if ( local !== undefined && remote !== undefined && identity.privateKey !== undefined ) { void checkPairingConfirmationFromSync({ relays, pairLocal: local.uuid, pairRemote: remote.uuid, identity, start, end, remotePublicKey: remote.publicKey, }).catch((err: unknown) => { console.error('Pairing confirmation check during sync:', err); }); } if (result.messages === 0) { handleError('Aucun message récupéré. Vérifiez la connectivité des relais.', 'NO_MESSAGES'); } } catch (err) { handleError(err, 'Erreur lors de la synchronisation'); } finally { setIsSyncing(false); } }; return (

Synchronisation

{error !== null && }

Information

{identity !== null && (

Fenêtre de scan: depuis {new Date(identity.t0_anniversaire).toLocaleString()}{' '} jusqu'à maintenant

)}
{stats !== null && (

Résultats

  • Messages récupérés: {stats.messages}
  • Nouveaux messages: {stats.newMessages}
  • Messages déchiffrés: {stats.decrypted}
  • Messages validés: {stats.validated}
  • Indéchiffrables (clé manquante): {stats.indechiffrable}
  • Non validés (ex. signature manquante): {stats.nonValide}
{stats.relayStatus.length > 0 && ( <>

Statut relais

    {stats.relayStatus.map((r) => (
  • {r.endpoint}: {r.ok ? 'OK' : 'indisponible'}
  • ))}
)}
)}
); }