@contember/react-client 1.0.0-alpha.8 → 1.0.0-rc.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/dist/types/ClientError.d.ts +3 -0
  2. package/dist/types/ClientError.d.ts.map +1 -0
  3. package/dist/types/ContemberClient.d.ts +12 -0
  4. package/dist/types/ContemberClient.d.ts.map +1 -0
  5. package/dist/types/apiRequest/ApiRequestAction.d.ts +13 -0
  6. package/dist/types/apiRequest/ApiRequestAction.d.ts.map +1 -0
  7. package/dist/types/apiRequest/ApiRequestState.d.ts +21 -0
  8. package/dist/types/apiRequest/ApiRequestState.d.ts.map +1 -0
  9. package/dist/types/apiRequest/apiRequestReducer.d.ts +5 -0
  10. package/dist/types/apiRequest/apiRequestReducer.d.ts.map +1 -0
  11. package/dist/types/apiRequest/index.d.ts +5 -0
  12. package/dist/types/apiRequest/index.d.ts.map +1 -0
  13. package/dist/types/apiRequest/useApiRequest.d.ts +8 -0
  14. package/dist/types/apiRequest/useApiRequest.d.ts.map +1 -0
  15. package/dist/types/auth/SessionTokenContext.d.ts +3 -0
  16. package/dist/types/auth/SessionTokenContext.d.ts.map +1 -0
  17. package/dist/types/auth/SetSessionTokenContext.d.ts +3 -0
  18. package/dist/types/auth/SetSessionTokenContext.d.ts.map +1 -0
  19. package/dist/types/auth/index.d.ts +5 -0
  20. package/dist/types/auth/index.d.ts.map +1 -0
  21. package/dist/types/auth/useSessionToken.d.ts +2 -0
  22. package/dist/types/auth/useSessionToken.d.ts.map +1 -0
  23. package/dist/types/auth/useSetSessionToken.d.ts +2 -0
  24. package/dist/types/auth/useSetSessionToken.d.ts.map +1 -0
  25. package/dist/types/components/RichTextRenderer/BuiltinElements.d.ts +49 -0
  26. package/dist/types/components/RichTextRenderer/BuiltinElements.d.ts.map +1 -0
  27. package/dist/types/components/RichTextRenderer/BuiltinLeaves.d.ts +21 -0
  28. package/dist/types/components/RichTextRenderer/BuiltinLeaves.d.ts.map +1 -0
  29. package/dist/types/components/RichTextRenderer/ElementRenderer.d.ts +22 -0
  30. package/dist/types/components/RichTextRenderer/ElementRenderer.d.ts.map +1 -0
  31. package/dist/types/components/RichTextRenderer/LeafRenderer.d.ts +14 -0
  32. package/dist/types/components/RichTextRenderer/LeafRenderer.d.ts.map +1 -0
  33. package/dist/types/components/RichTextRenderer/NormalizedRichTextBlock.d.ts +14 -0
  34. package/dist/types/components/RichTextRenderer/NormalizedRichTextBlock.d.ts.map +1 -0
  35. package/dist/types/components/RichTextRenderer/ReferenceRenderer.d.ts +14 -0
  36. package/dist/types/components/RichTextRenderer/ReferenceRenderer.d.ts.map +1 -0
  37. package/dist/types/components/RichTextRenderer/RenderElementFallback.d.ts +12 -0
  38. package/dist/types/components/RichTextRenderer/RenderElementFallback.d.ts.map +1 -0
  39. package/dist/types/components/RichTextRenderer/RenderLeafFallback.d.ts +7 -0
  40. package/dist/types/components/RichTextRenderer/RenderLeafFallback.d.ts.map +1 -0
  41. package/dist/types/components/RichTextRenderer/RichTextBlock.d.ts +2 -0
  42. package/dist/types/components/RichTextRenderer/RichTextBlock.d.ts.map +1 -0
  43. package/dist/types/components/RichTextRenderer/RichTextElement.d.ts +7 -0
  44. package/dist/types/components/RichTextRenderer/RichTextElement.d.ts.map +1 -0
  45. package/dist/types/components/RichTextRenderer/RichTextElementMetadata.d.ts +11 -0
  46. package/dist/types/components/RichTextRenderer/RichTextElementMetadata.d.ts.map +1 -0
  47. package/dist/types/components/RichTextRenderer/RichTextLeaf.d.ts +4 -0
  48. package/dist/types/components/RichTextRenderer/RichTextLeaf.d.ts.map +1 -0
  49. package/dist/types/components/RichTextRenderer/RichTextLeafMetadata.d.ts +4 -0
  50. package/dist/types/components/RichTextRenderer/RichTextLeafMetadata.d.ts.map +1 -0
  51. package/dist/types/components/RichTextRenderer/RichTextReference.d.ts +4 -0
  52. package/dist/types/components/RichTextRenderer/RichTextReference.d.ts.map +1 -0
  53. package/dist/types/components/RichTextRenderer/RichTextRenderMetadata.d.ts +12 -0
  54. package/dist/types/components/RichTextRenderer/RichTextRenderMetadata.d.ts.map +1 -0
  55. package/dist/types/components/RichTextRenderer/RichTextRenderMetadataContext.d.ts +8 -0
  56. package/dist/types/components/RichTextRenderer/RichTextRenderMetadataContext.d.ts.map +1 -0
  57. package/dist/types/components/RichTextRenderer/RichTextRenderer.d.ts +29 -0
  58. package/dist/types/components/RichTextRenderer/RichTextRenderer.d.ts.map +1 -0
  59. package/dist/types/components/RichTextRenderer/RichTextRendererError.d.ts +3 -0
  60. package/dist/types/components/RichTextRenderer/RichTextRendererError.d.ts.map +1 -0
  61. package/dist/types/components/RichTextRenderer/RootEditorNode.d.ts +9 -0
  62. package/dist/types/components/RichTextRenderer/RootEditorNode.d.ts.map +1 -0
  63. package/dist/types/components/RichTextRenderer/defaultDeserialize.d.ts +5 -0
  64. package/dist/types/components/RichTextRenderer/defaultDeserialize.d.ts.map +1 -0
  65. package/dist/types/components/RichTextRenderer/index.d.ts +16 -0
  66. package/dist/types/components/RichTextRenderer/index.d.ts.map +1 -0
  67. package/dist/types/components/RichTextRenderer/renderChildren.d.ts +14 -0
  68. package/dist/types/components/RichTextRenderer/renderChildren.d.ts.map +1 -0
  69. package/dist/types/components/RichTextRenderer/resolveRichTextElementMetadata.d.ts +8 -0
  70. package/dist/types/components/RichTextRenderer/resolveRichTextElementMetadata.d.ts.map +1 -0
  71. package/dist/types/components/index.d.ts +2 -0
  72. package/dist/types/components/index.d.ts.map +1 -0
  73. package/dist/types/config/ApiBaseUrlContext.d.ts +3 -0
  74. package/dist/types/config/ApiBaseUrlContext.d.ts.map +1 -0
  75. package/dist/types/config/LoginTokenContext.d.ts +3 -0
  76. package/dist/types/config/LoginTokenContext.d.ts.map +1 -0
  77. package/dist/types/config/index.d.ts +5 -0
  78. package/dist/types/config/index.d.ts.map +1 -0
  79. package/dist/types/config/useApiBaseUrl.d.ts +2 -0
  80. package/dist/types/config/useApiBaseUrl.d.ts.map +1 -0
  81. package/dist/types/config/useLoginToken.d.ts +2 -0
  82. package/dist/types/config/useLoginToken.d.ts.map +1 -0
  83. package/dist/types/content/index.d.ts +4 -0
  84. package/dist/types/content/index.d.ts.map +1 -0
  85. package/dist/types/content/useContentApiRequest.d.ts +3 -0
  86. package/dist/types/content/useContentApiRequest.d.ts.map +1 -0
  87. package/dist/types/content/useContentGraphQlClient.d.ts +3 -0
  88. package/dist/types/content/useContentGraphQlClient.d.ts.map +1 -0
  89. package/dist/types/content/useCurrentContentGraphQlClient.d.ts +3 -0
  90. package/dist/types/content/useCurrentContentGraphQlClient.d.ts.map +1 -0
  91. package/dist/types/index.d.ts +14 -0
  92. package/dist/types/index.d.ts.map +1 -0
  93. package/dist/types/project/ProjectSlugContext.d.ts +3 -0
  94. package/dist/types/project/ProjectSlugContext.d.ts.map +1 -0
  95. package/dist/types/project/StageSlugContext.d.ts +3 -0
  96. package/dist/types/project/StageSlugContext.d.ts.map +1 -0
  97. package/dist/types/project/index.d.ts +5 -0
  98. package/dist/types/project/index.d.ts.map +1 -0
  99. package/dist/types/project/useProjectSlug.d.ts +2 -0
  100. package/dist/types/project/useProjectSlug.d.ts.map +1 -0
  101. package/dist/types/project/useStageSlug.d.ts +2 -0
  102. package/dist/types/project/useStageSlug.d.ts.map +1 -0
  103. package/dist/types/system/index.d.ts +4 -0
  104. package/dist/types/system/index.d.ts.map +1 -0
  105. package/dist/types/system/useCurrentSystemGraphQlClient.d.ts +3 -0
  106. package/dist/types/system/useCurrentSystemGraphQlClient.d.ts.map +1 -0
  107. package/dist/types/system/useSystemApiRequest.d.ts +3 -0
  108. package/dist/types/system/useSystemApiRequest.d.ts.map +1 -0
  109. package/dist/types/system/useSystemGraphQlClient.d.ts +2 -0
  110. package/dist/types/system/useSystemGraphQlClient.d.ts.map +1 -0
  111. package/dist/types/tenant/index.d.ts +3 -0
  112. package/dist/types/tenant/index.d.ts.map +1 -0
  113. package/dist/types/tenant/useTenantApiRequest.d.ts +3 -0
  114. package/dist/types/tenant/useTenantApiRequest.d.ts.map +1 -0
  115. package/dist/types/tenant/useTenantGraphQlClient.d.ts +2 -0
  116. package/dist/types/tenant/useTenantGraphQlClient.d.ts.map +1 -0
  117. package/dist/types/tsconfig.tsbuildinfo +1 -0
  118. package/dist/types/upload/FileId.d.ts +2 -0
  119. package/dist/types/upload/FileId.d.ts.map +1 -0
  120. package/dist/types/upload/FileUploadAction.d.ts +26 -0
  121. package/dist/types/upload/FileUploadAction.d.ts.map +1 -0
  122. package/dist/types/upload/FileUploadCompoundState.d.ts +4 -0
  123. package/dist/types/upload/FileUploadCompoundState.d.ts.map +1 -0
  124. package/dist/types/upload/FileUploadMetadata.d.ts +6 -0
  125. package/dist/types/upload/FileUploadMetadata.d.ts.map +1 -0
  126. package/dist/types/upload/FileUploadMultiTemporalState.d.ts +10 -0
  127. package/dist/types/upload/FileUploadMultiTemporalState.d.ts.map +1 -0
  128. package/dist/types/upload/FileUploadOperations.d.ts +18 -0
  129. package/dist/types/upload/FileUploadOperations.d.ts.map +1 -0
  130. package/dist/types/upload/FileWithMetadata.d.ts +8 -0
  131. package/dist/types/upload/FileWithMetadata.d.ts.map +1 -0
  132. package/dist/types/upload/SingleFileUploadState.d.ts +31 -0
  133. package/dist/types/upload/SingleFileUploadState.d.ts.map +1 -0
  134. package/dist/types/upload/fileUploadReducer.d.ts +5 -0
  135. package/dist/types/upload/fileUploadReducer.d.ts.map +1 -0
  136. package/dist/types/upload/index.d.ts +8 -0
  137. package/dist/types/upload/index.d.ts.map +1 -0
  138. package/dist/types/upload/toFileId.d.ts +4 -0
  139. package/dist/types/upload/toFileId.d.ts.map +1 -0
  140. package/dist/types/upload/useFileUpload.d.ts +11 -0
  141. package/dist/types/upload/useFileUpload.d.ts.map +1 -0
  142. package/dist/types/useGraphQlClient.d.ts +3 -0
  143. package/dist/types/useGraphQlClient.d.ts.map +1 -0
  144. package/dist/types/utils/assertNever.d.ts +2 -0
  145. package/dist/types/utils/assertNever.d.ts.map +1 -0
  146. package/dist/types/utils/index.d.ts +2 -0
  147. package/dist/types/utils/index.d.ts.map +1 -0
  148. package/package.json +6 -7
  149. package/src/ClientError.ts +1 -0
  150. package/src/ContemberClient.tsx +48 -0
  151. package/src/ambient.d.ts +1 -0
  152. package/src/apiRequest/ApiRequestAction.ts +17 -0
  153. package/src/apiRequest/ApiRequestState.ts +25 -0
  154. package/src/apiRequest/apiRequestReducer.ts +41 -0
  155. package/src/apiRequest/index.ts +4 -0
  156. package/src/apiRequest/useApiRequest.ts +73 -0
  157. package/src/auth/SessionTokenContext.ts +3 -0
  158. package/src/auth/SetSessionTokenContext.ts +5 -0
  159. package/src/auth/index.ts +4 -0
  160. package/src/auth/useSessionToken.ts +4 -0
  161. package/src/auth/useSetSessionToken.ts +4 -0
  162. package/src/components/RichTextRenderer/BuiltinElements.ts +112 -0
  163. package/src/components/RichTextRenderer/BuiltinLeaves.ts +32 -0
  164. package/src/components/RichTextRenderer/ElementRenderer.tsx +71 -0
  165. package/src/components/RichTextRenderer/LeafRenderer.tsx +39 -0
  166. package/src/components/RichTextRenderer/NormalizedRichTextBlock.ts +17 -0
  167. package/src/components/RichTextRenderer/ReferenceRenderer.ts +26 -0
  168. package/src/components/RichTextRenderer/RenderElementFallback.tsx +147 -0
  169. package/src/components/RichTextRenderer/RenderLeafFallback.tsx +43 -0
  170. package/src/components/RichTextRenderer/RichTextBlock.ts +1 -0
  171. package/src/components/RichTextRenderer/RichTextElement.ts +10 -0
  172. package/src/components/RichTextRenderer/RichTextElementMetadata.ts +15 -0
  173. package/src/components/RichTextRenderer/RichTextLeaf.ts +3 -0
  174. package/src/components/RichTextRenderer/RichTextLeafMetadata.ts +3 -0
  175. package/src/components/RichTextRenderer/RichTextReference.ts +3 -0
  176. package/src/components/RichTextRenderer/RichTextRenderMetadata.ts +16 -0
  177. package/src/components/RichTextRenderer/RichTextRenderMetadataContext.ts +20 -0
  178. package/src/components/RichTextRenderer/RichTextRenderer.tsx +165 -0
  179. package/src/components/RichTextRenderer/RichTextRendererError.ts +1 -0
  180. package/src/components/RichTextRenderer/RootEditorNode.ts +12 -0
  181. package/src/components/RichTextRenderer/defaultDeserialize.ts +19 -0
  182. package/src/components/RichTextRenderer/index.ts +15 -0
  183. package/src/components/RichTextRenderer/renderChildren.tsx +50 -0
  184. package/src/components/RichTextRenderer/resolveRichTextElementMetadata.ts +50 -0
  185. package/src/components/index.ts +1 -0
  186. package/src/config/ApiBaseUrlContext.ts +3 -0
  187. package/src/config/LoginTokenContext.ts +3 -0
  188. package/src/config/index.ts +4 -0
  189. package/src/config/useApiBaseUrl.ts +4 -0
  190. package/src/config/useLoginToken.ts +4 -0
  191. package/src/content/index.ts +3 -0
  192. package/src/content/useContentApiRequest.ts +6 -0
  193. package/src/content/useContentGraphQlClient.ts +6 -0
  194. package/src/content/useCurrentContentGraphQlClient.ts +17 -0
  195. package/src/index.ts +15 -0
  196. package/src/project/ProjectSlugContext.ts +3 -0
  197. package/src/project/StageSlugContext.ts +3 -0
  198. package/src/project/index.ts +4 -0
  199. package/src/project/useProjectSlug.ts +4 -0
  200. package/src/project/useStageSlug.ts +4 -0
  201. package/src/system/index.ts +3 -0
  202. package/src/system/useCurrentSystemGraphQlClient.ts +13 -0
  203. package/src/system/useSystemApiRequest.ts +6 -0
  204. package/src/system/useSystemGraphQlClient.ts +4 -0
  205. package/src/tenant/index.ts +2 -0
  206. package/src/tenant/useTenantApiRequest.ts +6 -0
  207. package/src/tenant/useTenantGraphQlClient.ts +4 -0
  208. package/src/tsconfig.json +9 -0
  209. package/src/upload/FileId.ts +1 -0
  210. package/src/upload/FileUploadAction.ts +33 -0
  211. package/src/upload/FileUploadCompoundState.ts +7 -0
  212. package/src/upload/FileUploadMetadata.ts +6 -0
  213. package/src/upload/FileUploadMultiTemporalState.ts +10 -0
  214. package/src/upload/FileUploadOperations.ts +22 -0
  215. package/src/upload/FileWithMetadata.ts +8 -0
  216. package/src/upload/SingleFileUploadState.ts +35 -0
  217. package/src/upload/fileUploadReducer.ts +185 -0
  218. package/src/upload/index.ts +15 -0
  219. package/src/upload/toFileId.ts +12 -0
  220. package/src/upload/useFileUpload.ts +262 -0
  221. package/src/useGraphQlClient.ts +10 -0
  222. package/src/utils/assertNever.ts +3 -0
  223. package/src/utils/index.ts +1 -0
  224. package/dist/react-client.d.ts +0 -367
