Primer commit — OPSV Dashboard de siniestralidad vial
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
import { useState, useEffect, useCallback } from 'react'
|
||||
import { supabasePublic } from '../lib/supabase'
|
||||
|
||||
function estaEnPeriodo(item, periodo) {
|
||||
if (!periodo?.desde || !periodo?.hasta) return true
|
||||
|
||||
const ano = Number(item.ano)
|
||||
const mes = Number(item.mes)
|
||||
|
||||
const desdeValor = periodo.desde.ano * 100 + periodo.desde.mes
|
||||
const hastaValor = periodo.hasta.ano * 100 + periodo.hasta.mes
|
||||
const actualValor = ano * 100 + mes
|
||||
|
||||
return actualValor >= desdeValor && actualValor <= hastaValor
|
||||
}
|
||||
|
||||
export function useData(year = null, periodo = { desde: null, hasta: null }) {
|
||||
const [siniestros, setSiniestros] = useState([])
|
||||
const [involucrados, setInvolucrados] = useState([])
|
||||
const [personas, setPersonas] = useState([])
|
||||
const [loading, setLoading] = useState(true)
|
||||
const [error, setError] = useState(null)
|
||||
|
||||
const periodoKey = JSON.stringify(periodo)
|
||||
|
||||
const fetchData = useCallback(async () => {
|
||||
setLoading(true)
|
||||
setError(null)
|
||||
|
||||
const periodoActual = JSON.parse(periodoKey)
|
||||
const periodoActivo = periodoActual.desde && periodoActual.hasta
|
||||
|
||||
try {
|
||||
let qS = supabasePublic.from('siniestros').select('*')
|
||||
let qI = supabasePublic.from('Involucrados').select('*')
|
||||
let qP = supabasePublic.from('Personas').select('*')
|
||||
|
||||
if (periodoActivo) {
|
||||
const anoDesde = periodoActual.desde.ano
|
||||
const anoHasta = periodoActual.hasta.ano
|
||||
|
||||
qS = qS.gte('ano', anoDesde).lte('ano', anoHasta)
|
||||
qI = qI.gte('ano', anoDesde).lte('ano', anoHasta)
|
||||
qP = qP.gte('ano', anoDesde).lte('ano', anoHasta)
|
||||
} else if (year) {
|
||||
qS = qS.eq('ano', year)
|
||||
qI = qI.eq('ano', year)
|
||||
qP = qP.eq('ano', year)
|
||||
}
|
||||
|
||||
const [resS, resI, resP] = await Promise.all([qS, qI, qP])
|
||||
|
||||
if (resS.error) throw resS.error
|
||||
if (resI.error) throw resI.error
|
||||
if (resP.error) throw resP.error
|
||||
|
||||
let dataS = resS.data || []
|
||||
let dataI = resI.data || []
|
||||
let dataP = resP.data || []
|
||||
|
||||
if (periodoActivo) {
|
||||
dataS = dataS.filter(item => estaEnPeriodo(item, periodoActual))
|
||||
dataI = dataI.filter(item => estaEnPeriodo(item, periodoActual))
|
||||
dataP = dataP.filter(item => estaEnPeriodo(item, periodoActual))
|
||||
}
|
||||
|
||||
console.log('useData fetch', {
|
||||
year,
|
||||
periodo: periodoActual,
|
||||
siniestros: dataS.length,
|
||||
involucrados: dataI.length,
|
||||
personas: dataP.length,
|
||||
})
|
||||
|
||||
setSiniestros(dataS)
|
||||
setInvolucrados(dataI)
|
||||
setPersonas(dataP)
|
||||
} catch (err) {
|
||||
setError(err?.message || String(err))
|
||||
console.error('useData error', err)
|
||||
} finally {
|
||||
setLoading(false)
|
||||
}
|
||||
}, [year, periodoKey])
|
||||
|
||||
useEffect(() => {
|
||||
fetchData()
|
||||
}, [fetchData])
|
||||
|
||||
return { siniestros, involucrados, personas, loading, error, refetch: fetchData }
|
||||
}
|
||||
Reference in New Issue
Block a user