Files
motor-de-encuestas/lib/dashboard-queries.ts

25 lines
1.4 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),
apoyos: (sid: string, f: DashboardFilters) => fetchWidget('apoyos', 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),
saturacion: (sid: string, f: DashboardFilters) => fetchWidget('saturacion', sid, f),
}