@@ -0,0 +1,31 @@
1
+ import type { FileUploader, FileUploadError } from '@contember/client';
2
+ export declare type SingleFileUploadState<Result = unknown, Metadata = undefined> = {
3
+ readyState: 'initializing';
4
+ abortController: AbortController;
5
+ file: File;
6
+ previewUrl: string;
7
+ } | {
8
+ readyState: 'uploading';
9
+ abortController: AbortController;
10
+ file: File;
11
+ metadata: Metadata;
12
+ previewUrl: string;
13
+ progress: number | undefined;
14
+ uploader: FileUploader;
15
+ } | {
16
+ readyState: 'success';
17
+ file: File;
18
+ metadata: Metadata;
19
+ previewUrl: string;
20
+ result: Result;
21
+ uploader: FileUploader;
22
+ } | {
23
+ readyState: 'error';
24
+ errors: FileUploadError[] | undefined;
25
+ rawError: any;
26
+ file: File;
27
+ metadata: Metadata | undefined;
28
+ previewUrl: string;
29
+ uploader: FileUploader | undefined;
30
+ };
31
+ //# sourceMappingURL=SingleFileUploadState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SingleFileUploadState.d.ts","sourceRoot":"","sources":["../../../src/upload/SingleFileUploadState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEtE,oBAAY,qBAAqB,CAAC,MAAM,GAAG,OAAO,EAAE,QAAQ,GAAG,SAAS,IACrE;IACA,UAAU,EAAE,cAAc,CAAA;IAC1B,eAAe,EAAE,eAAe,CAAA;IAChC,IAAI,EAAE,IAAI,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;CACjB,GACD;IACA,UAAU,EAAE,WAAW,CAAA;IACvB,eAAe,EAAE,eAAe,CAAA;IAChC,IAAI,EAAE,IAAI,CAAA;IACV,QAAQ,EAAE,QAAQ,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5B,QAAQ,EAAE,YAAY,CAAA;CACrB,GACD;IACA,UAAU,EAAE,SAAS,CAAA;IACrB,IAAI,EAAE,IAAI,CAAA;IACV,QAAQ,EAAE,QAAQ,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,YAAY,CAAA;CACrB,GACD;IACA,UAAU,EAAE,OAAO,CAAA;IACnB,MAAM,EAAE,eAAe,EAAE,GAAG,SAAS,CAAA;IACrC,QAAQ,EAAE,GAAG,CAAA;IACb,IAAI,EAAE,IAAI,CAAA;IACV,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAA;CACjC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { FileUploadAction } from './FileUploadAction';
2
+ import type { FileUploadMultiTemporalState } from './FileUploadMultiTemporalState';
3
+ export declare const initializeFileUploadState: <Result = unknown, Metadata = undefined>() => FileUploadMultiTemporalState<Result, Metadata>;
4
+ export declare const fileUploadReducer: <Result = unknown, Metadata = undefined>(previousState: FileUploadMultiTemporalState<Result, Metadata>, action: FileUploadAction<Result, Metadata>) => FileUploadMultiTemporalState<Result, Metadata>;
5
+ //# sourceMappingURL=fileUploadReducer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileUploadReducer.d.ts","sourceRoot":"","sources":["../../../src/upload/fileUploadReducer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAA;AAGlF,eAAO,MAAM,yBAAyB,8FASpC,CAAA;AAEF,eAAO,MAAM,iBAAiB,uMAsK7B,CAAA"}
@@ -0,0 +1,8 @@
1
+ export * from './useFileUpload';
2
+ export type { FileId } from './FileId';
3
+ export type { FileUploadCompoundState } from './FileUploadCompoundState';
4
+ export type { FileUploadMetadata } from './FileUploadMetadata';
5
+ export type { StartUploadFileOptions, StartUpload, FileUploadOperations, InitializeUpload, PurgeUpload, FailUpload, } from './FileUploadOperations';
6
+ export type { FileWithMetadata } from './FileWithMetadata';
7
+ export type { SingleFileUploadState } from './SingleFileUploadState';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/upload/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAE/B,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,YAAY,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACxE,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,YAAY,EACX,sBAAsB,EACtB,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,WAAW,EACX,UAAU,GACV,MAAM,wBAAwB,CAAA;AAC/B,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,YAAY,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { FileId } from './FileId';
2
+ import type { FileUploadMultiTemporalState } from './FileUploadMultiTemporalState';
3
+ export declare const toFileId: <Result = unknown, Metadata = undefined>(state: FileUploadMultiTemporalState<Result, Metadata>, fileOrId: File | FileId) => FileId;
4
+ //# sourceMappingURL=toFileId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toFileId.d.ts","sourceRoot":"","sources":["../../../src/upload/toFileId.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAA;AAElF,eAAO,MAAM,QAAQ,4GAEV,IAAI,GAAG,MAAM,WAMvB,CAAA"}
@@ -0,0 +1,11 @@
1
+ import type { FileUploadCompoundState } from './FileUploadCompoundState';
2
+ import type { FileUploadOperations } from './FileUploadOperations';
3
+ export declare type FileUpload<Result = unknown, Metadata = undefined> = [
4
+ FileUploadCompoundState<Result, Metadata>,
5
+ FileUploadOperations<Metadata>
6
+ ];
7
+ export interface FileUploadOptions {
8
+ maxUpdateFrequency?: number;
9
+ }
10
+ export declare const useFileUpload: <Result = unknown, Metadata = undefined>(options?: FileUploadOptions | undefined) => FileUpload<Result, Metadata>;
11
+ //# sourceMappingURL=useFileUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFileUpload.d.ts","sourceRoot":"","sources":["../../../src/upload/useFileUpload.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AAGxE,OAAO,KAAK,EAEX,oBAAoB,EAKpB,MAAM,wBAAwB,CAAA;AAK/B,oBAAY,UAAU,CAAC,MAAM,GAAG,OAAO,EAAE,QAAQ,GAAG,SAAS,IAAI;IAChE,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAC;IACzC,oBAAoB,CAAC,QAAQ,CAAC;CAC9B,CAAA;AAED,MAAM,WAAW,iBAAiB;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,eAAO,MAAM,aAAa,mHAwOzB,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { GraphQlClient } from '@contember/client';
2
+ export declare const useGraphQlClient: (path: string) => GraphQlClient;
3
+ //# sourceMappingURL=useGraphQlClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGraphQlClient.d.ts","sourceRoot":"","sources":["../../src/useGraphQlClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAKjD,eAAO,MAAM,gBAAgB,SAAU,MAAM,KAAG,aAI/C,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare function assertNever(_: never): asserts _ is never;
2
+ //# sourceMappingURL=assertNever.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertNever.d.ts","sourceRoot":"","sources":["../../../src/utils/assertNever.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC,IAAI,KAAK,CAExD"}
@@ -0,0 +1,2 @@
1
+ export * from './assertNever';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@contember/react-client",
3
3
  "license": "Apache-2.0",
