@contember/react-client 1.2.6 → 1.3.0-alpha.2
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/dist/development/ClientError.cjs +6 -0
- package/dist/development/ClientError.cjs.map +1 -0
- package/dist/development/ContemberClient.cjs +65 -0
- package/dist/development/ContemberClient.cjs.map +1 -0
- package/dist/development/apiRequest/apiRequestReducer.cjs +34 -0
- package/dist/development/apiRequest/apiRequestReducer.cjs.map +1 -0
- package/dist/development/apiRequest/useApiRequest.cjs +50 -0
- package/dist/development/apiRequest/useApiRequest.cjs.map +1 -0
- package/dist/development/auth/SessionTokenContext.cjs +10 -0
- package/dist/development/auth/SessionTokenContext.cjs.map +1 -0
- package/dist/development/auth/SetSessionTokenContext.cjs +8 -0
- package/dist/development/auth/SetSessionTokenContext.cjs.map +1 -0
- package/dist/development/auth/useSessionToken.cjs +9 -0
- package/dist/development/auth/useSessionToken.cjs.map +1 -0
- package/dist/development/auth/useSetSessionToken.cjs +7 -0
- package/dist/development/auth/useSetSessionToken.cjs.map +1 -0
- package/dist/development/components/RichTextRenderer/ElementRenderer.cjs +27 -0
- package/dist/development/components/RichTextRenderer/ElementRenderer.cjs.map +1 -0
- package/dist/development/components/RichTextRenderer/LeafRenderer.cjs +28 -0
- package/dist/development/components/RichTextRenderer/LeafRenderer.cjs.map +1 -0
- package/dist/development/components/RichTextRenderer/RenderElementFallback.cjs +155 -0
- package/dist/development/components/RichTextRenderer/RenderElementFallback.cjs.map +1 -0
- package/dist/development/components/RichTextRenderer/RenderLeafFallback.cjs +74 -0
- package/dist/development/components/RichTextRenderer/RenderLeafFallback.cjs.map +1 -0
- package/dist/development/components/RichTextRenderer/RichTextRenderMetadataContext.cjs +15 -0
- package/dist/development/components/RichTextRenderer/RichTextRenderMetadataContext.cjs.map +1 -0
- package/dist/development/components/RichTextRenderer/RichTextRenderer.cjs +124 -0
- package/dist/development/components/RichTextRenderer/RichTextRenderer.cjs.map +1 -0
- package/dist/development/components/RichTextRenderer/RichTextRendererError.cjs +6 -0
- package/dist/development/components/RichTextRenderer/RichTextRendererError.cjs.map +1 -0
- package/dist/development/components/RichTextRenderer/defaultDeserialize.cjs +14 -0
- package/dist/development/components/RichTextRenderer/defaultDeserialize.cjs.map +1 -0
- package/dist/development/components/RichTextRenderer/renderChildren.cjs +33 -0
- package/dist/development/components/RichTextRenderer/renderChildren.cjs.map +1 -0
- package/dist/development/components/RichTextRenderer/resolveRichTextElementMetadata.cjs +29 -0
- package/dist/development/components/RichTextRenderer/resolveRichTextElementMetadata.cjs.map +1 -0
- package/dist/development/config/ApiBaseUrlContext.cjs +6 -0
- package/dist/development/config/ApiBaseUrlContext.cjs.map +1 -0
- package/dist/development/config/LoginTokenContext.cjs +6 -0
- package/dist/development/config/LoginTokenContext.cjs.map +1 -0
- package/dist/development/config/useApiBaseUrl.cjs +7 -0
- package/dist/development/config/useApiBaseUrl.cjs.map +1 -0
- package/dist/development/config/useLoginToken.cjs +7 -0
- package/dist/development/config/useLoginToken.cjs.map +1 -0
- package/dist/development/content/useContentApiRequest.cjs +7 -0
- package/dist/development/content/useContentApiRequest.cjs.map +1 -0
- package/dist/development/content/useContentGraphQlClient.cjs +7 -0
- package/dist/development/content/useContentGraphQlClient.cjs.map +1 -0
- package/dist/development/content/useCurrentContentGraphQlClient.cjs +19 -0
- package/dist/development/content/useCurrentContentGraphQlClient.cjs.map +1 -0
- package/dist/development/index.cjs +68 -0
- package/dist/development/index.cjs.map +1 -0
- package/dist/development/project/ProjectSlugContext.cjs +6 -0
- package/dist/development/project/ProjectSlugContext.cjs.map +1 -0
- package/dist/development/project/StageSlugContext.cjs +6 -0
- package/dist/development/project/StageSlugContext.cjs.map +1 -0
- package/dist/development/project/useProjectSlug.cjs +7 -0
- package/dist/development/project/useProjectSlug.cjs.map +1 -0
- package/dist/development/project/useStageSlug.cjs +7 -0
- package/dist/development/project/useStageSlug.cjs.map +1 -0
- package/dist/development/system/useCurrentSystemGraphQlClient.cjs +14 -0
- package/dist/development/system/useCurrentSystemGraphQlClient.cjs.map +1 -0
- package/dist/development/system/useSystemApiRequest.cjs +7 -0
- package/dist/development/system/useSystemApiRequest.cjs.map +1 -0
- package/dist/development/system/useSystemGraphQlClient.cjs +7 -0
- package/dist/development/system/useSystemGraphQlClient.cjs.map +1 -0
- package/dist/development/tenant/useTenantApiRequest.cjs +7 -0
- package/dist/development/tenant/useTenantApiRequest.cjs.map +1 -0
- package/dist/development/tenant/useTenantGraphQlClient.cjs +7 -0
- package/dist/development/tenant/useTenantGraphQlClient.cjs.map +1 -0
- package/dist/development/upload/fileUploadReducer.cjs +150 -0
- package/dist/development/upload/fileUploadReducer.cjs.map +1 -0
- package/dist/development/upload/toFileId.cjs +10 -0
- package/dist/development/upload/toFileId.cjs.map +1 -0
- package/dist/development/upload/useFileUpload.cjs +166 -0
- package/dist/development/upload/useFileUpload.cjs.map +1 -0
- package/dist/development/useGraphQlClient.cjs +13 -0
- package/dist/development/useGraphQlClient.cjs.map +1 -0
- package/dist/production/ClientError.cjs +6 -0
- package/dist/production/ClientError.cjs.map +1 -0
- package/dist/production/ContemberClient.cjs +41 -0
- package/dist/production/ContemberClient.cjs.map +1 -0
- package/dist/production/apiRequest/apiRequestReducer.cjs +34 -0
- package/dist/production/apiRequest/apiRequestReducer.cjs.map +1 -0
- package/dist/production/apiRequest/useApiRequest.cjs +50 -0
- package/dist/production/apiRequest/useApiRequest.cjs.map +1 -0
- package/dist/production/auth/SessionTokenContext.cjs +10 -0
- package/dist/production/auth/SessionTokenContext.cjs.map +1 -0
- package/dist/production/auth/SetSessionTokenContext.cjs +8 -0
- package/dist/production/auth/SetSessionTokenContext.cjs.map +1 -0
- package/dist/production/auth/useSessionToken.cjs +9 -0
- package/dist/production/auth/useSessionToken.cjs.map +1 -0
- package/dist/production/auth/useSetSessionToken.cjs +7 -0
- package/dist/production/auth/useSetSessionToken.cjs.map +1 -0
- package/dist/production/components/RichTextRenderer/ElementRenderer.cjs +23 -0
- package/dist/production/components/RichTextRenderer/ElementRenderer.cjs.map +1 -0
- package/dist/production/components/RichTextRenderer/LeafRenderer.cjs +24 -0
- package/dist/production/components/RichTextRenderer/LeafRenderer.cjs.map +1 -0
- package/dist/production/components/RichTextRenderer/RenderElementFallback.cjs +82 -0
- package/dist/production/components/RichTextRenderer/RenderElementFallback.cjs.map +1 -0
- package/dist/production/components/RichTextRenderer/RenderLeafFallback.cjs +38 -0
- package/dist/production/components/RichTextRenderer/RenderLeafFallback.cjs.map +1 -0
- package/dist/production/components/RichTextRenderer/RichTextRenderMetadataContext.cjs +15 -0
- package/dist/production/components/RichTextRenderer/RichTextRenderMetadataContext.cjs.map +1 -0
- package/dist/production/components/RichTextRenderer/RichTextRenderer.cjs +109 -0
- package/dist/production/components/RichTextRenderer/RichTextRenderer.cjs.map +1 -0
- package/dist/production/components/RichTextRenderer/RichTextRendererError.cjs +6 -0
- package/dist/production/components/RichTextRenderer/RichTextRendererError.cjs.map +1 -0
- package/dist/production/components/RichTextRenderer/defaultDeserialize.cjs +14 -0
- package/dist/production/components/RichTextRenderer/defaultDeserialize.cjs.map +1 -0
- package/dist/production/components/RichTextRenderer/renderChildren.cjs +21 -0
- package/dist/production/components/RichTextRenderer/renderChildren.cjs.map +1 -0
- package/dist/production/components/RichTextRenderer/resolveRichTextElementMetadata.cjs +29 -0
- package/dist/production/components/RichTextRenderer/resolveRichTextElementMetadata.cjs.map +1 -0
- package/dist/production/config/ApiBaseUrlContext.cjs +6 -0
- package/dist/production/config/ApiBaseUrlContext.cjs.map +1 -0
- package/dist/production/config/LoginTokenContext.cjs +6 -0
- package/dist/production/config/LoginTokenContext.cjs.map +1 -0
- package/dist/production/config/useApiBaseUrl.cjs +7 -0
- package/dist/production/config/useApiBaseUrl.cjs.map +1 -0
- package/dist/production/config/useLoginToken.cjs +7 -0
- package/dist/production/config/useLoginToken.cjs.map +1 -0
- package/dist/production/content/useContentApiRequest.cjs +7 -0
- package/dist/production/content/useContentApiRequest.cjs.map +1 -0
- package/dist/production/content/useContentGraphQlClient.cjs +7 -0
- package/dist/production/content/useContentGraphQlClient.cjs.map +1 -0
- package/dist/production/content/useCurrentContentGraphQlClient.cjs +19 -0
- package/dist/production/content/useCurrentContentGraphQlClient.cjs.map +1 -0
- package/dist/production/index.cjs +68 -0
- package/dist/production/index.cjs.map +1 -0
- package/dist/production/project/ProjectSlugContext.cjs +6 -0
- package/dist/production/project/ProjectSlugContext.cjs.map +1 -0
- package/dist/production/project/StageSlugContext.cjs +6 -0
- package/dist/production/project/StageSlugContext.cjs.map +1 -0
- package/dist/production/project/useProjectSlug.cjs +7 -0
- package/dist/production/project/useProjectSlug.cjs.map +1 -0
- package/dist/production/project/useStageSlug.cjs +7 -0
- package/dist/production/project/useStageSlug.cjs.map +1 -0
- package/dist/production/system/useCurrentSystemGraphQlClient.cjs +14 -0
- package/dist/production/system/useCurrentSystemGraphQlClient.cjs.map +1 -0
- package/dist/production/system/useSystemApiRequest.cjs +7 -0
- package/dist/production/system/useSystemApiRequest.cjs.map +1 -0
- package/dist/production/system/useSystemGraphQlClient.cjs +7 -0
- package/dist/production/system/useSystemGraphQlClient.cjs.map +1 -0
- package/dist/production/tenant/useTenantApiRequest.cjs +7 -0
- package/dist/production/tenant/useTenantApiRequest.cjs.map +1 -0
- package/dist/production/tenant/useTenantGraphQlClient.cjs +7 -0
- package/dist/production/tenant/useTenantGraphQlClient.cjs.map +1 -0
- package/dist/production/upload/fileUploadReducer.cjs +150 -0
- package/dist/production/upload/fileUploadReducer.cjs.map +1 -0
- package/dist/production/upload/toFileId.cjs +10 -0
- package/dist/production/upload/toFileId.cjs.map +1 -0
- package/dist/production/upload/useFileUpload.cjs +166 -0
- package/dist/production/upload/useFileUpload.cjs.map +1 -0
- package/dist/production/useGraphQlClient.cjs +13 -0
- package/dist/production/useGraphQlClient.cjs.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +11 -4
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const client = require("@contember/client");
|
|
4
|
+
const utilities = require("@contember/utilities");
|
|
5
|
+
const toFileId = require("./toFileId.cjs");
|
|
6
|
+
const initializeFileUploadState = () => ({
|
|
7
|
+
fileIdByFile: /* @__PURE__ */ new WeakMap(),
|
|
8
|
+
state: /* @__PURE__ */ new Map()
|
|
9
|
+
});
|
|
10
|
+
const fileUploadReducer = (previousState, action) => {
|
|
11
|
+
let newState = void 0;
|
|
12
|
+
switch (action.type) {
|
|
13
|
+
case "initialize": {
|
|
14
|
+
for (const [fileId, metadata] of action.files) {
|
|
15
|
+
(newState ?? (newState = new Map(previousState.state))).set(fileId, {
|
|
16
|
+
readyState: "initializing",
|
|
17
|
+
abortController: metadata.abortController,
|
|
18
|
+
previewUrl: metadata.previewUrl,
|
|
19
|
+
file: metadata.file
|
|
20
|
+
});
|
|
21
|
+
previousState.fileIdByFile.set(metadata.file, fileId);
|
|
22
|
+
}
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
case "startUploading": {
|
|
26
|
+
for (const [fileOrId, metadata] of action.files) {
|
|
27
|
+
const fileId = toFileId.toFileId(previousState, fileOrId);
|
|
28
|
+
const fileState = (newState ?? previousState.state).get(fileId);
|
|
29
|
+
if (fileState === void 0 || fileState.readyState !== "initializing") {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
(newState ?? (newState = new Map(previousState.state))).set(fileId, {
|
|
33
|
+
readyState: "uploading",
|
|
34
|
+
abortController: fileState.abortController,
|
|
35
|
+
file: fileState.file,
|
|
36
|
+
metadata: metadata.metadata,
|
|
37
|
+
// If the user didn't supply the metadata, then that's on them.
|
|
38
|
+
previewUrl: fileState.previewUrl,
|
|
39
|
+
progress: void 0,
|
|
40
|
+
uploader: metadata.uploader
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
case "finishSuccessfully": {
|
|
46
|
+
for (const [fileOrId, result] of action.result) {
|
|
47
|
+
const fileId = toFileId.toFileId(previousState, fileOrId);
|
|
48
|
+
const previousFileState = (newState ?? previousState.state).get(fileId);
|
|
49
|
+
if (previousFileState === void 0 || previousFileState.readyState !== "uploading") {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
(newState ?? (newState = new Map(previousState.state))).set(fileId, {
|
|
53
|
+
readyState: "success",
|
|
54
|
+
file: previousFileState.file,
|
|
55
|
+
metadata: previousFileState.metadata,
|
|
56
|
+
previewUrl: previousFileState.previewUrl,
|
|
57
|
+
result,
|
|
58
|
+
uploader: previousFileState.uploader
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case "finishWithError": {
|
|
64
|
+
for (const errorSpec of action.error) {
|
|
65
|
+
let fileOrId;
|
|
66
|
+
let rawError;
|
|
67
|
+
if (Array.isArray(errorSpec)) {
|
|
68
|
+
[fileOrId, rawError] = errorSpec;
|
|
69
|
+
} else {
|
|
70
|
+
fileOrId = errorSpec;
|
|
71
|
+
rawError = void 0;
|
|
72
|
+
}
|
|
73
|
+
const errors = [];
|
|
74
|
+
if (rawError instanceof client.FileUploadError) {
|
|
75
|
+
errors.push(rawError);
|
|
76
|
+
} else if (Array.isArray(rawError)) {
|
|
77
|
+
for (const error of rawError) {
|
|
78
|
+
if (error instanceof client.FileUploadError) {
|
|
79
|
+
errors.push(error);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const fileId = toFileId.toFileId(previousState, fileOrId);
|
|
84
|
+
const previousFileState = (newState ?? previousState.state).get(fileId);
|
|
85
|
+
if (previousFileState === void 0 || previousFileState.readyState !== "initializing" && previousFileState.readyState !== "uploading") {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
const uploader = previousFileState.readyState === "uploading" ? previousFileState.uploader : void 0;
|
|
89
|
+
const metadata = previousFileState.readyState === "uploading" ? previousFileState.metadata : void 0;
|
|
90
|
+
(newState ?? (newState = new Map(previousState.state))).set(fileId, {
|
|
91
|
+
readyState: "error",
|
|
92
|
+
errors: errors.length ? errors : void 0,
|
|
93
|
+
rawError,
|
|
94
|
+
file: previousFileState.file,
|
|
95
|
+
metadata,
|
|
96
|
+
previewUrl: previousFileState.previewUrl,
|
|
97
|
+
uploader
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
case "purge": {
|
|
103
|
+
for (const fileOrId of action.files) {
|
|
104
|
+
const fileId = toFileId.toFileId(previousState, fileOrId);
|
|
105
|
+
const fileState = (newState ?? previousState.state).get(fileId);
|
|
106
|
+
if (fileState === void 0) {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
URL.revokeObjectURL(fileState.previewUrl);
|
|
110
|
+
if (fileState.readyState === "initializing" || fileState.readyState === "uploading") {
|
|
111
|
+
fileState.abortController.abort();
|
|
112
|
+
}
|
|
113
|
+
(newState ?? (newState = new Map(previousState.state))).delete(fileId);
|
|
114
|
+
}
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
case "updateUploadProgress": {
|
|
118
|
+
for (const [fileOrId, { progress }] of action.progress) {
|
|
119
|
+
const fileId = toFileId.toFileId(previousState, fileOrId);
|
|
120
|
+
const previousFileState = (newState ?? previousState.state).get(fileId);
|
|
121
|
+
if (progress === void 0 || previousFileState === void 0 || previousFileState.readyState !== "uploading") {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const roundedProgress = Math.floor(progress);
|
|
125
|
+
if (roundedProgress === previousFileState.progress) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
(newState ?? (newState = new Map(previousState.state))).set(fileId, {
|
|
129
|
+
readyState: "uploading",
|
|
130
|
+
file: previousFileState.file,
|
|
131
|
+
uploader: previousFileState.uploader,
|
|
132
|
+
abortController: previousFileState.abortController,
|
|
133
|
+
previewUrl: previousFileState.previewUrl,
|
|
134
|
+
metadata: previousFileState.metadata,
|
|
135
|
+
progress: roundedProgress
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
default:
|
|
141
|
+
utilities.assertNever(action);
|
|
142
|
+
}
|
|
143
|
+
if (newState === void 0) {
|
|
144
|
+
return previousState;
|
|
145
|
+
}
|
|
146
|
+
return { ...previousState, state: newState };
|
|
147
|
+
};
|
|
148
|
+
exports.fileUploadReducer = fileUploadReducer;
|
|
149
|
+
exports.initializeFileUploadState = initializeFileUploadState;
|
|
150
|
+
//# sourceMappingURL=fileUploadReducer.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileUploadReducer.cjs","sources":["../../../src/upload/fileUploadReducer.ts"],"sourcesContent":["import { FileUploadError } from '@contember/client'\nimport { assertNever } from '@contember/utilities'\nimport type { FileId } from './FileId'\nimport type { FileUploadAction } from './FileUploadAction'\nimport type { FileUploadMultiTemporalState } from './FileUploadMultiTemporalState'\nimport { toFileId } from './toFileId'\n\nexport const initializeFileUploadState = <Result = unknown, Metadata = undefined>(): FileUploadMultiTemporalState<Result, Metadata> => ({\n\tfileIdByFile: new WeakMap<File, FileId>(),\n\tstate: new Map(),\n})\n\nexport const fileUploadReducer = <Result = unknown, Metadata = undefined>(\n\tpreviousState: FileUploadMultiTemporalState<Result, Metadata>,\n\taction: FileUploadAction<Result, Metadata>,\n): FileUploadMultiTemporalState<Result, Metadata> => {\n\tlet newState: undefined | FileUploadMultiTemporalState<Result, Metadata>['state'] = undefined\n\n\tswitch (action.type) {\n\t\tcase 'initialize': {\n\t\t\tfor (const [fileId, metadata] of action.files) {\n\t\t\t\t// Deliberately allowing starting a new upload with the same id\n\t\t\t\t(newState ??= new Map(previousState.state)).set(fileId, {\n\t\t\t\t\treadyState: 'initializing',\n\t\t\t\t\tabortController: metadata.abortController,\n\t\t\t\t\tpreviewUrl: metadata.previewUrl,\n\t\t\t\t\tfile: metadata.file,\n\t\t\t\t})\n\t\t\t\t// Deliberately mutating\n\t\t\t\tpreviousState.fileIdByFile.set(metadata.file, fileId)\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase 'startUploading': {\n\t\t\tfor (const [fileOrId, metadata] of action.files) {\n\t\t\t\tconst fileId = toFileId(previousState, fileOrId)\n\t\t\t\tconst fileState = (newState ?? previousState.state).get(fileId)\n\n\t\t\t\tif (fileState === undefined || fileState.readyState !== 'initializing') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\t(newState ??= new Map(previousState.state)).set(fileId, {\n\t\t\t\t\treadyState: 'uploading',\n\t\t\t\t\tabortController: fileState.abortController,\n\t\t\t\t\tfile: fileState.file,\n\t\t\t\t\tmetadata: metadata.metadata!, // If the user didn't supply the metadata, then that's on them.\n\t\t\t\t\tpreviewUrl: fileState.previewUrl,\n\t\t\t\t\tprogress: undefined,\n\t\t\t\t\tuploader: metadata.uploader,\n\t\t\t\t})\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase 'finishSuccessfully': {\n\t\t\tfor (const [fileOrId, result] of action.result) {\n\t\t\t\tconst fileId = toFileId(previousState, fileOrId)\n\t\t\t\tconst previousFileState = (newState ?? previousState.state).get(fileId)\n\t\t\t\tif (previousFileState === undefined || previousFileState.readyState !== 'uploading') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\t(newState ??= new Map(previousState.state)).set(fileId, {\n\t\t\t\t\treadyState: 'success',\n\t\t\t\t\tfile: previousFileState.file,\n\t\t\t\t\tmetadata: previousFileState.metadata,\n\t\t\t\t\tpreviewUrl: previousFileState.previewUrl,\n\t\t\t\t\tresult,\n\t\t\t\t\tuploader: previousFileState.uploader,\n\t\t\t\t})\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase 'finishWithError': {\n\t\t\tfor (const errorSpec of action.error) {\n\t\t\t\tlet fileOrId: File | FileId\n\t\t\t\tlet rawError: unknown\n\n\t\t\t\tif (Array.isArray(errorSpec)) {\n\t\t\t\t\t[fileOrId, rawError] = errorSpec\n\t\t\t\t} else {\n\t\t\t\t\tfileOrId = errorSpec\n\t\t\t\t\trawError = undefined\n\t\t\t\t}\n\n\t\t\t\tconst errors: FileUploadError[] = []\n\n\t\t\t\tif (rawError instanceof FileUploadError) {\n\t\t\t\t\terrors.push(rawError)\n\t\t\t\t} else if (Array.isArray(rawError)) {\n\t\t\t\t\tfor (const error of rawError) {\n\t\t\t\t\t\tif (error instanceof FileUploadError) {\n\t\t\t\t\t\t\terrors.push(error)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst fileId = toFileId(previousState, fileOrId)\n\t\t\t\tconst previousFileState = (newState ?? previousState.state).get(fileId)\n\t\t\t\tif (\n\t\t\t\t\tpreviousFileState === undefined ||\n\t\t\t\t\t(previousFileState.readyState !== 'initializing' && previousFileState.readyState !== 'uploading')\n\t\t\t\t) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst uploader = previousFileState.readyState === 'uploading' ? previousFileState.uploader : undefined\n\t\t\t\tconst metadata = previousFileState.readyState === 'uploading' ? previousFileState.metadata : undefined\n\t\t\t\t\t; (newState ??= new Map(previousState.state)).set(fileId, {\n\t\t\t\t\t\treadyState: 'error',\n\t\t\t\t\t\terrors: errors.length ? errors : undefined,\n\t\t\t\t\t\trawError,\n\t\t\t\t\t\tfile: previousFileState.file,\n\t\t\t\t\t\tmetadata,\n\t\t\t\t\t\tpreviewUrl: previousFileState.previewUrl,\n\t\t\t\t\t\tuploader,\n\t\t\t\t\t})\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase 'purge': {\n\t\t\tfor (const fileOrId of action.files) {\n\t\t\t\tconst fileId = toFileId(previousState, fileOrId)\n\t\t\t\tconst fileState = (newState ?? previousState.state).get(fileId)\n\n\t\t\t\tif (fileState === undefined) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tURL.revokeObjectURL(fileState.previewUrl)\n\t\t\t\tif (fileState.readyState === 'initializing' || fileState.readyState === 'uploading') {\n\t\t\t\t\tfileState.abortController.abort() // This is a bit naughty… We shouldn't do this from here.\n\t\t\t\t}\n\t\t\t\t(newState ??= new Map(previousState.state)).delete(fileId)\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase 'updateUploadProgress': {\n\t\t\tfor (const [fileOrId, { progress }] of action.progress) {\n\t\t\t\tconst fileId = toFileId(previousState, fileOrId)\n\t\t\t\tconst previousFileState = (newState ?? previousState.state).get(fileId)\n\t\t\t\tif (progress === undefined || previousFileState === undefined || previousFileState.readyState !== 'uploading') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst roundedProgress = Math.floor(progress) // throttling\n\t\t\t\tif (roundedProgress === previousFileState.progress) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\t(newState ??= new Map(previousState.state)).set(fileId, {\n\t\t\t\t\treadyState: 'uploading',\n\t\t\t\t\tfile: previousFileState.file,\n\t\t\t\t\tuploader: previousFileState.uploader,\n\t\t\t\t\tabortController: previousFileState.abortController,\n\t\t\t\t\tpreviewUrl: previousFileState.previewUrl,\n\t\t\t\t\tmetadata: previousFileState.metadata,\n\t\t\t\t\tprogress: roundedProgress,\n\t\t\t\t})\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tdefault:\n\t\t\tassertNever(action)\n\t}\n\tif (newState === undefined) {\n\t\treturn previousState\n\t}\n\treturn { ...previousState, state: newState }\n}\n"],"names":["toFileId","FileUploadError","assertNever"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const toFileId = (state, fileOrId) => {
|
|
4
|
+
if (fileOrId instanceof File) {
|
|
5
|
+
return state.fileIdByFile.get(fileOrId);
|
|
6
|
+
}
|
|
7
|
+
return fileOrId;
|
|
8
|
+
};
|
|
9
|
+
exports.toFileId = toFileId;
|
|
10
|
+
//# sourceMappingURL=toFileId.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toFileId.cjs","sources":["../../../src/upload/toFileId.ts"],"sourcesContent":["import type { FileId } from './FileId'\nimport type { FileUploadMultiTemporalState } from './FileUploadMultiTemporalState'\n\nexport const toFileId = <Result = unknown, Metadata = undefined>(\n\tstate: FileUploadMultiTemporalState<Result, Metadata>,\n\tfileOrId: File | FileId,\n): FileId => {\n\tif (fileOrId instanceof File) {\n\t\treturn state.fileIdByFile.get(fileOrId)! // Should we throw instead of the yolo \"!\"?\n\t}\n\treturn fileOrId\n}\n"],"names":[],"mappings":";;AAGa,MAAA,WAAW,CACvB,OACA,aACY;AACZ,MAAI,oBAAoB,MAAM;AACtB,WAAA,MAAM,aAAa,IAAI,QAAQ;AAAA,EACvC;AACO,SAAA;AACR;;"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const client = require("@contember/client");
|
|
4
|
+
const react = require("react");
|
|
5
|
+
const fileUploadReducer = require("./fileUploadReducer.cjs");
|
|
6
|
+
const useCurrentContentGraphQlClient = require("../content/useCurrentContentGraphQlClient.cjs");
|
|
7
|
+
const useFileUpload = ({} = {}) => {
|
|
8
|
+
const contentApiClient = useCurrentContentGraphQlClient.useCurrentContentGraphQlClient();
|
|
9
|
+
const fileIdSeedRef = react.useRef(1);
|
|
10
|
+
const [internalState, dispatch] = react.useReducer(fileUploadReducer.fileUploadReducer, void 0, fileUploadReducer.initializeFileUploadState);
|
|
11
|
+
const defaultUploader = react.useMemo(() => new client.S3FileUploader(), []);
|
|
12
|
+
const purgeUpload = react.useCallback((files) => {
|
|
13
|
+
dispatch({
|
|
14
|
+
type: "purge",
|
|
15
|
+
files
|
|
16
|
+
});
|
|
17
|
+
}, []);
|
|
18
|
+
const failUpload = react.useCallback((error) => {
|
|
19
|
+
dispatch({
|
|
20
|
+
type: "finishWithError",
|
|
21
|
+
error
|
|
22
|
+
});
|
|
23
|
+
}, []);
|
|
24
|
+
const previewUrls = react.useRef(/* @__PURE__ */ new Set());
|
|
25
|
+
const fileIds = react.useRef(/* @__PURE__ */ new WeakMap());
|
|
26
|
+
const filesWithMetadataById = react.useRef(/* @__PURE__ */ new Map());
|
|
27
|
+
const initializeUpload = react.useCallback(
|
|
28
|
+
(files) => {
|
|
29
|
+
const newFileIds = /* @__PURE__ */ new Set();
|
|
30
|
+
const fileWithMetadataByFileConfig = /* @__PURE__ */ new Map();
|
|
31
|
+
for (const fileMaybeWithId of files) {
|
|
32
|
+
const abortController = new AbortController();
|
|
33
|
+
let fileId;
|
|
34
|
+
let file;
|
|
35
|
+
if (fileMaybeWithId instanceof File) {
|
|
36
|
+
fileId = `__contember__file-${fileIdSeedRef.current++}`;
|
|
37
|
+
file = fileMaybeWithId;
|
|
38
|
+
} else {
|
|
39
|
+
fileId = fileMaybeWithId[0];
|
|
40
|
+
file = fileMaybeWithId[1];
|
|
41
|
+
}
|
|
42
|
+
abortController.signal.addEventListener("abort", () => {
|
|
43
|
+
purgeUpload([fileId]);
|
|
44
|
+
});
|
|
45
|
+
const previewUrl = URL.createObjectURL(file);
|
|
46
|
+
const fileWithMetadata = {
|
|
47
|
+
previewUrl,
|
|
48
|
+
abortController,
|
|
49
|
+
file,
|
|
50
|
+
fileId
|
|
51
|
+
};
|
|
52
|
+
fileWithMetadataByFileConfig.set(fileId, fileWithMetadata);
|
|
53
|
+
newFileIds.add(fileId);
|
|
54
|
+
previewUrls.current.add(previewUrl);
|
|
55
|
+
fileIds.current.set(file, fileId);
|
|
56
|
+
filesWithMetadataById.current.set(fileId, new WeakRef(fileWithMetadata));
|
|
57
|
+
}
|
|
58
|
+
if (fileWithMetadataByFileConfig.size === 0) {
|
|
59
|
+
return fileWithMetadataByFileConfig;
|
|
60
|
+
}
|
|
61
|
+
if (newFileIds.size) {
|
|
62
|
+
dispatch({
|
|
63
|
+
type: "purge",
|
|
64
|
+
files: newFileIds
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
dispatch({
|
|
68
|
+
type: "initialize",
|
|
69
|
+
files: fileWithMetadataByFileConfig
|
|
70
|
+
});
|
|
71
|
+
return fileWithMetadataByFileConfig;
|
|
72
|
+
},
|
|
73
|
+
[purgeUpload]
|
|
74
|
+
);
|
|
75
|
+
const startUpload = react.useCallback(
|
|
76
|
+
(files) => {
|
|
77
|
+
const filesById = /* @__PURE__ */ new Map();
|
|
78
|
+
const groupedByUploader = /* @__PURE__ */ new Map();
|
|
79
|
+
for (const fileOrIdMaybeWithOptions of files) {
|
|
80
|
+
let fileOrId;
|
|
81
|
+
let options;
|
|
82
|
+
if (Array.isArray(fileOrIdMaybeWithOptions)) {
|
|
83
|
+
fileOrId = fileOrIdMaybeWithOptions[0];
|
|
84
|
+
options = fileOrIdMaybeWithOptions[1];
|
|
85
|
+
} else {
|
|
86
|
+
fileOrId = fileOrIdMaybeWithOptions;
|
|
87
|
+
options = {};
|
|
88
|
+
}
|
|
89
|
+
const { uploader = defaultUploader, metadata } = options;
|
|
90
|
+
const fileId = fileOrId instanceof File ? fileIds.current.get(fileOrId) : fileOrId;
|
|
91
|
+
const fileState = fileId ? filesWithMetadataById.current.get(fileId)?.deref() : void 0;
|
|
92
|
+
if (fileId === void 0 || fileState === void 0) {
|
|
93
|
+
throw new Error(
|
|
94
|
+
`Trying to startUpload a file that hasn't been previously initialized. This will be possible in future, but isn't yet.`
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
filesById.set(fileId, {
|
|
98
|
+
uploader,
|
|
99
|
+
metadata
|
|
100
|
+
});
|
|
101
|
+
let filesWithSameUploader = groupedByUploader.get(uploader);
|
|
102
|
+
if (filesWithSameUploader === void 0) {
|
|
103
|
+
groupedByUploader.set(uploader, filesWithSameUploader = /* @__PURE__ */ new Map());
|
|
104
|
+
}
|
|
105
|
+
filesWithSameUploader.set(fileState.file, {
|
|
106
|
+
abortSignal: fileState.abortController.signal
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
dispatch({
|
|
110
|
+
type: "startUploading",
|
|
111
|
+
files: filesById
|
|
112
|
+
});
|
|
113
|
+
for (const [uploader, filesForUpload] of groupedByUploader) {
|
|
114
|
+
try {
|
|
115
|
+
uploader.upload(filesForUpload, {
|
|
116
|
+
onProgress: (progress) => {
|
|
117
|
+
dispatch({
|
|
118
|
+
type: "updateUploadProgress",
|
|
119
|
+
progress
|
|
120
|
+
});
|
|
121
|
+
},
|
|
122
|
+
onSuccess: (result) => {
|
|
123
|
+
dispatch({
|
|
124
|
+
type: "finishSuccessfully",
|
|
125
|
+
result
|
|
126
|
+
});
|
|
127
|
+
},
|
|
128
|
+
onError: (error) => {
|
|
129
|
+
dispatch({
|
|
130
|
+
type: "finishWithError",
|
|
131
|
+
error
|
|
132
|
+
});
|
|
133
|
+
},
|
|
134
|
+
contentApiClient
|
|
135
|
+
});
|
|
136
|
+
} catch (error) {
|
|
137
|
+
dispatch({
|
|
138
|
+
type: "finishWithError",
|
|
139
|
+
error: Array.from(filesForUpload).map(([file]) => [file, error])
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
[contentApiClient, defaultUploader]
|
|
145
|
+
);
|
|
146
|
+
const operations = react.useMemo(
|
|
147
|
+
() => ({
|
|
148
|
+
failUpload,
|
|
149
|
+
initializeUpload,
|
|
150
|
+
purgeUpload,
|
|
151
|
+
startUpload
|
|
152
|
+
}),
|
|
153
|
+
[failUpload, initializeUpload, purgeUpload, startUpload]
|
|
154
|
+
);
|
|
155
|
+
react.useEffect(
|
|
156
|
+
() => () => {
|
|
157
|
+
for (const previewUrl of Array.from(previewUrls.current)) {
|
|
158
|
+
URL.revokeObjectURL(previewUrl);
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
[]
|
|
162
|
+
);
|
|
163
|
+
return [internalState.state, operations];
|
|
164
|
+
};
|
|
165
|
+
exports.useFileUpload = useFileUpload;
|
|
166
|
+
//# sourceMappingURL=useFileUpload.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFileUpload.cjs","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'\n\nexport type FileUpload<Result = unknown, Metadata = undefined> = [\n\tFileUploadCompoundState<Result, Metadata>,\n\tFileUploadOperations<Metadata>,\n]\n\nexport interface FileUploadOptions {\n}\n\nexport const useFileUpload = <Result = unknown, Metadata = undefined>({}: FileUploadOptions = {}): FileUpload<Result, Metadata> => {\n\tconst contentApiClient = useCurrentContentGraphQlClient()\n\n\tconst fileIdSeedRef = useRef(1)\n\n\tconst [internalState, dispatch] = useReducer<\n\t\tReducer<FileUploadMultiTemporalState<Result, Metadata>, FileUploadAction<Result, Metadata>>,\n\t\tundefined\n\t>(fileUploadReducer, undefined, initializeFileUploadState)\n\n\tconst defaultUploader = useMemo(() => new S3FileUploader(), [])\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\n\tconst previewUrls = useRef(new Set<string>())\n\tconst fileIds = useRef(new WeakMap<File, FileId>())\n\tconst filesWithMetadataById = useRef(new Map<FileId, WeakRef<FileWithMetadata>>)\n\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\tconst previewUrl = URL.createObjectURL(file)\n\t\t\t\tconst fileWithMetadata: FileWithMetadata = {\n\t\t\t\t\tpreviewUrl: previewUrl,\n\t\t\t\t\tabortController,\n\t\t\t\t\tfile,\n\t\t\t\t\tfileId,\n\t\t\t\t}\n\t\t\t\tfileWithMetadataByFileConfig.set(fileId, fileWithMetadata)\n\n\t\t\t\tnewFileIds.add(fileId)\n\n\t\t\t\tpreviewUrls.current.add(previewUrl)\n\t\t\t\tfileIds.current.set(file, fileId)\n\t\t\t\tfilesWithMetadataById.current.set(fileId, new WeakRef(fileWithMetadata))\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\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 = fileOrId instanceof File ? fileIds.current.get(fileOrId) : fileOrId\n\t\t\t\tconst fileState = fileId ? filesWithMetadataById.current.get(fileId)?.deref() : undefined\n\n\t\t\t\tif (fileId === undefined || fileState === undefined) {\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\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\n\tuseEffect(\n\t\t() => () => {\n\t\t\tfor (const previewUrl of Array.from(previewUrls.current)) {\n\t\t\t\tURL.revokeObjectURL(previewUrl)\n\t\t\t}\n\t\t},\n\t\t[],\n\t)\n\n\treturn [internalState.state, operations]\n}\n"],"names":["useCurrentContentGraphQlClient","useRef","useReducer","fileUploadReducer","initializeFileUploadState","useMemo","S3FileUploader","useCallback","useEffect"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const client = require("@contember/client");
|
|
4
|
+
const react = require("react");
|
|
5
|
+
const useApiBaseUrl = require("./config/useApiBaseUrl.cjs");
|
|
6
|
+
const useSessionToken = require("./auth/useSessionToken.cjs");
|
|
7
|
+
const useGraphQlClient = (path) => {
|
|
8
|
+
const apiBaseUrl = useApiBaseUrl.useApiBaseUrl();
|
|
9
|
+
const sessionToken = useSessionToken.useSessionToken();
|
|
10
|
+
return react.useMemo(() => new client.GraphQlClient(`${apiBaseUrl}${path}`, sessionToken), [apiBaseUrl, path, sessionToken]);
|
|
11
|
+
};
|
|
12
|
+
exports.useGraphQlClient = useGraphQlClient;
|
|
13
|
+
//# sourceMappingURL=useGraphQlClient.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGraphQlClient.cjs","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":["useApiBaseUrl","useSessionToken","useMemo","GraphQlClient"],"mappings":";;;;;;AAKa,MAAA,mBAAmB,CAAC,SAAgC;AAChE,QAAM,aAAaA,cAAAA;AACnB,QAAM,eAAeC,gBAAAA;AACrB,SAAOC,MAAQ,QAAA,MAAM,IAAIC,OAAA,cAAc,GAAG,aAAa,QAAQ,YAAY,GAAG,CAAC,YAAY,MAAM,YAAY,CAAC;AAC/G;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClientError.cjs","sources":["../../src/ClientError.ts"],"sourcesContent":["export class ClientError extends Error {}\n"],"names":[],"mappings":";;AAAO,MAAM,oBAAoB,MAAM;AAAC;;"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const react = require("react");
|
|
5
|
+
const ApiBaseUrlContext = require("./config/ApiBaseUrlContext.cjs");
|
|
6
|
+
const LoginTokenContext = require("./config/LoginTokenContext.cjs");
|
|
7
|
+
const SetSessionTokenContext = require("./auth/SetSessionTokenContext.cjs");
|
|
8
|
+
const SessionTokenContext = require("./auth/SessionTokenContext.cjs");
|
|
9
|
+
const ProjectSlugContext = require("./project/ProjectSlugContext.cjs");
|
|
10
|
+
const StageSlugContext = require("./project/StageSlugContext.cjs");
|
|
11
|
+
const sessionTokenKey = "contember_session_token";
|
|
12
|
+
const ContemberClient = react.memo(function ContemberClient2({
|
|
13
|
+
apiBaseUrl,
|
|
14
|
+
children,
|
|
15
|
+
loginToken,
|
|
16
|
+
project,
|
|
17
|
+
sessionToken,
|
|
18
|
+
stage
|
|
19
|
+
}) {
|
|
20
|
+
const [localStorageSessionToken, setLocalStorageSessionToken] = useLocalStorageSessionToken();
|
|
21
|
+
const sessionTokenContextValue = react.useMemo(() => ({
|
|
22
|
+
propsToken: sessionToken,
|
|
23
|
+
token: localStorageSessionToken ?? sessionToken,
|
|
24
|
+
source: localStorageSessionToken ? "localstorage" : sessionToken ? "props" : void 0
|
|
25
|
+
}), [localStorageSessionToken, sessionToken]);
|
|
26
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ApiBaseUrlContext.ApiBaseUrlContext.Provider, { value: apiBaseUrl, children: /* @__PURE__ */ jsxRuntime.jsx(LoginTokenContext.LoginTokenContext.Provider, { value: loginToken, children: /* @__PURE__ */ jsxRuntime.jsx(SetSessionTokenContext.SetSessionTokenContext.Provider, { value: setLocalStorageSessionToken, children: /* @__PURE__ */ jsxRuntime.jsx(SessionTokenContext.SessionTokenContext.Provider, { value: sessionTokenContextValue, children: /* @__PURE__ */ jsxRuntime.jsx(ProjectSlugContext.ProjectSlugContext.Provider, { value: project, children: /* @__PURE__ */ jsxRuntime.jsx(StageSlugContext.StageSlugContext.Provider, { value: stage, children }) }) }) }) }) });
|
|
27
|
+
});
|
|
28
|
+
const useLocalStorageSessionToken = () => {
|
|
29
|
+
const [sessionTokenInner, setSessionTokenInner] = react.useState(() => localStorage.getItem(sessionTokenKey) ?? void 0);
|
|
30
|
+
const setSessionToken = react.useCallback((token) => {
|
|
31
|
+
if (token !== void 0) {
|
|
32
|
+
localStorage.setItem(sessionTokenKey, token);
|
|
33
|
+
} else {
|
|
34
|
+
localStorage.removeItem(sessionTokenKey);
|
|
35
|
+
}
|
|
36
|
+
setSessionTokenInner(token);
|
|
37
|
+
}, []);
|
|
38
|
+
return [sessionTokenInner, setSessionToken];
|
|
39
|
+
};
|
|
40
|
+
exports.ContemberClient = ContemberClient;
|
|
41
|
+
//# sourceMappingURL=ContemberClient.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContemberClient.cjs","sources":["../../src/ContemberClient.tsx"],"sourcesContent":["import { memo, useCallback, useMemo, useState } from 'react'\nimport { SessionTokenContext, SessionTokenContextValue, SetSessionTokenContext } 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\nconst sessionTokenKey = 'contember_session_token'\n\n/**\n * @group Entrypoints\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\tconst [localStorageSessionToken, setLocalStorageSessionToken] = useLocalStorageSessionToken()\n\n\tconst sessionTokenContextValue = useMemo((): SessionTokenContextValue => ({\n\t\tpropsToken: sessionToken,\n\t\ttoken: localStorageSessionToken ?? sessionToken,\n\t\tsource: localStorageSessionToken ? 'localstorage' : (sessionToken ? 'props' : undefined),\n\t}), [localStorageSessionToken, sessionToken])\n\n\treturn (\n\t\t<ApiBaseUrlContext.Provider value={apiBaseUrl}>\n\t\t\t<LoginTokenContext.Provider value={loginToken}>\n\t\t\t\t<SetSessionTokenContext.Provider value={setLocalStorageSessionToken}>\n\t\t\t\t\t<SessionTokenContext.Provider value={sessionTokenContextValue}>\n\t\t\t\t\t\t<ProjectSlugContext.Provider value={project}>\n\t\t\t\t\t\t\t<StageSlugContext.Provider value={stage}>{children}</StageSlugContext.Provider>\n\t\t\t\t\t\t</ProjectSlugContext.Provider>\n\t\t\t\t\t</SessionTokenContext.Provider>\n\t\t\t\t</SetSessionTokenContext.Provider>\n\t\t\t</LoginTokenContext.Provider>\n\t\t</ApiBaseUrlContext.Provider>\n\t)\n})\n\nconst useLocalStorageSessionToken = (): [value: string | undefined, set: (token: string | undefined) => void] => {\n\tconst [sessionTokenInner, setSessionTokenInner] = useState(() => localStorage.getItem(sessionTokenKey) ?? undefined)\n\n\tconst setSessionToken = useCallback((token: string | undefined) => {\n\t\tif (token !== undefined) {\n\t\t\tlocalStorage.setItem(sessionTokenKey, token)\n\t\t} else {\n\t\t\tlocalStorage.removeItem(sessionTokenKey)\n\t\t}\n\t\tsetSessionTokenInner(token)\n\t}, [])\n\n\treturn [sessionTokenInner, setSessionToken]\n}\n"],"names":["memo","ContemberClient","useMemo","ApiBaseUrlContext","LoginTokenContext","jsx","SetSessionTokenContext","SessionTokenContext","ProjectSlugContext","StageSlugContext","useState","useCallback"],"mappings":";;;;;;;;;;AAaA,MAAM,kBAAkB;AAKX,MAAA,kBAAkBA,MAAAA,KAA2D,SAASC,iBAAgB;AAAA,EAClH;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAAG;AACF,QAAM,CAAC,0BAA0B,2BAA2B,IAAI,4BAA4B;AAEtF,QAAA,2BAA2BC,MAAAA,QAAQ,OAAiC;AAAA,IACzE,YAAY;AAAA,IACZ,OAAO,4BAA4B;AAAA,IACnC,QAAQ,2BAA2B,iBAAkB,eAAe,UAAU;AAAA,EAC3E,IAAA,CAAC,0BAA0B,YAAY,CAAC;AAE5C,wCACEC,oCAAkB,UAAlB,EAA2B,OAAO,YAClC,yCAACC,kBAAkB,kBAAA,UAAlB,EAA2B,OAAO,YAClC,UAACC,+BAAAC,uBAAAA,uBAAuB,UAAvB,EAAgC,OAAO,6BACvC,UAACD,2BAAA,IAAAE,wCAAoB,UAApB,EAA6B,OAAO,0BACpC,UAAAF,+BAACG,mBAAAA,mBAAmB,UAAnB,EAA4B,OAAO,SACnC,UAAAH,2BAAA,IAACI,kCAAiB,UAAjB,EAA0B,OAAO,OAAQ,SAAS,CAAA,GACpD,EACD,CAAA,EACD,CAAA,GACD,EACD,CAAA;AAEF,CAAC;AAED,MAAM,8BAA8B,MAA6E;AAC1G,QAAA,CAAC,mBAAmB,oBAAoB,IAAIC,eAAS,MAAM,aAAa,QAAQ,eAAe,KAAK,MAAS;AAE7G,QAAA,kBAAkBC,kBAAY,CAAC,UAA8B;AAClE,QAAI,UAAU,QAAW;AACX,mBAAA,QAAQ,iBAAiB,KAAK;AAAA,IAAA,OACrC;AACN,mBAAa,WAAW,eAAe;AAAA,IACxC;AACA,yBAAqB,KAAK;AAAA,EAC3B,GAAG,CAAE,CAAA;AAEE,SAAA,CAAC,mBAAmB,eAAe;AAC3C;;"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const apiRequestReducer = (previousState, action) => {
|
|
4
|
+
switch (action.type) {
|
|
5
|
+
case "uninitialize":
|
|
6
|
+
return {
|
|
7
|
+
readyState: "uninitialized",
|
|
8
|
+
isFinished: false,
|
|
9
|
+
isLoading: false
|
|
10
|
+
};
|
|
11
|
+
case "initialize":
|
|
12
|
+
return {
|
|
13
|
+
readyState: "pending",
|
|
14
|
+
isFinished: false,
|
|
15
|
+
isLoading: true
|
|
16
|
+
};
|
|
17
|
+
case "resolveSuccessfully":
|
|
18
|
+
return {
|
|
19
|
+
readyState: "networkSuccess",
|
|
20
|
+
data: action.data,
|
|
21
|
+
isFinished: true,
|
|
22
|
+
isLoading: false
|
|
23
|
+
};
|
|
24
|
+
case "resolveWithError":
|
|
25
|
+
return {
|
|
26
|
+
readyState: "networkError",
|
|
27
|
+
data: action.error,
|
|
28
|
+
isFinished: true,
|
|
29
|
+
isLoading: false
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
exports.apiRequestReducer = apiRequestReducer;
|
|
34
|
+
//# sourceMappingURL=apiRequestReducer.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiRequestReducer.cjs","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":";;AAQa,MAAA,oBAAoB,CAChC,eACA,WACkC;AAClC,UAAQ,OAAO,MAAM;AAAA,IACpB,KAAK;AACG,aAAA;AAAA,QACN,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,IAEb,KAAK;AACG,aAAA;AAAA,QACN,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,IAEb,KAAK;AACG,aAAA;AAAA,QACN,YAAY;AAAA,QACZ,MAAM,OAAO;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,IAEb,KAAK;AACG,aAAA;AAAA,QACN,YAAY;AAAA,QACZ,MAAM,OAAO;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,EAEd;AACD;;"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const react = require("react");
|
|
4
|
+
const apiRequestReducer = require("./apiRequestReducer.cjs");
|
|
5
|
+
const initialState = {
|
|
6
|
+
isLoading: false,
|
|
7
|
+
isFinished: false,
|
|
8
|
+
readyState: "uninitialized"
|
|
9
|
+
};
|
|
10
|
+
const useApiRequest = (client) => {
|
|
11
|
+
const [state, dispatch] = react.useReducer(apiRequestReducer.apiRequestReducer, initialState);
|
|
12
|
+
const isUnmountedRef = react.useRef(false);
|
|
13
|
+
const sendRequest = react.useCallback(
|
|
14
|
+
async (query, variables = {}, options) => {
|
|
15
|
+
if (isUnmountedRef.current) {
|
|
16
|
+
return Promise.reject();
|
|
17
|
+
}
|
|
18
|
+
dispatch({
|
|
19
|
+
type: "initialize"
|
|
20
|
+
});
|
|
21
|
+
return client.sendRequest(query, {
|
|
22
|
+
...options,
|
|
23
|
+
variables
|
|
24
|
+
}).then((data) => {
|
|
25
|
+
dispatch({
|
|
26
|
+
type: "resolveSuccessfully",
|
|
27
|
+
data
|
|
28
|
+
});
|
|
29
|
+
return Promise.resolve(data);
|
|
30
|
+
}).catch((error) => {
|
|
31
|
+
dispatch({
|
|
32
|
+
type: "resolveWithError",
|
|
33
|
+
error
|
|
34
|
+
});
|
|
35
|
+
return Promise.reject(error);
|
|
36
|
+
});
|
|
37
|
+
},
|
|
38
|
+
[client]
|
|
39
|
+
);
|
|
40
|
+
react.useEffect(
|
|
41
|
+
() => () => {
|
|
42
|
+
isUnmountedRef.current = true;
|
|
43
|
+
},
|
|
44
|
+
[]
|
|
45
|
+
// This empty array is crucial! Otherwise it will first "unmount" before second render no matter what.
|
|
46
|
+
);
|
|
47
|
+
return [state, sendRequest];
|
|
48
|
+
};
|
|
49
|
+
exports.useApiRequest = useApiRequest;
|
|
50
|
+
//# sourceMappingURL=useApiRequest.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useApiRequest.cjs","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":["useReducer","apiRequestReducer","useRef","useCallback","useEffect"],"mappings":";;;;AAUA,MAAM,eAAqC;AAAA,EAC1C,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AACb;AAWa,MAAA,gBAAgB,CAAc,WAA4D;AACtG,QAAM,CAAC,OAAO,QAAQ,IAAIA,MAAAA,WAAWC,kBAAAA,mBAAqD,YAAY;AAEhG,QAAA,iBAAiBC,aAAO,KAAK;AACnC,QAAM,cAAcC,MAAA;AAAA,IACnB,OACC,OACA,YAAoC,IACpC,YAC0B;AAC1B,UAAI,eAAe,SAAS;AAC3B,eAAO,QAAQ;MAChB;AACS,eAAA;AAAA,QACR,MAAM;AAAA,MAAA,CACN;AACM,aAAA,OACL,YAAyB,OAAO;AAAA,QAChC,GAAG;AAAA,QACH;AAAA,MAAA,CACA,EACA,KAAK,CAAQ,SAAA;AACJ,iBAAA;AAAA,UACR,MAAM;AAAA,UACN;AAAA,QAAA,CACA;AACM,eAAA,QAAQ,QAAQ,IAAI;AAAA,MAAA,CAC3B,EACA,MAAM,CAAC,UAA8C;AAC5C,iBAAA;AAAA,UACR,MAAM;AAAA,UACN;AAAA,QAAA,CACA;AACM,eAAA,QAAQ,OAAO,KAAK;AAAA,MAAA,CAC3B;AAAA,IACH;AAAA,IACA,CAAC,MAAM;AAAA,EAAA;AAGRC,QAAA;AAAA,IACC,MAAM,MAAM;AACX,qBAAe,UAAU;AAAA,IAC1B;AAAA,IACA,CAAC;AAAA;AAAA,EAAA;AAGK,SAAA,CAAC,OAAO,WAAW;AAC3B;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const react = require("react");
|
|
4
|
+
const SessionTokenContext = react.createContext({
|
|
5
|
+
propsToken: void 0,
|
|
6
|
+
source: void 0,
|
|
7
|
+
token: void 0
|
|
8
|
+
});
|
|
9
|
+
exports.SessionTokenContext = SessionTokenContext;
|
|
10
|
+
//# sourceMappingURL=SessionTokenContext.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionTokenContext.cjs","sources":["../../../src/auth/SessionTokenContext.ts"],"sourcesContent":["import { createContext } from 'react'\n\nexport interface SessionTokenContextValue {\n\tpropsToken: string | undefined\n\tsource: 'props' | 'localstorage' | undefined\n\ttoken: string | undefined\n}\n\nexport const SessionTokenContext = createContext<SessionTokenContextValue>({\n\tpropsToken: undefined,\n\tsource: undefined,\n\ttoken: undefined,\n})\n"],"names":["createContext"],"mappings":";;;AAQO,MAAM,sBAAsBA,MAAAA,cAAwC;AAAA,EAC1E,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,OAAO;AACR,CAAC;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const react = require("react");
|
|
4
|
+
const SetSessionTokenContext = react.createContext(() => {
|
|
5
|
+
throw new Error("SetSessionTokenContext is not set");
|
|
6
|
+
});
|
|
7
|
+
exports.SetSessionTokenContext = SetSessionTokenContext;
|
|
8
|
+
//# sourceMappingURL=SetSessionTokenContext.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SetSessionTokenContext.cjs","sources":["../../../src/auth/SetSessionTokenContext.ts"],"sourcesContent":["import { createContext } from 'react'\n\nexport const SetSessionTokenContext = createContext<(token: string | undefined) => void>(() => {\n\tthrow new Error('SetSessionTokenContext is not set')\n})\n"],"names":["createContext"],"mappings":";;;AAEa,MAAA,yBAAyBA,oBAAmD,MAAM;AACxF,QAAA,IAAI,MAAM,mCAAmC;AACpD,CAAC;;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const react = require("react");
|
|
4
|
+
const SessionTokenContext = require("./SessionTokenContext.cjs");
|
|
5
|
+
const useSessionToken = () => react.useContext(SessionTokenContext.SessionTokenContext).token;
|
|
6
|
+
const useSessionTokenWithMeta = () => react.useContext(SessionTokenContext.SessionTokenContext);
|
|
7
|
+
exports.useSessionToken = useSessionToken;
|
|
8
|
+
exports.useSessionTokenWithMeta = useSessionTokenWithMeta;
|
|
9
|
+
//# sourceMappingURL=useSessionToken.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSessionToken.cjs","sources":["../../../src/auth/useSessionToken.ts"],"sourcesContent":["import { useContext } from 'react'\nimport { SessionTokenContext } from './SessionTokenContext'\n\nexport const useSessionToken = () => useContext(SessionTokenContext).token\nexport const useSessionTokenWithMeta = () => useContext(SessionTokenContext)\n"],"names":["useContext","SessionTokenContext"],"mappings":";;;;AAGO,MAAM,kBAAkB,MAAMA,MAAAA,WAAWC,oBAAmB,mBAAA,EAAE;AACxD,MAAA,0BAA0B,MAAMD,MAAAA,WAAWC,oBAAmB,mBAAA;;;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const react = require("react");
|
|
4
|
+
const SetSessionTokenContext = require("./SetSessionTokenContext.cjs");
|
|
5
|
+
const useSetSessionToken = () => react.useContext(SetSessionTokenContext.SetSessionTokenContext);
|
|
6
|
+
exports.useSetSessionToken = useSetSessionToken;
|
|
7
|
+
//# sourceMappingURL=useSetSessionToken.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSetSessionToken.cjs","sources":["../../../src/auth/useSetSessionToken.ts"],"sourcesContent":["import { useContext } from 'react'\nimport { SetSessionTokenContext } from './SetSessionTokenContext'\n\nexport const useSetSessionToken = () => useContext(SetSessionTokenContext)\n"],"names":["useContext","SetSessionTokenContext"],"mappings":";;;;AAGa,MAAA,qBAAqB,MAAMA,MAAAA,WAAWC,uBAAsB,sBAAA;;"}
|