"use client"; import { useMemo, useRef, type ReactNode } from "react"; import { Renderer, type ComponentRenderer, type Spec, DataProvider, VisibilityProvider, ActionProvider, } from "@json-render/react"; import { registry, Fallback, handlers as createHandlers } from "./registry"; // ============================================================================= // DashboardRenderer // ============================================================================= type SetData = ( updater: (prev: Record) => Record, ) => void; interface DashboardRendererProps { spec: Spec | null; data?: Record; setData?: SetData; onDataChange?: (path: string, value: unknown) => void; loading?: boolean; } // Fallback component for unknown types const fallback: ComponentRenderer = ({ element }) => ( ); export function DashboardRenderer({ spec, data = {}, setData, onDataChange, loading, }: DashboardRendererProps): ReactNode { // Use refs so action handlers always see the latest data/setData const dataRef = useRef(data); const setDataRef = useRef(setData); dataRef.current = data; setDataRef.current = setData; // Create ActionProvider-compatible handlers using getters so they // always read the latest data/setData from refs const actionHandlers = useMemo( () => createHandlers( () => setDataRef.current, () => dataRef.current, ), [], ); if (!spec) return null; return ( ); }