@uploadcare/file-uploader 1.12.0 → 1.12.1-alpha.1
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/UploaderPublicApi.d.ts.map +1 -1
- package/abstract/UploaderPublicApi.js +4 -11
- package/blocks/CameraSource/CameraSource.d.ts +12 -22
- package/blocks/CameraSource/CameraSource.d.ts.map +1 -1
- package/blocks/CameraSource/CameraSource.js +81 -83
- package/blocks/CameraSource/camera-source.css +1 -0
- package/blocks/CameraSource/constants.d.ts +15 -0
- package/blocks/CameraSource/constants.d.ts.map +1 -0
- package/blocks/CameraSource/constants.js +17 -0
- package/blocks/CloudImageEditor/src/lib/parseTabs.js +2 -2
- package/blocks/Config/Config.d.ts +3 -3
- package/blocks/Config/Config.d.ts.map +1 -1
- package/blocks/Config/Config.js +13 -3
- package/blocks/Config/assertions.d.ts +5 -0
- package/blocks/Config/assertions.d.ts.map +1 -0
- package/blocks/Config/assertions.js +37 -0
- package/blocks/Config/initialConfig.d.ts.map +1 -1
- package/blocks/Config/initialConfig.js +4 -3
- package/blocks/Config/normalizeConfigValue.d.ts.map +1 -1
- package/blocks/Config/normalizeConfigValue.js +20 -7
- package/blocks/Config/side-effects.d.ts +7 -0
- package/blocks/Config/side-effects.d.ts.map +1 -0
- package/blocks/Config/side-effects.js +32 -0
- package/blocks/utils/comma-separated.d.ts +1 -1
- package/blocks/utils/comma-separated.d.ts.map +1 -1
- package/blocks/utils/comma-separated.js +5 -2
- package/index.ssr.d.ts +0 -14
- package/index.ssr.d.ts.map +1 -1
- package/index.ssr.js +5 -14
- package/package.json +1 -1
- package/types/exported.d.ts +81 -64
- 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 +4 -4
- 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.js +3 -3
- package/web/uc-file-uploader-regular.min.css +1 -1
- package/web/uc-file-uploader-regular.min.js +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UploaderPublicApi.d.ts","sourceRoot":"","sources":["UploaderPublicApi.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"UploaderPublicApi.d.ts","sourceRoot":"","sources":["UploaderPublicApi.js"],"names":[],"mappings":"AAaA;IAOE,8DAA8D;IAC9D,iBADY,OAAO,oBAAoB,EAAE,aAAa,EAGrD;IATD;;;OAGG;IACH,aAAK;IAOL,eAAe;IACf,gCAEC;IAED,yCAEC;IAED;;iBAEC;IAED;;;;;;OAMG;IACH,sBAJW,MAAM;;;;sBAEJ,OAAO,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC,CAUrD;IAEF;;;;OAIG;IACH,wBAJW,MAAM;;;;sBAEJ,OAAO,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC,CAUrD;IAEF;;;;OAIG;IACH,4BAJW,MAAM;;;;sBAEJ,OAAO,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC,CAgBrD;IAEF;;;;OAIG;IACH,0BAJW,IAAI;;;;;sBAEF,OAAO,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC,CAcrD;IAEF,iCAAiC;IACjC,qCADY,MAAM,UAMhB;IAEF,uBAEC;IAED,sBAeE;IAEF,mDAAmD;IACnD,6BADY;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,UAkDrC;IAEF;;;;OAIG;IACH,8EAHW,MAAM,iDA8Cf;IAEF,oEAAoE;IACpE,oKAIE;IAEF,+BAA+B;IAC/B,gDAsCE;IAEF,qBAQE;IAEF;;;;;;;;;OASG;IACH,uTAFQ,IAAI,CAWV;IAEF,2DAA2D;IAC3D,0BADc,OAAO,oBAAoB,EAAE,YAAY,CAGrD;IAEF,8BAA8B;IAC9B,wBADY,OAAO,UAOjB;IAEF;;;OAGG;IACH,0BAOC;CACF"}
|
|
@@ -4,11 +4,12 @@ import { ActivityBlock } from './ActivityBlock.js';
|
|
|
4
4
|
import { applyStyles, Data } from '@symbiotejs/symbiote';
|
|
5
5
|
import { EventType } from '../blocks/UploadCtxProvider/EventEmitter.js';
|
|
6
6
|
import { UploadSource } from '../blocks/utils/UploadSource.js';
|
|
7
|
-
import { serializeCsv } from '../blocks/utils/comma-separated.js';
|
|
7
|
+
import { deserializeCsv, serializeCsv } from '../blocks/utils/comma-separated.js';
|
|
8
8
|
import { IMAGE_ACCEPT_LIST, fileIsImage, mergeFileTypes } from '../utils/fileTypes.js';
|
|
9
9
|
import { parseCdnUrl } from '../utils/parseCdnUrl.js';
|
|
10
10
|
import { buildOutputCollectionState } from './buildOutputCollectionState.js';
|
|
11
11
|
import { stringToArray } from '../utils/stringToArray.js';
|
|
12
|
+
import { CameraSourceTypes } from '../blocks/CameraSource/constants.js';
|
|
12
13
|
|
|
13
14
|
export class UploaderPublicApi {
|
|
14
15
|
/**
|
|
@@ -141,15 +142,6 @@ export class UploaderPublicApi {
|
|
|
141
142
|
const accept = serializeCsv(
|
|
142
143
|
mergeFileTypes([this.cfg.accept ?? '', ...(this.cfg.imgOnly ? IMAGE_ACCEPT_LIST : [])]),
|
|
143
144
|
);
|
|
144
|
-
|
|
145
|
-
if (this.cfg.accept && !!this.cfg.imgOnly) {
|
|
146
|
-
console.warn(
|
|
147
|
-
'There could be a mistake.\n' +
|
|
148
|
-
'Both `accept` and `imgOnly` parameters are set.\n' +
|
|
149
|
-
'The value of `accept` will be concatenated with the internal image mime types list.',
|
|
150
|
-
);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
145
|
const INPUT_ATTR_NAME = 'uploadcare-file-input';
|
|
154
146
|
const fileInput = document.createElement('input');
|
|
155
147
|
fileInput.setAttribute(INPUT_ATTR_NAME, '');
|
|
@@ -163,7 +155,8 @@ export class UploaderPublicApi {
|
|
|
163
155
|
fileInput.multiple = this.cfg.multiple;
|
|
164
156
|
if (options.captureCamera) {
|
|
165
157
|
fileInput.capture = this.cfg.cameraCapture;
|
|
166
|
-
|
|
158
|
+
const isVideoRecordingEnabled = deserializeCsv(this.cfg.cameraModes).includes(CameraSourceTypes.VIDEO);
|
|
159
|
+
fileInput.accept = ['image/*', isVideoRecordingEnabled && 'video/*'].filter(Boolean).join(',');
|
|
167
160
|
} else {
|
|
168
161
|
fileInput.accept = accept;
|
|
169
162
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @typedef {'photo' | 'video'}
|
|
1
|
+
/** @typedef {'photo' | 'video'} CameraMode */
|
|
2
2
|
/** @typedef {'shot' | 'retake' | 'accept' | 'play' | 'stop' | 'pause' | 'resume'} CameraStatus */
|
|
3
3
|
export class CameraSource extends UploaderBlock {
|
|
4
4
|
activityType: "camera";
|
|
@@ -32,12 +32,12 @@ export class CameraSource extends UploaderBlock {
|
|
|
32
32
|
audioSelectOptions: null;
|
|
33
33
|
audioSelectHidden: boolean;
|
|
34
34
|
audioSelectDisabled: boolean;
|
|
35
|
-
|
|
35
|
+
audioToggleMicrophoneHidden: boolean;
|
|
36
36
|
tabCameraHidden: boolean;
|
|
37
37
|
tabVideoHidden: boolean;
|
|
38
38
|
currentIcon: string;
|
|
39
39
|
currentTimelineIcon: string;
|
|
40
|
-
|
|
40
|
+
toggleMicrophoneIcon: string;
|
|
41
41
|
/** @type {Number} */
|
|
42
42
|
_startTime: number;
|
|
43
43
|
/** @type {Number} */
|
|
@@ -117,10 +117,10 @@ export class CameraSource extends UploaderBlock {
|
|
|
117
117
|
_ctx: CanvasRenderingContext2D | null | undefined;
|
|
118
118
|
/**
|
|
119
119
|
* @private
|
|
120
|
-
* @param {
|
|
120
|
+
* @param {CameraMode} tabId
|
|
121
121
|
*/
|
|
122
122
|
private _handleActiveTab;
|
|
123
|
-
_activeTab:
|
|
123
|
+
_activeTab: CameraMode | undefined;
|
|
124
124
|
/**
|
|
125
125
|
* @param {'camera' | 'video'} type
|
|
126
126
|
* @param {'jpeg' | 'webm'} ext
|
|
@@ -136,6 +136,8 @@ export class CameraSource extends UploaderBlock {
|
|
|
136
136
|
* @param {File} file
|
|
137
137
|
*/
|
|
138
138
|
_toSend: (file: File) => void;
|
|
139
|
+
/** @private */
|
|
140
|
+
private get _cameraModes();
|
|
139
141
|
/**
|
|
140
142
|
* @private
|
|
141
143
|
* @param {'granted' | 'denied' | 'prompt'} state
|
|
@@ -150,37 +152,25 @@ export class CameraSource extends UploaderBlock {
|
|
|
150
152
|
_getPermission: () => void;
|
|
151
153
|
_requestDeviceAccess: () => Promise<void>;
|
|
152
154
|
_getDevices: () => Promise<void>;
|
|
153
|
-
|
|
155
|
+
_cameraDevices: {
|
|
154
156
|
text: string;
|
|
155
157
|
value: string;
|
|
156
158
|
}[] | undefined;
|
|
157
|
-
|
|
159
|
+
_audioDevices: false | {
|
|
158
160
|
text: string;
|
|
159
161
|
value: string;
|
|
160
162
|
}[] | undefined;
|
|
161
163
|
_onActivate: () => Promise<void>;
|
|
162
164
|
_onDeactivate: () => Promise<void>;
|
|
165
|
+
/** @param {CameraMode[]} cameraModes */
|
|
166
|
+
_handleCameraModes: (cameraModes: CameraMode[]) => void;
|
|
163
167
|
_destroy(): void;
|
|
164
168
|
destroyCallback(): Promise<void>;
|
|
165
169
|
}
|
|
166
170
|
export namespace CameraSource {
|
|
167
|
-
let types: Readonly<{
|
|
168
|
-
PHOTO: "photo";
|
|
169
|
-
VIDEO: "video";
|
|
170
|
-
}>;
|
|
171
|
-
let events: Readonly<{
|
|
172
|
-
IDLE: "idle";
|
|
173
|
-
SHOT: "shot";
|
|
174
|
-
PLAY: "play";
|
|
175
|
-
PAUSE: "pause";
|
|
176
|
-
RESUME: "resume";
|
|
177
|
-
STOP: "stop";
|
|
178
|
-
RETAKE: "retake";
|
|
179
|
-
ACCEPT: "accept";
|
|
180
|
-
}>;
|
|
181
171
|
let template: string;
|
|
182
172
|
}
|
|
183
|
-
export type
|
|
173
|
+
export type CameraMode = 'photo' | 'video';
|
|
184
174
|
export type CameraStatus = 'shot' | 'retake' | 'accept' | 'play' | 'stop' | 'pause' | 'resume';
|
|
185
175
|
import { UploaderBlock } from '../../abstract/UploaderBlock.js';
|
|
186
176
|
//# sourceMappingURL=CameraSource.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CameraSource.d.ts","sourceRoot":"","sources":["CameraSource.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CameraSource.d.ts","sourceRoot":"","sources":["CameraSource.js"],"names":[],"mappings":"AAyCA,8CAA8C;AAE9C,kGAAkG;AAElG;IAEE,uBAA+C;IAE/C,eAAe;IACf,0BAAyB;IAEzB,yBAAyB;IACzB,SADW,QAAQ,EAAE,CACR;IAEb,mCAAmC;IACnC,gBADW,aAAa,GAAG,IAAI,CACT;IAEtB,iCAAiC;IACjC,SADW,WAAW,GAAG,IAAI,CACd;IAEf,4BAA4B;IAC5B,kBADW,MAAM,GAAG,IAAI,CACA;IAExB,4BAA4B;IAC5B,mBADW,MAAM,GAAG,IAAI,CACC;IAKvB;;;;;;;;;;;;;;;;;;;;;;;;QAiCE,qBAAqB;;QAErB,qBAAqB;;;;QAMrB,uBAAuB;kCAAX,KAAK;QAMjB,uBAAuB;iCAAX,KAAK;;;;QAcjB,iDAAiD;;;;;;;;QAejD,4BAA4B;wBAAhB,UAAU;;;;;;;;;;;;;;MAKvB;IAGH,oCAaE;IAEF,yBAkBE;IADA,sCAAiE;IAGnE,wBAKE;IAEF,uBAEE;IAEF,2BAOE;IAEF,0BAEE;IAEF,4BAiCE;IA9BE;;;;;kBAEC;IA8BL,eAAe;IACf,uBAWE;IAEF,2DAA2D;IAC3D,6BAQE;IAEF,+BAOE;IAEF;;;;OAIG;IACH,sBA6BE;IAEF,oBAUE;IAEF,oBAoBE;IAEF,mCAAmC;IACnC,uBADY,YAAY,UAqBtB;IAEF,mCAAmC;IACnC,uBADY,YAAY,UAwCtB;IAEF;;;OAGG;IACH,wBAmBE;IAEF,eAAe;IACf,cAoBC;IAjBC,uCAA+C;IAC/C,kDAAyC;IAkB3C;;;OAGG;IACH,yBAwBE;IADA,mCAAuB;IAGzB;;;;;OAKG;IACH,oBALW,QAAQ,GAAG,OAAO,OAClB,MAAM,GAAG,MAAM,wBAEf,IAAI,UAYb;IAEF,uCAAuC;IACvC,4BADY,SAAS,SAAS,OAmC7B;IAED;;;;OAIG;IACH,gBAFW,IAAI,UAOb;IAEF,eAAe;IACf,2BAEC;IAED;;;OAGG;IACH,6BA+CQ;IAER,6CAQE;IAEF,yBAWE;IAFE,gCAAuB;IAI3B,8BAyCE;IAEF,qCAEE;IAEF,uCAYE;IAEF,2BAA0B;IAE1B,0CASE;IAEF,iCAsCE;IAlCE;;;oBAKK;IAEL;;;oBAOO;IAsBX,iCAME;IAEF,mCAYE;IAEF,wCAAwC;IACxC,kCADY,UAAU,EAAE,UAStB;IAyBF,iBAMC;IAED,iCAIC;CACF;;;;yBAjxBa,OAAO,GAAG,OAAO;2BAEjB,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ;8BAzCnD,iCAAiC"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
//@ts-nocheck
|
|
2
2
|
import { ActivityBlock } from '../../abstract/ActivityBlock.js';
|
|
3
3
|
import { UploaderBlock } from '../../abstract/UploaderBlock.js';
|
|
4
|
+
import { stringToArray } from '../../utils/stringToArray.js';
|
|
4
5
|
import { canUsePermissionsApi } from '../utils/abilities.js';
|
|
6
|
+
import { deserializeCsv } from '../utils/comma-separated.js';
|
|
5
7
|
import { debounce } from '../utils/debounce.js';
|
|
6
8
|
import { UploadSource } from '../utils/UploadSource.js';
|
|
9
|
+
import { CameraSourceEvents, CameraSourceTypes } from './constants.js';
|
|
7
10
|
|
|
8
11
|
const DEFAULT_VIDEO_CONFIG = {
|
|
9
12
|
width: {
|
|
@@ -36,7 +39,7 @@ function formatTime(time) {
|
|
|
36
39
|
const DEFAULT_PICTURE_FORMAT = 'image/jpeg';
|
|
37
40
|
const DEFAULT_VIDEO_FORMAT = 'video/webm';
|
|
38
41
|
|
|
39
|
-
/** @typedef {'photo' | 'video'}
|
|
42
|
+
/** @typedef {'photo' | 'video'} CameraMode */
|
|
40
43
|
|
|
41
44
|
/** @typedef {'shot' | 'retake' | 'accept' | 'play' | 'stop' | 'pause' | 'resume'} CameraStatus */
|
|
42
45
|
|
|
@@ -89,14 +92,14 @@ export class CameraSource extends UploaderBlock {
|
|
|
89
92
|
audioSelectOptions: null,
|
|
90
93
|
audioSelectHidden: true,
|
|
91
94
|
audioSelectDisabled: true,
|
|
92
|
-
|
|
95
|
+
audioToggleMicrophoneHidden: true,
|
|
93
96
|
|
|
94
97
|
tabCameraHidden: true,
|
|
95
98
|
tabVideoHidden: true,
|
|
96
99
|
|
|
97
100
|
currentIcon: 'camera-full',
|
|
98
101
|
currentTimelineIcon: 'play',
|
|
99
|
-
|
|
102
|
+
toggleMicrophoneIcon: 'microphone',
|
|
100
103
|
|
|
101
104
|
/** @type {Number} */
|
|
102
105
|
_startTime: 0,
|
|
@@ -144,17 +147,17 @@ export class CameraSource extends UploaderBlock {
|
|
|
144
147
|
/** @param {MouseEvent} e */
|
|
145
148
|
onClickTab: (e) => {
|
|
146
149
|
const id = /** @type {HTMLElement} */ (e.currentTarget).getAttribute('data-id');
|
|
147
|
-
if (id) this._handleActiveTab(/** @type {
|
|
150
|
+
if (id) this._handleActiveTab(/** @type {CameraMode} */ (id));
|
|
148
151
|
},
|
|
149
152
|
};
|
|
150
153
|
}
|
|
151
154
|
|
|
152
155
|
_chooseActionWithCamera = () => {
|
|
153
|
-
if (this._activeTab ===
|
|
156
|
+
if (this._activeTab === CameraSourceTypes.PHOTO) {
|
|
154
157
|
this._shot();
|
|
155
158
|
}
|
|
156
159
|
|
|
157
|
-
if (this._activeTab ===
|
|
160
|
+
if (this._activeTab === CameraSourceTypes.VIDEO) {
|
|
158
161
|
if (this._mediaRecorder?.state === 'recording') {
|
|
159
162
|
this._stopRecording();
|
|
160
163
|
return;
|
|
@@ -212,10 +215,10 @@ export class CameraSource extends UploaderBlock {
|
|
|
212
215
|
try {
|
|
213
216
|
this._chunks = [];
|
|
214
217
|
this._options = {
|
|
215
|
-
...this.cfg.
|
|
218
|
+
...this.cfg.mediaRecorderOptions,
|
|
216
219
|
};
|
|
217
220
|
|
|
218
|
-
const { mimeType } = this.cfg.
|
|
221
|
+
const { mimeType } = this.cfg.mediaRecorderOptions || {};
|
|
219
222
|
|
|
220
223
|
if (mimeType && MediaRecorder.isTypeSupported(mimeType)) {
|
|
221
224
|
this._options.mimeType = mimeType;
|
|
@@ -236,7 +239,7 @@ export class CameraSource extends UploaderBlock {
|
|
|
236
239
|
this._startTimer();
|
|
237
240
|
|
|
238
241
|
this.classList.add('uc-recording');
|
|
239
|
-
this._setCameraState(
|
|
242
|
+
this._setCameraState(CameraSourceEvents.PLAY);
|
|
240
243
|
}
|
|
241
244
|
} catch (error) {
|
|
242
245
|
console.error('Failed to start recording', error);
|
|
@@ -250,7 +253,7 @@ export class CameraSource extends UploaderBlock {
|
|
|
250
253
|
|
|
251
254
|
this._stopTimer();
|
|
252
255
|
|
|
253
|
-
this._setCameraState(
|
|
256
|
+
this._setCameraState(CameraSourceEvents.STOP);
|
|
254
257
|
});
|
|
255
258
|
|
|
256
259
|
this._mediaRecorder?.stop();
|
|
@@ -272,7 +275,7 @@ export class CameraSource extends UploaderBlock {
|
|
|
272
275
|
this._stream?.getAudioTracks().forEach((track) => {
|
|
273
276
|
track.enabled = !track.enabled;
|
|
274
277
|
|
|
275
|
-
this.$.
|
|
278
|
+
this.$.toggleMicrophoneIcon = !track.enabled ? 'microphone-mute' : 'microphone';
|
|
276
279
|
this.$.audioSelectDisabled = !track.enabled;
|
|
277
280
|
});
|
|
278
281
|
};
|
|
@@ -314,10 +317,10 @@ export class CameraSource extends UploaderBlock {
|
|
|
314
317
|
};
|
|
315
318
|
|
|
316
319
|
_retake = () => {
|
|
317
|
-
this._setCameraState(
|
|
320
|
+
this._setCameraState(CameraSourceEvents.RETAKE);
|
|
318
321
|
|
|
319
322
|
/** Reset video */
|
|
320
|
-
if (this._activeTab ===
|
|
323
|
+
if (this._activeTab === CameraSourceTypes.VIDEO) {
|
|
321
324
|
this.$.video = this._stream;
|
|
322
325
|
this.ref.video.muted = true;
|
|
323
326
|
}
|
|
@@ -326,9 +329,9 @@ export class CameraSource extends UploaderBlock {
|
|
|
326
329
|
};
|
|
327
330
|
|
|
328
331
|
_accept = () => {
|
|
329
|
-
this._setCameraState(
|
|
332
|
+
this._setCameraState(CameraSourceEvents.ACCEPT);
|
|
330
333
|
|
|
331
|
-
if (this._activeTab ===
|
|
334
|
+
if (this._activeTab === CameraSourceTypes.PHOTO) {
|
|
332
335
|
this._canvas?.toBlob((blob) => {
|
|
333
336
|
const file = this._createFile('camera', 'jpeg', DEFAULT_PICTURE_FORMAT, blob);
|
|
334
337
|
this._toSend(file);
|
|
@@ -349,7 +352,7 @@ export class CameraSource extends UploaderBlock {
|
|
|
349
352
|
|
|
350
353
|
/** @param {CameraStatus} status */
|
|
351
354
|
_handlePhoto = (status) => {
|
|
352
|
-
if (status ===
|
|
355
|
+
if (status === CameraSourceEvents.SHOT) {
|
|
353
356
|
this.set$({
|
|
354
357
|
tabVideoHidden: true,
|
|
355
358
|
cameraHidden: true,
|
|
@@ -359,20 +362,20 @@ export class CameraSource extends UploaderBlock {
|
|
|
359
362
|
});
|
|
360
363
|
}
|
|
361
364
|
|
|
362
|
-
if (status ===
|
|
365
|
+
if (status === CameraSourceEvents.RETAKE || status === CameraSourceEvents.ACCEPT) {
|
|
363
366
|
this.set$({
|
|
364
|
-
tabVideoHidden: !this.
|
|
367
|
+
tabVideoHidden: !this._cameraModes.includes(CameraSourceTypes.VIDEO),
|
|
368
|
+
tabCameraHidden: !this._cameraModes.includes(CameraSourceTypes.PHOTO),
|
|
365
369
|
cameraHidden: false,
|
|
366
|
-
tabCameraHidden: false,
|
|
367
370
|
cameraActionsHidden: true,
|
|
368
|
-
cameraSelectHidden: this.
|
|
371
|
+
cameraSelectHidden: this._cameraDevices.length <= 1,
|
|
369
372
|
});
|
|
370
373
|
}
|
|
371
374
|
};
|
|
372
375
|
|
|
373
376
|
/** @param {CameraStatus} status */
|
|
374
377
|
_handleVideo = (status) => {
|
|
375
|
-
if (status ===
|
|
378
|
+
if (status === CameraSourceEvents.PLAY) {
|
|
376
379
|
this.set$({
|
|
377
380
|
timerHidden: false,
|
|
378
381
|
tabCameraHidden: true,
|
|
@@ -386,27 +389,28 @@ export class CameraSource extends UploaderBlock {
|
|
|
386
389
|
});
|
|
387
390
|
}
|
|
388
391
|
|
|
389
|
-
if (status ===
|
|
392
|
+
if (status === CameraSourceEvents.STOP) {
|
|
390
393
|
this.set$({
|
|
391
394
|
timerHidden: false,
|
|
392
395
|
cameraHidden: true,
|
|
393
|
-
|
|
396
|
+
audioToggleMicrophoneHidden: true,
|
|
394
397
|
cameraActionsHidden: false,
|
|
395
398
|
});
|
|
396
399
|
}
|
|
397
400
|
|
|
398
|
-
if (status ===
|
|
401
|
+
if (status === CameraSourceEvents.RETAKE || status === CameraSourceEvents.ACCEPT) {
|
|
399
402
|
this.set$({
|
|
400
403
|
timerHidden: true,
|
|
401
|
-
|
|
404
|
+
tabVideoHidden: !this._cameraModes.includes(CameraSourceTypes.VIDEO),
|
|
405
|
+
tabCameraHidden: !this._cameraModes.includes(CameraSourceTypes.PHOTO),
|
|
402
406
|
cameraHidden: false,
|
|
403
407
|
cameraActionsHidden: true,
|
|
404
|
-
|
|
408
|
+
audioToggleMicrophoneHidden: !this.cfg.enableAudioRecording,
|
|
405
409
|
currentIcon: 'video-camera-full',
|
|
406
410
|
mutableClassButton: 'uc-shot-btn uc-camera-action',
|
|
407
411
|
|
|
408
|
-
audioSelectHidden: !this.cfg.enableAudioRecording || this.
|
|
409
|
-
cameraSelectHidden: this.
|
|
412
|
+
audioSelectHidden: !this.cfg.enableAudioRecording || this._audioDevices.length <= 1,
|
|
413
|
+
cameraSelectHidden: this._cameraDevices.length <= 1,
|
|
410
414
|
});
|
|
411
415
|
}
|
|
412
416
|
};
|
|
@@ -417,14 +421,14 @@ export class CameraSource extends UploaderBlock {
|
|
|
417
421
|
*/
|
|
418
422
|
_setCameraState = (status) => {
|
|
419
423
|
if (
|
|
420
|
-
this._activeTab ===
|
|
424
|
+
this._activeTab === CameraSourceTypes.PHOTO &&
|
|
421
425
|
(status === 'shot' || status === 'retake' || status === 'accept')
|
|
422
426
|
) {
|
|
423
427
|
this._handlePhoto(status);
|
|
424
428
|
}
|
|
425
429
|
|
|
426
430
|
if (
|
|
427
|
-
this._activeTab ===
|
|
431
|
+
this._activeTab === CameraSourceTypes.VIDEO &&
|
|
428
432
|
(status === 'play' ||
|
|
429
433
|
status === 'stop' ||
|
|
430
434
|
status === 'retake' ||
|
|
@@ -461,28 +465,28 @@ export class CameraSource extends UploaderBlock {
|
|
|
461
465
|
|
|
462
466
|
/**
|
|
463
467
|
* @private
|
|
464
|
-
* @param {
|
|
468
|
+
* @param {CameraMode} tabId
|
|
465
469
|
*/
|
|
466
470
|
_handleActiveTab = (tabId) => {
|
|
467
471
|
this.ref.switcher.querySelectorAll('button').forEach((/** @type {HTMLElement} */ btn) => {
|
|
468
472
|
btn.classList.toggle('uc-active', btn.getAttribute('data-id') === tabId);
|
|
469
473
|
});
|
|
470
474
|
|
|
471
|
-
if (tabId ===
|
|
475
|
+
if (tabId === CameraSourceTypes.PHOTO) {
|
|
472
476
|
this.set$({
|
|
473
477
|
currentIcon: 'camera-full',
|
|
474
478
|
audioSelectHidden: true,
|
|
475
|
-
|
|
479
|
+
audioToggleMicrophoneHidden: true,
|
|
476
480
|
});
|
|
477
481
|
}
|
|
478
482
|
|
|
479
|
-
if (tabId ===
|
|
483
|
+
if (tabId === CameraSourceTypes.VIDEO) {
|
|
480
484
|
this.set$({
|
|
481
485
|
currentTimelineIcon: 'play',
|
|
482
486
|
currentIcon: 'video-camera-full',
|
|
483
487
|
|
|
484
|
-
audioSelectHidden: !this.cfg.enableAudioRecording || this.
|
|
485
|
-
|
|
488
|
+
audioSelectHidden: !this.cfg.enableAudioRecording || this._audioDevices.length <= 1,
|
|
489
|
+
audioToggleMicrophoneHidden: !this.cfg.enableAudioRecording,
|
|
486
490
|
});
|
|
487
491
|
}
|
|
488
492
|
|
|
@@ -556,6 +560,11 @@ export class CameraSource extends UploaderBlock {
|
|
|
556
560
|
});
|
|
557
561
|
};
|
|
558
562
|
|
|
563
|
+
/** @private */
|
|
564
|
+
get _cameraModes() {
|
|
565
|
+
return stringToArray(this.cfg.cameraModes);
|
|
566
|
+
}
|
|
567
|
+
|
|
559
568
|
/**
|
|
560
569
|
* @private
|
|
561
570
|
* @param {'granted' | 'denied' | 'prompt'} state
|
|
@@ -563,19 +572,20 @@ export class CameraSource extends UploaderBlock {
|
|
|
563
572
|
_setPermissionsState = debounce((state) => {
|
|
564
573
|
this.classList.toggle('uc-initialized', state === 'granted');
|
|
565
574
|
|
|
566
|
-
const visibleAudio = this._activeTab ===
|
|
567
|
-
const currentIcon = this._activeTab ===
|
|
575
|
+
const visibleAudio = this._activeTab === CameraSourceTypes.VIDEO && this.cfg.enableAudioRecording;
|
|
576
|
+
const currentIcon = this._activeTab === CameraSourceTypes.PHOTO ? 'camera-full' : 'video-camera-full';
|
|
568
577
|
|
|
569
578
|
if (state === 'granted') {
|
|
570
579
|
this.set$({
|
|
571
580
|
videoHidden: false,
|
|
572
581
|
cameraHidden: false,
|
|
573
|
-
tabCameraHidden:
|
|
582
|
+
tabCameraHidden: !this._cameraModes.includes(CameraSourceTypes.PHOTO),
|
|
583
|
+
tabVideoHidden: !this._cameraModes.includes(CameraSourceTypes.VIDEO),
|
|
574
584
|
messageHidden: true,
|
|
575
585
|
timerHidden: true,
|
|
576
586
|
|
|
577
587
|
currentIcon,
|
|
578
|
-
|
|
588
|
+
audioToggleMicrophoneHidden: !visibleAudio,
|
|
579
589
|
audioSelectHidden: !visibleAudio,
|
|
580
590
|
});
|
|
581
591
|
} else if (state === 'prompt') {
|
|
@@ -596,8 +606,8 @@ export class CameraSource extends UploaderBlock {
|
|
|
596
606
|
videoHidden: true,
|
|
597
607
|
messageHidden: false,
|
|
598
608
|
|
|
599
|
-
tabCameraHidden:
|
|
600
|
-
tabVideoHidden: !this.
|
|
609
|
+
tabCameraHidden: !this._cameraModes.includes(CameraSourceTypes.PHOTO),
|
|
610
|
+
tabVideoHidden: !this._cameraModes.includes(CameraSourceTypes.VIDEO),
|
|
601
611
|
|
|
602
612
|
cameraActionsHidden: true,
|
|
603
613
|
|
|
@@ -709,14 +719,14 @@ export class CameraSource extends UploaderBlock {
|
|
|
709
719
|
try {
|
|
710
720
|
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
711
721
|
|
|
712
|
-
this.
|
|
722
|
+
this._cameraDevices = devices
|
|
713
723
|
.filter((device) => device.kind === 'videoinput')
|
|
714
724
|
.map((device, index) => ({
|
|
715
725
|
text: device.label.trim() || `${this.l10n('caption-camera')} ${index + 1}`,
|
|
716
726
|
value: device.deviceId,
|
|
717
727
|
}));
|
|
718
728
|
|
|
719
|
-
this.
|
|
729
|
+
this._audioDevices =
|
|
720
730
|
this.cfg.enableAudioRecording &&
|
|
721
731
|
devices
|
|
722
732
|
.filter((device) => device.kind === 'audioinput')
|
|
@@ -725,21 +735,21 @@ export class CameraSource extends UploaderBlock {
|
|
|
725
735
|
value: device.deviceId,
|
|
726
736
|
}));
|
|
727
737
|
|
|
728
|
-
if (this.
|
|
738
|
+
if (this._cameraDevices.length > 1) {
|
|
729
739
|
this.set$({
|
|
730
|
-
cameraSelectOptions: this.
|
|
740
|
+
cameraSelectOptions: this._cameraDevices,
|
|
731
741
|
cameraSelectHidden: false,
|
|
732
742
|
});
|
|
733
743
|
}
|
|
734
|
-
this._selectedCameraId = this.
|
|
744
|
+
this._selectedCameraId = this._cameraDevices[0]?.value;
|
|
735
745
|
|
|
736
|
-
if (this.
|
|
746
|
+
if (this._audioDevices.length > 1) {
|
|
737
747
|
this.set$({
|
|
738
|
-
audioSelectOptions: this.
|
|
748
|
+
audioSelectOptions: this._audioDevices,
|
|
739
749
|
audioSelectHidden: false,
|
|
740
750
|
});
|
|
741
751
|
}
|
|
742
|
-
this._selectedAudioId = this.
|
|
752
|
+
this._selectedAudioId = this._audioDevices[0]?.value;
|
|
743
753
|
} catch (error) {
|
|
744
754
|
console.log('Failed to get devices', error);
|
|
745
755
|
}
|
|
@@ -749,6 +759,8 @@ export class CameraSource extends UploaderBlock {
|
|
|
749
759
|
await this._permissionAccess();
|
|
750
760
|
await this._requestDeviceAccess();
|
|
751
761
|
await this._capture();
|
|
762
|
+
|
|
763
|
+
this._handleCameraModes(this._cameraModes);
|
|
752
764
|
};
|
|
753
765
|
|
|
754
766
|
_onDeactivate = async () => {
|
|
@@ -765,6 +777,17 @@ export class CameraSource extends UploaderBlock {
|
|
|
765
777
|
this._stopCapture();
|
|
766
778
|
};
|
|
767
779
|
|
|
780
|
+
/** @param {CameraMode[]} cameraModes */
|
|
781
|
+
_handleCameraModes = (cameraModes) => {
|
|
782
|
+
this.$.tabVideoHidden = !cameraModes.includes(CameraSourceTypes.VIDEO);
|
|
783
|
+
this.$.tabCameraHidden = !cameraModes.includes(CameraSourceTypes.PHOTO);
|
|
784
|
+
|
|
785
|
+
const defaultTab = cameraModes[0];
|
|
786
|
+
if (!this._activeTab || !cameraModes.includes(this._activeTab)) {
|
|
787
|
+
this._handleActiveTab(defaultTab);
|
|
788
|
+
}
|
|
789
|
+
};
|
|
790
|
+
|
|
768
791
|
initCallback() {
|
|
769
792
|
super.initCallback();
|
|
770
793
|
this.registerActivity(this.activityType, {
|
|
@@ -777,21 +800,14 @@ export class CameraSource extends UploaderBlock {
|
|
|
777
800
|
});
|
|
778
801
|
|
|
779
802
|
this.subConfigValue('enableAudioRecording', (val) => {
|
|
780
|
-
this.$.
|
|
803
|
+
this.$.audioToggleMicrophoneHidden = !val;
|
|
781
804
|
this.$.audioSelectDisabled = !val;
|
|
782
805
|
});
|
|
783
806
|
|
|
784
|
-
this.subConfigValue('
|
|
785
|
-
this
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
this.subConfigValue('defaultCameraMode', (val) => {
|
|
789
|
-
if (this.cfg.enableVideoRecording) {
|
|
790
|
-
this._handleActiveTab(val);
|
|
791
|
-
return;
|
|
792
|
-
}
|
|
793
|
-
|
|
794
|
-
this._handleActiveTab('photo');
|
|
807
|
+
this.subConfigValue('cameraModes', (val) => {
|
|
808
|
+
if (!this.isActivityActive) return;
|
|
809
|
+
const cameraModes = deserializeCsv(val);
|
|
810
|
+
this._handleCameraModes(cameraModes);
|
|
795
811
|
});
|
|
796
812
|
}
|
|
797
813
|
|
|
@@ -810,24 +826,6 @@ export class CameraSource extends UploaderBlock {
|
|
|
810
826
|
}
|
|
811
827
|
}
|
|
812
828
|
|
|
813
|
-
CameraSource.types = Object.freeze({
|
|
814
|
-
PHOTO: 'photo',
|
|
815
|
-
VIDEO: 'video',
|
|
816
|
-
});
|
|
817
|
-
|
|
818
|
-
CameraSource.events = Object.freeze({
|
|
819
|
-
IDLE: 'idle',
|
|
820
|
-
SHOT: 'shot',
|
|
821
|
-
|
|
822
|
-
PLAY: 'play',
|
|
823
|
-
PAUSE: 'pause',
|
|
824
|
-
RESUME: 'resume',
|
|
825
|
-
STOP: 'stop',
|
|
826
|
-
|
|
827
|
-
RETAKE: 'retake',
|
|
828
|
-
ACCEPT: 'accept',
|
|
829
|
-
});
|
|
830
|
-
|
|
831
829
|
CameraSource.template = /* HTML */ `
|
|
832
830
|
<uc-activity-header>
|
|
833
831
|
<button type="button" class="uc-mini-btn" set="onclick: *historyBack" l10n="@title:back">
|
|
@@ -882,7 +880,7 @@ CameraSource.template = /* HTML */ `
|
|
|
882
880
|
<button
|
|
883
881
|
data-id="video"
|
|
884
882
|
type="button"
|
|
885
|
-
class="uc-switch
|
|
883
|
+
class="uc-switch uc-mini-btn"
|
|
886
884
|
set="onclick: onClickTab; @hidden: tabVideoHidden"
|
|
887
885
|
>
|
|
888
886
|
<uc-icon name="video-camera"></uc-icon>
|
|
@@ -909,8 +907,8 @@ CameraSource.template = /* HTML */ `
|
|
|
909
907
|
</button>
|
|
910
908
|
|
|
911
909
|
<div class="uc-select">
|
|
912
|
-
<button class="uc-mini-btn uc-btn-microphone" set="onclick: onToggleAudio; @hidden:
|
|
913
|
-
<uc-icon set="@name:
|
|
910
|
+
<button class="uc-mini-btn uc-btn-microphone" set="onclick: onToggleAudio; @hidden: audioToggleMicrophoneHidden;">
|
|
911
|
+
<uc-icon set="@name:toggleMicrophoneIcon"></uc-icon>
|
|
914
912
|
</button>
|
|
915
913
|
|
|
916
914
|
<uc-select
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const CameraSourceTypes: Readonly<{
|
|
2
|
+
PHOTO: "photo";
|
|
3
|
+
VIDEO: "video";
|
|
4
|
+
}>;
|
|
5
|
+
export const CameraSourceEvents: Readonly<{
|
|
6
|
+
IDLE: "idle";
|
|
7
|
+
SHOT: "shot";
|
|
8
|
+
PLAY: "play";
|
|
9
|
+
PAUSE: "pause";
|
|
10
|
+
RESUME: "resume";
|
|
11
|
+
STOP: "stop";
|
|
12
|
+
RETAKE: "retake";
|
|
13
|
+
ACCEPT: "accept";
|
|
14
|
+
}>;
|
|
15
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["constants.js"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const CameraSourceTypes = Object.freeze({
|
|
2
|
+
PHOTO: 'photo',
|
|
3
|
+
VIDEO: 'video',
|
|
4
|
+
});
|
|
5
|
+
|
|
6
|
+
export const CameraSourceEvents = Object.freeze({
|
|
7
|
+
IDLE: 'idle',
|
|
8
|
+
SHOT: 'shot',
|
|
9
|
+
|
|
10
|
+
PLAY: 'play',
|
|
11
|
+
PAUSE: 'pause',
|
|
12
|
+
RESUME: 'resume',
|
|
13
|
+
STOP: 'stop',
|
|
14
|
+
|
|
15
|
+
RETAKE: 'retake',
|
|
16
|
+
ACCEPT: 'accept',
|
|
17
|
+
});
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { deserializeCsv } from '../../../utils/comma-separated.js';
|
|
4
4
|
import { ALL_TABS } from '../toolbar-constants.js';
|
|
5
5
|
|
|
6
6
|
/** @param {string} tabs */
|
|
7
7
|
export const parseTabs = (tabs) => {
|
|
8
8
|
if (!tabs) return ALL_TABS;
|
|
9
|
-
const tabList =
|
|
9
|
+
const tabList = deserializeCsv(tabs).filter((tab) => ALL_TABS.includes(tab));
|
|
10
10
|
if (tabList.length === 0) {
|
|
11
11
|
return ALL_TABS;
|
|
12
12
|
}
|