import { useState } from 'react' /** Documento requerido en el checklist */ export interface DocumentoChecklist { tipo: string nombre: string obligatorio: boolean } const DOCUMENTOS_DEFAULT: DocumentoChecklist[] = [ { tipo: 'INE', nombre: 'INE / Identificación oficial', obligatorio: true }, { tipo: 'RFC', nombre: 'RFC', obligatorio: true }, { tipo: 'CURP', nombre: 'CURP', obligatorio: true }, { tipo: 'COMPROBANTE_DOMICILIO', nombre: 'Comprobante de domicilio', obligatorio: true }, { tipo: 'ACTA_NACIMIENTO', nombre: 'Acta de nacimiento', obligatorio: true }, ] function iconoDoc(recibido: boolean, obligatorio: boolean): string { if (recibido) return '✅' return obligatorio ? '⏳' : '📄' } interface ChecklistDocumentosProps { documentos?: DocumentoChecklist[] recibidos?: string[] // tipos ya marcados como recibidos onToggle?: (tipo: string, recibido: boolean) => void soloLectura?: boolean } export default function ChecklistDocumentos({ documentos = DOCUMENTOS_DEFAULT, recibidos: recibidosProp, onToggle, soloLectura = false, }: ChecklistDocumentosProps) { const [recibidosInterno, setRecibidosInterno] = useState>(() => new Set(recibidosProp ?? [])) const recibidos = recibidosProp ? new Set(recibidosProp) : recibidosInterno const toggle = (tipo: string) => { if (soloLectura) return const nuevo = new Set(recibidosInterno) if (nuevo.has(tipo)) nuevo.delete(tipo) else nuevo.add(tipo) setRecibidosInterno(nuevo) onToggle?.(tipo, nuevo.has(tipo)) } const total = documentos.length const completados = documentos.filter((d) => recibidos.has(d.tipo)).length return (

Documentos requeridos

{completados} de {total}
{/* Barra de progreso */}
0 ? (completados / total) * 100 : 0}%` }} />
    {documentos.map((doc) => { const recibido = recibidos.has(doc.tipo) return (
  • toggle(doc.tipo)} className={`flex items-center gap-3 rounded-lg border px-4 py-3 transition-colors ${ recibido ? 'border-green-200 bg-green-50 dark:border-green-900/40 dark:bg-green-950/20' : 'border-[#E5E7EB] bg-white dark:border-[#334155] dark:bg-[#0F172A]' } ${soloLectura ? '' : 'cursor-pointer hover:border-accent'}`} > {iconoDoc(recibido, doc.obligatorio)}

    {doc.nombre}

    {doc.obligatorio && !recibido && (

    Requerido

    )}
    {!soloLectura && ( toggle(doc.tipo)} className="h-4 w-4 rounded border-gray-300 text-green-600 focus:ring-green-500" /> )}
  • ) })}
) }