@contember/react-client 1.0.0-rc.2 → 1.0.0-rc.22

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 (237) hide show
  1. package/dist/development/components/RichTextRenderer/RichTextRenderer.js +1 -1
  2. package/dist/development/components/RichTextRenderer/RichTextRenderer.js.map +1 -1
  3. package/dist/development/upload/fileUploadReducer.js +3 -3
  4. package/dist/development/upload/fileUploadReducer.js.map +1 -1
  5. package/dist/development/upload/useFileUpload.js +5 -5
  6. package/dist/development/upload/useFileUpload.js.map +1 -1
  7. package/dist/production/components/RichTextRenderer/RichTextRenderer.js +1 -1
  8. package/dist/production/components/RichTextRenderer/RichTextRenderer.js.map +1 -1
  9. package/dist/production/upload/fileUploadReducer.js +3 -3
  10. package/dist/production/upload/fileUploadReducer.js.map +1 -1
  11. package/dist/production/upload/useFileUpload.js +5 -5
  12. package/dist/production/upload/useFileUpload.js.map +1 -1
  13. package/dist/types/ClientError.d.ts +3 -0
  14. package/dist/types/ClientError.d.ts.map +1 -0
  15. package/dist/types/ContemberClient.d.ts +12 -0
  16. package/dist/types/ContemberClient.d.ts.map +1 -0
  17. package/dist/types/apiRequest/ApiRequestAction.d.ts +13 -0
  18. package/dist/types/apiRequest/ApiRequestAction.d.ts.map +1 -0
  19. package/dist/types/apiRequest/ApiRequestState.d.ts +21 -0
  20. package/dist/types/apiRequest/ApiRequestState.d.ts.map +1 -0
  21. package/dist/types/apiRequest/apiRequestReducer.d.ts +5 -0
  22. package/dist/types/apiRequest/apiRequestReducer.d.ts.map +1 -0
  23. package/dist/types/apiRequest/index.d.ts +5 -0
  24. package/dist/types/apiRequest/index.d.ts.map +1 -0
  25. package/dist/types/apiRequest/useApiRequest.d.ts +8 -0
  26. package/dist/types/apiRequest/useApiRequest.d.ts.map +1 -0
  27. package/dist/types/auth/SessionTokenContext.d.ts +3 -0
  28. package/dist/types/auth/SessionTokenContext.d.ts.map +1 -0
  29. package/dist/types/auth/SetSessionTokenContext.d.ts +3 -0
  30. package/dist/types/auth/SetSessionTokenContext.d.ts.map +1 -0
  31. package/dist/types/auth/index.d.ts +5 -0
  32. package/dist/types/auth/index.d.ts.map +1 -0
  33. package/dist/types/auth/useSessionToken.d.ts +2 -0
  34. package/dist/types/auth/useSessionToken.d.ts.map +1 -0
  35. package/dist/types/auth/useSetSessionToken.d.ts +2 -0
  36. package/dist/types/auth/useSetSessionToken.d.ts.map +1 -0
  37. package/dist/types/components/RichTextRenderer/BuiltinElements.d.ts +49 -0
  38. package/dist/types/components/RichTextRenderer/BuiltinElements.d.ts.map +1 -0
  39. package/dist/types/components/RichTextRenderer/BuiltinLeaves.d.ts +21 -0
  40. package/dist/types/components/RichTextRenderer/BuiltinLeaves.d.ts.map +1 -0
  41. package/dist/types/components/RichTextRenderer/ElementRenderer.d.ts +22 -0
  42. package/dist/types/components/RichTextRenderer/ElementRenderer.d.ts.map +1 -0
  43. package/dist/types/components/RichTextRenderer/LeafRenderer.d.ts +14 -0
  44. package/dist/types/components/RichTextRenderer/LeafRenderer.d.ts.map +1 -0
  45. package/dist/types/components/RichTextRenderer/NormalizedRichTextBlock.d.ts +14 -0
  46. package/dist/types/components/RichTextRenderer/NormalizedRichTextBlock.d.ts.map +1 -0
  47. package/dist/types/components/RichTextRenderer/ReferenceRenderer.d.ts +14 -0
  48. package/dist/types/components/RichTextRenderer/ReferenceRenderer.d.ts.map +1 -0
  49. package/dist/types/components/RichTextRenderer/RenderElementFallback.d.ts +12 -0
  50. package/dist/types/components/RichTextRenderer/RenderElementFallback.d.ts.map +1 -0
  51. package/dist/types/components/RichTextRenderer/RenderLeafFallback.d.ts +7 -0
  52. package/dist/types/components/RichTextRenderer/RenderLeafFallback.d.ts.map +1 -0
  53. package/dist/types/components/RichTextRenderer/RichTextBlock.d.ts +2 -0
  54. package/dist/types/components/RichTextRenderer/RichTextBlock.d.ts.map +1 -0
  55. package/dist/types/components/RichTextRenderer/RichTextElement.d.ts +7 -0
  56. package/dist/types/components/RichTextRenderer/RichTextElement.d.ts.map +1 -0
  57. package/dist/types/components/RichTextRenderer/RichTextElementMetadata.d.ts +11 -0
  58. package/dist/types/components/RichTextRenderer/RichTextElementMetadata.d.ts.map +1 -0
  59. package/dist/types/components/RichTextRenderer/RichTextLeaf.d.ts +4 -0
  60. package/dist/types/components/RichTextRenderer/RichTextLeaf.d.ts.map +1 -0
  61. package/dist/types/components/RichTextRenderer/RichTextLeafMetadata.d.ts +4 -0
  62. package/dist/types/components/RichTextRenderer/RichTextLeafMetadata.d.ts.map +1 -0
  63. package/dist/types/components/RichTextRenderer/RichTextReference.d.ts +4 -0
  64. package/dist/types/components/RichTextRenderer/RichTextReference.d.ts.map +1 -0
  65. package/dist/types/components/RichTextRenderer/RichTextRenderMetadata.d.ts +12 -0
  66. package/dist/types/components/RichTextRenderer/RichTextRenderMetadata.d.ts.map +1 -0
  67. package/dist/types/components/RichTextRenderer/RichTextRenderMetadataContext.d.ts +8 -0
  68. package/dist/types/components/RichTextRenderer/RichTextRenderMetadataContext.d.ts.map +1 -0
  69. package/dist/types/components/RichTextRenderer/RichTextRenderer.d.ts +29 -0
  70. package/dist/types/components/RichTextRenderer/RichTextRenderer.d.ts.map +1 -0
  71. package/dist/types/components/RichTextRenderer/RichTextRendererError.d.ts +3 -0
  72. package/dist/types/components/RichTextRenderer/RichTextRendererError.d.ts.map +1 -0
  73. package/dist/types/components/RichTextRenderer/RootEditorNode.d.ts +9 -0
  74. package/dist/types/components/RichTextRenderer/RootEditorNode.d.ts.map +1 -0
  75. package/dist/types/components/RichTextRenderer/defaultDeserialize.d.ts +5 -0
  76. package/dist/types/components/RichTextRenderer/defaultDeserialize.d.ts.map +1 -0
  77. package/dist/types/components/RichTextRenderer/index.d.ts +16 -0
  78. package/dist/types/components/RichTextRenderer/index.d.ts.map +1 -0
  79. package/dist/types/components/RichTextRenderer/renderChildren.d.ts +14 -0
  80. package/dist/types/components/RichTextRenderer/renderChildren.d.ts.map +1 -0
  81. package/dist/types/components/RichTextRenderer/resolveRichTextElementMetadata.d.ts +8 -0
  82. package/dist/types/components/RichTextRenderer/resolveRichTextElementMetadata.d.ts.map +1 -0
  83. package/dist/types/components/index.d.ts +2 -0
  84. package/dist/types/components/index.d.ts.map +1 -0
  85. package/dist/types/config/ApiBaseUrlContext.d.ts +3 -0
  86. package/dist/types/config/ApiBaseUrlContext.d.ts.map +1 -0
  87. package/dist/types/config/LoginTokenContext.d.ts +3 -0
  88. package/dist/types/config/LoginTokenContext.d.ts.map +1 -0
  89. package/dist/types/config/index.d.ts +5 -0
  90. package/dist/types/config/index.d.ts.map +1 -0
  91. package/dist/types/config/useApiBaseUrl.d.ts +2 -0
  92. package/dist/types/config/useApiBaseUrl.d.ts.map +1 -0
  93. package/dist/types/config/useLoginToken.d.ts +2 -0
  94. package/dist/types/config/useLoginToken.d.ts.map +1 -0
  95. package/dist/types/content/index.d.ts +4 -0
  96. package/dist/types/content/index.d.ts.map +1 -0
  97. package/dist/types/content/useContentApiRequest.d.ts +3 -0
  98. package/dist/types/content/useContentApiRequest.d.ts.map +1 -0
  99. package/dist/types/content/useContentGraphQlClient.d.ts +3 -0
  100. package/dist/types/content/useContentGraphQlClient.d.ts.map +1 -0
  101. package/dist/types/content/useCurrentContentGraphQlClient.d.ts +3 -0
  102. package/dist/types/content/useCurrentContentGraphQlClient.d.ts.map +1 -0
  103. package/dist/types/index.d.ts +14 -0
  104. package/dist/types/index.d.ts.map +1 -0
  105. package/dist/types/project/ProjectSlugContext.d.ts +3 -0
  106. package/dist/types/project/ProjectSlugContext.d.ts.map +1 -0
  107. package/dist/types/project/StageSlugContext.d.ts +3 -0
  108. package/dist/types/project/StageSlugContext.d.ts.map +1 -0
  109. package/dist/types/project/index.d.ts +5 -0
  110. package/dist/types/project/index.d.ts.map +1 -0
  111. package/dist/types/project/useProjectSlug.d.ts +2 -0
  112. package/dist/types/project/useProjectSlug.d.ts.map +1 -0
  113. package/dist/types/project/useStageSlug.d.ts +2 -0
  114. package/dist/types/project/useStageSlug.d.ts.map +1 -0
  115. package/dist/types/system/index.d.ts +4 -0
  116. package/dist/types/system/index.d.ts.map +1 -0
  117. package/dist/types/system/useCurrentSystemGraphQlClient.d.ts +3 -0
  118. package/dist/types/system/useCurrentSystemGraphQlClient.d.ts.map +1 -0
  119. package/dist/types/system/useSystemApiRequest.d.ts +3 -0
  120. package/dist/types/system/useSystemApiRequest.d.ts.map +1 -0
  121. package/dist/types/system/useSystemGraphQlClient.d.ts +2 -0
  122. package/dist/types/system/useSystemGraphQlClient.d.ts.map +1 -0
  123. package/dist/types/tenant/index.d.ts +3 -0
  124. package/dist/types/tenant/index.d.ts.map +1 -0
  125. package/dist/types/tenant/useTenantApiRequest.d.ts +3 -0
  126. package/dist/types/tenant/useTenantApiRequest.d.ts.map +1 -0
  127. package/dist/types/tenant/useTenantGraphQlClient.d.ts +2 -0
  128. package/dist/types/tenant/useTenantGraphQlClient.d.ts.map +1 -0
  129. package/dist/types/tsconfig.tsbuildinfo +1 -0
  130. package/dist/types/upload/FileId.d.ts +2 -0
  131. package/dist/types/upload/FileId.d.ts.map +1 -0
  132. package/dist/types/upload/FileUploadAction.d.ts +26 -0
  133. package/dist/types/upload/FileUploadAction.d.ts.map +1 -0
  134. package/dist/types/upload/FileUploadCompoundState.d.ts +4 -0
  135. package/dist/types/upload/FileUploadCompoundState.d.ts.map +1 -0
  136. package/dist/types/upload/FileUploadMetadata.d.ts +6 -0
  137. package/dist/types/upload/FileUploadMetadata.d.ts.map +1 -0
  138. package/dist/types/upload/FileUploadMultiTemporalState.d.ts +10 -0
  139. package/dist/types/upload/FileUploadMultiTemporalState.d.ts.map +1 -0
  140. package/dist/types/upload/FileUploadOperations.d.ts +18 -0
  141. package/dist/types/upload/FileUploadOperations.d.ts.map +1 -0
  142. package/dist/types/upload/FileWithMetadata.d.ts +8 -0
  143. package/dist/types/upload/FileWithMetadata.d.ts.map +1 -0
  144. package/dist/types/upload/SingleFileUploadState.d.ts +31 -0
  145. package/dist/types/upload/SingleFileUploadState.d.ts.map +1 -0
  146. package/dist/types/upload/fileUploadReducer.d.ts +5 -0
  147. package/dist/types/upload/fileUploadReducer.d.ts.map +1 -0
  148. package/dist/types/upload/index.d.ts +8 -0
  149. package/dist/types/upload/index.d.ts.map +1 -0
  150. package/dist/types/upload/toFileId.d.ts +4 -0
  151. package/dist/types/upload/toFileId.d.ts.map +1 -0
  152. package/dist/types/upload/useFileUpload.d.ts +11 -0
  153. package/dist/types/upload/useFileUpload.d.ts.map +1 -0
  154. package/dist/types/useGraphQlClient.d.ts +3 -0
  155. package/dist/types/useGraphQlClient.d.ts.map +1 -0
  156. package/dist/types/utils/assertNever.d.ts +2 -0
  157. package/dist/types/utils/assertNever.d.ts.map +1 -0
  158. package/dist/types/utils/index.d.ts +2 -0
  159. package/dist/types/utils/index.d.ts.map +1 -0
  160. package/package.json +7 -8
  161. package/readme.md +39 -1
  162. package/src/ClientError.ts +1 -0
  163. package/src/ContemberClient.tsx +48 -0
  164. package/src/ambient.d.ts +1 -0
  165. package/src/apiRequest/ApiRequestAction.ts +17 -0
  166. package/src/apiRequest/ApiRequestState.ts +25 -0
  167. package/src/apiRequest/apiRequestReducer.ts +41 -0
  168. package/src/apiRequest/index.ts +4 -0
  169. package/src/apiRequest/useApiRequest.ts +73 -0
  170. package/src/auth/SessionTokenContext.ts +3 -0
  171. package/src/auth/SetSessionTokenContext.ts +5 -0
  172. package/src/auth/index.ts +4 -0
  173. package/src/auth/useSessionToken.ts +4 -0
  174. package/src/auth/useSetSessionToken.ts +4 -0
  175. package/src/components/RichTextRenderer/BuiltinElements.ts +112 -0
  176. package/src/components/RichTextRenderer/BuiltinLeaves.ts +32 -0
  177. package/src/components/RichTextRenderer/ElementRenderer.tsx +71 -0
  178. package/src/components/RichTextRenderer/LeafRenderer.tsx +39 -0
  179. package/src/components/RichTextRenderer/NormalizedRichTextBlock.ts +17 -0
  180. package/src/components/RichTextRenderer/ReferenceRenderer.ts +26 -0
  181. package/src/components/RichTextRenderer/RenderElementFallback.tsx +147 -0
  182. package/src/components/RichTextRenderer/RenderLeafFallback.tsx +43 -0
  183. package/src/components/RichTextRenderer/RichTextBlock.ts +1 -0
  184. package/src/components/RichTextRenderer/RichTextElement.ts +10 -0
  185. package/src/components/RichTextRenderer/RichTextElementMetadata.ts +15 -0
  186. package/src/components/RichTextRenderer/RichTextLeaf.ts +3 -0
  187. package/src/components/RichTextRenderer/RichTextLeafMetadata.ts +3 -0
  188. package/src/components/RichTextRenderer/RichTextReference.ts +3 -0
  189. package/src/components/RichTextRenderer/RichTextRenderMetadata.ts +16 -0
  190. package/src/components/RichTextRenderer/RichTextRenderMetadataContext.ts +20 -0
  191. package/src/components/RichTextRenderer/RichTextRenderer.tsx +165 -0
  192. package/src/components/RichTextRenderer/RichTextRendererError.ts +1 -0
  193. package/src/components/RichTextRenderer/RootEditorNode.ts +12 -0
  194. package/src/components/RichTextRenderer/defaultDeserialize.ts +19 -0
  195. package/src/components/RichTextRenderer/index.ts +15 -0
  196. package/src/components/RichTextRenderer/renderChildren.tsx +50 -0
  197. package/src/components/RichTextRenderer/resolveRichTextElementMetadata.ts +50 -0
  198. package/src/components/index.ts +1 -0
  199. package/src/config/ApiBaseUrlContext.ts +3 -0
  200. package/src/config/LoginTokenContext.ts +3 -0
  201. package/src/config/index.ts +4 -0
  202. package/src/config/useApiBaseUrl.ts +4 -0
  203. package/src/config/useLoginToken.ts +4 -0
  204. package/src/content/index.ts +3 -0
  205. package/src/content/useContentApiRequest.ts +6 -0
  206. package/src/content/useContentGraphQlClient.ts +6 -0
  207. package/src/content/useCurrentContentGraphQlClient.ts +17 -0
  208. package/src/index.ts +15 -0
  209. package/src/project/ProjectSlugContext.ts +3 -0
  210. package/src/project/StageSlugContext.ts +3 -0
  211. package/src/project/index.ts +4 -0
  212. package/src/project/useProjectSlug.ts +4 -0
  213. package/src/project/useStageSlug.ts +4 -0
  214. package/src/system/index.ts +3 -0
  215. package/src/system/useCurrentSystemGraphQlClient.ts +13 -0
  216. package/src/system/useSystemApiRequest.ts +6 -0
  217. package/src/system/useSystemGraphQlClient.ts +4 -0
  218. package/src/tenant/index.ts +2 -0
  219. package/src/tenant/useTenantApiRequest.ts +6 -0
  220. package/src/tenant/useTenantGraphQlClient.ts +4 -0
  221. package/src/tsconfig.json +9 -0
  222. package/src/upload/FileId.ts +1 -0
  223. package/src/upload/FileUploadAction.ts +33 -0
  224. package/src/upload/FileUploadCompoundState.ts +7 -0
  225. package/src/upload/FileUploadMetadata.ts +6 -0
  226. package/src/upload/FileUploadMultiTemporalState.ts +10 -0
  227. package/src/upload/FileUploadOperations.ts +22 -0
  228. package/src/upload/FileWithMetadata.ts +8 -0
  229. package/src/upload/SingleFileUploadState.ts +35 -0
  230. package/src/upload/fileUploadReducer.ts +185 -0
  231. package/src/upload/index.ts +15 -0
  232. package/src/upload/toFileId.ts +12 -0
  233. package/src/upload/useFileUpload.ts +262 -0
  234. package/src/useGraphQlClient.ts +10 -0
  235. package/src/utils/assertNever.ts +3 -0
  236. package/src/utils/index.ts +1 -0
  237. package/dist/react-client.d.ts +0 -367
