import { useForm, FormProvider } from 'react-hook-form' import { useEffect } from 'react' import { zodResolver } from '@hookform/resolvers/zod' import type { ViviendaCredito, TipoCredito } from '../types' import { viviendaCreditoSchema } from '../lib/schemas' import { CampoTexto, CampoSelect, MensajeError } from '../components/Campos' import SectionCard from '../components/SectionCard' import Navegacion from './Navegacion' import type { PasoProps } from './DatosGeneralesForm' import { PROYECTOS, MODELOS_POR_PROYECTO, TIPOS_CREDITO, TIPOS_PRODUCTO } from '../data/constantes' /** Paso 6: datos de la vivienda, crédito e identificación oficial (PLD) */ export default function ViviendaCreditoForm({ valores, onAnterior, onSiguiente }: PasoProps) { const metodos = useForm({ resolver: zodResolver(viviendaCreditoSchema), defaultValues: valores, mode: 'onSubmit', }) const proyecto = metodos.watch('proyecto') const tiposSeleccionados = metodos.watch('tiposCredito') ?? [] type Proyecto = (typeof PROYECTOS)[number] const modelos = MODELOS_POR_PROYECTO[proyecto as Proyecto] // Al cambiar de proyecto, limpia el modelo si no aplica en la lista nueva useEffect(() => { const actual = metodos.getValues('modelo') if (modelos && actual && !modelos.includes(actual)) { metodos.setValue('modelo', '', { shouldDirty: true }) } // eslint-disable-next-line react-hooks/exhaustive-deps }, [proyecto]) /** * El tipo de crédito es de selección ÚNICA (Infonavit, Apoyo Infonavit, * Cofinavit, Segundo crédito, etc.). Se guarda como arreglo de un elemento * para no cambiar el contrato de datos; volver a tocar el elegido lo quita. */ const seleccionarCredito = (valor: TipoCredito) => { const actuales = metodos.getValues('tiposCredito') ?? [] metodos.setValue('tiposCredito', actuales.includes(valor) ? [] : [valor], { shouldDirty: true }) } return (
({ valor: p, etiqueta: p === 'OTRO' ? 'Otro' : p }))} /> {proyecto === 'OTRO' && ( )} {modelos ? ( ({ valor: m, etiqueta: m }))} /> ) : ( )}
{TIPOS_CREDITO.map((tc) => ( ))}
) }