renderer.tsx 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. "use client";
  2. import { type ReactNode } from "react";
  3. import {
  4. Renderer,
  5. type ComponentRenderer,
  6. type Spec,
  7. StateProvider,
  8. VisibilityProvider,
  9. ActionProvider,
  10. } from "@json-render/react";
  11. import { registry, Fallback } from "./registry";
  12. // =============================================================================
  13. // ExplorerRenderer
  14. // =============================================================================
  15. interface ExplorerRendererProps {
  16. spec: Spec | null;
  17. loading?: boolean;
  18. }
  19. const fallback: ComponentRenderer = ({ element }) => (
  20. <Fallback type={element.type} />
  21. );
  22. export function ExplorerRenderer({
  23. spec,
  24. loading,
  25. }: ExplorerRendererProps): ReactNode {
  26. if (!spec) return null;
  27. return (
  28. <StateProvider initialState={spec.state ?? {}}>
  29. <VisibilityProvider>
  30. <ActionProvider>
  31. <Renderer
  32. spec={spec}
  33. registry={registry}
  34. fallback={fallback}
  35. loading={loading}
  36. />
  37. </ActionProvider>
  38. </VisibilityProvider>
  39. </StateProvider>
  40. );
  41. }