25 lines
1.3 KiB
TypeScript
25 lines
1.3 KiB
TypeScript
// El cliente NUNCA consulta Supabase directamente.
|
|
// Toda la comunicación va a través de los Route Handlers /api/dashboard/[widget].
|
|
|
|
import type { DashboardFilters } from './dashboard-types'
|
|
import { filtersToQuery } from './dashboard-utils'
|
|
|
|
async function fetchWidget<T>(widget: string, surveyId: string, filters: DashboardFilters): Promise<T> {
|
|
const qs = filtersToQuery(surveyId, filters)
|
|
const res = await fetch(`/api/dashboard/${widget}?${qs}`, { cache: 'no-store' })
|
|
if (!res.ok) throw new Error(`Widget ${widget}: ${res.status}`)
|
|
return res.json()
|
|
}
|
|
|
|
export const queries = {
|
|
kpis: (sid: string, f: DashboardFilters) => fetchWidget('kpis', sid, f),
|
|
prevalencia: (sid: string, f: DashboardFilters) => fetchWidget('prevalencia', sid, f),
|
|
heatmap: (sid: string, f: DashboardFilters) => fetchWidget('heatmap', sid, f),
|
|
distribucion: (sid: string, f: DashboardFilters) => fetchWidget('distribucion', sid, f),
|
|
politicas: (sid: string, f: DashboardFilters) => fetchWidget('politicas', sid, f),
|
|
score: (sid: string, f: DashboardFilters) => fetchWidget('score', sid, f),
|
|
piramide: (sid: string, f: DashboardFilters) => fetchWidget('piramide', sid, f),
|
|
intensidad: (sid: string, f: DashboardFilters) => fetchWidget('intensidad', sid, f),
|
|
riesgo: (sid: string, f: DashboardFilters) => fetchWidget('riesgo', sid, f),
|
|
}
|