'use client'; import { useEffect, useState } from 'react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { getSyncHistory, retrySync } from '@/lib/api/sat'; import type { SatSyncJob } from '@horux/shared'; interface SyncHistoryProps { fielConfigured: boolean; } 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', }; const typeLabels: Record = { initial: 'Inicial', daily: 'Diaria', }; export function SyncHistory({ fielConfigured }: SyncHistoryProps) { const [jobs, setJobs] = useState([]); const [loading, setLoading] = useState(true); const [page, setPage] = useState(1); const [total, setTotal] = useState(0); const limit = 10; const fetchHistory = async () => { try { const data = await getSyncHistory(page, limit); setJobs(data.jobs); setTotal(data.total); } catch (err) { console.error('Error fetching sync history:', err); } finally { setLoading(false); } }; useEffect(() => { if (fielConfigured) { fetchHistory(); } else { setLoading(false); } }, [fielConfigured, page]); const handleRetry = async (jobId: string) => { try { await retrySync(jobId); fetchHistory(); } catch (err) { console.error('Error retrying job:', err); } }; if (!fielConfigured) { return null; } if (loading) { return ( Historial de Sincronizaciones

Cargando historial...

); } if (jobs.length === 0) { return ( Historial de Sincronizaciones Registro de todas las sincronizaciones con el SAT

No hay sincronizaciones registradas.

); } const totalPages = Math.ceil(total / limit); return ( Historial de Sincronizaciones Registro de todas las sincronizaciones con el SAT
{jobs.map((job) => (
{statusLabels[job.status]} {typeLabels[job.type]}

{job.startedAt ? new Date(job.startedAt).toLocaleString('es-MX') : 'No iniciado'}

{job.cfdisInserted} nuevos, {job.cfdisUpdated} actualizados

{job.errorMessage && (

{job.errorMessage}

)}
{job.status === 'failed' && ( )} {job.status === 'running' && (

{job.progressPercent}%

{job.cfdisDownloaded} descargados

)}
))}
{totalPages > 1 && (
Pagina {page} de {totalPages}
)}
); }