renderer.tsx 836 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  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. const fallback: ComponentRenderer = ({ element }) => (
  13. <Fallback type={element.type} />
  14. );
  15. export function ReportRenderer({
  16. spec,
  17. loading,
  18. }: {
  19. spec: Spec | null;
  20. loading?: boolean;
  21. }): ReactNode {
  22. if (!spec) return null;
  23. return (
  24. <StateProvider initialState={spec.state ?? {}}>
  25. <VisibilityProvider>
  26. <ActionProvider>
  27. <Renderer
  28. spec={spec}
  29. registry={registry}
  30. fallback={fallback}
  31. loading={loading}
  32. />
  33. </ActionProvider>
  34. </VisibilityProvider>
  35. </StateProvider>
  36. );
  37. }