@contember/react-client 1.3.0-alpha.2 → 1.3.0-alpha.21
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/index.cjs +9 -5
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js +1 -4
- package/dist/development/index.js.map +1 -1
- package/dist/development/upload/fileUploadReducer.cjs +2 -3
- package/dist/development/upload/fileUploadReducer.cjs.map +1 -1
- package/dist/development/upload/fileUploadReducer.js +2 -3
- package/dist/development/upload/fileUploadReducer.js.map +1 -1
- package/dist/development/upload/useFileUpload.cjs.map +1 -1
- package/dist/development/upload/useFileUpload.js.map +1 -1
- package/dist/development/useGraphQlClient.cjs.map +1 -1
- package/dist/development/useGraphQlClient.js.map +1 -1
- package/dist/production/index.cjs +9 -5
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.js +1 -4
- package/dist/production/index.js.map +1 -1
- package/dist/production/upload/fileUploadReducer.cjs +2 -3
- package/dist/production/upload/fileUploadReducer.cjs.map +1 -1
- package/dist/production/upload/fileUploadReducer.js +2 -3
- package/dist/production/upload/fileUploadReducer.js.map +1 -1
- package/dist/production/upload/useFileUpload.cjs.map +1 -1
- package/dist/production/upload/useFileUpload.js.map +1 -1
- package/dist/production/useGraphQlClient.cjs.map +1 -1
- package/dist/production/useGraphQlClient.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dist/types/upload/SingleFileUploadState.d.ts +8 -4
- package/dist/types/upload/SingleFileUploadState.d.ts.map +1 -1
- package/dist/types/upload/fileUploadReducer.d.ts.map +1 -1
- package/dist/types/upload/index.d.ts +1 -1
- package/dist/types/upload/index.d.ts.map +1 -1
- package/package.json +4 -3
- package/src/index.ts +1 -1
- package/src/tsconfig.json +1 -0
- package/src/upload/SingleFileUploadState.ts +40 -32
- package/src/upload/fileUploadReducer.ts +4 -3
- package/src/upload/index.ts +1 -1
- package/dist/development/components/RichTextRenderer/ElementRenderer.cjs +0 -27
- package/dist/development/components/RichTextRenderer/ElementRenderer.cjs.map +0 -1
- package/dist/development/components/RichTextRenderer/ElementRenderer.js +0 -27
- package/dist/development/components/RichTextRenderer/ElementRenderer.js.map +0 -1
- package/dist/development/components/RichTextRenderer/LeafRenderer.cjs +0 -28
- package/dist/development/components/RichTextRenderer/LeafRenderer.cjs.map +0 -1
- package/dist/development/components/RichTextRenderer/LeafRenderer.js +0 -28
- package/dist/development/components/RichTextRenderer/LeafRenderer.js.map +0 -1
- package/dist/development/components/RichTextRenderer/RenderElementFallback.cjs +0 -155
- package/dist/development/components/RichTextRenderer/RenderElementFallback.cjs.map +0 -1
- package/dist/development/components/RichTextRenderer/RenderElementFallback.js +0 -155
- package/dist/development/components/RichTextRenderer/RenderElementFallback.js.map +0 -1
- package/dist/development/components/RichTextRenderer/RenderLeafFallback.cjs +0 -74
- package/dist/development/components/RichTextRenderer/RenderLeafFallback.cjs.map +0 -1
- package/dist/development/components/RichTextRenderer/RenderLeafFallback.js +0 -74
- package/dist/development/components/RichTextRenderer/RenderLeafFallback.js.map +0 -1
- package/dist/development/components/RichTextRenderer/RichTextRenderMetadataContext.cjs +0 -15
- package/dist/development/components/RichTextRenderer/RichTextRenderMetadataContext.cjs.map +0 -1
- package/dist/development/components/RichTextRenderer/RichTextRenderMetadataContext.js +0 -15
- package/dist/development/components/RichTextRenderer/RichTextRenderMetadataContext.js.map +0 -1
- package/dist/development/components/RichTextRenderer/RichTextRenderer.cjs +0 -124
- package/dist/development/components/RichTextRenderer/RichTextRenderer.cjs.map +0 -1
- package/dist/development/components/RichTextRenderer/RichTextRenderer.js +0 -124
- package/dist/development/components/RichTextRenderer/RichTextRenderer.js.map +0 -1
- package/dist/development/components/RichTextRenderer/RichTextRendererError.cjs +0 -6
- package/dist/development/components/RichTextRenderer/RichTextRendererError.cjs.map +0 -1
- package/dist/development/components/RichTextRenderer/RichTextRendererError.js +0 -6
- package/dist/development/components/RichTextRenderer/RichTextRendererError.js.map +0 -1
- package/dist/development/components/RichTextRenderer/defaultDeserialize.cjs +0 -14
- package/dist/development/components/RichTextRenderer/defaultDeserialize.cjs.map +0 -1
- package/dist/development/components/RichTextRenderer/defaultDeserialize.js +0 -14
- package/dist/development/components/RichTextRenderer/defaultDeserialize.js.map +0 -1
- package/dist/development/components/RichTextRenderer/renderChildren.cjs +0 -33
- package/dist/development/components/RichTextRenderer/renderChildren.cjs.map +0 -1
- package/dist/development/components/RichTextRenderer/renderChildren.js +0 -33
- package/dist/development/components/RichTextRenderer/renderChildren.js.map +0 -1
- package/dist/development/components/RichTextRenderer/resolveRichTextElementMetadata.cjs +0 -29
- package/dist/development/components/RichTextRenderer/resolveRichTextElementMetadata.cjs.map +0 -1
- package/dist/development/components/RichTextRenderer/resolveRichTextElementMetadata.js +0 -29
- package/dist/development/components/RichTextRenderer/resolveRichTextElementMetadata.js.map +0 -1
- package/dist/production/components/RichTextRenderer/ElementRenderer.cjs +0 -23
- package/dist/production/components/RichTextRenderer/ElementRenderer.cjs.map +0 -1
- package/dist/production/components/RichTextRenderer/ElementRenderer.js +0 -23
- package/dist/production/components/RichTextRenderer/ElementRenderer.js.map +0 -1
- package/dist/production/components/RichTextRenderer/LeafRenderer.cjs +0 -24
- package/dist/production/components/RichTextRenderer/LeafRenderer.cjs.map +0 -1
- package/dist/production/components/RichTextRenderer/LeafRenderer.js +0 -24
- package/dist/production/components/RichTextRenderer/LeafRenderer.js.map +0 -1
- package/dist/production/components/RichTextRenderer/RenderElementFallback.cjs +0 -82
- package/dist/production/components/RichTextRenderer/RenderElementFallback.cjs.map +0 -1
- package/dist/production/components/RichTextRenderer/RenderElementFallback.js +0 -82
- package/dist/production/components/RichTextRenderer/RenderElementFallback.js.map +0 -1
- package/dist/production/components/RichTextRenderer/RenderLeafFallback.cjs +0 -38
- package/dist/production/components/RichTextRenderer/RenderLeafFallback.cjs.map +0 -1
- package/dist/production/components/RichTextRenderer/RenderLeafFallback.js +0 -38
- package/dist/production/components/RichTextRenderer/RenderLeafFallback.js.map +0 -1
- package/dist/production/components/RichTextRenderer/RichTextRenderMetadataContext.cjs +0 -15
- package/dist/production/components/RichTextRenderer/RichTextRenderMetadataContext.cjs.map +0 -1
- package/dist/production/components/RichTextRenderer/RichTextRenderMetadataContext.js +0 -15
- package/dist/production/components/RichTextRenderer/RichTextRenderMetadataContext.js.map +0 -1
- package/dist/production/components/RichTextRenderer/RichTextRenderer.cjs +0 -109
- package/dist/production/components/RichTextRenderer/RichTextRenderer.cjs.map +0 -1
- package/dist/production/components/RichTextRenderer/RichTextRenderer.js +0 -109
- package/dist/production/components/RichTextRenderer/RichTextRenderer.js.map +0 -1
- package/dist/production/components/RichTextRenderer/RichTextRendererError.cjs +0 -6
- package/dist/production/components/RichTextRenderer/RichTextRendererError.cjs.map +0 -1
- package/dist/production/components/RichTextRenderer/RichTextRendererError.js +0 -6
- package/dist/production/components/RichTextRenderer/RichTextRendererError.js.map +0 -1
- package/dist/production/components/RichTextRenderer/defaultDeserialize.cjs +0 -14
- package/dist/production/components/RichTextRenderer/defaultDeserialize.cjs.map +0 -1
- package/dist/production/components/RichTextRenderer/defaultDeserialize.js +0 -14
- package/dist/production/components/RichTextRenderer/defaultDeserialize.js.map +0 -1
- package/dist/production/components/RichTextRenderer/renderChildren.cjs +0 -21
- package/dist/production/components/RichTextRenderer/renderChildren.cjs.map +0 -1
- package/dist/production/components/RichTextRenderer/renderChildren.js +0 -21
- package/dist/production/components/RichTextRenderer/renderChildren.js.map +0 -1
- package/dist/production/components/RichTextRenderer/resolveRichTextElementMetadata.cjs +0 -29
- package/dist/production/components/RichTextRenderer/resolveRichTextElementMetadata.cjs.map +0 -1
- package/dist/production/components/RichTextRenderer/resolveRichTextElementMetadata.js +0 -29
- package/dist/production/components/RichTextRenderer/resolveRichTextElementMetadata.js.map +0 -1
- package/dist/types/components/RichTextRenderer/BuiltinElements.d.ts +0 -49
- package/dist/types/components/RichTextRenderer/BuiltinElements.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/BuiltinLeaves.d.ts +0 -21
- package/dist/types/components/RichTextRenderer/BuiltinLeaves.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/ElementRenderer.d.ts +0 -22
- package/dist/types/components/RichTextRenderer/ElementRenderer.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/LeafRenderer.d.ts +0 -14
- package/dist/types/components/RichTextRenderer/LeafRenderer.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/NormalizedRichTextBlock.d.ts +0 -14
- package/dist/types/components/RichTextRenderer/NormalizedRichTextBlock.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/ReferenceRenderer.d.ts +0 -14
- package/dist/types/components/RichTextRenderer/ReferenceRenderer.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/RenderElementFallback.d.ts +0 -12
- package/dist/types/components/RichTextRenderer/RenderElementFallback.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/RenderLeafFallback.d.ts +0 -6
- package/dist/types/components/RichTextRenderer/RenderLeafFallback.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/RichTextBlock.d.ts +0 -2
- package/dist/types/components/RichTextRenderer/RichTextBlock.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/RichTextElement.d.ts +0 -7
- package/dist/types/components/RichTextRenderer/RichTextElement.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/RichTextElementMetadata.d.ts +0 -11
- package/dist/types/components/RichTextRenderer/RichTextElementMetadata.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/RichTextLeaf.d.ts +0 -4
- package/dist/types/components/RichTextRenderer/RichTextLeaf.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/RichTextLeafMetadata.d.ts +0 -4
- package/dist/types/components/RichTextRenderer/RichTextLeafMetadata.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/RichTextReference.d.ts +0 -4
- package/dist/types/components/RichTextRenderer/RichTextReference.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/RichTextRenderMetadata.d.ts +0 -12
- package/dist/types/components/RichTextRenderer/RichTextRenderMetadata.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/RichTextRenderMetadataContext.d.ts +0 -7
- package/dist/types/components/RichTextRenderer/RichTextRenderMetadataContext.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/RichTextRenderer.d.ts +0 -33
- package/dist/types/components/RichTextRenderer/RichTextRenderer.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/RichTextRendererError.d.ts +0 -3
- package/dist/types/components/RichTextRenderer/RichTextRendererError.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/RootEditorNode.d.ts +0 -9
- package/dist/types/components/RichTextRenderer/RootEditorNode.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/defaultDeserialize.d.ts +0 -5
- package/dist/types/components/RichTextRenderer/defaultDeserialize.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/index.d.ts +0 -16
- package/dist/types/components/RichTextRenderer/index.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/renderChildren.d.ts +0 -14
- package/dist/types/components/RichTextRenderer/renderChildren.d.ts.map +0 -1
- package/dist/types/components/RichTextRenderer/resolveRichTextElementMetadata.d.ts +0 -8
- package/dist/types/components/RichTextRenderer/resolveRichTextElementMetadata.d.ts.map +0 -1
- package/dist/types/components/index.d.ts +0 -2
- package/dist/types/components/index.d.ts.map +0 -1
- package/src/components/RichTextRenderer/BuiltinElements.ts +0 -112
- package/src/components/RichTextRenderer/BuiltinLeaves.ts +0 -32
- package/src/components/RichTextRenderer/ElementRenderer.tsx +0 -71
- package/src/components/RichTextRenderer/LeafRenderer.tsx +0 -39
- package/src/components/RichTextRenderer/NormalizedRichTextBlock.ts +0 -17
- package/src/components/RichTextRenderer/ReferenceRenderer.ts +0 -26
- package/src/components/RichTextRenderer/RenderElementFallback.tsx +0 -147
- package/src/components/RichTextRenderer/RenderLeafFallback.tsx +0 -43
- package/src/components/RichTextRenderer/RichTextBlock.ts +0 -1
- package/src/components/RichTextRenderer/RichTextElement.ts +0 -10
- package/src/components/RichTextRenderer/RichTextElementMetadata.ts +0 -15
- package/src/components/RichTextRenderer/RichTextLeaf.ts +0 -3
- package/src/components/RichTextRenderer/RichTextLeafMetadata.ts +0 -3
- package/src/components/RichTextRenderer/RichTextReference.ts +0 -3
- package/src/components/RichTextRenderer/RichTextRenderMetadata.ts +0 -16
- package/src/components/RichTextRenderer/RichTextRenderMetadataContext.ts +0 -20
- package/src/components/RichTextRenderer/RichTextRenderer.tsx +0 -168
- package/src/components/RichTextRenderer/RichTextRendererError.ts +0 -1
- package/src/components/RichTextRenderer/RootEditorNode.ts +0 -12
- package/src/components/RichTextRenderer/defaultDeserialize.ts +0 -19
- package/src/components/RichTextRenderer/index.ts +0 -15
- package/src/components/RichTextRenderer/renderChildren.tsx +0 -50
- package/src/components/RichTextRenderer/resolveRichTextElementMetadata.ts +0 -50
- package/src/components/index.ts +0 -1
|
@@ -4,14 +4,13 @@ const ContemberClient = require("./ContemberClient.cjs");
|
|
|
4
4
|
const ClientError = require("./ClientError.cjs");
|
|
5
5
|
const useGraphQlClient = require("./useGraphQlClient.cjs");
|
|
6
6
|
const client = require("@contember/client");
|
|
7
|
+
const reactRichtextRenderer = require("@contember/react-richtext-renderer");
|
|
7
8
|
const apiRequestReducer = require("./apiRequest/apiRequestReducer.cjs");
|
|
8
9
|
const useApiRequest = require("./apiRequest/useApiRequest.cjs");
|
|
9
10
|
const SessionTokenContext = require("./auth/SessionTokenContext.cjs");
|
|
10
11
|
const SetSessionTokenContext = require("./auth/SetSessionTokenContext.cjs");
|
|
11
12
|
const useSessionToken = require("./auth/useSessionToken.cjs");
|
|
12
13
|
const useSetSessionToken = require("./auth/useSetSessionToken.cjs");
|
|
13
|
-
const RichTextRenderer = require("./components/RichTextRenderer/RichTextRenderer.cjs");
|
|
14
|
-
const RichTextRendererError = require("./components/RichTextRenderer/RichTextRendererError.cjs");
|
|
15
14
|
const ApiBaseUrlContext = require("./config/ApiBaseUrlContext.cjs");
|
|
16
15
|
const LoginTokenContext = require("./config/LoginTokenContext.cjs");
|
|
17
16
|
const useApiBaseUrl = require("./config/useApiBaseUrl.cjs");
|
|
@@ -39,8 +38,6 @@ exports.SetSessionTokenContext = SetSessionTokenContext.SetSessionTokenContext;
|
|
|
39
38
|
exports.useSessionToken = useSessionToken.useSessionToken;
|
|
40
39
|
exports.useSessionTokenWithMeta = useSessionToken.useSessionTokenWithMeta;
|
|
41
40
|
exports.useSetSessionToken = useSetSessionToken.useSetSessionToken;
|
|
42
|
-
exports.RichTextRenderer = RichTextRenderer.RichTextRenderer;
|
|
43
|
-
exports.RichTextRendererError = RichTextRendererError.RichTextRendererError;
|
|
44
41
|
exports.ApiBaseUrlContext = ApiBaseUrlContext.ApiBaseUrlContext;
|
|
45
42
|
exports.LoginTokenContext = LoginTokenContext.LoginTokenContext;
|
|
46
43
|
exports.useApiBaseUrl = useApiBaseUrl.useApiBaseUrl;
|
|
@@ -59,10 +56,17 @@ exports.useTenantApiRequest = useTenantApiRequest.useTenantApiRequest;
|
|
|
59
56
|
exports.useTenantGraphQlClient = useTenantGraphQlClient.useTenantGraphQlClient;
|
|
60
57
|
exports.useFileUpload = useFileUpload.useFileUpload;
|
|
61
58
|
Object.keys(client).forEach((k) => {
|
|
62
|
-
if (k !== "default" && !
|
|
59
|
+
if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k))
|
|
63
60
|
Object.defineProperty(exports, k, {
|
|
64
61
|
enumerable: true,
|
|
65
62
|
get: () => client[k]
|
|
66
63
|
});
|
|
67
64
|
});
|
|
65
|
+
Object.keys(reactRichtextRenderer).forEach((k) => {
|
|
66
|
+
if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k))
|
|
67
|
+
Object.defineProperty(exports, k, {
|
|
68
|
+
enumerable: true,
|
|
69
|
+
get: () => reactRichtextRenderer[k]
|
|
70
|
+
});
|
|
71
|
+
});
|
|
68
72
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -2,14 +2,13 @@ import { ContemberClient } from "./ContemberClient.js";
|
|
|
2
2
|
import { ClientError } from "./ClientError.js";
|
|
3
3
|
import { useGraphQlClient } from "./useGraphQlClient.js";
|
|
4
4
|
export * from "@contember/client";
|
|
5
|
+
export * from "@contember/react-richtext-renderer";
|
|
5
6
|
import { apiRequestReducer } from "./apiRequest/apiRequestReducer.js";
|
|
6
7
|
import { useApiRequest } from "./apiRequest/useApiRequest.js";
|
|
7
8
|
import { SessionTokenContext } from "./auth/SessionTokenContext.js";
|
|
8
9
|
import { SetSessionTokenContext } from "./auth/SetSessionTokenContext.js";
|
|
9
10
|
import { useSessionToken, useSessionTokenWithMeta } from "./auth/useSessionToken.js";
|
|
10
11
|
import { useSetSessionToken } from "./auth/useSetSessionToken.js";
|
|
11
|
-
import { RichTextRenderer } from "./components/RichTextRenderer/RichTextRenderer.js";
|
|
12
|
-
import { RichTextRendererError } from "./components/RichTextRenderer/RichTextRendererError.js";
|
|
13
12
|
import { ApiBaseUrlContext } from "./config/ApiBaseUrlContext.js";
|
|
14
13
|
import { LoginTokenContext } from "./config/LoginTokenContext.js";
|
|
15
14
|
import { useApiBaseUrl } from "./config/useApiBaseUrl.js";
|
|
@@ -33,8 +32,6 @@ export {
|
|
|
33
32
|
ContemberClient,
|
|
34
33
|
LoginTokenContext,
|
|
35
34
|
ProjectSlugContext,
|
|
36
|
-
RichTextRenderer,
|
|
37
|
-
RichTextRendererError,
|
|
38
35
|
SessionTokenContext,
|
|
39
36
|
SetSessionTokenContext,
|
|
40
37
|
StageSlugContext,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -121,8 +121,7 @@ const fileUploadReducer = (previousState, action) => {
|
|
|
121
121
|
if (progress === void 0 || previousFileState === void 0 || previousFileState.readyState !== "uploading") {
|
|
122
122
|
continue;
|
|
123
123
|
}
|
|
124
|
-
|
|
125
|
-
if (roundedProgress === previousFileState.progress) {
|
|
124
|
+
if (previousFileState.progress && Math.abs(progress - previousFileState.progress) < 0.01) {
|
|
126
125
|
continue;
|
|
127
126
|
}
|
|
128
127
|
(newState ?? (newState = new Map(previousState.state))).set(fileId, {
|
|
@@ -132,7 +131,7 @@ const fileUploadReducer = (previousState, action) => {
|
|
|
132
131
|
abortController: previousFileState.abortController,
|
|
133
132
|
previewUrl: previousFileState.previewUrl,
|
|
134
133
|
metadata: previousFileState.metadata,
|
|
135
|
-
progress
|
|
134
|
+
progress
|
|
136
135
|
});
|
|
137
136
|
}
|
|
138
137
|
break;
|
|
@@ -1 +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\
|
|
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\n\t\t\t\tif (previousFileState.progress && Math.abs(progress - previousFileState.progress) < 0.01) {\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\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: progress,\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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"}
|
|
@@ -119,8 +119,7 @@ const fileUploadReducer = (previousState, action) => {
|
|
|
119
119
|
if (progress === void 0 || previousFileState === void 0 || previousFileState.readyState !== "uploading") {
|
|
120
120
|
continue;
|
|
121
121
|
}
|
|
122
|
-
|
|
123
|
-
if (roundedProgress === previousFileState.progress) {
|
|
122
|
+
if (previousFileState.progress && Math.abs(progress - previousFileState.progress) < 0.01) {
|
|
124
123
|
continue;
|
|
125
124
|
}
|
|
126
125
|
(newState ?? (newState = new Map(previousState.state))).set(fileId, {
|
|
@@ -130,7 +129,7 @@ const fileUploadReducer = (previousState, action) => {
|
|
|
130
129
|
abortController: previousFileState.abortController,
|
|
131
130
|
previewUrl: previousFileState.previewUrl,
|
|
132
131
|
metadata: previousFileState.metadata,
|
|
133
|
-
progress
|
|
132
|
+
progress
|
|
134
133
|
});
|
|
135
134
|
}
|
|
136
135
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileUploadReducer.js","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\
|
|
1
|
+
{"version":3,"file":"fileUploadReducer.js","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\n\t\t\t\tif (previousFileState.progress && Math.abs(progress - previousFileState.progress) < 0.01) {\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\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: progress,\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":[],"mappings":";;;AAOO,MAAM,4BAA4B,OAA+F;AAAA,EACvI,kCAAkB,QAAsB;AAAA,EACxC,2BAAW,IAAI;AAChB;AAEa,MAAA,oBAAoB,CAChC,eACA,WACoD;AACpD,MAAI,WAAgF;AAEpF,UAAQ,OAAO,MAAM;AAAA,IACpB,KAAK,cAAc;AAClB,iBAAW,CAAC,QAAQ,QAAQ,KAAK,OAAO,OAAO;AAE9C,SAAC,wBAAa,IAAI,IAAI,cAAc,KAAK,IAAG,IAAI,QAAQ;AAAA,UACvD,YAAY;AAAA,UACZ,iBAAiB,SAAS;AAAA,UAC1B,YAAY,SAAS;AAAA,UACrB,MAAM,SAAS;AAAA,QAAA,CACf;AAED,sBAAc,aAAa,IAAI,SAAS,MAAM,MAAM;AAAA,MACrD;AACA;AAAA,IACD;AAAA,IACA,KAAK,kBAAkB;AACtB,iBAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,OAAO;AAC1C,cAAA,SAAS,SAAS,eAAe,QAAQ;AAC/C,cAAM,aAAa,YAAY,cAAc,OAAO,IAAI,MAAM;AAE9D,YAAI,cAAc,UAAa,UAAU,eAAe,gBAAgB;AACvE;AAAA,QACD;AAEA,SAAC,wBAAa,IAAI,IAAI,cAAc,KAAK,IAAG,IAAI,QAAQ;AAAA,UACvD,YAAY;AAAA,UACZ,iBAAiB,UAAU;AAAA,UAC3B,MAAM,UAAU;AAAA,UAChB,UAAU,SAAS;AAAA;AAAA,UACnB,YAAY,UAAU;AAAA,UACtB,UAAU;AAAA,UACV,UAAU,SAAS;AAAA,QAAA,CACnB;AAAA,MACF;AACA;AAAA,IACD;AAAA,IACA,KAAK,sBAAsB;AAC1B,iBAAW,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ;AACzC,cAAA,SAAS,SAAS,eAAe,QAAQ;AAC/C,cAAM,qBAAqB,YAAY,cAAc,OAAO,IAAI,MAAM;AACtE,YAAI,sBAAsB,UAAa,kBAAkB,eAAe,aAAa;AACpF;AAAA,QACD;AACA,SAAC,wBAAa,IAAI,IAAI,cAAc,KAAK,IAAG,IAAI,QAAQ;AAAA,UACvD,YAAY;AAAA,UACZ,MAAM,kBAAkB;AAAA,UACxB,UAAU,kBAAkB;AAAA,UAC5B,YAAY,kBAAkB;AAAA,UAC9B;AAAA,UACA,UAAU,kBAAkB;AAAA,QAAA,CAC5B;AAAA,MACF;AACA;AAAA,IACD;AAAA,IACA,KAAK,mBAAmB;AACZ,iBAAA,aAAa,OAAO,OAAO;AACjC,YAAA;AACA,YAAA;AAEA,YAAA,MAAM,QAAQ,SAAS,GAAG;AAC5B,WAAA,UAAU,QAAQ,IAAI;AAAA,QAAA,OACjB;AACK,qBAAA;AACA,qBAAA;AAAA,QACZ;AAEA,cAAM,SAA4B,CAAA;AAElC,YAAI,oBAAoB,iBAAiB;AACxC,iBAAO,KAAK,QAAQ;AAAA,QACV,WAAA,MAAM,QAAQ,QAAQ,GAAG;AACnC,qBAAW,SAAS,UAAU;AAC7B,gBAAI,iBAAiB,iBAAiB;AACrC,qBAAO,KAAK,KAAK;AAAA,YAClB;AAAA,UACD;AAAA,QACD;AAEM,cAAA,SAAS,SAAS,eAAe,QAAQ;AAC/C,cAAM,qBAAqB,YAAY,cAAc,OAAO,IAAI,MAAM;AACtE,YACC,sBAAsB,UACrB,kBAAkB,eAAe,kBAAkB,kBAAkB,eAAe,aACpF;AACD;AAAA,QACD;AACA,cAAM,WAAW,kBAAkB,eAAe,cAAc,kBAAkB,WAAW;AAC7F,cAAM,WAAW,kBAAkB,eAAe,cAAc,kBAAkB,WAAW;AAC1F,SAAC,wBAAa,IAAI,IAAI,cAAc,KAAK,IAAG,IAAI,QAAQ;AAAA,UACzD,YAAY;AAAA,UACZ,QAAQ,OAAO,SAAS,SAAS;AAAA,UACjC;AAAA,UACA,MAAM,kBAAkB;AAAA,UACxB;AAAA,UACA,YAAY,kBAAkB;AAAA,UAC9B;AAAA,QAAA,CACA;AAAA,MACH;AACA;AAAA,IACD;AAAA,IACA,KAAK,SAAS;AACF,iBAAA,YAAY,OAAO,OAAO;AAC9B,cAAA,SAAS,SAAS,eAAe,QAAQ;AAC/C,cAAM,aAAa,YAAY,cAAc,OAAO,IAAI,MAAM;AAE9D,YAAI,cAAc,QAAW;AAC5B;AAAA,QACD;AACI,YAAA,gBAAgB,UAAU,UAAU;AACxC,YAAI,UAAU,eAAe,kBAAkB,UAAU,eAAe,aAAa;AACpF,oBAAU,gBAAgB;QAC3B;AACA,SAAC,wBAAa,IAAI,IAAI,cAAc,KAAK,IAAG,OAAO,MAAM;AAAA,MAC1D;AACA;AAAA,IACD;AAAA,IACA,KAAK,wBAAwB;AAC5B,iBAAW,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,UAAU;AACjD,cAAA,SAAS,SAAS,eAAe,QAAQ;AAC/C,cAAM,qBAAqB,YAAY,cAAc,OAAO,IAAI,MAAM;AACtE,YAAI,aAAa,UAAa,sBAAsB,UAAa,kBAAkB,eAAe,aAAa;AAC9G;AAAA,QACD;AAEI,YAAA,kBAAkB,YAAY,KAAK,IAAI,WAAW,kBAAkB,QAAQ,IAAI,MAAM;AACzF;AAAA,QACD;AAEA,SAAC,wBAAa,IAAI,IAAI,cAAc,KAAK,IAAG,IAAI,QAAQ;AAAA,UACvD,YAAY;AAAA,UACZ,MAAM,kBAAkB;AAAA,UACxB,UAAU,kBAAkB;AAAA,UAC5B,iBAAiB,kBAAkB;AAAA,UACnC,YAAY,kBAAkB;AAAA,UAC9B,UAAU,kBAAkB;AAAA,UAC5B;AAAA,QAAA,CACA;AAAA,MACF;AACA;AAAA,IACD;AAAA,IACA;AACC,kBAAY,MAAM;AAAA,EACpB;AACA,MAAI,aAAa,QAAW;AACpB,WAAA;AAAA,EACR;AACA,SAAO,EAAE,GAAG,eAAe,OAAO,SAAS;AAC5C;"}
|
|
@@ -1 +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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"}
|
|
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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"}
|
|
@@ -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'\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":[],"mappings":";;;;AA2BO,MAAM,gBAAgB,CAAyC,CAAC,IAAuB,OAAqC;AAClI,QAAM,mBAAmB;AAEnB,QAAA,gBAAgB,OAAO,CAAC;AAE9B,QAAM,CAAC,eAAe,QAAQ,IAAI,WAGhC,mBAAmB,QAAW,yBAAyB;AAEzD,QAAM,kBAAkB,QAAQ,MAAM,IAAI,eAAe,GAAG,CAAE,CAAA;AAExD,QAAA,cAAc,YAAyB,CAAS,UAAA;AAC5C,aAAA;AAAA,MACR,MAAM;AAAA,MACN;AAAA,IAAA,CACA;AAAA,EACF,GAAG,CAAE,CAAA;AACC,QAAA,aAAa,YAAwB,CAAS,UAAA;AAC1C,aAAA;AAAA,MACR,MAAM;AAAA,MACN;AAAA,IAAA,CACA;AAAA,EACF,GAAG,CAAE,CAAA;AAEL,QAAM,cAAc,OAAW,oBAAA,IAAa,CAAA;AAC5C,QAAM,UAAU,OAAW,oBAAA,QAAuB,CAAA;AAC5C,QAAA,wBAAwB,OAAO,oBAAI,IAAsC,CAAA;AAE/E,QAAM,mBAAmB;AAAA,IACxB,CAAS,UAAA;AACF,YAAA,iCAAiB;AACjB,YAAA,mDAAmC;AAEzC,iBAAW,mBAAmB,OAAO;AAC9B,cAAA,kBAAkB,IAAI;AAExB,YAAA;AACA,YAAA;AAEJ,YAAI,2BAA2B,MAAM;
|
|
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'\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":[],"mappings":"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"}
|
|
@@ -1 +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,
|
|
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,UAAU,GAAG,IAAI,IAAI,YAAY,GAAG,CAAC,YAAY,MAAM,YAAY,CAAC;AAC/G;;"}
|
|
@@ -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,
|
|
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,UAAU,GAAG,IAAI,IAAI,YAAY,GAAG,CAAC,YAAY,MAAM,YAAY,CAAC;AAC/G;"}
|
|
@@ -4,14 +4,13 @@ const ContemberClient = require("./ContemberClient.cjs");
|
|
|
4
4
|
const ClientError = require("./ClientError.cjs");
|
|
5
5
|
const useGraphQlClient = require("./useGraphQlClient.cjs");
|
|
6
6
|
const client = require("@contember/client");
|
|
7
|
+
const reactRichtextRenderer = require("@contember/react-richtext-renderer");
|
|
7
8
|
const apiRequestReducer = require("./apiRequest/apiRequestReducer.cjs");
|
|
8
9
|
const useApiRequest = require("./apiRequest/useApiRequest.cjs");
|
|
9
10
|
const SessionTokenContext = require("./auth/SessionTokenContext.cjs");
|
|
10
11
|
const SetSessionTokenContext = require("./auth/SetSessionTokenContext.cjs");
|
|
11
12
|
const useSessionToken = require("./auth/useSessionToken.cjs");
|
|
12
13
|
const useSetSessionToken = require("./auth/useSetSessionToken.cjs");
|
|
13
|
-
const RichTextRenderer = require("./components/RichTextRenderer/RichTextRenderer.cjs");
|
|
14
|
-
const RichTextRendererError = require("./components/RichTextRenderer/RichTextRendererError.cjs");
|
|
15
14
|
const ApiBaseUrlContext = require("./config/ApiBaseUrlContext.cjs");
|
|
16
15
|
const LoginTokenContext = require("./config/LoginTokenContext.cjs");
|
|
17
16
|
const useApiBaseUrl = require("./config/useApiBaseUrl.cjs");
|
|
@@ -39,8 +38,6 @@ exports.SetSessionTokenContext = SetSessionTokenContext.SetSessionTokenContext;
|
|
|
39
38
|
exports.useSessionToken = useSessionToken.useSessionToken;
|
|
40
39
|
exports.useSessionTokenWithMeta = useSessionToken.useSessionTokenWithMeta;
|
|
41
40
|
exports.useSetSessionToken = useSetSessionToken.useSetSessionToken;
|
|
42
|
-
exports.RichTextRenderer = RichTextRenderer.RichTextRenderer;
|
|
43
|
-
exports.RichTextRendererError = RichTextRendererError.RichTextRendererError;
|
|
44
41
|
exports.ApiBaseUrlContext = ApiBaseUrlContext.ApiBaseUrlContext;
|
|
45
42
|
exports.LoginTokenContext = LoginTokenContext.LoginTokenContext;
|
|
46
43
|
exports.useApiBaseUrl = useApiBaseUrl.useApiBaseUrl;
|
|
@@ -59,10 +56,17 @@ exports.useTenantApiRequest = useTenantApiRequest.useTenantApiRequest;
|
|
|
59
56
|
exports.useTenantGraphQlClient = useTenantGraphQlClient.useTenantGraphQlClient;
|
|
60
57
|
exports.useFileUpload = useFileUpload.useFileUpload;
|
|
61
58
|
Object.keys(client).forEach((k) => {
|
|
62
|
-
if (k !== "default" && !
|
|
59
|
+
if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k))
|
|
63
60
|
Object.defineProperty(exports, k, {
|
|
64
61
|
enumerable: true,
|
|
65
62
|
get: () => client[k]
|
|
66
63
|
});
|
|
67
64
|
});
|
|
65
|
+
Object.keys(reactRichtextRenderer).forEach((k) => {
|
|
66
|
+
if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k))
|
|
67
|
+
Object.defineProperty(exports, k, {
|
|
68
|
+
enumerable: true,
|
|
69
|
+
get: () => reactRichtextRenderer[k]
|
|
70
|
+
});
|
|
71
|
+
});
|
|
68
72
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/production/index.js
CHANGED
|
@@ -2,14 +2,13 @@ import { ContemberClient } from "./ContemberClient.js";
|
|
|
2
2
|
import { ClientError } from "./ClientError.js";
|
|
3
3
|
import { useGraphQlClient } from "./useGraphQlClient.js";
|
|
4
4
|
export * from "@contember/client";
|
|
5
|
+
export * from "@contember/react-richtext-renderer";
|
|
5
6
|
import { apiRequestReducer } from "./apiRequest/apiRequestReducer.js";
|
|
6
7
|
import { useApiRequest } from "./apiRequest/useApiRequest.js";
|
|
7
8
|
import { SessionTokenContext } from "./auth/SessionTokenContext.js";
|
|
8
9
|
import { SetSessionTokenContext } from "./auth/SetSessionTokenContext.js";
|
|
9
10
|
import { useSessionToken, useSessionTokenWithMeta } from "./auth/useSessionToken.js";
|
|
10
11
|
import { useSetSessionToken } from "./auth/useSetSessionToken.js";
|
|
11
|
-
import { RichTextRenderer } from "./components/RichTextRenderer/RichTextRenderer.js";
|
|
12
|
-
import { RichTextRendererError } from "./components/RichTextRenderer/RichTextRendererError.js";
|
|
13
12
|
import { ApiBaseUrlContext } from "./config/ApiBaseUrlContext.js";
|
|
14
13
|
import { LoginTokenContext } from "./config/LoginTokenContext.js";
|
|
15
14
|
import { useApiBaseUrl } from "./config/useApiBaseUrl.js";
|
|
@@ -33,8 +32,6 @@ export {
|
|
|
33
32
|
ContemberClient,
|
|
34
33
|
LoginTokenContext,
|
|
35
34
|
ProjectSlugContext,
|
|
36
|
-
RichTextRenderer,
|
|
37
|
-
RichTextRendererError,
|
|
38
35
|
SessionTokenContext,
|
|
39
36
|
SetSessionTokenContext,
|
|
40
37
|
StageSlugContext,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -121,8 +121,7 @@ const fileUploadReducer = (previousState, action) => {
|
|
|
121
121
|
if (progress === void 0 || previousFileState === void 0 || previousFileState.readyState !== "uploading") {
|
|
122
122
|
continue;
|
|
123
123
|
}
|
|
124
|
-
|
|
125
|
-
if (roundedProgress === previousFileState.progress) {
|
|
124
|
+
if (previousFileState.progress && Math.abs(progress - previousFileState.progress) < 0.01) {
|
|
126
125
|
continue;
|
|
127
126
|
}
|
|
128
127
|
(newState ?? (newState = new Map(previousState.state))).set(fileId, {
|
|
@@ -132,7 +131,7 @@ const fileUploadReducer = (previousState, action) => {
|
|
|
132
131
|
abortController: previousFileState.abortController,
|
|
133
132
|
previewUrl: previousFileState.previewUrl,
|
|
134
133
|
metadata: previousFileState.metadata,
|
|
135
|
-
progress
|
|
134
|
+
progress
|
|
136
135
|
});
|
|
137
136
|
}
|
|
138
137
|
break;
|
|
@@ -1 +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\
|
|
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\n\t\t\t\tif (previousFileState.progress && Math.abs(progress - previousFileState.progress) < 0.01) {\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\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: progress,\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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"}
|
|
@@ -119,8 +119,7 @@ const fileUploadReducer = (previousState, action) => {
|
|
|
119
119
|
if (progress === void 0 || previousFileState === void 0 || previousFileState.readyState !== "uploading") {
|
|
120
120
|
continue;
|
|
121
121
|
}
|
|
122
|
-
|
|
123
|
-
if (roundedProgress === previousFileState.progress) {
|
|
122
|
+
if (previousFileState.progress && Math.abs(progress - previousFileState.progress) < 0.01) {
|
|
124
123
|
continue;
|
|
125
124
|
}
|
|
126
125
|
(newState ?? (newState = new Map(previousState.state))).set(fileId, {
|
|
@@ -130,7 +129,7 @@ const fileUploadReducer = (previousState, action) => {
|
|
|
130
129
|
abortController: previousFileState.abortController,
|
|
131
130
|
previewUrl: previousFileState.previewUrl,
|
|
132
131
|
metadata: previousFileState.metadata,
|
|
133
|
-
progress
|
|
132
|
+
progress
|
|
134
133
|
});
|
|
135
134
|
}
|
|
136
135
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileUploadReducer.js","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\
|
|
1
|
+
{"version":3,"file":"fileUploadReducer.js","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\n\t\t\t\tif (previousFileState.progress && Math.abs(progress - previousFileState.progress) < 0.01) {\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\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: progress,\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":[],"mappings":";;;AAOO,MAAM,4BAA4B,OAA+F;AAAA,EACvI,kCAAkB,QAAsB;AAAA,EACxC,2BAAW,IAAI;AAChB;AAEa,MAAA,oBAAoB,CAChC,eACA,WACoD;AACpD,MAAI,WAAgF;AAEpF,UAAQ,OAAO,MAAM;AAAA,IACpB,KAAK,cAAc;AAClB,iBAAW,CAAC,QAAQ,QAAQ,KAAK,OAAO,OAAO;AAE9C,SAAC,wBAAa,IAAI,IAAI,cAAc,KAAK,IAAG,IAAI,QAAQ;AAAA,UACvD,YAAY;AAAA,UACZ,iBAAiB,SAAS;AAAA,UAC1B,YAAY,SAAS;AAAA,UACrB,MAAM,SAAS;AAAA,QAAA,CACf;AAED,sBAAc,aAAa,IAAI,SAAS,MAAM,MAAM;AAAA,MACrD;AACA;AAAA,IACD;AAAA,IACA,KAAK,kBAAkB;AACtB,iBAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,OAAO;AAC1C,cAAA,SAAS,SAAS,eAAe,QAAQ;AAC/C,cAAM,aAAa,YAAY,cAAc,OAAO,IAAI,MAAM;AAE9D,YAAI,cAAc,UAAa,UAAU,eAAe,gBAAgB;AACvE;AAAA,QACD;AAEA,SAAC,wBAAa,IAAI,IAAI,cAAc,KAAK,IAAG,IAAI,QAAQ;AAAA,UACvD,YAAY;AAAA,UACZ,iBAAiB,UAAU;AAAA,UAC3B,MAAM,UAAU;AAAA,UAChB,UAAU,SAAS;AAAA;AAAA,UACnB,YAAY,UAAU;AAAA,UACtB,UAAU;AAAA,UACV,UAAU,SAAS;AAAA,QAAA,CACnB;AAAA,MACF;AACA;AAAA,IACD;AAAA,IACA,KAAK,sBAAsB;AAC1B,iBAAW,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ;AACzC,cAAA,SAAS,SAAS,eAAe,QAAQ;AAC/C,cAAM,qBAAqB,YAAY,cAAc,OAAO,IAAI,MAAM;AACtE,YAAI,sBAAsB,UAAa,kBAAkB,eAAe,aAAa;AACpF;AAAA,QACD;AACA,SAAC,wBAAa,IAAI,IAAI,cAAc,KAAK,IAAG,IAAI,QAAQ;AAAA,UACvD,YAAY;AAAA,UACZ,MAAM,kBAAkB;AAAA,UACxB,UAAU,kBAAkB;AAAA,UAC5B,YAAY,kBAAkB;AAAA,UAC9B;AAAA,UACA,UAAU,kBAAkB;AAAA,QAAA,CAC5B;AAAA,MACF;AACA;AAAA,IACD;AAAA,IACA,KAAK,mBAAmB;AACZ,iBAAA,aAAa,OAAO,OAAO;AACjC,YAAA;AACA,YAAA;AAEA,YAAA,MAAM,QAAQ,SAAS,GAAG;AAC5B,WAAA,UAAU,QAAQ,IAAI;AAAA,QAAA,OACjB;AACK,qBAAA;AACA,qBAAA;AAAA,QACZ;AAEA,cAAM,SAA4B,CAAA;AAElC,YAAI,oBAAoB,iBAAiB;AACxC,iBAAO,KAAK,QAAQ;AAAA,QACV,WAAA,MAAM,QAAQ,QAAQ,GAAG;AACnC,qBAAW,SAAS,UAAU;AAC7B,gBAAI,iBAAiB,iBAAiB;AACrC,qBAAO,KAAK,KAAK;AAAA,YAClB;AAAA,UACD;AAAA,QACD;AAEM,cAAA,SAAS,SAAS,eAAe,QAAQ;AAC/C,cAAM,qBAAqB,YAAY,cAAc,OAAO,IAAI,MAAM;AACtE,YACC,sBAAsB,UACrB,kBAAkB,eAAe,kBAAkB,kBAAkB,eAAe,aACpF;AACD;AAAA,QACD;AACA,cAAM,WAAW,kBAAkB,eAAe,cAAc,kBAAkB,WAAW;AAC7F,cAAM,WAAW,kBAAkB,eAAe,cAAc,kBAAkB,WAAW;AAC1F,SAAC,wBAAa,IAAI,IAAI,cAAc,KAAK,IAAG,IAAI,QAAQ;AAAA,UACzD,YAAY;AAAA,UACZ,QAAQ,OAAO,SAAS,SAAS;AAAA,UACjC;AAAA,UACA,MAAM,kBAAkB;AAAA,UACxB;AAAA,UACA,YAAY,kBAAkB;AAAA,UAC9B;AAAA,QAAA,CACA;AAAA,MACH;AACA;AAAA,IACD;AAAA,IACA,KAAK,SAAS;AACF,iBAAA,YAAY,OAAO,OAAO;AAC9B,cAAA,SAAS,SAAS,eAAe,QAAQ;AAC/C,cAAM,aAAa,YAAY,cAAc,OAAO,IAAI,MAAM;AAE9D,YAAI,cAAc,QAAW;AAC5B;AAAA,QACD;AACI,YAAA,gBAAgB,UAAU,UAAU;AACxC,YAAI,UAAU,eAAe,kBAAkB,UAAU,eAAe,aAAa;AACpF,oBAAU,gBAAgB;QAC3B;AACA,SAAC,wBAAa,IAAI,IAAI,cAAc,KAAK,IAAG,OAAO,MAAM;AAAA,MAC1D;AACA;AAAA,IACD;AAAA,IACA,KAAK,wBAAwB;AAC5B,iBAAW,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,UAAU;AACjD,cAAA,SAAS,SAAS,eAAe,QAAQ;AAC/C,cAAM,qBAAqB,YAAY,cAAc,OAAO,IAAI,MAAM;AACtE,YAAI,aAAa,UAAa,sBAAsB,UAAa,kBAAkB,eAAe,aAAa;AAC9G;AAAA,QACD;AAEI,YAAA,kBAAkB,YAAY,KAAK,IAAI,WAAW,kBAAkB,QAAQ,IAAI,MAAM;AACzF;AAAA,QACD;AAEA,SAAC,wBAAa,IAAI,IAAI,cAAc,KAAK,IAAG,IAAI,QAAQ;AAAA,UACvD,YAAY;AAAA,UACZ,MAAM,kBAAkB;AAAA,UACxB,UAAU,kBAAkB;AAAA,UAC5B,iBAAiB,kBAAkB;AAAA,UACnC,YAAY,kBAAkB;AAAA,UAC9B,UAAU,kBAAkB;AAAA,UAC5B;AAAA,QAAA,CACA;AAAA,MACF;AACA;AAAA,IACD;AAAA,IACA;AACC,kBAAY,MAAM;AAAA,EACpB;AACA,MAAI,aAAa,QAAW;AACpB,WAAA;AAAA,EACR;AACA,SAAO,EAAE,GAAG,eAAe,OAAO,SAAS;AAC5C;"}
|