@contember/react-client 0.7.0-alpha.20
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.
- package/LICENSE +186 -0
- package/dist/development/ClientError.js +5 -0
- package/dist/development/ClientError.js.map +1 -0
- package/dist/development/ContemberClient.js +30 -0
- package/dist/development/ContemberClient.js.map +1 -0
- package/dist/development/apiRequest/apiRequestReducer.js +33 -0
- package/dist/development/apiRequest/apiRequestReducer.js.map +1 -0
- package/dist/development/apiRequest/useApiRequest.js +43 -0
- package/dist/development/apiRequest/useApiRequest.js.map +1 -0
- package/dist/development/auth/SessionTokenContext.js +6 -0
- package/dist/development/auth/SessionTokenContext.js.map +1 -0
- package/dist/development/auth/useLoginRequest.js +18 -0
- package/dist/development/auth/useLoginRequest.js.map +1 -0
- package/dist/development/auth/useSessionToken.js +7 -0
- package/dist/development/auth/useSessionToken.js.map +1 -0
- package/dist/development/components/RichTextRenderer/ElementRenderer.js +25 -0
- package/dist/development/components/RichTextRenderer/ElementRenderer.js.map +1 -0
- package/dist/development/components/RichTextRenderer/LeafRenderer.js +21 -0
- package/dist/development/components/RichTextRenderer/LeafRenderer.js.map +1 -0
- package/dist/development/components/RichTextRenderer/RenderElementFallback.js +107 -0
- package/dist/development/components/RichTextRenderer/RenderElementFallback.js.map +1 -0
- package/dist/development/components/RichTextRenderer/RenderLeafFallback.js +36 -0
- package/dist/development/components/RichTextRenderer/RenderLeafFallback.js.map +1 -0
- package/dist/development/components/RichTextRenderer/RichTextRenderMetadataContext.js +14 -0
- package/dist/development/components/RichTextRenderer/RichTextRenderMetadataContext.js.map +1 -0
- package/dist/development/components/RichTextRenderer/RichTextRenderer.js +91 -0
- package/dist/development/components/RichTextRenderer/RichTextRenderer.js.map +1 -0
- package/dist/development/components/RichTextRenderer/RichTextRendererError.js +5 -0
- package/dist/development/components/RichTextRenderer/RichTextRendererError.js.map +1 -0
- package/dist/development/components/RichTextRenderer/defaultDeserialize.js +13 -0
- package/dist/development/components/RichTextRenderer/defaultDeserialize.js.map +1 -0
- package/dist/development/components/RichTextRenderer/renderChildren.js +29 -0
- package/dist/development/components/RichTextRenderer/renderChildren.js.map +1 -0
- package/dist/development/components/RichTextRenderer/resolveRichTextElementMetadata.js +27 -0
- package/dist/development/components/RichTextRenderer/resolveRichTextElementMetadata.js.map +1 -0
- package/dist/development/config/ApiBaseUrlContext.js +6 -0
- package/dist/development/config/ApiBaseUrlContext.js.map +1 -0
- package/dist/development/config/LoginTokenContext.js +6 -0
- package/dist/development/config/LoginTokenContext.js.map +1 -0
- package/dist/development/config/useApiBaseUrl.js +7 -0
- package/dist/development/config/useApiBaseUrl.js.map +1 -0
- package/dist/development/config/useLoginToken.js +7 -0
- package/dist/development/config/useLoginToken.js.map +1 -0
- package/dist/development/content/useContentApiRequest.js +7 -0
- package/dist/development/content/useContentApiRequest.js.map +1 -0
- package/dist/development/content/useContentGraphQlClient.js +7 -0
- package/dist/development/content/useContentGraphQlClient.js.map +1 -0
- package/dist/development/content/useCurrentContentGraphQlClient.js +19 -0
- package/dist/development/content/useCurrentContentGraphQlClient.js.map +1 -0
- package/dist/development/index.js +31 -0
- package/dist/development/index.js.map +1 -0
- package/dist/development/project/ProjectSlugContext.js +6 -0
- package/dist/development/project/ProjectSlugContext.js.map +1 -0
- package/dist/development/project/StageSlugContext.js +6 -0
- package/dist/development/project/StageSlugContext.js.map +1 -0
- package/dist/development/project/useProjectSlug.js +7 -0
- package/dist/development/project/useProjectSlug.js.map +1 -0
- package/dist/development/project/useStageSlug.js +7 -0
- package/dist/development/project/useStageSlug.js.map +1 -0
- package/dist/development/system/useCurrentSystemGraphQlClient.js +14 -0
- package/dist/development/system/useCurrentSystemGraphQlClient.js.map +1 -0
- package/dist/development/system/useDiffQuery.js +17 -0
- package/dist/development/system/useDiffQuery.js.map +1 -0
- package/dist/development/system/useReleaseTreeMutation.js +17 -0
- package/dist/development/system/useReleaseTreeMutation.js.map +1 -0
- package/dist/development/system/useSystemApiRequest.js +7 -0
- package/dist/development/system/useSystemApiRequest.js.map +1 -0
- package/dist/development/system/useSystemGraphQlClient.js +7 -0
- package/dist/development/system/useSystemGraphQlClient.js.map +1 -0
- package/dist/development/tenant/useTenantApiRequest.js +7 -0
- package/dist/development/tenant/useTenantApiRequest.js.map +1 -0
- package/dist/development/tenant/useTenantGraphQlClient.js +7 -0
- package/dist/development/tenant/useTenantGraphQlClient.js.map +1 -0
- package/dist/development/upload/fileUploadReducer.js +162 -0
- package/dist/development/upload/fileUploadReducer.js.map +1 -0
- package/dist/development/upload/toFileId.js +9 -0
- package/dist/development/upload/toFileId.js.map +1 -0
- package/dist/development/upload/useFileUpload.js +192 -0
- package/dist/development/upload/useFileUpload.js.map +1 -0
- package/dist/development/useGraphQlClient.js +13 -0
- package/dist/development/useGraphQlClient.js.map +1 -0
- package/dist/development/utils/assertNever.js +6 -0
- package/dist/development/utils/assertNever.js.map +1 -0
- package/dist/production/ClientError.js +4 -0
- package/dist/production/ClientError.js.map +1 -0
- package/dist/production/ContemberClient.js +28 -0
- package/dist/production/ContemberClient.js.map +1 -0
- package/dist/production/apiRequest/apiRequestReducer.js +32 -0
- package/dist/production/apiRequest/apiRequestReducer.js.map +1 -0
- package/dist/production/apiRequest/useApiRequest.js +41 -0
- package/dist/production/apiRequest/useApiRequest.js.map +1 -0
- package/dist/production/auth/SessionTokenContext.js +4 -0
- package/dist/production/auth/SessionTokenContext.js.map +1 -0
- package/dist/production/auth/useLoginRequest.js +16 -0
- package/dist/production/auth/useLoginRequest.js.map +1 -0
- package/dist/production/auth/useSessionToken.js +5 -0
- package/dist/production/auth/useSessionToken.js.map +1 -0
- package/dist/production/components/RichTextRenderer/ElementRenderer.js +23 -0
- package/dist/production/components/RichTextRenderer/ElementRenderer.js.map +1 -0
- package/dist/production/components/RichTextRenderer/LeafRenderer.js +19 -0
- package/dist/production/components/RichTextRenderer/LeafRenderer.js.map +1 -0
- package/dist/production/components/RichTextRenderer/RenderElementFallback.js +104 -0
- package/dist/production/components/RichTextRenderer/RenderElementFallback.js.map +1 -0
- package/dist/production/components/RichTextRenderer/RenderLeafFallback.js +34 -0
- package/dist/production/components/RichTextRenderer/RenderLeafFallback.js.map +1 -0
- package/dist/production/components/RichTextRenderer/RichTextRenderMetadataContext.js +12 -0
- package/dist/production/components/RichTextRenderer/RichTextRenderMetadataContext.js.map +1 -0
- package/dist/production/components/RichTextRenderer/RichTextRenderer.js +89 -0
- package/dist/production/components/RichTextRenderer/RichTextRenderer.js.map +1 -0
- package/dist/production/components/RichTextRenderer/RichTextRendererError.js +4 -0
- package/dist/production/components/RichTextRenderer/RichTextRendererError.js.map +1 -0
- package/dist/production/components/RichTextRenderer/defaultDeserialize.js +12 -0
- package/dist/production/components/RichTextRenderer/defaultDeserialize.js.map +1 -0
- package/dist/production/components/RichTextRenderer/renderChildren.js +27 -0
- package/dist/production/components/RichTextRenderer/renderChildren.js.map +1 -0
- package/dist/production/components/RichTextRenderer/resolveRichTextElementMetadata.js +25 -0
- package/dist/production/components/RichTextRenderer/resolveRichTextElementMetadata.js.map +1 -0
- package/dist/production/config/ApiBaseUrlContext.js +4 -0
- package/dist/production/config/ApiBaseUrlContext.js.map +1 -0
- package/dist/production/config/LoginTokenContext.js +4 -0
- package/dist/production/config/LoginTokenContext.js.map +1 -0
- package/dist/production/config/useApiBaseUrl.js +5 -0
- package/dist/production/config/useApiBaseUrl.js.map +1 -0
- package/dist/production/config/useLoginToken.js +5 -0
- package/dist/production/config/useLoginToken.js.map +1 -0
- package/dist/production/content/useContentApiRequest.js +5 -0
- package/dist/production/content/useContentApiRequest.js.map +1 -0
- package/dist/production/content/useContentGraphQlClient.js +5 -0
- package/dist/production/content/useContentGraphQlClient.js.map +1 -0
- package/dist/production/content/useCurrentContentGraphQlClient.js +17 -0
- package/dist/production/content/useCurrentContentGraphQlClient.js.map +1 -0
- package/dist/production/index.js +31 -0
- package/dist/production/index.js.map +1 -0
- package/dist/production/project/ProjectSlugContext.js +4 -0
- package/dist/production/project/ProjectSlugContext.js.map +1 -0
- package/dist/production/project/StageSlugContext.js +4 -0
- package/dist/production/project/StageSlugContext.js.map +1 -0
- package/dist/production/project/useProjectSlug.js +5 -0
- package/dist/production/project/useProjectSlug.js.map +1 -0
- package/dist/production/project/useStageSlug.js +5 -0
- package/dist/production/project/useStageSlug.js.map +1 -0
- package/dist/production/system/useCurrentSystemGraphQlClient.js +12 -0
- package/dist/production/system/useCurrentSystemGraphQlClient.js.map +1 -0
- package/dist/production/system/useDiffQuery.js +15 -0
- package/dist/production/system/useDiffQuery.js.map +1 -0
- package/dist/production/system/useReleaseTreeMutation.js +15 -0
- package/dist/production/system/useReleaseTreeMutation.js.map +1 -0
- package/dist/production/system/useSystemApiRequest.js +5 -0
- package/dist/production/system/useSystemApiRequest.js.map +1 -0
- package/dist/production/system/useSystemGraphQlClient.js +5 -0
- package/dist/production/system/useSystemGraphQlClient.js.map +1 -0
- package/dist/production/tenant/useTenantApiRequest.js +5 -0
- package/dist/production/tenant/useTenantApiRequest.js.map +1 -0
- package/dist/production/tenant/useTenantGraphQlClient.js +5 -0
- package/dist/production/tenant/useTenantGraphQlClient.js.map +1 -0
- package/dist/production/upload/fileUploadReducer.js +160 -0
- package/dist/production/upload/fileUploadReducer.js.map +1 -0
- package/dist/production/upload/toFileId.js +8 -0
- package/dist/production/upload/toFileId.js.map +1 -0
- package/dist/production/upload/useFileUpload.js +190 -0
- package/dist/production/upload/useFileUpload.js.map +1 -0
- package/dist/production/useGraphQlClient.js +11 -0
- package/dist/production/useGraphQlClient.js.map +1 -0
- package/dist/production/utils/assertNever.js +5 -0
- package/dist/production/utils/assertNever.js.map +1 -0
- package/dist/react-client.d.ts +370 -0
- package/package.json +31 -0
- package/readme.md +22 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFileUpload.js","sources":["../../../src/upload/useFileUpload.ts"],"sourcesContent":["import { FileUploader, S3FileUploader, UploadedFileMetadata } from '@contember/client'\nimport { Reducer, useCallback, useEffect, useMemo, useReducer, useRef } from 'react'\nimport { useCurrentContentGraphQlClient } from '../content'\nimport type { FileId } from './FileId'\nimport type { FileUploadAction } from './FileUploadAction'\nimport type { FileUploadCompoundState } from './FileUploadCompoundState'\nimport type { FileUploadMetadata } from './FileUploadMetadata'\nimport type { FileUploadMultiTemporalState } from './FileUploadMultiTemporalState'\nimport type {\n\tPurgeUpload,\n\tFileUploadOperations,\n\tInitializeUpload,\n\tStartUpload,\n\tStartUploadFileOptions,\n\tFailUpload,\n} from './FileUploadOperations'\nimport { fileUploadReducer, initializeFileUploadState } from './fileUploadReducer'\nimport type { FileWithMetadata } from './FileWithMetadata'\nimport { toFileId } from './toFileId'\n\nexport type FileUpload<Result = unknown, Metadata = undefined> = [\n\tFileUploadCompoundState<Result, Metadata>,\n\tFileUploadOperations<Metadata>,\n]\n\nexport interface FileUploadOptions {\n\tmaxUpdateFrequency?: number // This does NOT apply to all kinds of updates.\n}\n\nexport const useFileUpload = <Result = unknown, Metadata = undefined>(\n\toptions?: FileUploadOptions,\n): FileUpload<Result, Metadata> => {\n\tconst maxUpdateFrequency = options?.maxUpdateFrequency ?? 100\n\n\tconst contentApiClient = useCurrentContentGraphQlClient()\n\n\tconst updateTimeoutRef = useRef<number | undefined>(undefined)\n\tconst isFirstRenderRef = useRef(true)\n\tconst fileIdSeedRef = useRef(1)\n\n\tconst [multiTemporalState, dispatch] = useReducer<\n\t\tReducer<FileUploadMultiTemporalState<Result, Metadata>, FileUploadAction<Result, Metadata>>,\n\t\tundefined\n\t>(fileUploadReducer, undefined, initializeFileUploadState)\n\tconst multiTemporalStateRef = useRef(multiTemporalState)\n\n\tconst defaultUploader = useMemo(() => new S3FileUploader(), [])\n\n\tuseEffect(() => {\n\t\tmultiTemporalStateRef.current = multiTemporalState\n\t})\n\n\tconst purgeUpload = useCallback<PurgeUpload>(files => {\n\t\tdispatch({\n\t\t\ttype: 'purge',\n\t\t\tfiles,\n\t\t})\n\t}, [])\n\tconst failUpload = useCallback<FailUpload>(error => {\n\t\tdispatch({\n\t\t\ttype: 'finishWithError',\n\t\t\terror,\n\t\t})\n\t}, [])\n\tconst initializeUpload = useCallback<InitializeUpload>(\n\t\tfiles => {\n\t\t\tconst newFileIds = new Set<FileId>()\n\t\t\tconst fileWithMetadataByFileConfig = new Map<FileId, FileWithMetadata>()\n\n\t\t\tfor (const fileMaybeWithId of files) {\n\t\t\t\tconst abortController = new AbortController()\n\n\t\t\t\tlet fileId: FileId\n\t\t\t\tlet file: File\n\n\t\t\t\tif (fileMaybeWithId instanceof File) {\n\t\t\t\t\tfileId = `__contember__file-${fileIdSeedRef.current++}`\n\t\t\t\t\tfile = fileMaybeWithId\n\t\t\t\t} else {\n\t\t\t\t\tfileId = fileMaybeWithId[0]\n\t\t\t\t\tfile = fileMaybeWithId[1]\n\t\t\t\t}\n\n\t\t\t\tabortController.signal.addEventListener('abort', () => {\n\t\t\t\t\tpurgeUpload([fileId])\n\t\t\t\t})\n\n\t\t\t\tfileWithMetadataByFileConfig.set(fileId, {\n\t\t\t\t\tpreviewUrl: URL.createObjectURL(file),\n\t\t\t\t\tabortController,\n\t\t\t\t\tfile,\n\t\t\t\t\tfileId,\n\t\t\t\t})\n\n\t\t\t\tnewFileIds.add(fileId)\n\t\t\t}\n\t\t\tif (fileWithMetadataByFileConfig.size === 0) {\n\t\t\t\treturn fileWithMetadataByFileConfig\n\t\t\t}\n\n\t\t\tif (newFileIds.size) {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: 'purge',\n\t\t\t\t\tfiles: newFileIds,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tdispatch({\n\t\t\t\ttype: 'initialize',\n\t\t\t\tfiles: fileWithMetadataByFileConfig,\n\t\t\t})\n\n\t\t\treturn fileWithMetadataByFileConfig\n\t\t},\n\t\t[purgeUpload],\n\t)\n\tconst startUpload = useCallback<StartUpload<Metadata>>(\n\t\tfiles => {\n\t\t\tconst filesById = new Map<FileId, FileUploadMetadata<Metadata>>()\n\t\t\tconst groupedByUploader: Map<FileUploader, Map<File, UploadedFileMetadata>> = new Map()\n\n\t\t\tconst currentState = multiTemporalStateRef.current\n\n\t\t\tfor (const fileOrIdMaybeWithOptions of files) {\n\t\t\t\tlet fileOrId: File | FileId\n\t\t\t\tlet options: StartUploadFileOptions<Metadata>\n\n\t\t\t\tif (Array.isArray(fileOrIdMaybeWithOptions)) {\n\t\t\t\t\tfileOrId = fileOrIdMaybeWithOptions[0]\n\t\t\t\t\toptions = fileOrIdMaybeWithOptions[1]\n\t\t\t\t} else {\n\t\t\t\t\tfileOrId = fileOrIdMaybeWithOptions\n\t\t\t\t\toptions = {}\n\t\t\t\t}\n\t\t\t\tconst { uploader = defaultUploader, metadata } = options\n\n\t\t\t\tconst fileId = toFileId(currentState, fileOrId)\n\t\t\t\tconst fileState = currentState.liveState.get(fileId)\n\n\t\t\t\tif (fileState === undefined || fileState.readyState !== 'initializing') {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Trying to startUpload a file that hasn't been previously initialized. ` +\n\t\t\t\t\t\t\t`This will be possible in future, but isn't yet.`,\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tfilesById.set(fileId, {\n\t\t\t\t\tuploader,\n\t\t\t\t\tmetadata,\n\t\t\t\t})\n\n\t\t\t\tlet filesWithSameUploader = groupedByUploader.get(uploader)\n\t\t\t\tif (filesWithSameUploader === undefined) {\n\t\t\t\t\tgroupedByUploader.set(uploader, (filesWithSameUploader = new Map()))\n\t\t\t\t}\n\t\t\t\tfilesWithSameUploader.set(fileState.file, {\n\t\t\t\t\tabortSignal: fileState.abortController.signal,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tdispatch({\n\t\t\t\ttype: 'startUploading',\n\t\t\t\tfiles: filesById,\n\t\t\t})\n\n\t\t\tfor (const [uploader, filesForUpload] of groupedByUploader) {\n\t\t\t\ttry {\n\t\t\t\t\tuploader.upload(filesForUpload, {\n\t\t\t\t\t\tonProgress: progress => {\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: 'updateUploadProgress',\n\t\t\t\t\t\t\t\tprogress,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonSuccess: result => {\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: 'finishSuccessfully',\n\t\t\t\t\t\t\t\tresult,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonError: error => {\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: 'finishWithError',\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcontentApiClient,\n\t\t\t\t\t})\n\t\t\t\t} catch (error) {\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: 'finishWithError',\n\t\t\t\t\t\terror: Array.from(filesForUpload).map(([file]) => [file, error]),\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[contentApiClient, defaultUploader],\n\t)\n\n\tconst operations = useMemo<FileUploadOperations<Metadata>>(\n\t\t() => ({\n\t\t\tfailUpload,\n\t\t\tinitializeUpload,\n\t\t\tpurgeUpload,\n\t\t\tstartUpload,\n\t\t}),\n\t\t[failUpload, initializeUpload, purgeUpload, startUpload],\n\t)\n\n\tuseEffect(() => {\n\t\tif (isFirstRenderRef.current) {\n\t\t\treturn\n\t\t}\n\t\tif (multiTemporalState.isLiveStateDirty) {\n\t\t\tconst now = Date.now()\n\t\t\tconst timeDelta = Math.max(now - multiTemporalState.lastUpdateTime, 0) // The max is just a sanity check\n\t\t\tif (timeDelta > maxUpdateFrequency) {\n\t\t\t\tif (updateTimeoutRef.current !== undefined) {\n\t\t\t\t\tclearTimeout(updateTimeoutRef.current)\n\t\t\t\t}\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: 'publishNewestState',\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tif (updateTimeoutRef.current !== undefined) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tupdateTimeoutRef.current = window.setTimeout(() => {\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: 'publishNewestState',\n\t\t\t\t\t})\n\t\t\t\t\tupdateTimeoutRef.current = undefined\n\t\t\t\t}, maxUpdateFrequency - timeDelta)\n\t\t\t}\n\t\t}\n\t}, [\n\t\tmultiTemporalState.isLiveStateDirty,\n\t\tmultiTemporalState.lastUpdateTime,\n\t\tmultiTemporalState.liveState,\n\t\tmultiTemporalState.publicState,\n\t\tmaxUpdateFrequency,\n\t])\n\n\tuseEffect(\n\t\t() => () => {\n\t\t\tfor (const [, state] of multiTemporalStateRef.current.liveState) {\n\t\t\t\tURL.revokeObjectURL(state.previewUrl)\n\t\t\t}\n\t\t\tfor (const [, state] of multiTemporalStateRef.current.publicState) {\n\t\t\t\tURL.revokeObjectURL(state.previewUrl)\n\t\t\t}\n\t\t},\n\t\t[],\n\t)\n\n\t// For this to work, this effect must be the last one to run.\n\tuseEffect(() => {\n\t\tisFirstRenderRef.current = false\n\t}, [])\n\n\treturn [multiTemporalState.publicState, operations]\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { GraphQlClient } from '@contember/client';
|
|
2
|
+
import { useMemo } from 'react';
|
|
3
|
+
import { useApiBaseUrl } from './config/useApiBaseUrl.js';
|
|
4
|
+
import { useSessionToken } from './auth/useSessionToken.js';
|
|
5
|
+
|
|
6
|
+
const useGraphQlClient = (path) => {
|
|
7
|
+
const apiBaseUrl = useApiBaseUrl();
|
|
8
|
+
const sessionToken = useSessionToken();
|
|
9
|
+
return useMemo(() => new GraphQlClient(`${apiBaseUrl}${path}`, sessionToken), [apiBaseUrl, path, sessionToken]);
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export { useGraphQlClient };
|
|
13
|
+
//# sourceMappingURL=useGraphQlClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGraphQlClient.js","sources":["../../src/useGraphQlClient.ts"],"sourcesContent":["import { GraphQlClient } from '@contember/client'\nimport { useMemo } from 'react'\nimport { useSessionToken } from './auth'\nimport { useApiBaseUrl } from './config'\n\nexport const useGraphQlClient = (path: string): GraphQlClient => {\n\tconst apiBaseUrl = useApiBaseUrl()\n\tconst sessionToken = useSessionToken()\n\treturn useMemo(() => new GraphQlClient(`${apiBaseUrl}${path}`, sessionToken), [apiBaseUrl, path, sessionToken])\n}\n"],"names":[],"mappings":";;;;;MAKa,mBAAmB,CAAC,SAAgC;AAChE,QAAM,aAAa;AACnB,QAAM,eAAe;AACrB,SAAO,QAAQ,MAAM,IAAI,cAAc,GAAG,aAAa,QAAQ,eAAe,CAAC,YAAY,MAAM;AAAA;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertNever.js","sources":["../../../src/utils/assertNever.ts"],"sourcesContent":["export function assertNever(_: never): asserts _ is never {\n\tthrow new Error()\n}\n"],"names":[],"mappings":"qBAA4B,GAA8B;AACzD,QAAM,IAAI;AAAA;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClientError.js","sources":["../../src/ClientError.ts"],"sourcesContent":["export class ClientError extends Error {}\n"],"names":[],"mappings":"0BAAiC,MAAM;AAAA;;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { memo, createElement } from "react";
|
|
2
|
+
import { ApiBaseUrlContext } from "./config/ApiBaseUrlContext.js";
|
|
3
|
+
import { LoginTokenContext } from "./config/LoginTokenContext.js";
|
|
4
|
+
import { SessionTokenContext } from "./auth/SessionTokenContext.js";
|
|
5
|
+
import { ProjectSlugContext } from "./project/ProjectSlugContext.js";
|
|
6
|
+
import { StageSlugContext } from "./project/StageSlugContext.js";
|
|
7
|
+
const ContemberClient = memo(function ContemberClient2({
|
|
8
|
+
apiBaseUrl,
|
|
9
|
+
children,
|
|
10
|
+
loginToken,
|
|
11
|
+
project,
|
|
12
|
+
sessionToken,
|
|
13
|
+
stage
|
|
14
|
+
}) {
|
|
15
|
+
return /* @__PURE__ */ createElement(ApiBaseUrlContext.Provider, {
|
|
16
|
+
value: apiBaseUrl
|
|
17
|
+
}, /* @__PURE__ */ createElement(LoginTokenContext.Provider, {
|
|
18
|
+
value: loginToken
|
|
19
|
+
}, /* @__PURE__ */ createElement(SessionTokenContext.Provider, {
|
|
20
|
+
value: sessionToken
|
|
21
|
+
}, /* @__PURE__ */ createElement(ProjectSlugContext.Provider, {
|
|
22
|
+
value: project
|
|
23
|
+
}, /* @__PURE__ */ createElement(StageSlugContext.Provider, {
|
|
24
|
+
value: stage
|
|
25
|
+
}, children)))));
|
|
26
|
+
});
|
|
27
|
+
export { ContemberClient };
|
|
28
|
+
//# sourceMappingURL=ContemberClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContemberClient.js","sources":["../../src/ContemberClient.tsx"],"sourcesContent":["import { memo, ReactNode } from 'react'\nimport { SessionTokenContext } from './auth'\nimport { ApiBaseUrlContext, LoginTokenContext } from './config'\nimport { ProjectSlugContext, StageSlugContext } from './project'\n\nexport interface ContemberClientProps {\n\tapiBaseUrl: string\n\tsessionToken?: string\n\tloginToken?: string\n\tproject?: string\n\tstage?: string\n}\n\nexport const ContemberClient = memo<ContemberClientProps & { children: React.ReactNode }>(function ContemberClient({\n\tapiBaseUrl,\n\tchildren,\n\tloginToken,\n\tproject,\n\tsessionToken,\n\tstage,\n}) {\n\treturn (\n\t\t<ApiBaseUrlContext.Provider value={apiBaseUrl}>\n\t\t\t<LoginTokenContext.Provider value={loginToken}>\n\t\t\t\t<SessionTokenContext.Provider value={sessionToken}>\n\t\t\t\t\t<ProjectSlugContext.Provider value={project}>\n\t\t\t\t\t\t<StageSlugContext.Provider value={stage}>{children}</StageSlugContext.Provider>\n\t\t\t\t\t</ProjectSlugContext.Provider>\n\t\t\t\t</SessionTokenContext.Provider>\n\t\t\t</LoginTokenContext.Provider>\n\t\t</ApiBaseUrlContext.Provider>\n\t)\n})\n"],"names":[],"mappings":";;;;;;MAaa,kBAAkB,KAA2D,0BAAyB;AAAA,EAClH;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACE;uCAEA,kBAAkB,UAAnB;AAAA,IAA4B,OAAO;AAAA,mCACjC,kBAAkB,UAAnB;AAAA,IAA4B,OAAO;AAAA,mCACjC,oBAAoB,UAArB;AAAA,IAA8B,OAAO;AAAA,mCACnC,mBAAmB,UAApB;AAAA,IAA6B,OAAO;AAAA,mCAClC,iBAAiB,UAAlB;AAAA,IAA2B,OAAO;AAAA,KAAQ;AAAA;;"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const apiRequestReducer = (previousState, action) => {
|
|
2
|
+
switch (action.type) {
|
|
3
|
+
case "uninitialize":
|
|
4
|
+
return {
|
|
5
|
+
readyState: "uninitialized",
|
|
6
|
+
isFinished: false,
|
|
7
|
+
isLoading: false
|
|
8
|
+
};
|
|
9
|
+
case "initialize":
|
|
10
|
+
return {
|
|
11
|
+
readyState: "pending",
|
|
12
|
+
isFinished: false,
|
|
13
|
+
isLoading: true
|
|
14
|
+
};
|
|
15
|
+
case "resolveSuccessfully":
|
|
16
|
+
return {
|
|
17
|
+
readyState: "networkSuccess",
|
|
18
|
+
data: action.data,
|
|
19
|
+
isFinished: true,
|
|
20
|
+
isLoading: false
|
|
21
|
+
};
|
|
22
|
+
case "resolveWithError":
|
|
23
|
+
return {
|
|
24
|
+
readyState: "networkError",
|
|
25
|
+
data: action.error,
|
|
26
|
+
isFinished: true,
|
|
27
|
+
isLoading: false
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
export { apiRequestReducer };
|
|
32
|
+
//# sourceMappingURL=apiRequestReducer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiRequestReducer.js","sources":["../../../src/apiRequest/apiRequestReducer.ts"],"sourcesContent":["import type { ApiRequestAction } from './ApiRequestAction'\nimport type { ApiRequestState } from './ApiRequestState'\n\nexport type ApiRequestReducer<SuccessData> = (\n\tpreviousState: ApiRequestState<SuccessData>,\n\taction: ApiRequestAction<SuccessData>,\n) => ApiRequestState<SuccessData>\n\nexport const apiRequestReducer = <SuccessData>(\n\tpreviousState: ApiRequestState<SuccessData>,\n\taction: ApiRequestAction<SuccessData>,\n): ApiRequestState<SuccessData> => {\n\tswitch (action.type) {\n\t\tcase 'uninitialize':\n\t\t\treturn {\n\t\t\t\treadyState: 'uninitialized',\n\t\t\t\tisFinished: false,\n\t\t\t\tisLoading: false,\n\t\t\t}\n\t\tcase 'initialize':\n\t\t\treturn {\n\t\t\t\treadyState: 'pending',\n\t\t\t\tisFinished: false,\n\t\t\t\tisLoading: true,\n\t\t\t}\n\t\tcase 'resolveSuccessfully':\n\t\t\treturn {\n\t\t\t\treadyState: 'networkSuccess',\n\t\t\t\tdata: action.data,\n\t\t\t\tisFinished: true,\n\t\t\t\tisLoading: false,\n\t\t\t}\n\t\tcase 'resolveWithError':\n\t\t\treturn {\n\t\t\t\treadyState: 'networkError',\n\t\t\t\tdata: action.error,\n\t\t\t\tisFinished: true,\n\t\t\t\tisLoading: false,\n\t\t\t}\n\t}\n}\n"],"names":[],"mappings":"MAQa,oBAAoB,CAChC,eACA,WACkC;UAC1B,OAAO;AAAA,SACT;aACG;AAAA,QACN,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA;AAAA,SAER;aACG;AAAA,QACN,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA;AAAA,SAER;aACG;AAAA,QACN,YAAY;AAAA,QACZ,MAAM,OAAO;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA;AAAA,SAER;aACG;AAAA,QACN,YAAY;AAAA,QACZ,MAAM,OAAO;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA;AAAA;AAAA;;"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { useReducer, useRef, useCallback, useEffect } from "react";
|
|
2
|
+
import { apiRequestReducer } from "./apiRequestReducer.js";
|
|
3
|
+
const initialState = {
|
|
4
|
+
isLoading: false,
|
|
5
|
+
isFinished: false,
|
|
6
|
+
readyState: "uninitialized"
|
|
7
|
+
};
|
|
8
|
+
const useApiRequest = (client) => {
|
|
9
|
+
const [state, dispatch] = useReducer(apiRequestReducer, initialState);
|
|
10
|
+
const isUnmountedRef = useRef(false);
|
|
11
|
+
const sendRequest = useCallback(async (query, variables = {}, options) => {
|
|
12
|
+
if (isUnmountedRef.current) {
|
|
13
|
+
return Promise.reject();
|
|
14
|
+
}
|
|
15
|
+
dispatch({
|
|
16
|
+
type: "initialize"
|
|
17
|
+
});
|
|
18
|
+
return client.sendRequest(query, {
|
|
19
|
+
...options,
|
|
20
|
+
variables
|
|
21
|
+
}).then((data) => {
|
|
22
|
+
dispatch({
|
|
23
|
+
type: "resolveSuccessfully",
|
|
24
|
+
data
|
|
25
|
+
});
|
|
26
|
+
return Promise.resolve(data);
|
|
27
|
+
}).catch((error) => {
|
|
28
|
+
dispatch({
|
|
29
|
+
type: "resolveWithError",
|
|
30
|
+
error
|
|
31
|
+
});
|
|
32
|
+
return Promise.reject(error);
|
|
33
|
+
});
|
|
34
|
+
}, [client]);
|
|
35
|
+
useEffect(() => () => {
|
|
36
|
+
isUnmountedRef.current = true;
|
|
37
|
+
}, []);
|
|
38
|
+
return [state, sendRequest];
|
|
39
|
+
};
|
|
40
|
+
export { useApiRequest };
|
|
41
|
+
//# sourceMappingURL=useApiRequest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useApiRequest.js","sources":["../../../src/apiRequest/useApiRequest.ts"],"sourcesContent":["import type {\n\tGraphQlClient,\n\tGraphQlClientFailedRequestMetadata,\n\tGraphQlClientRequestOptions,\n\tGraphQlClientVariables,\n} from '@contember/client'\nimport { useCallback, useEffect, useReducer, useRef } from 'react'\nimport { ApiRequestReducer, apiRequestReducer } from './apiRequestReducer'\nimport type { ApiRequestState } from './ApiRequestState'\n\nconst initialState: ApiRequestState<any> = {\n\tisLoading: false,\n\tisFinished: false,\n\treadyState: 'uninitialized',\n}\n\nexport type UseApiRequestResult<SuccessData> = [\n\tApiRequestState<SuccessData>,\n\t(\n\t\tquery: string,\n\t\tvariables?: GraphQlClientVariables,\n\t\toptions?: Omit<GraphQlClientRequestOptions, 'variables'>,\n\t) => Promise<SuccessData>,\n]\n\nexport const useApiRequest = <SuccessData>(client: GraphQlClient): UseApiRequestResult<SuccessData> => {\n\tconst [state, dispatch] = useReducer(apiRequestReducer as ApiRequestReducer<SuccessData>, initialState)\n\n\tconst isUnmountedRef = useRef(false)\n\tconst sendRequest = useCallback(\n\t\tasync (\n\t\t\tquery: string,\n\t\t\tvariables: GraphQlClientVariables = {},\n\t\t\toptions?: Omit<GraphQlClientRequestOptions, 'variables'>,\n\t\t): Promise<SuccessData> => {\n\t\t\tif (isUnmountedRef.current) {\n\t\t\t\treturn Promise.reject()\n\t\t\t}\n\t\t\tdispatch({\n\t\t\t\ttype: 'initialize',\n\t\t\t})\n\t\t\treturn client\n\t\t\t\t.sendRequest<SuccessData>(query, {\n\t\t\t\t\t...options,\n\t\t\t\t\tvariables,\n\t\t\t\t})\n\t\t\t\t.then(data => {\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: 'resolveSuccessfully',\n\t\t\t\t\t\tdata,\n\t\t\t\t\t})\n\t\t\t\t\treturn Promise.resolve(data)\n\t\t\t\t})\n\t\t\t\t.catch((error: GraphQlClientFailedRequestMetadata) => {\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: 'resolveWithError',\n\t\t\t\t\t\terror,\n\t\t\t\t\t})\n\t\t\t\t\treturn Promise.reject(error)\n\t\t\t\t})\n\t\t},\n\t\t[client],\n\t)\n\n\tuseEffect(\n\t\t() => () => {\n\t\t\tisUnmountedRef.current = true\n\t\t},\n\t\t[], // This empty array is crucial! Otherwise it will first \"unmount\" before second render no matter what.\n\t)\n\n\treturn [state, sendRequest]\n}\n"],"names":[],"mappings":";;AAUA,MAAM,eAAqC;AAAA,EAC1C,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA;MAYA,gBAAgB,CAAc,WAA4D;QAChG,CAAC,OAAO,YAAY,WAAW,mBAAqD;QAEpF,iBAAiB,OAAO;QACxB,cAAc,YACnB,OACC,OACA,YAAoC,IACpC,YAC0B;QACtB,eAAe,SAAS;aACpB,QAAQ;AAAA;aAEP;AAAA,MACR,MAAM;AAAA;WAEA,OACL,YAAyB,OAAO;AAAA,SAC7B;AAAA,MACH;AAAA,OAEA,KAAK,UAAQ;eACJ;AAAA,QACR,MAAM;AAAA,QACN;AAAA;aAEM,QAAQ,QAAQ;AAAA,OAEvB,MAAM,CAAC,UAA8C;eAC5C;AAAA,QACR,MAAM;AAAA,QACN;AAAA;aAEM,QAAQ,OAAO;AAAA;AAAA,KAGzB,CAAC;YAID,MAAM,MAAM;mBACI,UAAU;AAAA,KAE1B;SAGM,CAAC,OAAO;AAAA;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionTokenContext.js","sources":["../../../src/auth/SessionTokenContext.ts"],"sourcesContent":["import { createContext } from 'react'\n\nexport const SessionTokenContext = createContext<string | undefined>(undefined)\n"],"names":[],"mappings":";MAEa,sBAAsB,cAAkC;;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { loginMutation } from "@contember/client";
|
|
2
|
+
import { useCallback } from "react";
|
|
3
|
+
import { useTenantApiRequest } from "../tenant/useTenantApiRequest.js";
|
|
4
|
+
import { useLoginToken } from "../config/useLoginToken.js";
|
|
5
|
+
const useLoginRequest = () => {
|
|
6
|
+
const [requestState, sendRequest] = useTenantApiRequest();
|
|
7
|
+
const loginToken = useLoginToken();
|
|
8
|
+
const login = useCallback((email, password) => sendRequest(loginMutation, {
|
|
9
|
+
email,
|
|
10
|
+
password,
|
|
11
|
+
expiration: 3600 * 24 * 14
|
|
12
|
+
}, { apiTokenOverride: loginToken }), [sendRequest, loginToken]);
|
|
13
|
+
return [requestState, login];
|
|
14
|
+
};
|
|
15
|
+
export { useLoginRequest };
|
|
16
|
+
//# sourceMappingURL=useLoginRequest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLoginRequest.js","sources":["../../../src/auth/useLoginRequest.ts"],"sourcesContent":["import { loginMutation, LoginMutationResponse } from '@contember/client'\nimport { useCallback } from 'react'\nimport type { ApiRequestState } from '../apiRequest'\nimport { useLoginToken } from '../config'\nimport { useTenantApiRequest } from '../tenant'\n\nexport const useLoginRequest = (): [\n\tApiRequestState<LoginMutationResponse>,\n\t(email: string, password: string) => Promise<LoginMutationResponse>,\n] => {\n\tconst [requestState, sendRequest] = useTenantApiRequest<LoginMutationResponse>()\n\tconst loginToken = useLoginToken()\n\n\tconst login = useCallback(\n\t\t(email: string, password: string) =>\n\t\t\tsendRequest(\n\t\t\t\tloginMutation,\n\t\t\t\t{\n\t\t\t\t\temail,\n\t\t\t\t\tpassword,\n\t\t\t\t\texpiration: 3600 * 24 * 14, // Two weeks\n\t\t\t\t},\n\t\t\t\t{ apiTokenOverride: loginToken },\n\t\t\t),\n\t\t[sendRequest, loginToken],\n\t)\n\n\treturn [requestState, login]\n}\n"],"names":[],"mappings":";;;;MAMa,kBAAkB,MAG1B;QACE,CAAC,cAAc,eAAe;QAC9B,aAAa;QAEb,QAAQ,YACb,CAAC,OAAe,aACf,YACC,eACA;AAAA,IACC;AAAA,IACA;AAAA,IACA,YAAY,OAAO,KAAK;AAAA,KAEzB,EAAE,kBAAkB,eAEtB,CAAC,aAAa;SAGR,CAAC,cAAc;AAAA;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSessionToken.js","sources":["../../../src/auth/useSessionToken.ts"],"sourcesContent":["import { useContext } from 'react'\nimport { SessionTokenContext } from './SessionTokenContext'\n\nexport const useSessionToken = () => useContext(SessionTokenContext)\n"],"names":[],"mappings":";;MAGa,kBAAkB,MAAM,WAAW;;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { createElement } from "react";
|
|
2
|
+
import { renderChildren } from "./renderChildren.js";
|
|
3
|
+
import { RenderElementFallback } from "./RenderElementFallback.js";
|
|
4
|
+
import { resolveRichTextElementMetadata } from "./resolveRichTextElementMetadata.js";
|
|
5
|
+
import { useRichTextRenderMetadata } from "./RichTextRenderMetadataContext.js";
|
|
6
|
+
function ElementRenderer({ element, children, options }) {
|
|
7
|
+
const metadata = useRichTextRenderMetadata();
|
|
8
|
+
const elementMetadata = resolveRichTextElementMetadata(element, metadata);
|
|
9
|
+
const fallback = /* @__PURE__ */ createElement(RenderElementFallback, {
|
|
10
|
+
element,
|
|
11
|
+
options
|
|
12
|
+
}, children);
|
|
13
|
+
return options.renderElement ? createElement(options.renderElement, {
|
|
14
|
+
...elementMetadata,
|
|
15
|
+
element,
|
|
16
|
+
fallback,
|
|
17
|
+
children,
|
|
18
|
+
renderChildren,
|
|
19
|
+
renderChildrenOptions: options
|
|
20
|
+
}) : fallback;
|
|
21
|
+
}
|
|
22
|
+
export { ElementRenderer };
|
|
23
|
+
//# sourceMappingURL=ElementRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ElementRenderer.js","sources":["../../../../src/components/RichTextRenderer/ElementRenderer.tsx"],"sourcesContent":["import type { ComponentType, ReactElement } from 'react'\nimport { createElement } from 'react'\nimport type { BuiltinElements } from './BuiltinElements'\nimport type { BuiltinLeaves } from './BuiltinLeaves'\nimport type { RenderChildrenOptions } from './renderChildren'\nimport { renderChildren } from './renderChildren'\nimport { RenderElementFallback } from './RenderElementFallback'\nimport { resolveRichTextElementMetadata } from './resolveRichTextElementMetadata'\nimport type { RichTextElement } from './RichTextElement'\nimport type { RichTextElementMetadata } from './RichTextElementMetadata'\nimport type { RichTextLeaf } from './RichTextLeaf'\nimport type { RichTextReference } from './RichTextReference'\nimport { useRichTextRenderMetadata } from './RichTextRenderMetadataContext'\n\nexport type RenderElement<\n\tCustomElements extends RichTextElement = never,\n\tCustomLeaves extends RichTextLeaf = never,\n\tReference extends RichTextReference = RichTextReference,\n> = ComponentType<\n\t{\n\t\telement: CustomElements | BuiltinElements<CustomElements, CustomLeaves>\n\t\tchildren: ReactElement\n\n\t\tfallback: ReactElement\n\n\t\trenderChildren: (\n\t\t\tchildren:\n\t\t\t\t| CustomElements\n\t\t\t\t| BuiltinElements<CustomElements, CustomLeaves>\n\t\t\t\t| CustomLeaves\n\t\t\t\t| BuiltinLeaves\n\t\t\t\t| Array<CustomElements | BuiltinElements<CustomElements, CustomLeaves> | CustomLeaves | BuiltinLeaves>,\n\t\t\toptions: RenderChildrenOptions<CustomElements, CustomLeaves>,\n\t\t) => ReactElement\n\t\trenderChildrenOptions: RenderChildrenOptions<CustomElements, CustomLeaves>\n\t} & RichTextElementMetadata<CustomElements, CustomLeaves, Reference>\n>\n\nexport interface ElementRendererProps<\n\tCustomElements extends RichTextElement = never,\n\tCustomLeaves extends RichTextLeaf = never,\n> {\n\telement: CustomElements | BuiltinElements<CustomElements, CustomLeaves>\n\tchildren: ReactElement\n\toptions: RenderChildrenOptions<CustomElements, CustomLeaves>\n}\n\nexport function ElementRenderer<\n\tCustomElements extends RichTextElement = never,\n\tCustomLeaves extends RichTextLeaf = never,\n>({ element, children, options }: ElementRendererProps<CustomElements, CustomLeaves>) {\n\tconst metadata = useRichTextRenderMetadata<CustomElements, CustomLeaves>()\n\tconst elementMetadata = resolveRichTextElementMetadata<CustomElements, CustomLeaves>(element, metadata)\n\n\tconst fallback = (\n\t\t<RenderElementFallback element={element as BuiltinElements} options={options}>\n\t\t\t{children}\n\t\t</RenderElementFallback>\n\t)\n\n\treturn options.renderElement\n\t\t? createElement(options.renderElement, {\n\t\t\t\t...elementMetadata,\n\t\t\t\telement,\n\t\t\t\tfallback,\n\t\t\t\tchildren,\n\t\t\t\trenderChildren,\n\t\t\t\trenderChildrenOptions: options,\n\t\t })\n\t\t: fallback\n}\n"],"names":[],"mappings":";;;;;yBAkDE,EAAE,SAAS,UAAU,WAA+D;QAC/E,WAAW;QACX,kBAAkB,+BAA6D,SAAS;QAExF,yCACJ,uBAAD;AAAA,IAAuB;AAAA,IAAqC;AAAA,KAC1D;SAII,QAAQ,gBACZ,cAAc,QAAQ,eAAe;AAAA,OAClC;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,uBAAuB;AAAA,OAEvB;AAAA;;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createElement } from "react";
|
|
2
|
+
import { RenderLeafFallback } from "./RenderLeafFallback.js";
|
|
3
|
+
import { useRichTextRenderMetadata } from "./RichTextRenderMetadataContext.js";
|
|
4
|
+
function LeafRenderer({
|
|
5
|
+
leaf,
|
|
6
|
+
renderLeaf
|
|
7
|
+
}) {
|
|
8
|
+
const formatVersion = useRichTextRenderMetadata().formatVersion;
|
|
9
|
+
const fallback = /* @__PURE__ */ createElement(RenderLeafFallback, {
|
|
10
|
+
leaf
|
|
11
|
+
});
|
|
12
|
+
return renderLeaf ? createElement(renderLeaf, {
|
|
13
|
+
formatVersion,
|
|
14
|
+
leaf,
|
|
15
|
+
fallback
|
|
16
|
+
}, leaf.text) : fallback;
|
|
17
|
+
}
|
|
18
|
+
export { LeafRenderer };
|
|
19
|
+
//# sourceMappingURL=LeafRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LeafRenderer.js","sources":["../../../../src/components/RichTextRenderer/LeafRenderer.tsx"],"sourcesContent":["import type { ComponentType, ReactElement } from 'react'\nimport { createElement } from 'react'\nimport type { BuiltinLeaves } from './BuiltinLeaves'\nimport { RenderLeafFallback } from './RenderLeafFallback'\nimport type { RichTextLeaf } from './RichTextLeaf'\nimport type { RichTextLeafMetadata } from './RichTextLeafMetadata'\nimport { useRichTextRenderMetadata } from './RichTextRenderMetadataContext'\n\nexport type RenderLeaf<CustomLeaves extends RichTextLeaf> = ComponentType<\n\t{\n\t\tleaf: CustomLeaves | BuiltinLeaves\n\t\tfallback: ReactElement\n\t} & RichTextLeafMetadata\n>\n\nexport interface LeafRendererProps<CustomLeaves extends RichTextLeaf = never> {\n\trenderLeaf?: RenderLeaf<CustomLeaves>\n\tleaf: CustomLeaves | BuiltinLeaves\n}\n\nexport function LeafRenderer<CustomLeaves extends RichTextLeaf = never>({\n\tleaf,\n\trenderLeaf,\n}: LeafRendererProps<CustomLeaves>) {\n\tconst formatVersion = useRichTextRenderMetadata().formatVersion\n\tconst fallback = <RenderLeafFallback leaf={leaf} />\n\n\treturn renderLeaf\n\t\t? createElement(\n\t\t\t\trenderLeaf,\n\t\t\t\t{\n\t\t\t\t\tformatVersion,\n\t\t\t\t\tleaf,\n\t\t\t\t\tfallback,\n\t\t\t\t},\n\t\t\t\tleaf.text,\n\t\t )\n\t\t: fallback\n}\n"],"names":[],"mappings":";;;sBAoBwE;AAAA,EACvE;AAAA,EACA;AAAA,GACmC;QAC7B,gBAAgB,4BAA4B;QAC5C,yCAAY,oBAAD;AAAA,IAAoB;AAAA;SAE9B,aACJ,cACA,YACA;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,KAED,KAAK,QAEL;AAAA;;"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { createElement, Fragment } from "react";
|
|
2
|
+
import { renderChildren } from "./renderChildren.js";
|
|
3
|
+
import { resolveRichTextElementMetadata } from "./resolveRichTextElementMetadata.js";
|
|
4
|
+
import { useRichTextRenderMetadata } from "./RichTextRenderMetadataContext.js";
|
|
5
|
+
const getElementDataAttributes = (element, attributeNamePrefix = "contember-") => {
|
|
6
|
+
const { children, referenceId, ...extendedSpecifics } = element;
|
|
7
|
+
return Object.fromEntries(Object.entries(extendedSpecifics).filter(([, value]) => {
|
|
8
|
+
const t = typeof value;
|
|
9
|
+
return t === "string" || t === "number" || t === "boolean";
|
|
10
|
+
}).map(([attribute, value]) => [`data-${attributeNamePrefix}${attribute.toLowerCase()}`, value]));
|
|
11
|
+
};
|
|
12
|
+
function RenderElementFallback({ element, children, options }) {
|
|
13
|
+
const attributes = getElementDataAttributes(element, options.attributeNamePrefix);
|
|
14
|
+
switch (element.type) {
|
|
15
|
+
case "anchor":
|
|
16
|
+
return /* @__PURE__ */ createElement("a", {
|
|
17
|
+
...attributes,
|
|
18
|
+
href: element.href
|
|
19
|
+
}, children);
|
|
20
|
+
case "heading":
|
|
21
|
+
return createElement(`h${element.level}`, attributes, children);
|
|
22
|
+
case "horizontalRule":
|
|
23
|
+
return /* @__PURE__ */ createElement("hr", {
|
|
24
|
+
...attributes
|
|
25
|
+
});
|
|
26
|
+
case "listItem":
|
|
27
|
+
return /* @__PURE__ */ createElement("li", {
|
|
28
|
+
...attributes
|
|
29
|
+
}, children);
|
|
30
|
+
case "orderedList":
|
|
31
|
+
return /* @__PURE__ */ createElement("ol", {
|
|
32
|
+
...attributes
|
|
33
|
+
}, children);
|
|
34
|
+
case "paragraph":
|
|
35
|
+
return /* @__PURE__ */ createElement("p", {
|
|
36
|
+
...attributes
|
|
37
|
+
}, children);
|
|
38
|
+
case "reference": {
|
|
39
|
+
return /* @__PURE__ */ createElement(ReferenceElementFallback, {
|
|
40
|
+
element,
|
|
41
|
+
children
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
case "scrollTarget":
|
|
45
|
+
return /* @__PURE__ */ createElement("span", {
|
|
46
|
+
...attributes,
|
|
47
|
+
id: element.identifier
|
|
48
|
+
}, children);
|
|
49
|
+
case "table": {
|
|
50
|
+
const firstRow = element.children[0];
|
|
51
|
+
if (!firstRow || firstRow.headerScope !== "table") {
|
|
52
|
+
return /* @__PURE__ */ createElement("table", {
|
|
53
|
+
...attributes
|
|
54
|
+
}, /* @__PURE__ */ createElement("tbody", null, children));
|
|
55
|
+
}
|
|
56
|
+
return /* @__PURE__ */ createElement("table", {
|
|
57
|
+
...attributes
|
|
58
|
+
}, /* @__PURE__ */ createElement("thead", null, renderChildren([firstRow], options)), /* @__PURE__ */ createElement("tbody", null, renderChildren(element.children.slice(1), options)));
|
|
59
|
+
}
|
|
60
|
+
case "tableRow":
|
|
61
|
+
return /* @__PURE__ */ createElement("tr", {
|
|
62
|
+
...attributes
|
|
63
|
+
}, children);
|
|
64
|
+
case "tableCell": {
|
|
65
|
+
if (element.headerScope) {
|
|
66
|
+
return /* @__PURE__ */ createElement("th", {
|
|
67
|
+
...attributes,
|
|
68
|
+
scope: element.headerScope
|
|
69
|
+
}, children);
|
|
70
|
+
}
|
|
71
|
+
return /* @__PURE__ */ createElement("td", {
|
|
72
|
+
...attributes
|
|
73
|
+
}, children);
|
|
74
|
+
}
|
|
75
|
+
case "unorderedList":
|
|
76
|
+
return /* @__PURE__ */ createElement("ul", {
|
|
77
|
+
...attributes
|
|
78
|
+
}, children);
|
|
79
|
+
default: {
|
|
80
|
+
{
|
|
81
|
+
return children;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function ReferenceElementFallback({ element, children }) {
|
|
87
|
+
const metadata = useRichTextRenderMetadata();
|
|
88
|
+
const elementMetadata = resolveRichTextElementMetadata(element, metadata);
|
|
89
|
+
if (elementMetadata.referenceRenderer === void 0 || elementMetadata.referenceType === void 0 || elementMetadata.reference === void 0) {
|
|
90
|
+
{
|
|
91
|
+
return children;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return /* @__PURE__ */ createElement(Fragment, null, elementMetadata.referenceRenderer?.({
|
|
95
|
+
referenceType: elementMetadata.referenceType,
|
|
96
|
+
referenceRenderer: elementMetadata.referenceRenderer,
|
|
97
|
+
reference: elementMetadata.reference,
|
|
98
|
+
formatVersion: elementMetadata.formatVersion,
|
|
99
|
+
element,
|
|
100
|
+
children
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
export { RenderElementFallback };
|
|
104
|
+
//# sourceMappingURL=RenderElementFallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RenderElementFallback.js","sources":["../../../../src/components/RichTextRenderer/RenderElementFallback.tsx"],"sourcesContent":["import { createElement, ReactElement } from 'react'\nimport type { BuiltinElements, RichTextReferenceElement, RichTextTableRowElement } from './BuiltinElements'\nimport { renderChildren, RenderChildrenOptions } from './renderChildren'\nimport { resolveRichTextElementMetadata } from './resolveRichTextElementMetadata'\nimport type { RichTextElement } from './RichTextElement'\nimport type { RichTextLeaf } from './RichTextLeaf'\nimport { RichTextRendererError } from './RichTextRendererError'\nimport { useRichTextRenderMetadata } from './RichTextRenderMetadataContext'\n\nexport interface RenderElementFallbackProps<\n\tCustomElements extends RichTextElement = never,\n\tCustomLeaves extends RichTextLeaf = never,\n> {\n\telement: BuiltinElements<CustomElements, CustomLeaves>\n\tchildren: ReactElement\n\toptions: RenderChildrenOptions<CustomElements, CustomLeaves>\n}\n\nconst getElementDataAttributes = <\n\tCustomElements extends RichTextElement = never,\n\tCustomLeaves extends RichTextLeaf = never,\n>(\n\telement: RichTextElement<CustomElements, CustomLeaves>,\n\tattributeNamePrefix: string = 'contember-',\n): {\n\t[dataAttribute: string]: string | number | boolean\n} => {\n\tconst { children, referenceId, ...extendedSpecifics } = element\n\n\treturn Object.fromEntries(\n\t\tObject.entries(extendedSpecifics)\n\t\t\t.filter(([, value]) => {\n\t\t\t\tconst t = typeof value\n\t\t\t\treturn t === 'string' || t === 'number' || t === 'boolean'\n\t\t\t})\n\t\t\t.map(([attribute, value]) => [`data-${attributeNamePrefix}${attribute.toLowerCase()}`, value]),\n\t)\n}\n\nexport function RenderElementFallback<\n\tCustomElements extends RichTextElement = never,\n\tCustomLeaves extends RichTextLeaf = never,\n>({ element, children, options }: RenderElementFallbackProps<CustomElements, CustomLeaves>) {\n\tconst attributes = getElementDataAttributes(element, options.attributeNamePrefix)\n\n\tswitch (element.type) {\n\t\tcase 'anchor':\n\t\t\treturn (\n\t\t\t\t<a {...attributes} href={element.href}>\n\t\t\t\t\t{children}\n\t\t\t\t</a>\n\t\t\t)\n\t\tcase 'heading':\n\t\t\treturn createElement(`h${element.level}`, attributes, children) // TODO numbered\n\t\tcase 'horizontalRule':\n\t\t\treturn <hr {...attributes} />\n\t\tcase 'listItem':\n\t\t\treturn <li {...attributes}>{children}</li>\n\t\tcase 'orderedList':\n\t\t\treturn <ol {...attributes}>{children}</ol>\n\t\tcase 'paragraph':\n\t\t\treturn <p {...attributes}>{children}</p>\n\t\tcase 'reference': {\n\t\t\treturn <ReferenceElementFallback element={element} children={children} />\n\t\t}\n\t\tcase 'scrollTarget':\n\t\t\treturn (\n\t\t\t\t<span {...attributes} id={element.identifier}>\n\t\t\t\t\t{children}\n\t\t\t\t</span>\n\t\t\t)\n\t\tcase 'table': {\n\t\t\tconst firstRow = element.children[0] as RichTextTableRowElement<CustomElements, CustomLeaves> | undefined\n\t\t\tif (!firstRow || firstRow.headerScope !== 'table') {\n\t\t\t\treturn (\n\t\t\t\t\t<table {...attributes}>\n\t\t\t\t\t\t<tbody>{children}</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn (\n\t\t\t\t<table {...attributes}>\n\t\t\t\t\t<thead>{renderChildren<CustomElements, CustomLeaves>([firstRow], options)}</thead>\n\t\t\t\t\t<tbody>{renderChildren<CustomElements, CustomLeaves>(element.children.slice(1) as any, options)}</tbody>\n\t\t\t\t</table>\n\t\t\t)\n\t\t}\n\t\tcase 'tableRow':\n\t\t\treturn <tr {...attributes}>{children}</tr>\n\t\tcase 'tableCell': {\n\t\t\tif (element.headerScope) {\n\t\t\t\treturn (\n\t\t\t\t\t<th {...attributes} scope={element.headerScope}>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</th>\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn <td {...attributes}>{children}</td>\n\t\t}\n\t\tcase 'unorderedList':\n\t\t\treturn <ul {...attributes}>{children}</ul>\n\t\tdefault: {\n\t\t\tif (import.meta.env.DEV) {\n\t\t\t\tthrow new RichTextRendererError(\n\t\t\t\t\t`RichTextRenderer: unknown element of type '${(element as { type: string }).type}'.`,\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\treturn children // At least render the text contents\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction ReferenceElementFallback<\n\tCustomElements extends RichTextElement = never,\n\tCustomLeaves extends RichTextLeaf = never,\n>({ element, children }: { element: RichTextReferenceElement<CustomElements, CustomLeaves>; children: ReactElement }) {\n\tconst metadata = useRichTextRenderMetadata<CustomElements, CustomLeaves>()\n\tconst elementMetadata = resolveRichTextElementMetadata<CustomElements, CustomLeaves>(element, metadata)\n\n\tif (\n\t\telementMetadata.referenceRenderer === undefined ||\n\t\telementMetadata.referenceType === undefined ||\n\t\telementMetadata.reference === undefined\n\t) {\n\t\tif (import.meta.env.DEV) {\n\t\t\tthrow new RichTextRendererError(\n\t\t\t\t`RichTextRenderer: cannot render reference of type '${elementMetadata.referenceType}'.`,\n\t\t\t)\n\t\t} else {\n\t\t\treturn children // At least render the text contents\n\t\t}\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{elementMetadata.referenceRenderer?.({\n\t\t\t\treferenceType: elementMetadata.referenceType,\n\t\t\t\treferenceRenderer: elementMetadata.referenceRenderer,\n\t\t\t\treference: elementMetadata.reference,\n\t\t\t\tformatVersion: elementMetadata.formatVersion,\n\t\t\t\telement,\n\t\t\t\tchildren,\n\t\t\t})}\n\t\t</>\n\t)\n}\n"],"names":[],"mappings":";;;;AAkBA,MAAM,2BAA2B,CAIhC,SACA,sBAA8B,iBAG1B;QACE,EAAE,UAAU,gBAAgB,sBAAsB;SAEjD,OAAO,YACb,OAAO,QAAQ,mBACb,OAAO,CAAC,GAAG,WAAW;UAChB,IAAI,OAAO;WACV,MAAM,YAAY,MAAM,YAAY,MAAM;AAAA,KAEjD,IAAI,CAAC,CAAC,WAAW,WAAW,CAAC,QAAQ,sBAAsB,UAAU,iBAAiB;AAAA;+BAOxF,EAAE,SAAS,UAAU,WAAqE;QACrF,aAAa,yBAAyB,SAAS,QAAQ;UAErD,QAAQ;AAAA,SACV;2CAEF,KAAD;AAAA,WAAO;AAAA,QAAY,MAAM,QAAQ;AAAA,SAC/B;AAAA,SAGC;aACG,cAAc,IAAI,QAAQ,SAAS,YAAY;AAAA,SAClD;2CACI,MAAD;AAAA,WAAQ;AAAA;AAAA,SACX;2CACI,MAAD;AAAA,WAAQ;AAAA,SAAa;AAAA,SACxB;2CACI,MAAD;AAAA,WAAQ;AAAA,SAAa;AAAA,SACxB;2CACI,KAAD;AAAA,WAAO;AAAA,SAAa;AAAA,SACvB,aAAa;2CACT,0BAAD;AAAA,QAA0B;AAAA,QAAkB;AAAA;AAAA;AAAA,SAE/C;2CAEF,QAAD;AAAA,WAAU;AAAA,QAAY,IAAI,QAAQ;AAAA,SAChC;AAAA,SAGC,SAAS;YACP,WAAW,QAAQ,SAAS;UAC9B,CAAC,YAAY,SAAS,gBAAgB,SAAS;6CAEhD,SAAD;AAAA,aAAW;AAAA,yCACT,SAAD,MAAQ;AAAA;2CAKT,SAAD;AAAA,WAAW;AAAA,uCACT,SAAD,MAAQ,eAA6C,CAAC,WAAW,yCAChE,SAAD,MAAQ,eAA6C,QAAQ,SAAS,MAAM,IAAW;AAAA;AAAA,SAIrF;2CACI,MAAD;AAAA,WAAQ;AAAA,SAAa;AAAA,SACxB,aAAa;UACb,QAAQ,aAAa;6CAEtB,MAAD;AAAA,aAAQ;AAAA,UAAY,OAAO,QAAQ;AAAA,WACjC;AAAA;2CAII,MAAD;AAAA,WAAQ;AAAA,SAAa;AAAA;AAAA,SAExB;2CACI,MAAD;AAAA,WAAQ;AAAA,SAAa;AAAA,aACpB;AAKD;eACC;AAAA;AAAA;AAAA;AAAA;AAMX,kCAGE,EAAE,SAAS,YAAyG;QAC/G,WAAW;QACX,kBAAkB,+BAA6D,SAAS;MAG7F,gBAAgB,sBAAsB,UACtC,gBAAgB,kBAAkB,UAClC,gBAAgB,cAAc,QAC7B;AAKM;aACC;AAAA;AAAA;uDAMN,gBAAgB,oBAAoB;AAAA,IACpC,eAAe,gBAAgB;AAAA,IAC/B,mBAAmB,gBAAgB;AAAA,IACnC,WAAW,gBAAgB;AAAA,IAC3B,eAAe,gBAAgB;AAAA,IAC/B;AAAA,IACA;AAAA;AAAA;;"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createElement, Fragment } from "react";
|
|
2
|
+
function jsxN2br(text) {
|
|
3
|
+
const lines = text.split("\n");
|
|
4
|
+
if (lines.length <= 1) {
|
|
5
|
+
return text;
|
|
6
|
+
}
|
|
7
|
+
return lines.map((line, i) => /* @__PURE__ */ createElement(Fragment, {
|
|
8
|
+
key: i
|
|
9
|
+
}, !!i && /* @__PURE__ */ createElement("br", null), line));
|
|
10
|
+
}
|
|
11
|
+
function RenderLeafFallback({ leaf }) {
|
|
12
|
+
let element = jsxN2br(leaf.text);
|
|
13
|
+
if ("isCode" in leaf && leaf.isCode === true) {
|
|
14
|
+
element = /* @__PURE__ */ createElement("code", null, element);
|
|
15
|
+
}
|
|
16
|
+
if ("isStruckThrough" in leaf && leaf.isStruckThrough === true) {
|
|
17
|
+
element = /* @__PURE__ */ createElement("s", null, element);
|
|
18
|
+
}
|
|
19
|
+
if ("isHighlighted" in leaf && leaf.isHighlighted === true) {
|
|
20
|
+
element = /* @__PURE__ */ createElement("em", null, element);
|
|
21
|
+
}
|
|
22
|
+
if ("isUnderlined" in leaf && leaf.isUnderlined === true) {
|
|
23
|
+
element = /* @__PURE__ */ createElement("u", null, element);
|
|
24
|
+
}
|
|
25
|
+
if ("isItalic" in leaf && leaf.isItalic === true) {
|
|
26
|
+
element = /* @__PURE__ */ createElement("i", null, element);
|
|
27
|
+
}
|
|
28
|
+
if ("isBold" in leaf && leaf.isBold === true) {
|
|
29
|
+
element = /* @__PURE__ */ createElement("b", null, element);
|
|
30
|
+
}
|
|
31
|
+
return /* @__PURE__ */ createElement(Fragment, null, element);
|
|
32
|
+
}
|
|
33
|
+
export { RenderLeafFallback };
|
|
34
|
+
//# sourceMappingURL=RenderLeafFallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RenderLeafFallback.js","sources":["../../../../src/components/RichTextRenderer/RenderLeafFallback.tsx"],"sourcesContent":["import { Fragment, ReactNode } from 'react'\nimport type { BuiltinLeaves } from './BuiltinLeaves'\n\nexport interface RenderLeafFallbackProps {\n\tleaf: BuiltinLeaves\n}\n\nfunction jsxN2br(text: string): ReactNode {\n\tconst lines = text.split('\\n')\n\tif (lines.length <= 1) {\n\t\treturn text\n\t}\n\treturn lines.map((line, i) => (\n\t\t<Fragment key={i}>\n\t\t\t{!!i && <br />}\n\t\t\t{line}\n\t\t</Fragment>\n\t))\n}\n\nexport function RenderLeafFallback({ leaf }: RenderLeafFallbackProps) {\n\tlet element = jsxN2br(leaf.text)\n\n\tif ('isCode' in leaf && leaf.isCode === true) {\n\t\telement = <code>{element}</code>\n\t}\n\tif ('isStruckThrough' in leaf && leaf.isStruckThrough === true) {\n\t\telement = <s>{element}</s>\n\t}\n\tif ('isHighlighted' in leaf && leaf.isHighlighted === true) {\n\t\telement = <em>{element}</em>\n\t}\n\tif ('isUnderlined' in leaf && leaf.isUnderlined === true) {\n\t\telement = <u>{element}</u>\n\t}\n\tif ('isItalic' in leaf && leaf.isItalic === true) {\n\t\telement = <i>{element}</i>\n\t}\n\tif ('isBold' in leaf && leaf.isBold === true) {\n\t\telement = <b>{element}</b>\n\t}\n\treturn <>{element}</>\n}\n"],"names":[],"mappings":";AAOA,iBAAiB,MAAyB;QACnC,QAAQ,KAAK,MAAM;MACrB,MAAM,UAAU,GAAG;WACf;AAAA;SAED,MAAM,IAAI,CAAC,MAAM,oCACtB,UAAD;AAAA,IAAU,KAAK;AAAA,KACb,CAAC,CAAC,mCAAM,MAAD,OACP;AAAA;4BAK+B,EAAE,QAAiC;MACjE,UAAU,QAAQ,KAAK;MAEvB,YAAY,QAAQ,KAAK,WAAW,MAAM;4CAClC,QAAD,MAAO;AAAA;MAEd,qBAAqB,QAAQ,KAAK,oBAAoB,MAAM;4CACpD,KAAD,MAAI;AAAA;MAEX,mBAAmB,QAAQ,KAAK,kBAAkB,MAAM;4CAChD,MAAD,MAAK;AAAA;MAEZ,kBAAkB,QAAQ,KAAK,iBAAiB,MAAM;4CAC9C,KAAD,MAAI;AAAA;MAEX,cAAc,QAAQ,KAAK,aAAa,MAAM;4CACtC,KAAD,MAAI;AAAA;MAEX,YAAY,QAAQ,KAAK,WAAW,MAAM;4CAClC,KAAD,MAAI;AAAA;uDAEL;AAAA;;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createContext, useContext } from "react";
|
|
2
|
+
const RichTextRenderMetadataContext = createContext({
|
|
3
|
+
formatVersion: 0,
|
|
4
|
+
referencesField: void 0,
|
|
5
|
+
referenceDiscriminationField: void 0,
|
|
6
|
+
referenceRenderers: {},
|
|
7
|
+
references: void 0
|
|
8
|
+
});
|
|
9
|
+
RichTextRenderMetadataContext.displayName = "RichTextRenderMetadataContext";
|
|
10
|
+
const useRichTextRenderMetadata = () => useContext(RichTextRenderMetadataContext);
|
|
11
|
+
export { RichTextRenderMetadataContext, useRichTextRenderMetadata };
|
|
12
|
+
//# sourceMappingURL=RichTextRenderMetadataContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RichTextRenderMetadataContext.js","sources":["../../../../src/components/RichTextRenderer/RichTextRenderMetadataContext.ts"],"sourcesContent":["import { createContext, useContext } from 'react'\nimport type { RichTextElement } from './RichTextElement'\nimport type { RichTextLeaf } from './RichTextLeaf'\nimport type { RichTextReference } from './RichTextReference'\nimport type { RichTextRenderMetadata } from './RichTextRenderMetadata'\n\nexport const RichTextRenderMetadataContext = createContext<RichTextRenderMetadata<any, any, any>>({\n\tformatVersion: 0,\n\treferencesField: undefined,\n\treferenceDiscriminationField: undefined,\n\treferenceRenderers: {},\n\treferences: undefined,\n})\nRichTextRenderMetadataContext.displayName = 'RichTextRenderMetadataContext'\n\nexport const useRichTextRenderMetadata = <\n\tCustomElements extends RichTextElement = never,\n\tCustomLeaves extends RichTextLeaf = never,\n\tReference extends RichTextReference = RichTextReference,\n>() => useContext(RichTextRenderMetadataContext) as RichTextRenderMetadata<CustomElements, CustomLeaves, Reference>\n"],"names":[],"mappings":";MAMa,gCAAgC,cAAqD;AAAA,EACjG,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,8BAA8B;AAAA,EAC9B,oBAAoB;AAAA,EACpB,YAAY;AAAA;AAEb,8BAA8B,cAAc;MAE/B,4BAA4B,MAIlC,WAAW;;"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { memo, useMemo, createElement, Fragment } from "react";
|
|
2
|
+
import { defaultDeserialize } from "./defaultDeserialize.js";
|
|
3
|
+
import { renderChildren } from "./renderChildren.js";
|
|
4
|
+
import { RichTextRendererError } from "./RichTextRendererError.js";
|
|
5
|
+
import { RichTextRenderMetadataContext } from "./RichTextRenderMetadataContext.js";
|
|
6
|
+
const RichTextRenderer = memo(function RichTextRenderer2({
|
|
7
|
+
deserialize = defaultDeserialize,
|
|
8
|
+
renderElement,
|
|
9
|
+
renderLeaf,
|
|
10
|
+
attributeNamePrefix,
|
|
11
|
+
...sourceProps
|
|
12
|
+
}) {
|
|
13
|
+
const normalizedSource = useMemo(() => {
|
|
14
|
+
if ("source" in sourceProps && !("blocks" in sourceProps)) {
|
|
15
|
+
return [
|
|
16
|
+
{
|
|
17
|
+
content: sourceProps.source ? deserialize(sourceProps.source) : {
|
|
18
|
+
formatVersion: 0,
|
|
19
|
+
children: []
|
|
20
|
+
},
|
|
21
|
+
id: void 0,
|
|
22
|
+
referencesField: void 0,
|
|
23
|
+
referenceDiscriminationField: void 0,
|
|
24
|
+
referenceRenderers: {},
|
|
25
|
+
references: void 0
|
|
26
|
+
}
|
|
27
|
+
];
|
|
28
|
+
}
|
|
29
|
+
if ("blocks" in sourceProps) {
|
|
30
|
+
const sourceField = sourceProps.sourceField ?? "source";
|
|
31
|
+
const referencesField = sourceProps.referencesField ?? "references";
|
|
32
|
+
const referenceDiscriminationField = sourceProps.referenceDiscriminationField ?? "type";
|
|
33
|
+
return sourceProps.blocks.map((block) => {
|
|
34
|
+
if (!(sourceField in block)) {
|
|
35
|
+
throw new RichTextRendererError(`Found a block without a '${sourceField}' field. ` + (sourceProps.sourceField === void 0 ? `The 'sourceField' prop has not been supplied, and so '${sourceField}' was used as a default.` : `That is what the 'sourceField' prop has been set to, and so either this is a typo, or the data supplied is invalid.`));
|
|
36
|
+
}
|
|
37
|
+
const source = block[sourceField];
|
|
38
|
+
if (typeof source !== "string") {
|
|
39
|
+
throw new RichTextRendererError(`Found a block whose source is not a string.`);
|
|
40
|
+
}
|
|
41
|
+
if (sourceProps.referencesField !== void 0 && !(referencesField in block)) {
|
|
42
|
+
throw new RichTextRendererError(`The 'referencesField' prop is set to '${referencesField}' but a block without such field has been encountered. Unless this is just a typo, if you do not wish to use references, avoid supplying the 'referencesField' prop.`);
|
|
43
|
+
}
|
|
44
|
+
const references = block[referencesField];
|
|
45
|
+
let normalizedReferences = void 0;
|
|
46
|
+
if (references) {
|
|
47
|
+
if (typeof Object(references)[Symbol.iterator] !== "function") {
|
|
48
|
+
throw new RichTextRendererError(`The set of references must be an iterable!`);
|
|
49
|
+
}
|
|
50
|
+
normalizedReferences = new Map();
|
|
51
|
+
for (const reference of references) {
|
|
52
|
+
if (!("id" in reference)) {
|
|
53
|
+
throw new RichTextRendererError(`Found a reference without an id field.`);
|
|
54
|
+
}
|
|
55
|
+
if (!(referenceDiscriminationField in reference)) {
|
|
56
|
+
throw new RichTextRendererError(`Found a reference without a '${referenceDiscriminationField}' field. ` + (sourceProps.referenceDiscriminationField === void 0 ? `The 'referenceDiscriminationField' prop has not been supplied, and so '${referenceDiscriminationField}' was used as a default.` : `That is what the 'referenceDiscriminationField' prop has been set to, and so either this is a typo, or the data supplied is invalid.`));
|
|
57
|
+
}
|
|
58
|
+
normalizedReferences.set(reference.id, reference);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
id: typeof block.id === "string" ? block.id : void 0,
|
|
63
|
+
content: deserialize(source),
|
|
64
|
+
referenceDiscriminationField,
|
|
65
|
+
referenceRenderers: sourceProps.referenceRenderers ?? {},
|
|
66
|
+
referencesField,
|
|
67
|
+
references: normalizedReferences
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
throw new RichTextRendererError(`RichTextRenderer: invalid data supplied.`);
|
|
72
|
+
}, [deserialize, sourceProps]);
|
|
73
|
+
return /* @__PURE__ */ createElement(Fragment, null, normalizedSource.map((block, i) => /* @__PURE__ */ createElement(RichTextRenderMetadataContext.Provider, {
|
|
74
|
+
key: block.id ?? i,
|
|
75
|
+
value: {
|
|
76
|
+
formatVersion: block.content.formatVersion,
|
|
77
|
+
referenceRenderers: block.referenceRenderers,
|
|
78
|
+
referencesField: block.referencesField,
|
|
79
|
+
referenceDiscriminationField: block.referenceDiscriminationField,
|
|
80
|
+
references: block.references
|
|
81
|
+
}
|
|
82
|
+
}, renderChildren(block.content.children, {
|
|
83
|
+
renderLeaf,
|
|
84
|
+
renderElement,
|
|
85
|
+
attributeNamePrefix
|
|
86
|
+
}))));
|
|
87
|
+
});
|
|
88
|
+
export { RichTextRenderer };
|
|
89
|
+
//# sourceMappingURL=RichTextRenderer.js.map
|