page.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import { Code } from "@/components/code";
  2. export const metadata = {
  3. title: "@json-render/react API | json-render",
  4. };
  5. export default function ReactApiPage() {
  6. return (
  7. <article>
  8. <h1 className="text-3xl font-bold mb-4">@json-render/react</h1>
  9. <p className="text-muted-foreground mb-8">
  10. React components, providers, and hooks.
  11. </p>
  12. <h2 className="text-xl font-semibold mt-12 mb-4">Providers</h2>
  13. <h3 className="text-lg font-semibold mt-8 mb-4">DataProvider</h3>
  14. <Code lang="tsx">{`<DataProvider initialData={object}>
  15. {children}
  16. </DataProvider>`}</Code>
  17. <h3 className="text-lg font-semibold mt-8 mb-4">ActionProvider</h3>
  18. <Code lang="tsx">{`<ActionProvider handlers={Record<string, ActionHandler>}>
  19. {children}
  20. </ActionProvider>
  21. type ActionHandler = (params: Record<string, unknown>) => void | Promise<void>;`}</Code>
  22. <h3 className="text-lg font-semibold mt-8 mb-4">VisibilityProvider</h3>
  23. <Code lang="tsx">{`<VisibilityProvider auth={AuthState}>
  24. {children}
  25. </VisibilityProvider>
  26. interface AuthState {
  27. isSignedIn: boolean;
  28. roles?: string[];
  29. }`}</Code>
  30. <h3 className="text-lg font-semibold mt-8 mb-4">ValidationProvider</h3>
  31. <Code lang="tsx">{`<ValidationProvider functions={Record<string, ValidatorFn>}>
  32. {children}
  33. </ValidationProvider>
  34. type ValidatorFn = (value: unknown, args?: object) => boolean | Promise<boolean>;`}</Code>
  35. <h2 className="text-xl font-semibold mt-12 mb-4">createRenderer</h2>
  36. <p className="text-sm text-muted-foreground mb-4">
  37. Factory function to create a pre-configured renderer component.
  38. </p>
  39. <Code lang="tsx">{`import { createRenderer } from '@json-render/react';
  40. const MyRenderer = createRenderer({
  41. registry: componentRegistry,
  42. data?: initialData,
  43. actionHandlers?: actionHandlerMap,
  44. auth?: authState,
  45. });
  46. // Usage
  47. <MyRenderer spec={spec} loading={isStreaming} />`}</Code>
  48. <h2 className="text-xl font-semibold mt-12 mb-4">Components</h2>
  49. <h3 className="text-lg font-semibold mt-8 mb-4">Renderer</h3>
  50. <Code lang="tsx">{`<Renderer
  51. spec={Spec} // The UI spec to render
  52. registry={Registry} // Component registry
  53. loading={boolean} // Optional loading state
  54. />
  55. type Registry = Record<string, React.ComponentType<ComponentProps>>;
  56. interface ComponentProps<T = Record<string, unknown>> {
  57. props: T; // Component props from spec
  58. children?: React.ReactNode; // Rendered children (for slot components)
  59. }`}</Code>
  60. <h2 className="text-xl font-semibold mt-12 mb-4">Hooks</h2>
  61. <h3 className="text-lg font-semibold mt-8 mb-4">useUIStream</h3>
  62. <Code lang="typescript">{`const {
  63. spec, // Spec - current UI state
  64. isStreaming, // boolean - true while streaming
  65. error, // Error | null
  66. send, // (prompt: string) => void
  67. abort, // () => void
  68. } = useUIStream({
  69. api: string, // API endpoint URL
  70. onChunk?: (chunk: string) => void, // Called for each chunk
  71. onFinish?: (spec: Spec) => void, // Called when streaming completes
  72. });`}</Code>
  73. <h3 className="text-lg font-semibold mt-8 mb-4">useData</h3>
  74. <Code lang="typescript">{`const {
  75. data, // Record<string, unknown>
  76. setData, // (data: object) => void
  77. getValue, // (path: string) => unknown
  78. setValue, // (path: string, value: unknown) => void
  79. } = useData();`}</Code>
  80. <h3 className="text-lg font-semibold mt-8 mb-4">useDataValue</h3>
  81. <Code lang="typescript">{`const value = useDataValue(path: string);`}</Code>
  82. <h3 className="text-lg font-semibold mt-8 mb-4">useDataBinding</h3>
  83. <Code lang="typescript">{`const [value, setValue] = useDataBinding(path: string);`}</Code>
  84. <h3 className="text-lg font-semibold mt-8 mb-4">useActions</h3>
  85. <Code lang="typescript">{`const { dispatch } = useActions();
  86. // dispatch(actionName: string, params: object)`}</Code>
  87. <h3 className="text-lg font-semibold mt-8 mb-4">useAction</h3>
  88. <Code lang="typescript">{`const submitForm = useAction('submit_form');
  89. // submitForm(params: object)`}</Code>
  90. <h3 className="text-lg font-semibold mt-8 mb-4">useIsVisible</h3>
  91. <Code lang="typescript">{`const isVisible = useIsVisible(condition?: VisibilityCondition);`}</Code>
  92. <h3 className="text-lg font-semibold mt-8 mb-4">useFieldValidation</h3>
  93. <Code lang="typescript">{`const {
  94. value, // unknown
  95. setValue, // (value: unknown) => void
  96. errors, // string[]
  97. validate, // () => Promise<boolean>
  98. isValid, // boolean
  99. } = useFieldValidation(path: string, checks: ValidationCheck[]);`}</Code>
  100. </article>
  101. );
  102. }