'use client'; import { useEffect, useState } from 'react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { getSyncStatus, startSync } from '@/lib/api/sat'; import type { SatSyncStatusResponse } from '@horux/shared'; interface SyncStatusProps { fielConfigured: boolean; onSyncStarted?: () => void; } const statusLabels: Record = { pending: 'Pendiente', running: 'En progreso', completed: 'Completado', failed: 'Fallido', }; const statusColors: Record = { pending: 'bg-yellow-100 text-yellow-800', running: 'bg-blue-100 text-blue-800', completed: 'bg-green-100 text-green-800', failed: 'bg-red-100 text-red-800', }; export function SyncStatus({ fielConfigured, onSyncStarted }: SyncStatusProps) { const [status, setStatus] = useState(null); const [loading, setLoading] = useState(true); const [startingSync, setStartingSync] = useState(false); const [error, setError] = useState(''); const fetchStatus = async () => { try { const data = await getSyncStatus(); setStatus(data); } catch (err) { console.error('Error fetching sync status:', err); } finally { setLoading(false); } }; useEffect(() => { if (fielConfigured) { fetchStatus(); // Actualizar cada 30 segundos si hay sync activo const interval = setInterval(fetchStatus, 30000); return () => clearInterval(interval); } else { setLoading(false); } }, [fielConfigured]); const handleStartSync = async (type: 'initial' | 'daily') => { setStartingSync(true); setError(''); try { await startSync({ type }); await fetchStatus(); onSyncStarted?.(); } catch (err: any) { setError(err.response?.data?.error || 'Error al iniciar sincronizacion'); } finally { setStartingSync(false); } }; if (!fielConfigured) { return ( Sincronizacion SAT Configura tu FIEL para habilitar la sincronizacion automatica

La sincronizacion con el SAT requiere una FIEL valida configurada.

); } if (loading) { return ( Sincronizacion SAT

Cargando estado...

); } return ( Sincronizacion SAT Estado de la sincronizacion automatica de CFDIs {status?.hasActiveSync && status.currentJob && (
{statusLabels[status.currentJob.status]} {status.currentJob.type === 'initial' ? 'Sincronizacion inicial' : 'Sincronizacion diaria'}
{status.currentJob.status === 'running' && (
)}

{status.currentJob.cfdisDownloaded} CFDIs descargados

)} {status?.lastCompletedJob && !status.hasActiveSync && (
Ultima sincronizacion exitosa

{new Date(status.lastCompletedJob.completedAt!).toLocaleString('es-MX')}

{status.lastCompletedJob.cfdisInserted} CFDIs nuevos, {status.lastCompletedJob.cfdisUpdated} actualizados

)}

{status?.totalCfdisSynced || 0}

CFDIs sincronizados

3:00 AM

Sincronizacion diaria

{error && (

{error}

)}
{!status?.lastCompletedJob && ( )}
); }