@contember/react-client 1.1.0-alpha.9 → 1.1.0-beta.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.js +3 -1
- package/dist/development/ClientError.js.map +1 -1
- package/dist/development/ContemberClient.js +49 -15
- package/dist/development/ContemberClient.js.map +1 -1
- package/dist/development/apiRequest/apiRequestReducer.js +3 -1
- package/dist/development/apiRequest/apiRequestReducer.js.map +1 -1
- package/dist/development/apiRequest/useApiRequest.js +33 -25
- package/dist/development/apiRequest/useApiRequest.js.map +1 -1
- package/dist/development/auth/SessionTokenContext.js +3 -1
- package/dist/development/auth/SessionTokenContext.js.map +1 -1
- package/dist/development/auth/SetSessionTokenContext.js +3 -1
- package/dist/development/auth/SetSessionTokenContext.js.map +1 -1
- package/dist/development/auth/useSessionToken.js +3 -1
- package/dist/development/auth/useSessionToken.js.map +1 -1
- package/dist/development/auth/useSetSessionToken.js +3 -1
- package/dist/development/auth/useSetSessionToken.js.map +1 -1
- package/dist/development/components/RichTextRenderer/ElementRenderer.js +18 -5
- package/dist/development/components/RichTextRenderer/ElementRenderer.js.map +1 -1
- package/dist/development/components/RichTextRenderer/LeafRenderer.js +11 -3
- package/dist/development/components/RichTextRenderer/LeafRenderer.js.map +1 -1
- package/dist/development/components/RichTextRenderer/RenderElementFallback.js +148 -50
- package/dist/development/components/RichTextRenderer/RenderElementFallback.js.map +1 -1
- package/dist/development/components/RichTextRenderer/RenderLeafFallback.js +65 -13
- package/dist/development/components/RichTextRenderer/RenderLeafFallback.js.map +1 -1
- package/dist/development/components/RichTextRenderer/RichTextRenderMetadataContext.js +4 -1
- package/dist/development/components/RichTextRenderer/RichTextRenderMetadataContext.js.map +1 -1
- package/dist/development/components/RichTextRenderer/RichTextRenderer.js +44 -32
- package/dist/development/components/RichTextRenderer/RichTextRenderer.js.map +1 -1
- package/dist/development/components/RichTextRenderer/RichTextRendererError.js +3 -1
- package/dist/development/components/RichTextRenderer/RichTextRendererError.js.map +1 -1
- package/dist/development/components/RichTextRenderer/defaultDeserialize.js +3 -1
- package/dist/development/components/RichTextRenderer/defaultDeserialize.js.map +1 -1
- package/dist/development/components/RichTextRenderer/renderChildren.js +31 -19
- package/dist/development/components/RichTextRenderer/renderChildren.js.map +1 -1
- package/dist/development/components/RichTextRenderer/resolveRichTextElementMetadata.js +6 -2
- package/dist/development/components/RichTextRenderer/resolveRichTextElementMetadata.js.map +1 -1
- package/dist/development/config/ApiBaseUrlContext.js +3 -1
- package/dist/development/config/ApiBaseUrlContext.js.map +1 -1
- package/dist/development/config/LoginTokenContext.js +3 -1
- package/dist/development/config/LoginTokenContext.js.map +1 -1
- package/dist/development/config/useApiBaseUrl.js +3 -1
- package/dist/development/config/useApiBaseUrl.js.map +1 -1
- package/dist/development/config/useLoginToken.js +3 -1
- package/dist/development/config/useLoginToken.js.map +1 -1
- package/dist/development/content/useContentApiRequest.js +3 -1
- package/dist/development/content/useContentApiRequest.js.map +1 -1
- package/dist/development/content/useContentGraphQlClient.js +3 -1
- package/dist/development/content/useContentGraphQlClient.js.map +1 -1
- package/dist/development/content/useCurrentContentGraphQlClient.js +3 -1
- package/dist/development/content/useCurrentContentGraphQlClient.js.map +1 -1
- package/dist/development/index.js +58 -28
- package/dist/development/project/ProjectSlugContext.js +3 -1
- package/dist/development/project/ProjectSlugContext.js.map +1 -1
- package/dist/development/project/StageSlugContext.js +3 -1
- package/dist/development/project/StageSlugContext.js.map +1 -1
- package/dist/development/project/useProjectSlug.js +3 -1
- package/dist/development/project/useProjectSlug.js.map +1 -1
- package/dist/development/project/useStageSlug.js +3 -1
- package/dist/development/project/useStageSlug.js.map +1 -1
- package/dist/development/system/useCurrentSystemGraphQlClient.js +3 -1
- package/dist/development/system/useCurrentSystemGraphQlClient.js.map +1 -1
- package/dist/development/system/useSystemApiRequest.js +3 -1
- package/dist/development/system/useSystemApiRequest.js.map +1 -1
- package/dist/development/system/useSystemGraphQlClient.js +3 -1
- package/dist/development/system/useSystemGraphQlClient.js.map +1 -1
- package/dist/development/tenant/useTenantApiRequest.js +3 -1
- package/dist/development/tenant/useTenantApiRequest.js.map +1 -1
- package/dist/development/tenant/useTenantGraphQlClient.js +3 -1
- package/dist/development/tenant/useTenantGraphQlClient.js.map +1 -1
- package/dist/development/upload/fileUploadReducer.js +4 -1
- package/dist/development/upload/fileUploadReducer.js.map +1 -1
- package/dist/development/upload/toFileId.js +3 -1
- package/dist/development/upload/toFileId.js.map +1 -1
- package/dist/development/upload/useFileUpload.js +131 -115
- package/dist/development/upload/useFileUpload.js.map +1 -1
- package/dist/development/useGraphQlClient.js +3 -1
- package/dist/development/useGraphQlClient.js.map +1 -1
- package/dist/development/utils/assertNever.js +3 -1
- package/dist/development/utils/assertNever.js.map +1 -1
- package/dist/production/ClientError.js +3 -1
- package/dist/production/ClientError.js.map +1 -1
- package/dist/production/ContemberClient.js +24 -15
- package/dist/production/ContemberClient.js.map +1 -1
- package/dist/production/apiRequest/apiRequestReducer.js +3 -1
- package/dist/production/apiRequest/apiRequestReducer.js.map +1 -1
- package/dist/production/apiRequest/useApiRequest.js +33 -25
- package/dist/production/apiRequest/useApiRequest.js.map +1 -1
- package/dist/production/auth/SessionTokenContext.js +3 -1
- package/dist/production/auth/SessionTokenContext.js.map +1 -1
- package/dist/production/auth/SetSessionTokenContext.js +3 -1
- package/dist/production/auth/SetSessionTokenContext.js.map +1 -1
- package/dist/production/auth/useSessionToken.js +3 -1
- package/dist/production/auth/useSessionToken.js.map +1 -1
- package/dist/production/auth/useSetSessionToken.js +3 -1
- package/dist/production/auth/useSetSessionToken.js.map +1 -1
- package/dist/production/components/RichTextRenderer/ElementRenderer.js +13 -5
- package/dist/production/components/RichTextRenderer/ElementRenderer.js.map +1 -1
- package/dist/production/components/RichTextRenderer/LeafRenderer.js +5 -2
- package/dist/production/components/RichTextRenderer/LeafRenderer.js.map +1 -1
- package/dist/production/components/RichTextRenderer/RenderElementFallback.js +81 -48
- package/dist/production/components/RichTextRenderer/RenderElementFallback.js.map +1 -1
- package/dist/production/components/RichTextRenderer/RenderLeafFallback.js +32 -13
- package/dist/production/components/RichTextRenderer/RenderLeafFallback.js.map +1 -1
- package/dist/production/components/RichTextRenderer/RichTextRenderMetadataContext.js +4 -1
- package/dist/production/components/RichTextRenderer/RichTextRenderMetadataContext.js.map +1 -1
- package/dist/production/components/RichTextRenderer/RichTextRenderer.js +39 -32
- package/dist/production/components/RichTextRenderer/RichTextRenderer.js.map +1 -1
- package/dist/production/components/RichTextRenderer/RichTextRendererError.js +3 -1
- package/dist/production/components/RichTextRenderer/RichTextRendererError.js.map +1 -1
- package/dist/production/components/RichTextRenderer/defaultDeserialize.js +3 -1
- package/dist/production/components/RichTextRenderer/defaultDeserialize.js.map +1 -1
- package/dist/production/components/RichTextRenderer/renderChildren.js +22 -19
- package/dist/production/components/RichTextRenderer/renderChildren.js.map +1 -1
- package/dist/production/components/RichTextRenderer/resolveRichTextElementMetadata.js +6 -2
- package/dist/production/components/RichTextRenderer/resolveRichTextElementMetadata.js.map +1 -1
- package/dist/production/config/ApiBaseUrlContext.js +3 -1
- package/dist/production/config/ApiBaseUrlContext.js.map +1 -1
- package/dist/production/config/LoginTokenContext.js +3 -1
- package/dist/production/config/LoginTokenContext.js.map +1 -1
- package/dist/production/config/useApiBaseUrl.js +3 -1
- package/dist/production/config/useApiBaseUrl.js.map +1 -1
- package/dist/production/config/useLoginToken.js +3 -1
- package/dist/production/config/useLoginToken.js.map +1 -1
- package/dist/production/content/useContentApiRequest.js +3 -1
- package/dist/production/content/useContentApiRequest.js.map +1 -1
- package/dist/production/content/useContentGraphQlClient.js +3 -1
- package/dist/production/content/useContentGraphQlClient.js.map +1 -1
- package/dist/production/content/useCurrentContentGraphQlClient.js +3 -1
- package/dist/production/content/useCurrentContentGraphQlClient.js.map +1 -1
- package/dist/production/index.js +58 -28
- package/dist/production/project/ProjectSlugContext.js +3 -1
- package/dist/production/project/ProjectSlugContext.js.map +1 -1
- package/dist/production/project/StageSlugContext.js +3 -1
- package/dist/production/project/StageSlugContext.js.map +1 -1
- package/dist/production/project/useProjectSlug.js +3 -1
- package/dist/production/project/useProjectSlug.js.map +1 -1
- package/dist/production/project/useStageSlug.js +3 -1
- package/dist/production/project/useStageSlug.js.map +1 -1
- package/dist/production/system/useCurrentSystemGraphQlClient.js +3 -1
- package/dist/production/system/useCurrentSystemGraphQlClient.js.map +1 -1
- package/dist/production/system/useSystemApiRequest.js +3 -1
- package/dist/production/system/useSystemApiRequest.js.map +1 -1
- package/dist/production/system/useSystemGraphQlClient.js +3 -1
- package/dist/production/system/useSystemGraphQlClient.js.map +1 -1
- package/dist/production/tenant/useTenantApiRequest.js +3 -1
- package/dist/production/tenant/useTenantApiRequest.js.map +1 -1
- package/dist/production/tenant/useTenantGraphQlClient.js +3 -1
- package/dist/production/tenant/useTenantGraphQlClient.js.map +1 -1
- package/dist/production/upload/fileUploadReducer.js +4 -1
- package/dist/production/upload/fileUploadReducer.js.map +1 -1
- package/dist/production/upload/toFileId.js +3 -1
- package/dist/production/upload/toFileId.js.map +1 -1
- package/dist/production/upload/useFileUpload.js +131 -115
- package/dist/production/upload/useFileUpload.js.map +1 -1
- package/dist/production/useGraphQlClient.js +3 -1
- package/dist/production/useGraphQlClient.js.map +1 -1
- package/dist/production/utils/assertNever.js +3 -1
- package/dist/production/utils/assertNever.js.map +1 -1
- package/dist/types/components/RichTextRenderer/RichTextRenderer.d.ts +2 -1
- package/dist/types/components/RichTextRenderer/RichTextRenderer.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dist/types/upload/useFileUpload.d.ts +1 -1
- package/dist/types/upload/useFileUpload.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/components/RichTextRenderer/RichTextRenderer.tsx +1 -1
|
@@ -27,119 +27,130 @@ const useFileUpload = (options) => {
|
|
|
27
27
|
error
|
|
28
28
|
});
|
|
29
29
|
}, []);
|
|
30
|
-
const initializeUpload = useCallback(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
if (fileWithMetadataByFileConfig.size === 0) {
|
|
56
|
-
return fileWithMetadataByFileConfig;
|
|
57
|
-
}
|
|
58
|
-
if (newFileIds.size) {
|
|
59
|
-
dispatch({
|
|
60
|
-
type: "purge",
|
|
61
|
-
files: newFileIds
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
dispatch({
|
|
65
|
-
type: "initialize",
|
|
66
|
-
files: fileWithMetadataByFileConfig
|
|
67
|
-
});
|
|
68
|
-
return fileWithMetadataByFileConfig;
|
|
69
|
-
}, [purgeUpload]);
|
|
70
|
-
const startUpload = useCallback((files) => {
|
|
71
|
-
const filesById = /* @__PURE__ */ new Map();
|
|
72
|
-
const groupedByUploader = /* @__PURE__ */ new Map();
|
|
73
|
-
const currentState = multiTemporalStateRef.current;
|
|
74
|
-
for (const fileOrIdMaybeWithOptions of files) {
|
|
75
|
-
let fileOrId;
|
|
76
|
-
let options2;
|
|
77
|
-
if (Array.isArray(fileOrIdMaybeWithOptions)) {
|
|
78
|
-
fileOrId = fileOrIdMaybeWithOptions[0];
|
|
79
|
-
options2 = fileOrIdMaybeWithOptions[1];
|
|
80
|
-
} else {
|
|
81
|
-
fileOrId = fileOrIdMaybeWithOptions;
|
|
82
|
-
options2 = {};
|
|
30
|
+
const initializeUpload = useCallback(
|
|
31
|
+
(files) => {
|
|
32
|
+
const newFileIds = /* @__PURE__ */ new Set();
|
|
33
|
+
const fileWithMetadataByFileConfig = /* @__PURE__ */ new Map();
|
|
34
|
+
for (const fileMaybeWithId of files) {
|
|
35
|
+
const abortController = new AbortController();
|
|
36
|
+
let fileId;
|
|
37
|
+
let file;
|
|
38
|
+
if (fileMaybeWithId instanceof File) {
|
|
39
|
+
fileId = `__contember__file-${fileIdSeedRef.current++}`;
|
|
40
|
+
file = fileMaybeWithId;
|
|
41
|
+
} else {
|
|
42
|
+
fileId = fileMaybeWithId[0];
|
|
43
|
+
file = fileMaybeWithId[1];
|
|
44
|
+
}
|
|
45
|
+
abortController.signal.addEventListener("abort", () => {
|
|
46
|
+
purgeUpload([fileId]);
|
|
47
|
+
});
|
|
48
|
+
fileWithMetadataByFileConfig.set(fileId, {
|
|
49
|
+
previewUrl: URL.createObjectURL(file),
|
|
50
|
+
abortController,
|
|
51
|
+
file,
|
|
52
|
+
fileId
|
|
53
|
+
});
|
|
54
|
+
newFileIds.add(fileId);
|
|
83
55
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
const fileState = currentState.liveState.get(fileId);
|
|
87
|
-
if (fileState === void 0 || fileState.readyState !== "initializing") {
|
|
88
|
-
throw new Error(`Trying to startUpload a file that hasn't been previously initialized. This will be possible in future, but isn't yet.`);
|
|
56
|
+
if (fileWithMetadataByFileConfig.size === 0) {
|
|
57
|
+
return fileWithMetadataByFileConfig;
|
|
89
58
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if (filesWithSameUploader === void 0) {
|
|
96
|
-
groupedByUploader.set(uploader, filesWithSameUploader = /* @__PURE__ */ new Map());
|
|
59
|
+
if (newFileIds.size) {
|
|
60
|
+
dispatch({
|
|
61
|
+
type: "purge",
|
|
62
|
+
files: newFileIds
|
|
63
|
+
});
|
|
97
64
|
}
|
|
98
|
-
|
|
99
|
-
|
|
65
|
+
dispatch({
|
|
66
|
+
type: "initialize",
|
|
67
|
+
files: fileWithMetadataByFileConfig
|
|
100
68
|
});
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
69
|
+
return fileWithMetadataByFileConfig;
|
|
70
|
+
},
|
|
71
|
+
[purgeUpload]
|
|
72
|
+
);
|
|
73
|
+
const startUpload = useCallback(
|
|
74
|
+
(files) => {
|
|
75
|
+
const filesById = /* @__PURE__ */ new Map();
|
|
76
|
+
const groupedByUploader = /* @__PURE__ */ new Map();
|
|
77
|
+
const currentState = multiTemporalStateRef.current;
|
|
78
|
+
for (const fileOrIdMaybeWithOptions of files) {
|
|
79
|
+
let fileOrId;
|
|
80
|
+
let options2;
|
|
81
|
+
if (Array.isArray(fileOrIdMaybeWithOptions)) {
|
|
82
|
+
fileOrId = fileOrIdMaybeWithOptions[0];
|
|
83
|
+
options2 = fileOrIdMaybeWithOptions[1];
|
|
84
|
+
} else {
|
|
85
|
+
fileOrId = fileOrIdMaybeWithOptions;
|
|
86
|
+
options2 = {};
|
|
87
|
+
}
|
|
88
|
+
const { uploader = defaultUploader, metadata } = options2;
|
|
89
|
+
const fileId = toFileId(currentState, fileOrId);
|
|
90
|
+
const fileState = currentState.liveState.get(fileId);
|
|
91
|
+
if (fileState === void 0 || fileState.readyState !== "initializing") {
|
|
92
|
+
throw new Error(
|
|
93
|
+
`Trying to startUpload a file that hasn't been previously initialized. This will be possible in future, but isn't yet.`
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
filesById.set(fileId, {
|
|
97
|
+
uploader,
|
|
98
|
+
metadata
|
|
128
99
|
});
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
100
|
+
let filesWithSameUploader = groupedByUploader.get(uploader);
|
|
101
|
+
if (filesWithSameUploader === void 0) {
|
|
102
|
+
groupedByUploader.set(uploader, filesWithSameUploader = /* @__PURE__ */ new Map());
|
|
103
|
+
}
|
|
104
|
+
filesWithSameUploader.set(fileState.file, {
|
|
105
|
+
abortSignal: fileState.abortController.signal
|
|
133
106
|
});
|
|
134
107
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
108
|
+
dispatch({
|
|
109
|
+
type: "startUploading",
|
|
110
|
+
files: filesById
|
|
111
|
+
});
|
|
112
|
+
for (const [uploader, filesForUpload] of groupedByUploader) {
|
|
113
|
+
try {
|
|
114
|
+
uploader.upload(filesForUpload, {
|
|
115
|
+
onProgress: (progress) => {
|
|
116
|
+
dispatch({
|
|
117
|
+
type: "updateUploadProgress",
|
|
118
|
+
progress
|
|
119
|
+
});
|
|
120
|
+
},
|
|
121
|
+
onSuccess: (result) => {
|
|
122
|
+
dispatch({
|
|
123
|
+
type: "finishSuccessfully",
|
|
124
|
+
result
|
|
125
|
+
});
|
|
126
|
+
},
|
|
127
|
+
onError: (error) => {
|
|
128
|
+
dispatch({
|
|
129
|
+
type: "finishWithError",
|
|
130
|
+
error
|
|
131
|
+
});
|
|
132
|
+
},
|
|
133
|
+
contentApiClient
|
|
134
|
+
});
|
|
135
|
+
} catch (error) {
|
|
136
|
+
dispatch({
|
|
137
|
+
type: "finishWithError",
|
|
138
|
+
error: Array.from(filesForUpload).map(([file]) => [file, error])
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
[contentApiClient, defaultUploader]
|
|
144
|
+
);
|
|
145
|
+
const operations = useMemo(
|
|
146
|
+
() => ({
|
|
147
|
+
failUpload,
|
|
148
|
+
initializeUpload,
|
|
149
|
+
purgeUpload,
|
|
150
|
+
startUpload
|
|
151
|
+
}),
|
|
152
|
+
[failUpload, initializeUpload, purgeUpload, startUpload]
|
|
153
|
+
);
|
|
143
154
|
useEffect(() => {
|
|
144
155
|
if (isFirstRenderRef.current) {
|
|
145
156
|
return;
|
|
@@ -173,18 +184,23 @@ const useFileUpload = (options) => {
|
|
|
173
184
|
multiTemporalState.publicState,
|
|
174
185
|
maxUpdateFrequency
|
|
175
186
|
]);
|
|
176
|
-
useEffect(
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
187
|
+
useEffect(
|
|
188
|
+
() => () => {
|
|
189
|
+
for (const [, state] of multiTemporalStateRef.current.liveState) {
|
|
190
|
+
URL.revokeObjectURL(state.previewUrl);
|
|
191
|
+
}
|
|
192
|
+
for (const [, state] of multiTemporalStateRef.current.publicState) {
|
|
193
|
+
URL.revokeObjectURL(state.previewUrl);
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
[]
|
|
197
|
+
);
|
|
184
198
|
useEffect(() => {
|
|
185
199
|
isFirstRenderRef.current = false;
|
|
186
200
|
}, []);
|
|
187
201
|
return [multiTemporalState.publicState, operations];
|
|
188
202
|
};
|
|
189
|
-
export {
|
|
203
|
+
export {
|
|
204
|
+
useFileUpload
|
|
205
|
+
};
|
|
190
206
|
//# sourceMappingURL=useFileUpload.js.map
|
|
@@ -1 +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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"}
|
|
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":["options"],"mappings":"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"}
|
|
@@ -7,5 +7,7 @@ const useGraphQlClient = (path) => {
|
|
|
7
7
|
const sessionToken = useSessionToken();
|
|
8
8
|
return useMemo(() => new GraphQlClient(`${apiBaseUrl}${path}`, sessionToken), [apiBaseUrl, path, sessionToken]);
|
|
9
9
|
};
|
|
10
|
-
export {
|
|
10
|
+
export {
|
|
11
|
+
useGraphQlClient
|
|
12
|
+
};
|
|
11
13
|
//# sourceMappingURL=useGraphQlClient.js.map
|
|
@@ -1 +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":";;;;AAKa,MAAA,mBAAmB,CAAC,SAAgC;AAChE,QAAM,aAAa;AACnB,QAAM,eAAe;AACrB,SAAO,QAAQ,MAAM,IAAI,cAAc,GAAG,aAAa,QAAQ,YAAY,GAAG,CAAC,YAAY,MAAM,YAAY,CAAC;AAC/G
|
|
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":";;;;AAKa,MAAA,mBAAmB,CAAC,SAAgC;AAChE,QAAM,aAAa;AACnB,QAAM,eAAe;AACrB,SAAO,QAAQ,MAAM,IAAI,cAAc,GAAG,aAAa,QAAQ,YAAY,GAAG,CAAC,YAAY,MAAM,YAAY,CAAC;AAC/G;"}
|
|
@@ -1 +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":"AAAO,
|
|
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":"AAAO,SAAS,YAAY,GAA8B;AACzD,QAAM,IAAI,MAAM;AACjB;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClientError.js","sources":["../../src/ClientError.ts"],"sourcesContent":["export class ClientError extends Error {}\n"],"names":[],"mappings":"AAAO,MAAM,oBAAoB,MAAM;AAAC
|
|
1
|
+
{"version":3,"file":"ClientError.js","sources":["../../src/ClientError.ts"],"sourcesContent":["export class ClientError extends Error {}\n"],"names":[],"mappings":"AAAO,MAAM,oBAAoB,MAAM;AAAC;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { memo, useState, useCallback
|
|
1
|
+
import { memo, useState, useCallback } from "react";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
3
|
import { ApiBaseUrlContext } from "./config/ApiBaseUrlContext.js";
|
|
3
4
|
import { LoginTokenContext } from "./config/LoginTokenContext.js";
|
|
4
5
|
import { SetSessionTokenContext } from "./auth/SetSessionTokenContext.js";
|
|
@@ -23,19 +24,27 @@ const ContemberClient = memo(function ContemberClient2({
|
|
|
23
24
|
}
|
|
24
25
|
setSessionTokenInner(token);
|
|
25
26
|
}, []);
|
|
26
|
-
return /* @__PURE__ */
|
|
27
|
-
value: apiBaseUrl
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
27
|
+
return /* @__PURE__ */ jsx(ApiBaseUrlContext.Provider, {
|
|
28
|
+
value: apiBaseUrl,
|
|
29
|
+
children: /* @__PURE__ */ jsx(LoginTokenContext.Provider, {
|
|
30
|
+
value: loginToken,
|
|
31
|
+
children: /* @__PURE__ */ jsx(SetSessionTokenContext.Provider, {
|
|
32
|
+
value: setSessionToken,
|
|
33
|
+
children: /* @__PURE__ */ jsx(SessionTokenContext.Provider, {
|
|
34
|
+
value: sessionTokenInner,
|
|
35
|
+
children: /* @__PURE__ */ jsx(ProjectSlugContext.Provider, {
|
|
36
|
+
value: project,
|
|
37
|
+
children: /* @__PURE__ */ jsx(StageSlugContext.Provider, {
|
|
38
|
+
value: stage,
|
|
39
|
+
children
|
|
40
|
+
})
|
|
41
|
+
})
|
|
42
|
+
})
|
|
43
|
+
})
|
|
44
|
+
})
|
|
45
|
+
});
|
|
39
46
|
});
|
|
40
|
-
export {
|
|
47
|
+
export {
|
|
48
|
+
ContemberClient
|
|
49
|
+
};
|
|
41
50
|
//# sourceMappingURL=ContemberClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContemberClient.js","sources":["../../src/ContemberClient.tsx"],"sourcesContent":["import { memo, useCallback, useEffect, useState } from 'react'\nimport { SessionTokenContext, 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\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 [sessionTokenInner, setSessionTokenInner] = useState(() => localStorage.getItem(sessionTokenKey) ?? sessionToken ?? 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 (\n\t\t<ApiBaseUrlContext.Provider value={apiBaseUrl}>\n\t\t\t<LoginTokenContext.Provider value={loginToken}>\n\t\t\t\t<SetSessionTokenContext.Provider value={setSessionToken}>\n\t\t\t\t\t<SessionTokenContext.Provider value={sessionTokenInner}>\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"],"names":["_jsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ContemberClient.js","sources":["../../src/ContemberClient.tsx"],"sourcesContent":["import { memo, useCallback, useEffect, useState } from 'react'\nimport { SessionTokenContext, 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\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 [sessionTokenInner, setSessionTokenInner] = useState(() => localStorage.getItem(sessionTokenKey) ?? sessionToken ?? 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 (\n\t\t<ApiBaseUrlContext.Provider value={apiBaseUrl}>\n\t\t\t<LoginTokenContext.Provider value={loginToken}>\n\t\t\t\t<SetSessionTokenContext.Provider value={setSessionToken}>\n\t\t\t\t\t<SessionTokenContext.Provider value={sessionTokenInner}>\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"],"names":["sessionTokenKey","ContemberClient","memo","apiBaseUrl","children","loginToken","project","sessionToken","stage","sessionTokenInner","setSessionTokenInner","useState","localStorage","getItem","undefined","setSessionToken","useCallback","token","setItem","removeItem","_jsx"],"mappings":";;;;;;;;AAaA,MAAMA,kBAAkB;AAEXC,MAAAA,kBAAkBC,KAA2D,SAASD,iBAAgB;AAAA,EAClHE;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AACD,GAAG;AACI,QAAA,CAACC,mBAAmBC,oBAAoB,IAAIC,SAAS,MAAMC,aAAaC,QAAQb,eAAe,KAAKO,gBAAiBO,MAAS;AAE9HC,QAAAA,kBAAkBC,YAAY,CAACC,UAA8B;AAClE,QAAIA,UAAUH,QAAW;AACXI,mBAAAA,QAAQlB,iBAAiBiB,KAAK;AAAA,IAAA,OACrC;AACNL,mBAAaO,WAAWnB,eAAe;AAAA,IACxC;AACAU,yBAAqBO,KAAK;AAAA,EAC3B,GAAG,CAAE,CAAA;AAGJ,SAAAG,oBAAC,kBAAkB,UAAQ;AAAA,IAAC,OAAOjB;AAAAA,IAAW,UAC5CiB,oBAAA,kBAAkB,UAAQ;AAAA,MAAC,OAAOf;AAAAA,MAAW,UAC5Ce,oBAAA,uBAAuB,UAAQ;AAAA,QAAC,OAAOL;AAAAA,QAAgB,UACtDK,oBAAA,oBAAoB,UAAQ;AAAA,UAAC,OAAOX;AAAAA,UAAkB,UACrDW,oBAAA,mBAAmB,UAAQ;AAAA,YAAC,OAAOd;AAAAA,YAAQ,UAC1Cc,oBAAA,iBAAiB,UAAQ;AAAA,cAAC,OAAOZ;AAAAA,cAAM;AAAA,YAAA,CAAU;AAAA,UAAA,CAA6B;AAAA,QAAA,CAClD;AAAA,MAAA,CACA;AAAA,IAAA,CACE;AAAA,EAAA,CAEP;AAE/B,CAAC;"}
|
|
@@ -1 +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":"AAQa,MAAA,oBAAoB,CAChC,eACA,WACkC;AAClC,UAAQ,OAAO;AAAA,SACT;AACG,aAAA;AAAA,QACN,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,SAER;AACG,aAAA;AAAA,QACN,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,SAER;AACG,aAAA;AAAA,QACN,YAAY;AAAA,QACZ,MAAM,OAAO;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,SAER;AACG,aAAA;AAAA,QACN,YAAY;AAAA,QACZ,MAAM,OAAO;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA;AAGf
|
|
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":"AAQa,MAAA,oBAAoB,CAChC,eACA,WACkC;AAClC,UAAQ,OAAO;AAAA,SACT;AACG,aAAA;AAAA,QACN,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,SAER;AACG,aAAA;AAAA,QACN,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,SAER;AACG,aAAA;AAAA,QACN,YAAY;AAAA,QACZ,MAAM,OAAO;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,SAER;AACG,aAAA;AAAA,QACN,YAAY;AAAA,QACZ,MAAM,OAAO;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA;AAGf;"}
|
|
@@ -8,34 +8,42 @@ const initialState = {
|
|
|
8
8
|
const useApiRequest = (client) => {
|
|
9
9
|
const [state, dispatch] = useReducer(apiRequestReducer, initialState);
|
|
10
10
|
const isUnmountedRef = useRef(false);
|
|
11
|
-
const sendRequest = useCallback(
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
type: "initialize"
|
|
17
|
-
});
|
|
18
|
-
return client.sendRequest(query, {
|
|
19
|
-
...options,
|
|
20
|
-
variables
|
|
21
|
-
}).then((data) => {
|
|
11
|
+
const sendRequest = useCallback(
|
|
12
|
+
async (query, variables = {}, options) => {
|
|
13
|
+
if (isUnmountedRef.current) {
|
|
14
|
+
return Promise.reject();
|
|
15
|
+
}
|
|
22
16
|
dispatch({
|
|
23
|
-
type: "
|
|
24
|
-
data
|
|
17
|
+
type: "initialize"
|
|
25
18
|
});
|
|
26
|
-
return
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
19
|
+
return client.sendRequest(query, {
|
|
20
|
+
...options,
|
|
21
|
+
variables
|
|
22
|
+
}).then((data) => {
|
|
23
|
+
dispatch({
|
|
24
|
+
type: "resolveSuccessfully",
|
|
25
|
+
data
|
|
26
|
+
});
|
|
27
|
+
return Promise.resolve(data);
|
|
28
|
+
}).catch((error) => {
|
|
29
|
+
dispatch({
|
|
30
|
+
type: "resolveWithError",
|
|
31
|
+
error
|
|
32
|
+
});
|
|
33
|
+
return Promise.reject(error);
|
|
31
34
|
});
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
useEffect(
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
},
|
|
36
|
+
[client]
|
|
37
|
+
);
|
|
38
|
+
useEffect(
|
|
39
|
+
() => () => {
|
|
40
|
+
isUnmountedRef.current = true;
|
|
41
|
+
},
|
|
42
|
+
[]
|
|
43
|
+
);
|
|
38
44
|
return [state, sendRequest];
|
|
39
45
|
};
|
|
40
|
-
export {
|
|
46
|
+
export {
|
|
47
|
+
useApiRequest
|
|
48
|
+
};
|
|
41
49
|
//# sourceMappingURL=useApiRequest.js.map
|
|
@@ -1 +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;AACb;AAWa,MAAA,gBAAgB,CAAc,WAA4D;AACtG,QAAM,CAAC,OAAO,
|
|
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;AACb;AAWa,MAAA,gBAAgB,CAAc,WAA4D;AACtG,QAAM,CAAC,OAAO,QAAQ,IAAI,WAAW,mBAAqD,YAAY;AAEhG,QAAA,iBAAiB,OAAO,KAAK;AACnC,QAAM,cAAc;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;AAGR;AAAA,IACC,MAAM,MAAM;AACX,qBAAe,UAAU;AAAA,IAC1B;AAAA,IACA,CAAC;AAAA,EAAA;AAGK,SAAA,CAAC,OAAO,WAAW;AAC3B;"}
|
|
@@ -1 +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":";AAEa,MAAA,sBAAsB,cAAkC,MAAS
|
|
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":";AAEa,MAAA,sBAAsB,cAAkC,MAAS;"}
|
|
@@ -2,5 +2,7 @@ import { createContext } from "react";
|
|
|
2
2
|
const SetSessionTokenContext = createContext(() => {
|
|
3
3
|
throw new Error("SetSessionTokenContext is not set");
|
|
4
4
|
});
|
|
5
|
-
export {
|
|
5
|
+
export {
|
|
6
|
+
SetSessionTokenContext
|
|
7
|
+
};
|
|
6
8
|
//# sourceMappingURL=SetSessionTokenContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SetSessionTokenContext.js","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":[],"mappings":";AAEa,MAAA,yBAAyB,cAAmD,MAAM;AACxF,QAAA,IAAI,MAAM,mCAAmC;AACpD,CAAC
|
|
1
|
+
{"version":3,"file":"SetSessionTokenContext.js","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":[],"mappings":";AAEa,MAAA,yBAAyB,cAAmD,MAAM;AACxF,QAAA,IAAI,MAAM,mCAAmC;AACpD,CAAC;"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { useContext } from "react";
|
|
2
2
|
import { SessionTokenContext } from "./SessionTokenContext.js";
|
|
3
3
|
const useSessionToken = () => useContext(SessionTokenContext);
|
|
4
|
-
export {
|
|
4
|
+
export {
|
|
5
|
+
useSessionToken
|
|
6
|
+
};
|
|
5
7
|
//# sourceMappingURL=useSessionToken.js.map
|
|
@@ -1 +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":";;AAGa,MAAA,kBAAkB,MAAM,WAAW,mBAAmB
|
|
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":";;AAGa,MAAA,kBAAkB,MAAM,WAAW,mBAAmB;"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { useContext } from "react";
|
|
2
2
|
import { SetSessionTokenContext } from "./SetSessionTokenContext.js";
|
|
3
3
|
const useSetSessionToken = () => useContext(SetSessionTokenContext);
|
|
4
|
-
export {
|
|
4
|
+
export {
|
|
5
|
+
useSetSessionToken
|
|
6
|
+
};
|
|
5
7
|
//# sourceMappingURL=useSetSessionToken.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSetSessionToken.js","sources":["../../../src/auth/useSetSessionToken.ts"],"sourcesContent":["import { useContext } from 'react'\nimport { SetSessionTokenContext } from './SetSessionTokenContext'\n\nexport const useSetSessionToken = () => useContext(SetSessionTokenContext)\n"],"names":[],"mappings":";;AAGa,MAAA,qBAAqB,MAAM,WAAW,sBAAsB
|
|
1
|
+
{"version":3,"file":"useSetSessionToken.js","sources":["../../../src/auth/useSetSessionToken.ts"],"sourcesContent":["import { useContext } from 'react'\nimport { SetSessionTokenContext } from './SetSessionTokenContext'\n\nexport const useSetSessionToken = () => useContext(SetSessionTokenContext)\n"],"names":[],"mappings":";;AAGa,MAAA,qBAAqB,MAAM,WAAW,sBAAsB;"}
|