feat: ecosistema FRASA — apps Cotizador, Alta Clientes, Cobranza y Landing
- Cotizador (/quote): 4 propuestas con formulas validadas del Excel, comparador, combobox de unidades, vigencia, PDF ANEXO A - Alta Clientes (/client): wizard 8 pasos, validacion CURP RENAPO, OCR de INE, checklist de expediente, firma digital, 5 PDFs legales - Cobranza (/pay): planes de enganche, mora, vista cobranza del dia, recibos PDF, bitacora, dashboard con filtros - Landing (/): entrada al ecosistema - Design system StudioBlank (monocromo, acento #1B4332) en las 4 apps - 123 tests vitest
This commit is contained in:
38
apps/cotizador/src/hooks/useUnidades.ts
Normal file
38
apps/cotizador/src/hooks/useUnidades.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
import { useEffect, useState } from 'react'
|
||||
import type { Unidad } from '../types'
|
||||
import { getUnidades } from '../services/api'
|
||||
|
||||
interface UseUnidadesResult {
|
||||
unidades: Unidad[]
|
||||
cargando: boolean
|
||||
error: string | null
|
||||
}
|
||||
|
||||
/** Carga el inventario de unidades (hoy desde seed; mañana desde el API Gateway) */
|
||||
export function useUnidades(): UseUnidadesResult {
|
||||
const [unidades, setUnidades] = useState<Unidad[]>([])
|
||||
const [cargando, setCargando] = useState(true)
|
||||
const [error, setError] = useState<string | null>(null)
|
||||
|
||||
useEffect(() => {
|
||||
let activo = true
|
||||
getUnidades()
|
||||
.then((data) => {
|
||||
if (activo) {
|
||||
setUnidades(data)
|
||||
setCargando(false)
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
if (activo) {
|
||||
setError('No se pudo cargar el inventario de unidades.')
|
||||
setCargando(false)
|
||||
}
|
||||
})
|
||||
return () => {
|
||||
activo = false
|
||||
}
|
||||
}, [])
|
||||
|
||||
return { unidades, cargando, error }
|
||||
}
|
||||
Reference in New Issue
Block a user