import { useCallback, useEffect, useState } from 'react' import { Cell, Funnel, FunnelChart, LabelList, ResponsiveContainer, Tooltip } from 'recharts' import { tooltipProps } from '../lib/chart-theme' import KpiCard from './KpiCard' import { EstadoVacio, TarjetaGrafica, type AccionesTablero } from './comunes' import { funnelMiTablero, type MiTablero } from '../lib/mi-tablero' import { fetchMiTablero } from '../services/reportes' // Misma paleta del funnel del tablero general (NovaSpark: azules + neutros); // rojo para la etapa final "Descartados" const COLORES_FUNNEL = ['#94A3B8', '#64748B', '#3B82F6', '#2563EB', '#EF4444'] /** * "Mi tablero": KPIs personales del vendedor logueado y su funnel de conversión * (Leads → Oportunidades → Apartados → Vendidos → Descartados). * Fuente: GET /api/reportes/mi-tablero, el mismo endpoint que usa el panel * "Mi día" (DashboardVendedor). */ export default function MiTablero({ alCambiarAcciones }: { alCambiarAcciones: (acciones: AccionesTablero) => void }) { const [tablero, setTablero] = useState(null) const [error, setError] = useState(null) const [cargando, setCargando] = useState(true) const cargar = useCallback(async () => { setCargando(true) try { setTablero(await fetchMiTablero()) setError(null) } catch (err) { setError(err instanceof Error ? err.message : 'No se pudo cargar el tablero') } finally { setCargando(false) } }, []) useEffect(() => { void cargar() }, [cargar]) // Expone "Actualizar" al header sticky de DashboardPage useEffect(() => { alCambiarAcciones({ actualizar: () => void cargar(), cargando }) }, [alCambiarAcciones, cargar, cargando]) const funnel = tablero ? funnelMiTablero(tablero) : [] const conversion = tablero?.conversion const tasaConversion = conversion && conversion.leads > 0 ? `${((conversion.oportunidades / conversion.leads) * 100).toFixed(1)}%` : '—' return (

Mi tablero

{tablero && (

Actualizado: {new Date(tablero.generadoEn).toLocaleString('es-MX')}

)}
{error && (

Sin datos del API — {error}

)} {!tablero && !error && cargando && } {!tablero && !error && !cargando && } {tablero && conversion && ( <>
{funnel.every((e) => e.valor === 0) ? ( ) : (
{funnel.map((etapa, i) => ( ))}
)}
)}
) }