@uploadcare/file-uploader 1.15.0-alpha.12 → 1.15.0-alpha.13
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/abstract/ActivityBlock.d.ts +5 -5
- package/abstract/ActivityBlock.d.ts.map +1 -1
- package/abstract/Block.d.ts +3 -9
- package/abstract/Block.d.ts.map +1 -1
- package/abstract/CTX.d.ts +6 -6
- package/abstract/CTX.d.ts.map +1 -1
- package/abstract/LocaleManager.d.ts +3 -3
- package/abstract/LocaleManager.d.ts.map +1 -1
- package/abstract/ModalManager.d.ts +13 -18
- package/abstract/ModalManager.d.ts.map +1 -1
- package/abstract/ModalManager.js +19 -10
- package/abstract/SecureUploadsManager.d.ts +2 -2
- package/abstract/SecureUploadsManager.d.ts.map +1 -1
- package/abstract/SolutionBlock.d.ts +2 -2
- package/abstract/SolutionBlock.d.ts.map +1 -1
- package/abstract/TypedCollection.d.ts +44 -44
- package/abstract/TypedCollection.d.ts.map +1 -1
- package/abstract/TypedCollection.js +53 -33
- package/abstract/TypedData.d.ts +71 -25
- package/abstract/TypedData.d.ts.map +1 -1
- package/abstract/TypedData.js +74 -17
- package/abstract/UploaderBlock.d.ts +10 -10
- package/abstract/UploaderBlock.d.ts.map +1 -1
- package/abstract/UploaderBlock.js +22 -10
- package/abstract/UploaderPublicApi.d.ts +24 -23
- package/abstract/UploaderPublicApi.d.ts.map +1 -1
- package/abstract/UploaderPublicApi.js +21 -10
- package/abstract/ValidationManager.d.ts +121 -6
- package/abstract/ValidationManager.d.ts.map +1 -1
- package/abstract/ValidationManager.js +1 -1
- package/abstract/a11y.d.ts +2 -2
- package/abstract/a11y.d.ts.map +1 -1
- package/abstract/buildOutputCollectionState.d.ts +1 -1
- package/abstract/buildOutputCollectionState.d.ts.map +1 -1
- package/abstract/defineComponents.d.ts.map +1 -1
- package/abstract/l10nProcessor.d.ts.map +1 -1
- package/abstract/loadFileUploaderFrom.d.ts +1 -1
- package/abstract/loadFileUploaderFrom.d.ts.map +1 -1
- package/abstract/localeRegistry.d.ts.map +1 -1
- package/abstract/sharedConfigKey.d.ts.map +1 -1
- package/abstract/uploadEntrySchema.d.ts +119 -63
- package/abstract/uploadEntrySchema.d.ts.map +1 -1
- package/abstract/uploadEntrySchema.js +62 -81
- package/blocks/CameraSource/CameraSource.d.ts +9 -9
- package/blocks/CameraSource/CameraSource.d.ts.map +1 -1
- package/blocks/CameraSource/calcCameraModes.d.ts +1 -1
- package/blocks/CameraSource/constants.d.ts.map +1 -1
- package/blocks/CloudImageEditor/src/CloudImageEditorBlock.d.ts.map +1 -1
- package/blocks/CloudImageEditor/src/CropFrame.d.ts +1 -1
- package/blocks/CloudImageEditor/src/EditorImageCropper.d.ts +3 -3
- package/blocks/CloudImageEditor/src/EditorImageFader.d.ts +1 -1
- package/blocks/CloudImageEditor/src/EditorImageFader.d.ts.map +1 -1
- package/blocks/CloudImageEditor/src/EditorSlider.d.ts +1 -1
- package/blocks/CloudImageEditor/src/EditorSlider.d.ts.map +1 -1
- package/blocks/CloudImageEditor/src/EditorToolbar.d.ts +1 -1
- package/blocks/CloudImageEditor/src/crop-utils.d.ts +14 -14
- package/blocks/CloudImageEditor/src/crop-utils.d.ts.map +1 -1
- package/blocks/CloudImageEditor/src/cropper-constants.d.ts.map +1 -1
- package/blocks/CloudImageEditor/src/lib/applyFocusVisiblePolyfill.d.ts +1 -1
- package/blocks/CloudImageEditor/src/lib/applyFocusVisiblePolyfill.d.ts.map +1 -1
- package/blocks/CloudImageEditor/src/lib/parseCropPreset.d.ts +1 -1
- package/blocks/CloudImageEditor/src/lib/transformationUtils.d.ts +3 -3
- package/blocks/CloudImageEditor/src/lib/transformationUtils.d.ts.map +1 -1
- package/blocks/CloudImageEditor/src/state.d.ts +4 -4
- package/blocks/CloudImageEditor/src/svg-sprite.d.ts.map +1 -1
- package/blocks/CloudImageEditor/src/types.d.ts +8 -58
- package/blocks/CloudImageEditor/src/types.d.ts.map +1 -1
- package/blocks/CloudImageEditorActivity/CloudImageEditorActivity.d.ts +5 -2
- package/blocks/CloudImageEditorActivity/CloudImageEditorActivity.d.ts.map +1 -1
- package/blocks/CloudImageEditorActivity/CloudImageEditorActivity.js +7 -3
- package/blocks/Config/Config.d.ts +3 -12
- package/blocks/Config/Config.d.ts.map +1 -1
- package/blocks/Config/assertions.d.ts +1 -1
- package/blocks/Config/initialConfig.d.ts +1 -1
- package/blocks/Config/initialConfig.d.ts.map +1 -1
- package/blocks/Config/initialConfig.js +1 -1
- package/blocks/Config/normalizeConfigValue.d.ts.map +1 -1
- package/blocks/Config/side-effects.d.ts.map +1 -1
- package/blocks/Config/validatorsType.d.ts +1 -1
- package/blocks/Config/validatorsType.d.ts.map +1 -1
- package/blocks/DropArea/DropArea.d.ts +2 -2
- package/blocks/DropArea/DropArea.d.ts.map +1 -1
- package/blocks/DropArea/addDropzone.d.ts.map +1 -1
- package/blocks/DropArea/drop-area.css +4 -2
- package/blocks/DropArea/getDropItems.d.ts +2 -2
- package/blocks/DropArea/getDropItems.d.ts.map +1 -1
- package/blocks/ExternalSource/ExternalSource.d.ts +3 -3
- package/blocks/ExternalSource/ExternalSource.d.ts.map +1 -1
- package/blocks/ExternalSource/MessageBridge.d.ts +3 -3
- package/blocks/ExternalSource/MessageBridge.d.ts.map +1 -1
- package/blocks/ExternalSource/query-string.d.ts.map +1 -1
- package/blocks/ExternalSource/types.d.ts +64 -64
- package/blocks/ExternalSource/types.d.ts.map +1 -1
- package/blocks/FileItem/FileItem.d.ts +20 -24
- package/blocks/FileItem/FileItem.d.ts.map +1 -1
- package/blocks/FileItem/FileItem.js +120 -121
- package/blocks/FileItem/file-item.css +29 -6
- package/blocks/Img/ImgBase.d.ts +3 -3
- package/blocks/Img/ImgBase.d.ts.map +1 -1
- package/blocks/Img/ImgBase.js +9 -9
- package/blocks/Img/ImgConfig.d.ts.map +1 -1
- package/blocks/Img/configurations.d.ts.map +1 -1
- package/blocks/Modal/Modal.d.ts +4 -4
- package/blocks/Modal/Modal.d.ts.map +1 -1
- package/blocks/ProgressBar/ProgressBar.d.ts +6 -1
- package/blocks/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/blocks/ProgressBar/ProgressBar.js +44 -42
- package/blocks/Range/Range.d.ts.map +1 -1
- package/blocks/SimpleBtn/SimpleBtn.d.ts +2 -2
- package/blocks/SimpleBtn/SimpleBtn.d.ts.map +1 -1
- package/blocks/SourceBtn/SourceBtn.d.ts +2 -5
- package/blocks/SourceBtn/SourceBtn.d.ts.map +1 -1
- package/blocks/SourceBtn/SourceBtn.js +5 -5
- package/blocks/SourceList/SourceList.js +2 -2
- package/blocks/Spinner/Spinner.d.ts.map +1 -1
- package/blocks/Thumb/Thumb.d.ts +22 -6
- package/blocks/Thumb/Thumb.d.ts.map +1 -1
- package/blocks/Thumb/Thumb.js +73 -21
- package/blocks/UploadCtxProvider/EventEmitter.d.ts +20 -20
- package/blocks/UploadCtxProvider/EventEmitter.d.ts.map +1 -1
- package/blocks/UploadCtxProvider/UploadCtxProvider.d.ts +4 -4
- package/blocks/UploadCtxProvider/UploadCtxProvider.d.ts.map +1 -1
- package/blocks/UploadList/UploadList.d.ts +3 -3
- package/blocks/UploadList/UploadList.d.ts.map +1 -1
- package/blocks/svg-backgrounds/svg-backgrounds.d.ts +3 -3
- package/blocks/svg-backgrounds/svg-backgrounds.d.ts.map +1 -1
- package/blocks/themes/uc-basic/svg-sprite.d.ts.map +1 -1
- package/blocks/utils/UploadSource.d.ts.map +1 -1
- package/blocks/utils/debounce.d.ts +3 -1
- package/blocks/utils/debounce.d.ts.map +1 -1
- package/blocks/utils/resizeImage.d.ts +1 -1
- package/blocks/utils/resizeImage.d.ts.map +1 -1
- package/blocks/utils/throttle.d.ts +3 -1
- package/blocks/utils/throttle.d.ts.map +1 -1
- package/blocks/utils/userAgent.d.ts +1 -1
- package/blocks/utils/userAgent.d.ts.map +1 -1
- package/env.d.ts.map +1 -1
- package/index.ssr.js +1 -1
- package/package.json +6 -5
- package/solutions/file-uploader/inline/FileUploaderInline.d.ts +2 -2
- package/solutions/file-uploader/inline/FileUploaderInline.d.ts.map +1 -1
- package/solutions/file-uploader/minimal/FileUploaderMinimal.d.ts +10 -10
- package/solutions/file-uploader/minimal/FileUploaderMinimal.d.ts.map +1 -1
- package/solutions/file-uploader/minimal/index.css +5 -0
- package/solutions/file-uploader/regular/FileUploaderRegular.d.ts +2 -2
- package/solutions/file-uploader/regular/FileUploaderRegular.d.ts.map +1 -1
- package/types/jsx.d.ts +1 -1
- package/utils/browser-info.d.ts +13 -0
- package/utils/browser-info.d.ts.map +1 -0
- package/utils/browser-info.js +22 -0
- package/utils/browser-info.test.d.ts +2 -0
- package/utils/browser-info.test.d.ts.map +1 -0
- package/utils/browser-info.test.js +109 -0
- package/utils/cdn-utils.d.ts +3 -3
- package/utils/cdn-utils.d.ts.map +1 -1
- package/utils/fileTypes.d.ts +5 -1
- package/utils/fileTypes.d.ts.map +1 -1
- package/utils/fileTypes.js +18 -2
- package/utils/getPluralForm.d.ts.map +1 -1
- package/utils/isSecureTokenExpired.d.ts +1 -1
- package/utils/memoize.d.ts.map +1 -1
- package/utils/mixinClass.d.ts +3 -1
- package/utils/mixinClass.d.ts.map +1 -1
- package/utils/prettyBytes.d.ts.map +1 -1
- package/utils/template-utils.d.ts +1 -1
- package/utils/template-utils.d.ts.map +1 -1
- package/utils/toKebabCase.d.ts.map +1 -1
- package/utils/transparentPixelSrc.d.ts.map +1 -1
- package/utils/uniqueArray.d.ts.map +1 -1
- package/utils/validators/collection/validateCollectionUploadError.d.ts +1 -1
- package/utils/validators/collection/validateMultiple.d.ts +1 -1
- package/utils/validators/file/validateFileType.d.ts +1 -1
- package/utils/validators/file/validateIsImage.d.ts +1 -1
- package/utils/validators/file/validateMaxSizeLimit.d.ts +1 -1
- package/utils/validators/file/validateUploadError.d.ts +1 -1
- package/utils/waitForAttribute.d.ts +1 -1
- package/utils/waitForAttribute.d.ts.map +1 -1
- package/web/file-uploader.iife.min.js +4 -4
- package/web/file-uploader.min.js +4 -4
- package/web/uc-basic.min.css +1 -1
- package/web/uc-cloud-image-editor.min.js +2 -2
- package/web/uc-file-uploader-inline.min.css +1 -1
- package/web/uc-file-uploader-inline.min.js +4 -4
- package/web/uc-file-uploader-minimal.min.css +1 -1
- package/web/uc-file-uploader-minimal.min.js +4 -4
- package/web/uc-file-uploader-regular.min.css +1 -1
- package/web/uc-file-uploader-regular.min.js +4 -4
- package/web/uc-img.min.js +1 -1
- package/blocks/utils/supportCapture.d.ts +0 -2
- package/blocks/utils/supportCapture.d.ts.map +0 -1
- package/blocks/utils/supportCapture.js +0 -3
|
@@ -1,23 +1,30 @@
|
|
|
1
|
+
// @ts-check
|
|
1
2
|
import { Data, UID } from '@symbiotejs/symbiote';
|
|
2
3
|
import { TypedData } from './TypedData.js';
|
|
3
4
|
|
|
5
|
+
/**
|
|
6
|
+
* @template {import('./TypedData.js').TypedSchema} T
|
|
7
|
+
* @typedef {(list: string[], added: Set<import('./TypedData.js').TypedData<T>>, removed: Set<TypedData<T>>) => void} TypedCollectionObserverHandler
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** @template {import('./TypedData.js').TypedSchema} T */
|
|
4
11
|
export class TypedCollection {
|
|
5
12
|
/**
|
|
6
13
|
* @param {Object} options
|
|
7
|
-
* @param {
|
|
8
|
-
* @param {
|
|
9
|
-
* @param {
|
|
10
|
-
* @param {
|
|
14
|
+
* @param {T} options.typedSchema
|
|
15
|
+
* @param {import('./TypedData.js').ExtractKeysFromSchema<T>[]} [options.watchList]
|
|
16
|
+
* @param {TypedCollectionObserverHandler<T>} [options.handler]
|
|
17
|
+
* @param {string} [options.ctxName]
|
|
11
18
|
*/
|
|
12
19
|
constructor(options) {
|
|
13
20
|
/**
|
|
14
21
|
* @private
|
|
15
|
-
* @type {
|
|
22
|
+
* @type {T}
|
|
16
23
|
*/
|
|
17
24
|
this.__typedSchema = options.typedSchema;
|
|
18
25
|
/**
|
|
19
26
|
* @private
|
|
20
|
-
* @type {
|
|
27
|
+
* @type {string}
|
|
21
28
|
*/
|
|
22
29
|
this.__ctxId = options.ctxName || UID.generate();
|
|
23
30
|
/**
|
|
@@ -27,12 +34,12 @@ export class TypedCollection {
|
|
|
27
34
|
this.__data = Data.registerCtx({}, this.__ctxId);
|
|
28
35
|
/**
|
|
29
36
|
* @private
|
|
30
|
-
* @type {
|
|
37
|
+
* @type {import('./TypedData.js').ExtractKeysFromSchema<T>[]}
|
|
31
38
|
*/
|
|
32
39
|
this.__watchList = options.watchList || [];
|
|
33
40
|
/**
|
|
34
41
|
* @private
|
|
35
|
-
* @type {Object<string,
|
|
42
|
+
* @type {Object<string, ReturnType<TypedData<T>['subscribe']>[]>}
|
|
36
43
|
*/
|
|
37
44
|
this.__subsMap = Object.create(null);
|
|
38
45
|
/**
|
|
@@ -42,7 +49,7 @@ export class TypedCollection {
|
|
|
42
49
|
this.__propertyObservers = new Set();
|
|
43
50
|
/**
|
|
44
51
|
* @private
|
|
45
|
-
* @type {Set<
|
|
52
|
+
* @type {Set<TypedCollectionObserverHandler<T>>}
|
|
46
53
|
*/
|
|
47
54
|
this.__collectionObservers = new Set();
|
|
48
55
|
/**
|
|
@@ -52,12 +59,12 @@ export class TypedCollection {
|
|
|
52
59
|
this.__items = new Set();
|
|
53
60
|
/**
|
|
54
61
|
* @private
|
|
55
|
-
* @type {Set<
|
|
62
|
+
* @type {Set<import('./TypedData.js').TypedData<T>>}
|
|
56
63
|
*/
|
|
57
64
|
this.__removed = new Set();
|
|
58
65
|
/**
|
|
59
66
|
* @private
|
|
60
|
-
* @type {Set<
|
|
67
|
+
* @type {Set<import('./TypedData.js').TypedData<T>>}
|
|
61
68
|
*/
|
|
62
69
|
this.__added = new Set();
|
|
63
70
|
|
|
@@ -105,7 +112,7 @@ export class TypedCollection {
|
|
|
105
112
|
});
|
|
106
113
|
}
|
|
107
114
|
|
|
108
|
-
/** @param {
|
|
115
|
+
/** @param {TypedCollectionObserverHandler<T>} handler */
|
|
109
116
|
observeCollection(handler) {
|
|
110
117
|
this.__collectionObservers.add(handler);
|
|
111
118
|
|
|
@@ -118,19 +125,19 @@ export class TypedCollection {
|
|
|
118
125
|
};
|
|
119
126
|
}
|
|
120
127
|
|
|
121
|
-
/** @param {
|
|
128
|
+
/** @param {TypedCollectionObserverHandler<T>} handler */
|
|
122
129
|
unobserveCollection(handler) {
|
|
123
130
|
this.__collectionObservers?.delete(handler);
|
|
124
131
|
}
|
|
125
132
|
|
|
126
133
|
/**
|
|
127
|
-
* @param {
|
|
134
|
+
* @param {Partial<import('./TypedData.js').ExtractDataFromSchema<T>>} init
|
|
128
135
|
* @returns {string}
|
|
129
136
|
*/
|
|
130
137
|
add(init) {
|
|
131
138
|
let item = new TypedData(this.__typedSchema);
|
|
132
|
-
for (let prop
|
|
133
|
-
item.setValue(prop,
|
|
139
|
+
for (let [prop, value] of Object.entries(init)) {
|
|
140
|
+
item.setValue(/** @type {import('./TypedData.js').ExtractKeysFromSchema<T>} */ (prop), value);
|
|
134
141
|
}
|
|
135
142
|
this.__items.add(item.uid);
|
|
136
143
|
this.notify();
|
|
@@ -139,7 +146,7 @@ export class TypedCollection {
|
|
|
139
146
|
this.__added.add(item);
|
|
140
147
|
this.__watchList.forEach((propName) => {
|
|
141
148
|
if (!this.__subsMap[item.uid]) {
|
|
142
|
-
this.__subsMap[item.uid] = [];
|
|
149
|
+
this.__subsMap[item.uid] = /** @type {ReturnType<TypedData<T>['subscribe']>[]} */ ([]);
|
|
143
150
|
}
|
|
144
151
|
this.__subsMap[item.uid].push(
|
|
145
152
|
item.subscribe(propName, () => {
|
|
@@ -151,37 +158,49 @@ export class TypedCollection {
|
|
|
151
158
|
}
|
|
152
159
|
|
|
153
160
|
/**
|
|
154
|
-
* @param {
|
|
155
|
-
* @returns {TypedData}
|
|
161
|
+
* @param {string} id
|
|
162
|
+
* @returns {TypedData<T> | null}
|
|
156
163
|
*/
|
|
157
164
|
read(id) {
|
|
158
165
|
return this.__data.read(id);
|
|
159
166
|
}
|
|
160
167
|
|
|
161
168
|
/**
|
|
162
|
-
* @
|
|
163
|
-
* @param {
|
|
164
|
-
* @
|
|
169
|
+
* @template {import('./TypedData.js').ExtractKeysFromSchema<T>} K
|
|
170
|
+
* @param {string} id
|
|
171
|
+
* @param {K} propName
|
|
172
|
+
* @returns {import('./TypedData.js').ExtractDataFromSchema<T>[propName] | null}
|
|
165
173
|
*/
|
|
166
174
|
readProp(id, propName) {
|
|
167
175
|
let item = this.read(id);
|
|
176
|
+
if (!item) {
|
|
177
|
+
console.warn(`Item with id ${id} not found`);
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
168
180
|
return item.getValue(propName);
|
|
169
181
|
}
|
|
170
182
|
|
|
171
183
|
/**
|
|
172
|
-
* @template T
|
|
173
|
-
* @param {
|
|
174
|
-
* @param {
|
|
175
|
-
* @param {T} value
|
|
184
|
+
* @template {import('./TypedData.js').ExtractKeysFromSchema<T>} K
|
|
185
|
+
* @param {string} id
|
|
186
|
+
* @param {K} propName
|
|
187
|
+
* @param {import('./TypedData.js').ExtractDataFromSchema<T>[K]} value
|
|
176
188
|
*/
|
|
177
189
|
publishProp(id, propName, value) {
|
|
178
190
|
let item = this.read(id);
|
|
191
|
+
if (!item) {
|
|
192
|
+
console.warn(`Item with id ${id} not found`);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
179
195
|
item.setValue(propName, value);
|
|
180
196
|
}
|
|
181
197
|
|
|
182
|
-
/** @param {
|
|
198
|
+
/** @param {string} id */
|
|
183
199
|
remove(id) {
|
|
184
|
-
this.
|
|
200
|
+
let item = this.read(id);
|
|
201
|
+
if (item) {
|
|
202
|
+
this.__removed.add(item);
|
|
203
|
+
}
|
|
185
204
|
this.__items.delete(id);
|
|
186
205
|
this.notify();
|
|
187
206
|
this.__data.pub(id, null);
|
|
@@ -209,14 +228,15 @@ export class TypedCollection {
|
|
|
209
228
|
}
|
|
210
229
|
|
|
211
230
|
/**
|
|
212
|
-
* @param {(item: TypedData) => Boolean} checkFn
|
|
213
|
-
* @returns {
|
|
231
|
+
* @param {(item: TypedData<T>) => Boolean} checkFn
|
|
232
|
+
* @returns {string[]}
|
|
214
233
|
*/
|
|
215
234
|
findItems(checkFn) {
|
|
235
|
+
/** @type {string[]} */
|
|
216
236
|
let result = [];
|
|
217
237
|
this.__items.forEach((id) => {
|
|
218
238
|
let item = this.read(id);
|
|
219
|
-
if (checkFn(item)) {
|
|
239
|
+
if (item && checkFn(item)) {
|
|
220
240
|
result.push(id);
|
|
221
241
|
}
|
|
222
242
|
});
|
|
@@ -233,8 +253,8 @@ export class TypedCollection {
|
|
|
233
253
|
|
|
234
254
|
destroy() {
|
|
235
255
|
Data.deleteCtx(this.__ctxId);
|
|
236
|
-
this.__propertyObservers =
|
|
237
|
-
this.__collectionObservers =
|
|
256
|
+
this.__propertyObservers = new Set();
|
|
257
|
+
this.__collectionObservers = new Set();
|
|
238
258
|
for (let id in this.__subsMap) {
|
|
239
259
|
this.__subsMap[id].forEach((sub) => {
|
|
240
260
|
sub.remove();
|
package/abstract/TypedData.d.ts
CHANGED
|
@@ -1,47 +1,93 @@
|
|
|
1
|
-
|
|
1
|
+
/** @typedef {Record<string, { type: unknown; value: unknown; nullable?: boolean }>} TypedSchema */
|
|
2
|
+
/**
|
|
3
|
+
* @template {any} [T=any] Default is `any`
|
|
4
|
+
* @typedef {new (...args: any[]) => T} Constructor
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* @template {unknown} T
|
|
8
|
+
* @template {unknown} V
|
|
9
|
+
* @typedef {T extends StringConstructor
|
|
10
|
+
* ? string
|
|
11
|
+
* : T extends BooleanConstructor
|
|
12
|
+
* ? boolean
|
|
13
|
+
* : T extends NumberConstructor
|
|
14
|
+
* ? number
|
|
15
|
+
* : T extends ArrayConstructor
|
|
16
|
+
* ? V
|
|
17
|
+
* : T extends Constructor
|
|
18
|
+
* ? InstanceType<T>
|
|
19
|
+
* : T} ExtractType
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* @template {TypedSchema} T
|
|
23
|
+
* @typedef {{
|
|
24
|
+
* [K in keyof T]: ExtractType<T[K]['type'], T[K]['value']> | (T[K]['nullable'] extends true ? null : never);
|
|
25
|
+
* }} ExtractDataFromSchema
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* @template {TypedSchema} T
|
|
29
|
+
* @typedef {Extract<keyof T, string>} ExtractKeysFromSchema
|
|
30
|
+
*/
|
|
31
|
+
/** @template {TypedSchema} T */
|
|
32
|
+
export class TypedData<T extends TypedSchema> {
|
|
2
33
|
/**
|
|
3
|
-
* @param {
|
|
34
|
+
* @param {T} typedSchema
|
|
4
35
|
* @param {String} [ctxName]
|
|
5
36
|
*/
|
|
6
|
-
constructor(typedSchema:
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
};
|
|
12
|
-
}, ctxName?: string | undefined);
|
|
13
|
-
/** @private */
|
|
37
|
+
constructor(typedSchema: T, ctxName?: string);
|
|
38
|
+
/**
|
|
39
|
+
* @private
|
|
40
|
+
* @type {T}
|
|
41
|
+
*/
|
|
14
42
|
private __typedSchema;
|
|
15
|
-
/**
|
|
43
|
+
/**
|
|
44
|
+
* @private
|
|
45
|
+
* @type {string}
|
|
46
|
+
*/
|
|
16
47
|
private __ctxId;
|
|
17
|
-
/**
|
|
48
|
+
/**
|
|
49
|
+
* @private
|
|
50
|
+
* @type {ExtractDataFromSchema<T>}
|
|
51
|
+
*/
|
|
18
52
|
private __schema;
|
|
19
53
|
/**
|
|
20
54
|
* @private
|
|
21
55
|
* @type {Data}
|
|
22
56
|
*/
|
|
23
57
|
private __data;
|
|
24
|
-
/** @returns {
|
|
58
|
+
/** @returns {string} */
|
|
25
59
|
get uid(): string;
|
|
26
60
|
/**
|
|
27
|
-
* @param {
|
|
28
|
-
* @param {
|
|
61
|
+
* @param {ExtractKeysFromSchema<T>} prop
|
|
62
|
+
* @param {ExtractDataFromSchema<T>[prop]} value
|
|
63
|
+
*/
|
|
64
|
+
setValue(prop: ExtractKeysFromSchema<T>, value: ExtractDataFromSchema<T>[Extract<keyof T, string>]): void;
|
|
65
|
+
/** @param {Partial<ExtractDataFromSchema<T>>} updObj */
|
|
66
|
+
setMultipleValues(updObj: Partial<ExtractDataFromSchema<T>>): void;
|
|
67
|
+
/**
|
|
68
|
+
* @template {ExtractKeysFromSchema<T>} K
|
|
69
|
+
* @param {K} prop
|
|
70
|
+
* @returns {ExtractDataFromSchema<T>[K]}
|
|
29
71
|
*/
|
|
30
|
-
|
|
31
|
-
/** @param {Object<string, any>} updObj */
|
|
32
|
-
setMultipleValues(updObj: {
|
|
33
|
-
[x: string]: any;
|
|
34
|
-
}): void;
|
|
35
|
-
/** @param {String} prop */
|
|
36
|
-
getValue(prop: string): any;
|
|
72
|
+
getValue<K extends ExtractKeysFromSchema<T>>(prop: K): ExtractDataFromSchema<T>[K];
|
|
37
73
|
/**
|
|
38
|
-
* @
|
|
39
|
-
* @param {
|
|
74
|
+
* @template {ExtractKeysFromSchema<T>} K
|
|
75
|
+
* @param {K} prop
|
|
76
|
+
* @param {(newVal: ExtractDataFromSchema<T>[K]) => void} handler
|
|
40
77
|
*/
|
|
41
|
-
subscribe(prop:
|
|
78
|
+
subscribe<K extends ExtractKeysFromSchema<T>>(prop: K, handler: (newVal: ExtractDataFromSchema<T>[K]) => void): {
|
|
42
79
|
remove: () => void;
|
|
43
80
|
callback: Function;
|
|
44
81
|
};
|
|
45
82
|
remove(): void;
|
|
46
83
|
}
|
|
84
|
+
export type TypedSchema = Record<string, {
|
|
85
|
+
type: unknown;
|
|
86
|
+
value: unknown;
|
|
87
|
+
nullable?: boolean;
|
|
88
|
+
}>;
|
|
89
|
+
export type Constructor<T extends unknown = any> = new (...args: any[]) => T;
|
|
90
|
+
export type ExtractType<T extends unknown, V extends unknown> = T extends StringConstructor ? string : T extends BooleanConstructor ? boolean : T extends NumberConstructor ? number : T extends ArrayConstructor ? V : T extends Constructor ? InstanceType<T> : T;
|
|
91
|
+
export type ExtractDataFromSchema<T extends TypedSchema> = { [K in keyof T]: ExtractType<T[K]["type"], T[K]["value"]> | (T[K]["nullable"] extends true ? null : never); };
|
|
92
|
+
export type ExtractKeysFromSchema<T extends TypedSchema> = Extract<keyof T, string>;
|
|
47
93
|
//# sourceMappingURL=TypedData.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TypedData.d.ts","sourceRoot":"","sources":["TypedData.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TypedData.d.ts","sourceRoot":"","sources":["TypedData.js"],"names":[],"mappings":"AAMA,mGAAmG;AAEnG;;;GAGG;AAEH;;;;;;;;;;;;;;GAcG;AAEH;;;;;GAKG;AAEH;;;GAGG;AAEH,gCAAgC;AAChC,uBAD4B,CAAC,SAAd,WAAY;IAEzB;;;OAGG;IACH,yBAHW,CAAC,oBA6BX;IAzBC;;;OAGG;IACH,sBAAgC;IAEhC;;;OAGG;IACH,gBAAwC;IAExC;;;OAGG;IACH,iBAGgD;IAChD;;;OAGG;IACH,eAA2D;IAG7D,wBAAwB;IACxB,WADc,MAAM,CAGnB;IAED;;;OAGG;IACH,eAHW,qBAAqB,CAAC,CAAC,CAAC,SACxB,qBAAqB,CAAC,CAAC,CAAC,0BAAM,QAkBxC;IAED,wDAAwD;IACxD,0BADY,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,QAK5C;IAED;;;;OAIG;IACH,SAJwC,CAAC,SAA3B,qBAAqB,CAAC,CAAC,CAAE,QAC5B,CAAC,GACC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAOvC;IAED;;;;OAIG;IACH,UAJwC,CAAC,SAA3B,qBAAqB,CAAC,CAAC,CAAE,QAC5B,CAAC,WACD,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;;;MAIvD;IAED,eAEC;CACF;0BA/Ha,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;wBAG/D,CAAC,0BACR,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC;wBAIf,CAAC,SAAX,OAAS,EACC,CAAC,SAAX,OAAS,IACT,CAAC,SAAS,iBAAiB,GACjC,MAAM,GACN,CAAC,SAAS,kBAAkB,GAC1B,OAAO,GACP,CAAC,SAAS,iBAAiB,GACzB,MAAM,GACN,CAAC,SAAS,gBAAgB,GACxB,CAAC,GACD,CAAC,SAAS,WAAW,GACnB,YAAY,CAAC,CAAC,CAAC,GACf,CAAC;kCAIW,CAAC,SAAd,WAAY,IACb,GACP,CAAC,IAAI,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC,GAC1G;kCAIuB,CAAC,SAAd,WAAY,IACb,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC"}
|
package/abstract/TypedData.js
CHANGED
|
@@ -1,23 +1,71 @@
|
|
|
1
|
+
// @ts-check
|
|
1
2
|
import { Data, UID } from '@symbiotejs/symbiote';
|
|
2
3
|
|
|
3
4
|
const MSG_NAME = '[Typed State] Wrong property name: ';
|
|
4
5
|
const MSG_TYPE = '[Typed State] Wrong property type: ';
|
|
5
6
|
|
|
7
|
+
/** @typedef {Record<string, { type: unknown; value: unknown; nullable?: boolean }>} TypedSchema */
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @template {any} [T=any] Default is `any`
|
|
11
|
+
* @typedef {new (...args: any[]) => T} Constructor
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @template {unknown} T
|
|
16
|
+
* @template {unknown} V
|
|
17
|
+
* @typedef {T extends StringConstructor
|
|
18
|
+
* ? string
|
|
19
|
+
* : T extends BooleanConstructor
|
|
20
|
+
* ? boolean
|
|
21
|
+
* : T extends NumberConstructor
|
|
22
|
+
* ? number
|
|
23
|
+
* : T extends ArrayConstructor
|
|
24
|
+
* ? V
|
|
25
|
+
* : T extends Constructor
|
|
26
|
+
* ? InstanceType<T>
|
|
27
|
+
* : T} ExtractType
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @template {TypedSchema} T
|
|
32
|
+
* @typedef {{
|
|
33
|
+
* [K in keyof T]: ExtractType<T[K]['type'], T[K]['value']> | (T[K]['nullable'] extends true ? null : never);
|
|
34
|
+
* }} ExtractDataFromSchema
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @template {TypedSchema} T
|
|
39
|
+
* @typedef {Extract<keyof T, string>} ExtractKeysFromSchema
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
/** @template {TypedSchema} T */
|
|
6
43
|
export class TypedData {
|
|
7
44
|
/**
|
|
8
|
-
* @param {
|
|
45
|
+
* @param {T} typedSchema
|
|
9
46
|
* @param {String} [ctxName]
|
|
10
47
|
*/
|
|
11
48
|
constructor(typedSchema, ctxName) {
|
|
12
|
-
/**
|
|
49
|
+
/**
|
|
50
|
+
* @private
|
|
51
|
+
* @type {T}
|
|
52
|
+
*/
|
|
13
53
|
this.__typedSchema = typedSchema;
|
|
14
|
-
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @private
|
|
57
|
+
* @type {string}
|
|
58
|
+
*/
|
|
15
59
|
this.__ctxId = ctxName || UID.generate();
|
|
16
|
-
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @private
|
|
63
|
+
* @type {ExtractDataFromSchema<T>}
|
|
64
|
+
*/
|
|
17
65
|
this.__schema = Object.keys(typedSchema).reduce((acc, key) => {
|
|
18
|
-
acc[key] = typedSchema[key].value;
|
|
66
|
+
/** @type {any} */ (acc)[key] = typedSchema[key].value;
|
|
19
67
|
return acc;
|
|
20
|
-
}, {});
|
|
68
|
+
}, /** @type {ExtractDataFromSchema<T>} */ ({}));
|
|
21
69
|
/**
|
|
22
70
|
* @private
|
|
23
71
|
* @type {Data}
|
|
@@ -25,14 +73,14 @@ export class TypedData {
|
|
|
25
73
|
this.__data = Data.registerCtx(this.__schema, this.__ctxId);
|
|
26
74
|
}
|
|
27
75
|
|
|
28
|
-
/** @returns {
|
|
76
|
+
/** @returns {string} */
|
|
29
77
|
get uid() {
|
|
30
78
|
return this.__ctxId;
|
|
31
79
|
}
|
|
32
80
|
|
|
33
81
|
/**
|
|
34
|
-
* @param {
|
|
35
|
-
* @param {
|
|
82
|
+
* @param {ExtractKeysFromSchema<T>} prop
|
|
83
|
+
* @param {ExtractDataFromSchema<T>[prop]} value
|
|
36
84
|
*/
|
|
37
85
|
setValue(prop, value) {
|
|
38
86
|
if (!this.__typedSchema.hasOwnProperty(prop)) {
|
|
@@ -40,32 +88,41 @@ export class TypedData {
|
|
|
40
88
|
return;
|
|
41
89
|
}
|
|
42
90
|
let pDesc = this.__typedSchema[prop];
|
|
43
|
-
|
|
91
|
+
|
|
92
|
+
let isMatchConstructorType = value?.constructor === pDesc.type;
|
|
93
|
+
let isMatchInstanceType = /** @type {any} */ (value) instanceof /** @type {any} */ (pDesc['type']);
|
|
94
|
+
let isMatchNullable = pDesc.nullable && value === null;
|
|
95
|
+
|
|
96
|
+
if (isMatchConstructorType || isMatchInstanceType || isMatchNullable) {
|
|
44
97
|
this.__data.pub(prop, value);
|
|
45
98
|
return;
|
|
46
99
|
}
|
|
47
100
|
console.warn(MSG_TYPE + prop);
|
|
48
101
|
}
|
|
49
102
|
|
|
50
|
-
/** @param {
|
|
103
|
+
/** @param {Partial<ExtractDataFromSchema<T>>} updObj */
|
|
51
104
|
setMultipleValues(updObj) {
|
|
52
|
-
for (let prop
|
|
53
|
-
this.setValue(prop,
|
|
105
|
+
for (let [prop, value] of Object.entries(updObj)) {
|
|
106
|
+
this.setValue(/** @type {ExtractKeysFromSchema<T>} */ (prop), value);
|
|
54
107
|
}
|
|
55
108
|
}
|
|
56
109
|
|
|
57
|
-
/**
|
|
110
|
+
/**
|
|
111
|
+
* @template {ExtractKeysFromSchema<T>} K
|
|
112
|
+
* @param {K} prop
|
|
113
|
+
* @returns {ExtractDataFromSchema<T>[K]}
|
|
114
|
+
*/
|
|
58
115
|
getValue(prop) {
|
|
59
116
|
if (!this.__typedSchema.hasOwnProperty(prop)) {
|
|
60
117
|
console.warn(MSG_NAME + prop);
|
|
61
|
-
return undefined;
|
|
62
118
|
}
|
|
63
119
|
return this.__data.read(prop);
|
|
64
120
|
}
|
|
65
121
|
|
|
66
122
|
/**
|
|
67
|
-
* @
|
|
68
|
-
* @param {
|
|
123
|
+
* @template {ExtractKeysFromSchema<T>} K
|
|
124
|
+
* @param {K} prop
|
|
125
|
+
* @param {(newVal: ExtractDataFromSchema<T>[K]) => void} handler
|
|
69
126
|
*/
|
|
70
127
|
subscribe(prop, handler) {
|
|
71
128
|
return this.__data.sub(prop, handler);
|
|
@@ -7,11 +7,11 @@ export class UploaderBlock extends ActivityBlock {
|
|
|
7
7
|
'*commonProgress': number;
|
|
8
8
|
'*uploadList': never[];
|
|
9
9
|
'*uploadQueue': import("@uploadcare/upload-client").Queue;
|
|
10
|
-
'*collectionErrors':
|
|
11
|
-
'*collectionState': import("../types").OutputCollectionState
|
|
10
|
+
'*collectionErrors': ReturnType<import("../types").OutputErrorCollection>[];
|
|
11
|
+
'*collectionState': import("../types").OutputCollectionState | null;
|
|
12
12
|
'*groupInfo': import("@uploadcare/upload-client").UploadcareGroup | null;
|
|
13
13
|
'*uploadTrigger': Set<string>;
|
|
14
|
-
'*secureUploadsManager': SecureUploadsManager | null;
|
|
14
|
+
'*secureUploadsManager': import("./SecureUploadsManager.js").SecureUploadsManager | null;
|
|
15
15
|
'*currentActivity': null;
|
|
16
16
|
'*currentActivityParams': {};
|
|
17
17
|
'*history': never[];
|
|
@@ -28,8 +28,8 @@ export class UploaderBlock extends ActivityBlock {
|
|
|
28
28
|
/** @returns {UploaderPublicApi} */
|
|
29
29
|
get api(): UploaderPublicApi;
|
|
30
30
|
getAPI(): UploaderPublicApi;
|
|
31
|
-
/** @returns {TypedCollection} */
|
|
32
|
-
get uploadCollection(): TypedCollection
|
|
31
|
+
/** @returns {TypedCollection<typeof uploadEntrySchema>} */
|
|
32
|
+
get uploadCollection(): TypedCollection<typeof uploadEntrySchema>;
|
|
33
33
|
/** @private */
|
|
34
34
|
private initCtxOwner;
|
|
35
35
|
/** @private */
|
|
@@ -45,13 +45,12 @@ export class UploaderBlock extends ActivityBlock {
|
|
|
45
45
|
private _flushOutputItems;
|
|
46
46
|
/**
|
|
47
47
|
* @private
|
|
48
|
-
* @type {
|
|
49
|
-
* @param {Set<import('./TypedData.js').TypedData>} removed
|
|
48
|
+
* @type {import('./TypedCollection.js').TypedCollectionObserverHandler<typeof uploadEntrySchema>}
|
|
50
49
|
*/
|
|
51
50
|
private _handleCollectionUpdate;
|
|
52
51
|
/**
|
|
53
52
|
* @private
|
|
54
|
-
* @param {Record<keyof import('./uploadEntrySchema.js').
|
|
53
|
+
* @param {Record<keyof import('./uploadEntrySchema.js').UploadEntryData, Set<string>>} changeMap
|
|
55
54
|
*/
|
|
56
55
|
private _handleCollectionPropertiesUpdate;
|
|
57
56
|
/** @private */
|
|
@@ -68,9 +67,9 @@ export class UploaderBlock extends ActivityBlock {
|
|
|
68
67
|
* @returns {Promise<import('@uploadcare/upload-client').FileFromOptions>}
|
|
69
68
|
* @protected
|
|
70
69
|
*/
|
|
71
|
-
protected getUploadClientOptions(): Promise<import(
|
|
70
|
+
protected getUploadClientOptions(): Promise<import("@uploadcare/upload-client").FileFromOptions>;
|
|
72
71
|
/** @returns {import('../types/exported.js').OutputFileEntry[]} */
|
|
73
|
-
getOutputData(): import(
|
|
72
|
+
getOutputData(): import("../types/exported.js").OutputFileEntry[];
|
|
74
73
|
}
|
|
75
74
|
export namespace UploaderBlock {
|
|
76
75
|
type extSrcList = string;
|
|
@@ -114,4 +113,5 @@ import { SecureUploadsManager } from './SecureUploadsManager.js';
|
|
|
114
113
|
import { ValidationManager } from './ValidationManager.js';
|
|
115
114
|
import { UploaderPublicApi } from './UploaderPublicApi.js';
|
|
116
115
|
import { TypedCollection } from './TypedCollection.js';
|
|
116
|
+
import { uploadEntrySchema } from './uploadEntrySchema.js';
|
|
117
117
|
//# sourceMappingURL=UploaderBlock.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UploaderBlock.d.ts","sourceRoot":"","sources":["UploaderBlock.js"],"names":[],"mappings":"AAmBA;IACE,iBAAiB;IACjB,mCAAwB;IAExB,eAAe;IACf,mBAAmB;IAEnB
|
|
1
|
+
{"version":3,"file":"UploaderBlock.d.ts","sourceRoot":"","sources":["UploaderBlock.js"],"names":[],"mappings":"AAmBA;IACE,iBAAiB;IACjB,mCAAwB;IAExB,eAAe;IACf,mBAAmB;IAEnB;;;;+CAdA,UAAU;mCACa,UAAS;6BAEjC,2BAA2B;;wCAEW,2BAA2B;;;;;;MASjC;IAE/B,eAAe;IACf,0BAOC;IA2BD;;;OAGG;IACH,mCAHa,iBAAiB,CAQ7B;IAED,mCAAmC;IACnC,WADc,iBAAiB,CAM9B;IAED,4BAEC;IAED,2DAA2D;IAC3D,wBADc,eAAe,CAAC,OAAO,iBAAiB,CAAC,CAMtD;IAYD,eAAe;IACf,qBAkBC;IAfC,eAAe;IACf,6BAAiG;IAEjG,eAAe;IACf,uCAEC;IAWH;;;OAGG;IACH,qBAkBC;IAED,eAAe;IACf,0BAYQ;IAER;;;OAGG;IACH,gCAkCE;IAEF;;;OAGG;IACH,0CA6FE;IAEF,eAAe;IACf,mCAsBE;IAEF,6BAiBC;IAED,eAAe;IACf,uBAkDC;IAED;;;OAGG;IACH,kCAHW,MAAM,qEAWhB;IAED;;;OAGG;IACH,oCAHa,OAAO,CAAC,OAAO,2BAA2B,EAAE,eAAe,CAAC,CA2BxE;IAED,kEAAkE;IAClE,iBADc,OAAO,sBAAsB,EAAE,eAAe,EAAE,CAK7D;CACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BAjc6B,oBAAoB;qCAWb,2BAA2B;kCAG9B,wBAAwB;kCADxB,wBAAwB;gCAD1B,sBAAsB;kCAGpB,wBAAwB"}
|
|
@@ -84,7 +84,7 @@ export class UploaderBlock extends ActivityBlock {
|
|
|
84
84
|
return this.api;
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
/** @returns {TypedCollection} */
|
|
87
|
+
/** @returns {TypedCollection<typeof uploadEntrySchema>} */
|
|
88
88
|
get uploadCollection() {
|
|
89
89
|
if (!this.has('*uploadCollection')) {
|
|
90
90
|
throw new Error('Unexpected error: TypedCollection is not initialized');
|
|
@@ -164,8 +164,7 @@ export class UploaderBlock extends ActivityBlock {
|
|
|
164
164
|
|
|
165
165
|
/**
|
|
166
166
|
* @private
|
|
167
|
-
* @type {
|
|
168
|
-
* @param {Set<import('./TypedData.js').TypedData>} removed
|
|
167
|
+
* @type {import('./TypedCollection.js').TypedCollectionObserverHandler<typeof uploadEntrySchema>}
|
|
169
168
|
*/
|
|
170
169
|
_handleCollectionUpdate = (entries, added, removed) => {
|
|
171
170
|
if (added.size || removed.size) {
|
|
@@ -190,7 +189,8 @@ export class UploaderBlock extends ActivityBlock {
|
|
|
190
189
|
isUploading: false,
|
|
191
190
|
uploadProgress: 0,
|
|
192
191
|
});
|
|
193
|
-
|
|
192
|
+
const thumbUrl = entry?.getValue('thumbUrl');
|
|
193
|
+
thumbUrl && URL.revokeObjectURL(thumbUrl);
|
|
194
194
|
this.emit(EventType.FILE_REMOVED, this.api.getOutputItem(entry.uid));
|
|
195
195
|
}
|
|
196
196
|
|
|
@@ -204,7 +204,7 @@ export class UploaderBlock extends ActivityBlock {
|
|
|
204
204
|
|
|
205
205
|
/**
|
|
206
206
|
* @private
|
|
207
|
-
* @param {Record<keyof import('./uploadEntrySchema.js').
|
|
207
|
+
* @param {Record<keyof import('./uploadEntrySchema.js').UploadEntryData, Set<string>>} changeMap
|
|
208
208
|
*/
|
|
209
209
|
_handleCollectionPropertiesUpdate = (changeMap) => {
|
|
210
210
|
this._flushOutputItems();
|
|
@@ -309,7 +309,9 @@ export class UploaderBlock extends ActivityBlock {
|
|
|
309
309
|
const items = [...uploadTrigger].filter((id) => !!this.uploadCollection.read(id));
|
|
310
310
|
items.forEach((id) => {
|
|
311
311
|
const uploadProgress = this.uploadCollection.readProp(id, 'uploadProgress');
|
|
312
|
-
|
|
312
|
+
if (typeof uploadProgress === 'number') {
|
|
313
|
+
commonProgress += uploadProgress;
|
|
314
|
+
}
|
|
313
315
|
});
|
|
314
316
|
const progress = items.length ? Math.round(commonProgress / items.length) : 0;
|
|
315
317
|
|
|
@@ -326,7 +328,7 @@ export class UploaderBlock extends ActivityBlock {
|
|
|
326
328
|
|
|
327
329
|
openCloudImageEditor() {
|
|
328
330
|
const [entry] = this.uploadCollection
|
|
329
|
-
.findItems((entry) => entry.getValue('fileInfo') && entry.getValue('isImage'))
|
|
331
|
+
.findItems((entry) => !!entry.getValue('fileInfo') && entry.getValue('isImage'))
|
|
330
332
|
.map((id) => this.uploadCollection.read(id));
|
|
331
333
|
|
|
332
334
|
if (
|
|
@@ -352,14 +354,19 @@ export class UploaderBlock extends ActivityBlock {
|
|
|
352
354
|
const entries = this.uploadCollection
|
|
353
355
|
.findItems(
|
|
354
356
|
(entry) =>
|
|
355
|
-
entry.getValue('fileInfo') &&
|
|
357
|
+
!!entry.getValue('fileInfo') &&
|
|
356
358
|
entry.getValue('isImage') &&
|
|
357
359
|
!entry.getValue('cdnUrlModifiers')?.includes('/crop/'),
|
|
358
360
|
)
|
|
359
|
-
.map((id) => this.uploadCollection.read(id))
|
|
361
|
+
.map((id) => this.uploadCollection.read(id))
|
|
362
|
+
.filter(Boolean);
|
|
360
363
|
|
|
361
364
|
for (const entry of entries) {
|
|
362
365
|
const fileInfo = entry.getValue('fileInfo');
|
|
366
|
+
if (!fileInfo || !fileInfo.imageInfo) {
|
|
367
|
+
console.warn('Failed to get image info for entry', entry.uid);
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
363
370
|
const { width, height } = fileInfo.imageInfo;
|
|
364
371
|
const expectedAspectRatio = aspectRatioPreset.width / aspectRatioPreset.height;
|
|
365
372
|
const crop = calculateMaxCenteredCropFrame(width, height, expectedAspectRatio);
|
|
@@ -367,9 +374,14 @@ export class UploaderBlock extends ActivityBlock {
|
|
|
367
374
|
`crop/${crop.width}x${crop.height}/${crop.x},${crop.y}`,
|
|
368
375
|
'preview',
|
|
369
376
|
);
|
|
377
|
+
const cdnUrl = entry.getValue('cdnUrl');
|
|
378
|
+
if (!cdnUrl) {
|
|
379
|
+
console.warn('Failed to get cdnUrl for entry', entry.uid);
|
|
380
|
+
continue;
|
|
381
|
+
}
|
|
370
382
|
entry.setMultipleValues({
|
|
371
383
|
cdnUrlModifiers,
|
|
372
|
-
cdnUrl: createCdnUrl(
|
|
384
|
+
cdnUrl: createCdnUrl(cdnUrl, cdnUrlModifiers),
|
|
373
385
|
});
|
|
374
386
|
if (
|
|
375
387
|
this.uploadCollection.size === 1 &&
|