4
- "version": "1.0.0-alpha.8",
4
+ "version": "1.0.0-rc.4",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "main": "./dist/production/index.js",
@@ -14,19 +14,18 @@
14
14
  }
15
15
  },
16
16
  "files": [
17
- "dist/"
17
+ "dist/",
18
+ "src/"
18
19
  ],
19
- "typings": "./dist/react-client.d.ts",
20
+ "typings": "./dist/types/index.d.ts",
20
21
  "dependencies": {
21
- "@contember/client": "1.0.0-alpha.8"
22
+ "@contember/client": "1.0.0-rc.4"
22
23
  },
23
24
  "peerDependencies": {
24
25
  "react": "^17"
25
26
  },
26
27
  "scripts": {
27
- "build": "vite build --mode development && vite build --mode production",
28
- "build:api:dev": "api-extractor run --local",
29
- "build:api:prod": "api-extractor run"
28
+ "build": "vite build --mode development && vite build --mode production"
30
29
  },
31
30
  "readme": "# `@contember/react-client`\n\n## Usage\nIf you wish to communicate with any Contember API, wrap your code with the `ContemberClient` component:\n```tsx\nimport { ContemberClient } from '@contember/react-client'\n\n<ContemberClient\n\tapiBaseUrl=\"https://api.example.com\"\n\tproject=\"PROJECT-SLUG\"\n\tsessionToken=\"SESSION-TOKEN\"\n\tstage=\"STAGE-SLUG\"\n>\n ...\n</ContemberClient>\n```\n\n## Notable APIs\nYou'll have to look at the code for now, sorry.\n- `<RichTextRenderer />`\n- `useFileUpload`\n- `useContentApiRequest` / `useTenantApiRequest` / `useSystemApiRequest`\n"
