{"version":3,"sources":["../../../frontend/src/components/core/charts/ChartJSGenerator.ts","../../../frontend/src/components/core/charts/ChartJS.tsx"],"names":["chartRegistered","chartCache","buildCacheKey","chartConfig","width","height","backgroundColor","devicePixelRatio","ensureRegistered","Chart","registerables","generateChartAsBase64","cacheKey","canvas","ctx","config","chart","dataUrl","error","TRANSPARENT_PIXEL","styles","StyleSheet","ChartJS","React","data","style","state","setState","useState","isMounted","useRef","stableData","useMemo","useEffect","url","err","jsx","View","jsxs","Text","Image","ChartJS_default"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ChartConfiguration } from \"chart.js\"\n\nexport interface ChartRenderOptions {\n  width?: number\n  height?: number\n  backgroundColor?: string\n  devicePixelRatio?: number\n}\n\nlet chartRegistered = false\n\nconst chartCache = new Map<string, string>()\n\nconst buildCacheKey = (\n  chartConfig: ChartConfiguration,\n  width: number,\n  height: number,\n  backgroundColor: string,\n  devicePixelRatio: number,\n): string => JSON.stringify({ chartConfig, width, height, backgroundColor, devicePixelRatio })\n\nconst ensureRegistered = async () => {\n  if (chartRegistered) return\n  const { Chart, registerables } = await import(\"chart.js\")\n  Chart.register(...registerables)\n  chartRegistered = true\n}\n\nexport const generateChartAsBase64 = async (\n  chartConfig: ChartConfiguration,\n  {\n    width = 600,\n    height = 400,\n    backgroundColor = \"transparent\",\n    devicePixelRatio = 2,\n  }: ChartRenderOptions = {},\n): Promise<string> => {\n  const cacheKey = buildCacheKey(chartConfig, width, height, backgroundColor, devicePixelRatio)\n  if (chartCache.has(cacheKey)) return chartCache.get(cacheKey)!\n\n  try {\n    await ensureRegistered()\n\n    const { Chart } = await import(\"chart.js\")\n\n    const canvas = document.createElement(\"canvas\")\n    canvas.width = width * devicePixelRatio\n    canvas.height = height * devicePixelRatio\n    canvas.style.width = `${width}px`\n    canvas.style.height = `${height}px`\n\n    const ctx = canvas.getContext(\"2d\")\n    if (!ctx) {\n      console.error(\"No se pudo obtener el contexto 2D del canvas\")\n      return \"\"\n    }\n\n    ctx.scale(devicePixelRatio, devicePixelRatio)\n\n    if (backgroundColor && backgroundColor !== \"transparent\") {\n      ctx.fillStyle = backgroundColor\n      ctx.fillRect(0, 0, width, height)\n    }\n\n    const config: ChartConfiguration = {\n      ...chartConfig,\n      options: {\n        responsive: false,\n        maintainAspectRatio: false,\n        ...(chartConfig.options ?? {}),\n        devicePixelRatio,\n        animation: false,\n      } as any,\n    }\n\n    const chart = new Chart(ctx, config as any)\n    const dataUrl = canvas.toDataURL(\"image/png\", 1.0)\n    chart.destroy()\n\n    if (!dataUrl || dataUrl === \"data:,\" || !dataUrl.startsWith(\"data:image\")) {\n      console.error(\"Data URL generada es inválida:\", dataUrl)\n      return \"\"\n    }\n\n    chartCache.set(cacheKey, dataUrl)\n    return dataUrl\n  } catch (error) {\n    console.error(\"Error generando gráfico:\", error)\n    return \"\"\n  }\n}","import React, { useEffect, useMemo, useRef, useState } from \"react\"\nimport { Image, StyleSheet, View, Text } from \"@react-pdf/renderer\"\nimport type { ChartConfiguration } from \"chart.js\"\nimport { generateChartAsBase64, type ChartRenderOptions } from \"./ChartJSGenerator\"\n\ninterface ChartJSProps extends ChartRenderOptions {\n  data: ChartConfiguration\n  style?: any\n}\n\ntype ChartState =\n  | { status: \"loading\" }\n  | { status: \"success\"; url: string }\n  | { status: \"error\"; message: string }\n\nconst TRANSPARENT_PIXEL =\n  \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=\"\n\nconst styles = StyleSheet.create({\n  container: {\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n  },\n  errorText: {\n    color: \"red\",\n    fontSize: 12,\n    padding: 10,\n  },\n  loadingText: {\n    color: \"#666\",\n    fontSize: 10,\n    padding: 10,\n  },\n})\n\nconst ChartJS: React.FC<ChartJSProps> = React.memo(({\n  data,\n  width = 600,\n  height = 400,\n  backgroundColor = \"white\",\n  devicePixelRatio = 2,\n  style,\n}) => {\n  const [state, setState] = useState<ChartState>({ status: \"loading\" })\n  const isMounted = useRef(true)\n\n  const stableData = useMemo(() => data, [JSON.stringify(data)])\n\n  useEffect(() => {\n    isMounted.current = true\n\n    const render = async () => {\n      setState({ status: \"loading\" })\n\n      try {\n        const url = await generateChartAsBase64(stableData, {\n          width,\n          height,\n          backgroundColor,\n          devicePixelRatio,\n        })\n\n        if (!isMounted.current) return\n\n        if (!url || url === \"data:,\") {\n          setState({ status: \"error\", message: \"No se pudo generar el gráfico. Data URL vacía.\" })\n        } else {\n          setState({ status: \"success\", url })\n        }\n      } catch (err) {\n        if (!isMounted.current) return\n        setState({\n          status: \"error\",\n          message: err instanceof Error ? err.message : \"Error desconocido\",\n        })\n      }\n    }\n\n    render()\n\n    return () => {\n      isMounted.current = false\n    }\n  }, [stableData, width, height, backgroundColor, devicePixelRatio])\n\n  if (state.status === \"error\") {\n    if (process.env.NODE_ENV === \"development\") {\n      return (\n        <View style={[styles.container, style, { width, height }]}>\n          <Text style={styles.errorText}>Error: {state.message}</Text>\n        </View>\n      )\n    }\n    return (\n      <View style={[styles.container, style]}>\n        <Image src={TRANSPARENT_PIXEL} style={{ width, height }} />\n      </View>\n    )\n  }\n\n  if (state.status === \"loading\") {\n    return (\n      <View style={[styles.container, style, { width, height, backgroundColor: \"#f0f0f0\" }]}>\n        <Text style={styles.loadingText}>Generando gráfico...</Text>\n      </View>\n    )\n  }\n\n  return (\n    <View style={[styles.container, style]}>\n      <Image src={state.url} style={{ width, height }} cache={false} />\n    </View>\n  )\n})\n\nexport default ChartJS"]}