'use client' import { useEffect, useState } from 'react' import { isSuppressed, type ScoreData } from '@/lib/dashboard-types' import { queries } from '@/lib/dashboard-queries' import type { DashboardFilters } from '@/lib/dashboard-types' import { WidgetShell } from './widget-shell' const ZONA_COLOR = { baja: '#ef4444', desarrollo: '#F8AD13', consciente: '#43BBC8' } const ZONA_LABEL = { baja: 'Baja madurez', desarrollo: 'En desarrollo', consciente: 'Consciente' } export function GaugeOrganizacional({ surveyId, filters }: { surveyId: string; filters: DashboardFilters }) { const [data, setData] = useState(null) const [sup, setSup] = useState(false) useEffect(() => { setData(null); setSup(false) queries.score(surveyId, filters) .then(d => { if (isSuppressed(d)) setSup(true); else setData(d as ScoreData) }) .catch(() => {}) }, [surveyId, JSON.stringify(filters)]) const status = !data && !sup ? 'loading' : sup ? 'suppressed' : 'ok' // SVG semicircle gauge const score = data?.score ?? 0 const angle = (score / 100) * 180 // 0° = left, 180° = right const rad = (angle - 90) * Math.PI / 180 const r = 60; const cx = 75; const cy = 80 const needleX = cx + r * Math.cos(rad) const needleY = cy + r * Math.sin(rad) const color = data ? ZONA_COLOR[data.zona] : '#43BBC8' return ( {data && (
{/* Fondo semicírculo */} {/* Arco coloreado proporcional al score */} {/* Aguja */} {/* Score */} {score} / 100

{ZONA_LABEL[data.zona]}

0–33 baja · 34–66 desarrollo · 67–100 consciente

)}
) }