// 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( widget: string, surveyId: string, filters: DashboardFilters, extra?: Record ): Promise { const qs = filtersToQuery(surveyId, filters) const extraQs = extra ? `&${new URLSearchParams(extra).toString()}` : '' const res = await fetch(`/api/dashboard/${widget}?${qs}${extraQs}`, { cache: 'no-store' }) if (!res.ok) throw new Error(`Widget ${widget}: ${res.status}`) return res.json() } // Mirada Empresa — una entrada por métrica (E1-E10 + estrella). export const queries = { mePrevalencia: (sid: string, f: DashboardFilters) => fetchWidget('me-prevalencia', sid, f), meRiesgoRotacion: (sid: string, f: DashboardFilters) => fetchWidget('me-riesgo-rotacion', sid, f), meAusentismo: (sid: string, f: DashboardFilters) => fetchWidget('me-ausentismo', sid, f), mePresentismo: (sid: string, f: DashboardFilters) => fetchWidget('me-presentismo', sid, f), mePuntoCiego: (sid: string, f: DashboardFilters) => fetchWidget('me-punto-ciego', sid, f), meApoyos: (sid: string, f: DashboardFilters) => fetchWidget('me-apoyos', sid, f), // p_umbral_senales es parametrizable en la RPC — el widget puede pasarlo, // si no se pasa nada la RPC usa su propio default (2 de 3). meTalentoRiesgo: (sid: string, f: DashboardFilters, umbral?: number) => fetchWidget('me-talento-riesgo', sid, f, umbral !== undefined ? { umbral: String(umbral) } : undefined), meCarreraCongelada: (sid: string, f: DashboardFilters) => fetchWidget('me-carrera-congelada', sid, f), meIntensidadCarga: (sid: string, f: DashboardFilters) => fetchWidget('me-intensidad-carga', sid, f), meSegmentacion: (sid: string, f: DashboardFilters) => fetchWidget('me-segmentacion', sid, f), meDisposicionRed: (sid: string, f: DashboardFilters) => fetchWidget('me-disposicion-red', sid, f), }