package/readme.md CHANGED
@@ -1,7 +1,9 @@
1
1
  # `@contember/react-client`
2
2
 
3
3
  ## Usage
4
+
4
5
  If you wish to communicate with any Contember API, wrap your code with the `ContemberClient` component:
6
+
5
7
  ```tsx
6
8
  import { ContemberClient } from '@contember/react-client'
7
9
 
@@ -11,12 +13,48 @@ import { ContemberClient } from '@contember/react-client'
11
13
  sessionToken="SESSION-TOKEN"
12
14
  stage="STAGE-SLUG"
13
15
  >
14
- ...
16
+ ...
15
17
  </ContemberClient>
16
18
  ```
17
19
 
18
20
  ## Notable APIs
21
+
19
22
  You'll have to look at the code for now, sorry.
23
+
20
24
  - `<RichTextRenderer />`
21
25
  - `useFileUpload`
22
26
  - `useContentApiRequest` / `useTenantApiRequest` / `useSystemApiRequest`
27
+
28
+ ## RichTextRenderer
29
+
30
+ Here is simple exmaple of how to use the `RichTextRenderer` component with custom references and elements.
31
+
32
+ ```tsx
33
+ import { RichTextRenderer } from '@contember/react-client'
34
+ import Image from './myComponents/Image'
35
+ import Gallery from './myComponents/Gallery'
36
+ import Quote from './myComponents/Quote'
37
+ import Link from './myComponents/Link'
38
+
39
+ <RichTextRenderer
40
+ sourceField="json"
41
+ renderElement={(props) => {
42
+ if (props.element.type === 'link' && props.reference) {
43
+ return <Link label={props.element.children[0].text} url={props.reference.target} />
44
+ }
45
+
46
+ return props.fallback
47
+ }}
48
+ referenceRenderers={{
49
+ image: (reference) => <Image reference={reference} />,
50
+ gallery: (reference) => <Gallery reference={reference} />,
51
+ quote: (reference) => <Quote reference={reference} />,
52
+ }}
53
+ />
54
+ ```
55
+
56
+ | Prop | Description |
57
+ | -------------------- | ----------------------------------------------------- |
58
+ | `sourceField` | The field in the GraphQL that contains the rich text. |
59
+ | `renderElement` | Function that renders an element. |
60
+ | `referenceRenderers` | Object that maps reference types to renderers. |
@@ -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
+ }
@@ -0,0 +1,17 @@
1
+ import type { ReferenceRenderer } from './ReferenceRenderer'
2
+ import type { RichTextElement } from './RichTextElement'
3
+ import type { RichTextLeaf } from './RichTextLeaf'
4
+ import type { RichTextReference } from './RichTextReference'
5
+ import type { RootEditorNode } from './RootEditorNode'
6
+
7
+ export interface NormalizedRichTextBlock<
8
+ CustomElements extends RichTextElement = never,
9
+ CustomLeaves extends RichTextLeaf = never,
10
+ > {
11
+ content: RootEditorNode<CustomElements, CustomLeaves>
12
+ referenceRenderers: Record<string, ReferenceRenderer<RichTextReference, CustomElements, CustomLeaves>>
13
+ references: Map<string, RichTextReference> | undefined
14
+ referencesField: string | undefined
15
+ referenceDiscriminationField: string | undefined
16
+ id: string | undefined
17
+ }
@@ -0,0 +1,26 @@
1
+ import type { ReactElement, ReactNode } from 'react'
2
+ import type { BuiltinElements } from './BuiltinElements'
3
+ import type { RichTextElement } from './RichTextElement'
4
+ import type { RichTextElementMetadata } from './RichTextElementMetadata'
5
+ import type { RichTextLeaf } from './RichTextLeaf'
6
+ import type { RichTextReference } from './RichTextReference'
7
+
8
+ export type ReferenceRendererProps<
9
+ Reference extends RichTextReference = RichTextReference,
10
+ CustomElements extends RichTextElement = never,
11
+ CustomLeaves extends RichTextLeaf = never,
12
+ > = {
13
+ element: CustomElements | BuiltinElements<CustomElements, CustomLeaves>
14
+ children: ReactElement
15
+ } & {
16
+ [Prop in keyof RichTextElementMetadata<CustomElements, CustomLeaves, Reference>]: Exclude<
17
+ RichTextElementMetadata<CustomElements, CustomLeaves, Reference>[Prop],
18
+ undefined
19
+ >
20
+ }
21
+
22
+ export type ReferenceRenderer<
23
+ Reference extends RichTextReference = RichTextReference,
24
+ CustomElements extends RichTextElement = never,
25
+ CustomLeaves extends RichTextLeaf = never,
26
+ > = (props: ReferenceRendererProps<Reference, CustomElements, CustomLeaves>) => ReactNode