32
31
  }
@@ -0,0 +1 @@
1
+ export class ClientError extends Error {}
@@ -0,0 +1,48 @@
1
+ import { memo, useCallback, useEffect, useState } from 'react'
2
+ import { SessionTokenContext, SetSessionTokenContext } from './auth'
3
+ import { ApiBaseUrlContext, LoginTokenContext } from './config'
4
+ import { ProjectSlugContext, StageSlugContext } from './project'
5
+
6
+ export interface ContemberClientProps {
7
+ apiBaseUrl: string
8
+ sessionToken?: string
9
+ loginToken?: string
10
+ project?: string
11
+ stage?: string
12
+ }
13
+
14
+ const sessionTokenKey = 'contember_session_token'
15
+
16
+ export const ContemberClient = memo<ContemberClientProps & { children: React.ReactNode }>(function ContemberClient({
17
+ apiBaseUrl,
18
+ children,
19
+ loginToken,
20
+ project,
21
+ sessionToken,
22
+ stage,
23
+ }) {
24
+ const [sessionTokenInner, setSessionTokenInner] = useState(() => localStorage.getItem(sessionTokenKey) ?? sessionToken ?? undefined)
25
+
26
+ const setSessionToken = useCallback((token: string | undefined) => {
27
+ if (token !== undefined) {
28
+ localStorage.setItem(sessionTokenKey, token)
29
+ } else {
30
+ localStorage.removeItem(sessionTokenKey)
31
+ }
32
+ setSessionTokenInner(token)
33
+ }, [])
34
+
35
+ return (
36
+ <ApiBaseUrlContext.Provider value={apiBaseUrl}>
37
+ <LoginTokenContext.Provider value={loginToken}>
38
+ <SetSessionTokenContext.Provider value={setSessionToken}>
39
+ <SessionTokenContext.Provider value={sessionTokenInner}>
40
+ <ProjectSlugContext.Provider value={project}>
41
+ <StageSlugContext.Provider value={stage}>{children}</StageSlugContext.Provider>
42
+ </ProjectSlugContext.Provider>
43
+ </SessionTokenContext.Provider>
44
+ </SetSessionTokenContext.Provider>
45
+ </LoginTokenContext.Provider>
46
+ </ApiBaseUrlContext.Provider>
47
+ )
48
+ })
@@ -0,0 +1 @@
1
+ /// <reference types="vite/client" />
@@ -0,0 +1,17 @@
1
+ import type { GraphQlClientFailedRequestMetadata } from '@contember/client'
2
+
3
+ export type ApiRequestAction<SuccessData> =
4
+ | {
5
+ type: 'uninitialize'
6
+ }
7
+ | {
8
+ type: 'initialize'
9
+ }
10
+ | {
11
+ type: 'resolveSuccessfully'
12
+ data: SuccessData
13
+ }
14
+ | {
15
+ type: 'resolveWithError'
16
+ error: GraphQlClientFailedRequestMetadata
17
+ }
@@ -0,0 +1,25 @@
1
+ import type { GraphQlClientFailedRequestMetadata } from '@contember/client'
2
+
3
+ export type ApiRequestState<SuccessData> =
4
+ | {
5
+ isLoading: false
6
+ isFinished: false
7
+ readyState: 'uninitialized'
8
+ }
9
+ | {
10
+ isLoading: true
11
+ isFinished: false
12
+ readyState: 'pending'
13
+ }
14
+ | {
15
+ isLoading: false
16
+ isFinished: true
17
+ readyState: 'networkSuccess'
18
+ data: SuccessData
19
+ }
20
+ | {
21
+ isLoading: false
22
+ isFinished: true
23
+ readyState: 'networkError'
24
+ data: GraphQlClientFailedRequestMetadata
25
+ }
@@ -0,0 +1,41 @@
1
+ import type { ApiRequestAction } from './ApiRequestAction'
2
+ import type { ApiRequestState } from './ApiRequestState'
3
+
4
+ export type ApiRequestReducer<SuccessData> = (
5
+ previousState: ApiRequestState<SuccessData>,
6
+ action: ApiRequestAction<SuccessData>,
7
+ ) => ApiRequestState<SuccessData>
8
+
9
+ export const apiRequestReducer = <SuccessData>(
10
+ previousState: ApiRequestState<SuccessData>,
11
+ action: ApiRequestAction<SuccessData>,
12
+ ): ApiRequestState<SuccessData> => {
13
+ switch (action.type) {
14
+ case 'uninitialize':
15
+ return {
16
+ readyState: 'uninitialized',
17
+ isFinished: false,
18
+ isLoading: false,
19
+ }
20
+ case 'initialize':
21
+ return {
22
+ readyState: 'pending',
23
+ isFinished: false,
24
+ isLoading: true,
25
+ }
26
+ case 'resolveSuccessfully':
27
+ return {
28
+ readyState: 'networkSuccess',
29
+ data: action.data,
30
+ isFinished: true,
31
+ isLoading: false,
32
+ }
33
+ case 'resolveWithError':
34
+ return {
35
+ readyState: 'networkError',
36
+ data: action.error,
37
+ isFinished: true,
38
+ isLoading: false,
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,4 @@
1
+ export * from './ApiRequestAction'
2
+ export * from './apiRequestReducer'
3
+ export * from './ApiRequestState'
4
+ export * from './useApiRequest'
@@ -0,0 +1,73 @@
1
+ import type {
2
+ GraphQlClient,
3
+ GraphQlClientFailedRequestMetadata,
4
+ GraphQlClientRequestOptions,
5
+ GraphQlClientVariables,
6
+ } from '@contember/client'
7
+ import { useCallback, useEffect, useReducer, useRef } from 'react'
8
+ import { ApiRequestReducer, apiRequestReducer } from './apiRequestReducer'
9
+ import type { ApiRequestState } from './ApiRequestState'
10
+
11
+ const initialState: ApiRequestState<any> = {
12
+ isLoading: false,
13
+ isFinished: false,
14
+ readyState: 'uninitialized',
15
+ }
16
+
17
+ export type UseApiRequestResult<SuccessData> = [
18
+ ApiRequestState<SuccessData>,
19
+ (
20
+ query: string,
21
+ variables?: GraphQlClientVariables,
22
+ options?: Omit<GraphQlClientRequestOptions, 'variables'>,
23
+ ) => Promise<SuccessData>,
24
+ ]
25
+
26
+ export const useApiRequest = <SuccessData>(client: GraphQlClient): UseApiRequestResult<SuccessData> => {
27
+ const [state, dispatch] = useReducer(apiRequestReducer as ApiRequestReducer<SuccessData>, initialState)
28
+
29
+ const isUnmountedRef = useRef(false)
30
+ const sendRequest = useCallback(
31
+ async (
32
+ query: string,
33
+ variables: GraphQlClientVariables = {},
34
+ options?: Omit<GraphQlClientRequestOptions, 'variables'>,
35
+ ): Promise<SuccessData> => {
36
+ if (isUnmountedRef.current) {
37
+ return Promise.reject()
38
+ }
39
+ dispatch({
40
+ type: 'initialize',
41
+ })
42
+ return client
43
+ .sendRequest<SuccessData>(query, {
44
+ ...options,
45
+ variables,
46
+ })
47
+ .then(data => {
48
+ dispatch({
49
+ type: 'resolveSuccessfully',
50
+ data,
51
+ })
52
+ return Promise.resolve(data)
53
+ })
54
+ .catch((error: GraphQlClientFailedRequestMetadata) => {
55
+ dispatch({
56
+ type: 'resolveWithError',
57
+ error,
58
+ })
59
+ return Promise.reject(error)
60
+ })
61
+ },
62
+ [client],
63
+ )
64
+
65
+ useEffect(
66
+ () => () => {
67
+ isUnmountedRef.current = true
68
+ },
69
+ [], // This empty array is crucial! Otherwise it will first "unmount" before second render no matter what.
70
+ )
71
+
72
+ return [state, sendRequest]
73
+ }
@@ -0,0 +1,3 @@
1
+ import { createContext } from 'react'
2
+
3
+ export const SessionTokenContext = createContext<string | undefined>(undefined)
@@ -0,0 +1,5 @@
1
+ import { createContext } from 'react'
2
+
3
+ export const SetSessionTokenContext = createContext<(token: string | undefined) => void>(() => {
4
+ throw new Error('SetSessionTokenContext is not set')
5
+ })
@@ -0,0 +1,4 @@
1
+ export * from './SessionTokenContext'
2
+ export * from './SetSessionTokenContext'
3
+ export * from './useSessionToken'
4
+ export * from './useSetSessionToken'
@@ -0,0 +1,4 @@
1
+ import { useContext } from 'react'
2
+ import { SessionTokenContext } from './SessionTokenContext'
3
+
4
+ export const useSessionToken = () => useContext(SessionTokenContext)
@@ -0,0 +1,4 @@
1
+ import { useContext } from 'react'
2
+ import { SetSessionTokenContext } from './SetSessionTokenContext'
3
+
4
+ export const useSetSessionToken = () => useContext(SetSessionTokenContext)
@@ -0,0 +1,112 @@
1
+ import type { RichTextElement } from './RichTextElement'
2
+ import type { RichTextLeaf } from './RichTextLeaf'
3
+
4
+ export type BuiltinElements<
5
+ CustomElements extends RichTextElement = never,
6
+ CustomLeaves extends RichTextLeaf = never,
7
+ > =
8
+ | RichTextAnchorElement<CustomElements, CustomLeaves>
9
+ | RichTextHeadingElement<CustomElements, CustomLeaves>
10
+ | RichTextHorizontalRuleElement<CustomElements, CustomLeaves>
11
+ | RichTextListItemElement<CustomElements, CustomLeaves>
12
+ | RichTextOrderedListElement<CustomElements, CustomLeaves>
13
+ | RichTextParagraphElement<CustomElements, CustomLeaves>
14
+ | RichTextReferenceElement<CustomElements, CustomLeaves>
15
+ | RichTextScrollTargetElement<CustomElements, CustomLeaves>
16
+ | RichTextTableCellElement<CustomElements, CustomLeaves>
17
+ | RichTextTableElement<CustomElements, CustomLeaves>
18
+ | RichTextTableRowElement<CustomElements, CustomLeaves>
19
+ | RichTextUnorderedListElement<CustomElements, CustomLeaves>
20
+
21
+ export interface RichTextAnchorElement<
22
+ CustomElements extends RichTextElement = never,
23
+ CustomLeaves extends RichTextLeaf = never,
24
+ > extends RichTextElement<CustomElements, CustomLeaves> {
25
+ type: 'anchor'
26
+ href: string
27
+ }
28
+
29
+ export interface RichTextHeadingElement<
30
+ CustomElements extends RichTextElement = never,
31
+ CustomLeaves extends RichTextLeaf = never,
32
+ > extends RichTextElement<CustomElements, CustomLeaves> {
33
+ type: 'heading'
34
+ level: 1 | 2 | 3 | 4 | 5 | 6
35
+ isNumbered?: boolean
36
+ }
37
+
38
+ export interface RichTextOrderedListElement<
39
+ CustomElements extends RichTextElement = never,
40
+ CustomLeaves extends RichTextLeaf = never,
41
+ > extends RichTextElement<CustomElements, CustomLeaves> {
42
+ type: 'orderedList'
43
+ }
44
+
45
+ export interface RichTextUnorderedListElement<
46
+ CustomElements extends RichTextElement = never,
47
+ CustomLeaves extends RichTextLeaf = never,
48
+ > extends RichTextElement<CustomElements, CustomLeaves> {
49
+ type: 'unorderedList'
50
+ }
51
+
52
+ export interface RichTextListItemElement<
53
+ CustomElements extends RichTextElement = never,
54
+ CustomLeaves extends RichTextLeaf = never,
55
+ > extends RichTextElement<CustomElements, CustomLeaves> {
56
+ type: 'listItem'
57
+ }
58
+
59
+ export interface RichTextHorizontalRuleElement<
60
+ CustomElements extends RichTextElement = never,
61
+ CustomLeaves extends RichTextLeaf = never,
62
+ > extends RichTextElement<CustomElements, CustomLeaves> {
63
+ type: 'horizontalRule'
64
+ }
65
+
66
+ export interface RichTextParagraphElement<
67
+ CustomElements extends RichTextElement = never,
68
+ CustomLeaves extends RichTextLeaf = never,
69
+ > extends RichTextElement<CustomElements, CustomLeaves> {
70
+ type: 'paragraph'
71
+ isNumbered?: boolean
72
+ }
73
+
74
+ export interface RichTextReferenceElement<
75
+ CustomElements extends RichTextElement = never,
76
+ CustomLeaves extends RichTextLeaf = never,
77
+ > extends RichTextElement<CustomElements, CustomLeaves> {
78
+ type: 'reference'
79
+ referenceId: string
80
+ }
81
+
82
+ export interface RichTextScrollTargetElement<
83
+ CustomElements extends RichTextElement = never,
84
+ CustomLeaves extends RichTextLeaf = never,
85
+ > extends RichTextElement<CustomElements, CustomLeaves> {
86
+ type: 'scrollTarget'
87
+ identifier: string
88
+ }
89
+
90
+ export interface RichTextTableElement<
91
+ CustomElements extends RichTextElement = never,
92
+ CustomLeaves extends RichTextLeaf = never,
93
+ > extends RichTextElement<CustomElements, CustomLeaves> {
94
+ type: 'table'
95
+ }
96
+
97
+ export interface RichTextTableCellElement<
98
+ CustomElements extends RichTextElement = never,
99
+ CustomLeaves extends RichTextLeaf = never,
100
+ > extends RichTextElement<CustomElements, CustomLeaves> {
101
+ type: 'tableCell'
102
+ headerScope?: 'row'
103
+ justify?: 'start' | 'center' | 'end'
104
+ }
105
+
106
+ export interface RichTextTableRowElement<
107
+ CustomElements extends RichTextElement = never,
108
+ CustomLeaves extends RichTextLeaf = never,
109
+ > extends RichTextElement<CustomElements, CustomLeaves> {
110
+ type: 'tableRow'
111
+ headerScope?: 'table'
112
+ }
@@ -0,0 +1,32 @@
1
+ import type { RichTextLeaf } from './RichTextLeaf'
2
+
3
+ export type BuiltinLeaves = RichTextBoldLeaf &
4
+ RichTextCodeLeaf &
5
+ RichTextHighlightLeaf &
6
+ RichTextItalicLeaf &
7
+ RichTextStrikeThroughLeaf &
8
+ RichTextUnderlineLeaf
9
+
10
+ export interface RichTextBoldLeaf extends RichTextLeaf {
11
+ isBold?: boolean
12
+ }
13
+
14
+ export interface RichTextCodeLeaf extends RichTextLeaf {
15
+ isCode?: boolean
16
+ }
17
+
18
+ export interface RichTextHighlightLeaf extends RichTextLeaf {
19
+ isHighlighted?: boolean
20
+ }
21
+
22
+ export interface RichTextItalicLeaf extends RichTextLeaf {
23
+ isItalic?: boolean
24
+ }
25
+
26
+ export interface RichTextStrikeThroughLeaf extends RichTextLeaf {
27
+ isStruckThrough?: boolean
28
+ }
29
+
30
+ export interface RichTextUnderlineLeaf extends RichTextLeaf {
31
+ isUnderlined?: boolean
32
+ }
@@ -0,0 +1,71 @@
1
+ import type { ComponentType, ReactElement } from 'react'
2
+ import { createElement } from 'react'
3
+ import type { BuiltinElements } from './BuiltinElements'
4
+ import type { BuiltinLeaves } from './BuiltinLeaves'
5
+ import type { RenderChildrenOptions } from './renderChildren'
6
+ import { renderChildren } from './renderChildren'
7
+ import { RenderElementFallback } from './RenderElementFallback'
8
+ import { resolveRichTextElementMetadata } from './resolveRichTextElementMetadata'
9
+ import type { RichTextElement } from './RichTextElement'
10
+ import type { RichTextElementMetadata } from './RichTextElementMetadata'
11
+ import type { RichTextLeaf } from './RichTextLeaf'
12
+ import type { RichTextReference } from './RichTextReference'
13
+ import { useRichTextRenderMetadata } from './RichTextRenderMetadataContext'
14
+
15
+ export type RenderElement<
16
+ CustomElements extends RichTextElement = never,
17
+ CustomLeaves extends RichTextLeaf = never,
18
+ Reference extends RichTextReference = RichTextReference,
19
+ > = ComponentType<
20
+ {
21
+ element: CustomElements | BuiltinElements<CustomElements, CustomLeaves>
22
+ children: ReactElement
23
+
24
+ fallback: ReactElement
25
+
26
+ renderChildren: (
27
+ children:
28
+ | CustomElements
29
+ | BuiltinElements<CustomElements, CustomLeaves>
30
+ | CustomLeaves
31
+ | BuiltinLeaves
32
+ | Array<CustomElements | BuiltinElements<CustomElements, CustomLeaves> | CustomLeaves | BuiltinLeaves>,
33
+ options: RenderChildrenOptions<CustomElements, CustomLeaves>,
34
+ ) => ReactElement
35
+ renderChildrenOptions: RenderChildrenOptions<CustomElements, CustomLeaves>
36
+ } & RichTextElementMetadata<CustomElements, CustomLeaves, Reference>
37
+ >
38
+
39
+ export interface ElementRendererProps<
40
+ CustomElements extends RichTextElement = never,
41
+ CustomLeaves extends RichTextLeaf = never,
42
+ > {
43
+ element: CustomElements | BuiltinElements<CustomElements, CustomLeaves>
44
+ children: ReactElement
45
+ options: RenderChildrenOptions<CustomElements, CustomLeaves>
46
+ }
47
+
48
+ export function ElementRenderer<
49
+ CustomElements extends RichTextElement = never,
50
+ CustomLeaves extends RichTextLeaf = never,
51
+ >({ element, children, options }: ElementRendererProps<CustomElements, CustomLeaves>) {
52
+ const metadata = useRichTextRenderMetadata<CustomElements, CustomLeaves>()
53
+ const elementMetadata = resolveRichTextElementMetadata<CustomElements, CustomLeaves>(element, metadata)
54
+
55
+ const fallback = (
56
+ <RenderElementFallback element={element as BuiltinElements} options={options}>
57
+ {children}
58
+ </RenderElementFallback>
59
+ )
60
+
61
+ return options.renderElement
62
+ ? createElement(options.renderElement, {
63
+ ...elementMetadata,
64
+ element,
65
+ fallback,
66
+ children,
67
+ renderChildren,
68
+ renderChildrenOptions: options,
69
+ })
70
+ : fallback
71
+ }
@@ -0,0 +1,39 @@
1
+ import type { ComponentType, ReactElement } from 'react'
2
+ import { createElement } from 'react'
3
+ import type { BuiltinLeaves } from './BuiltinLeaves'
4
+ import { RenderLeafFallback } from './RenderLeafFallback'
5
+ import type { RichTextLeaf } from './RichTextLeaf'
6
+ import type { RichTextLeafMetadata } from './RichTextLeafMetadata'
7
+ import { useRichTextRenderMetadata } from './RichTextRenderMetadataContext'
8
+
9
+ export type RenderLeaf<CustomLeaves extends RichTextLeaf> = ComponentType<
10
+ {
11
+ leaf: CustomLeaves | BuiltinLeaves
12
+ fallback: ReactElement
13
+ } & RichTextLeafMetadata
14
+ >
15
+
16
+ export interface LeafRendererProps<CustomLeaves extends RichTextLeaf = never> {
17
+ renderLeaf?: RenderLeaf<CustomLeaves>
18
+ leaf: CustomLeaves | BuiltinLeaves
19
+ }
20
+
21
+ export function LeafRenderer<CustomLeaves extends RichTextLeaf = never>({
22
+ leaf,
23
+ renderLeaf,
24
+ }: LeafRendererProps<CustomLeaves>) {
25
+ const formatVersion = useRichTextRenderMetadata().formatVersion
26
+ const fallback = <RenderLeafFallback leaf={leaf} />
27
+
28
+ return renderLeaf
29
+ ? createElement(
30
+ renderLeaf,
31
+ {
32
+ formatVersion,
33
+ leaf,
34
+ fallback,
35
+ },
36
+ leaf.text,
37
+ )
38
+ : fallback
39
+ }