sanity-plugin-mux-input 1.1.0

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.
Files changed (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +86 -0
  3. package/build/actions/assets.js +37 -0
  4. package/build/actions/assets.js.map +1 -0
  5. package/build/actions/secrets.js +125 -0
  6. package/build/actions/secrets.js.map +1 -0
  7. package/build/actions/upload.js +280 -0
  8. package/build/actions/upload.js.map +1 -0
  9. package/build/clients/SanityClient.js +19 -0
  10. package/build/clients/SanityClient.js.map +1 -0
  11. package/build/clients/upChunkObservable.js +66 -0
  12. package/build/clients/upChunkObservable.js.map +1 -0
  13. package/build/components/FileInputButton.js +84 -0
  14. package/build/components/FileInputButton.js.map +1 -0
  15. package/build/components/Input.css +30 -0
  16. package/build/components/Input.js +823 -0
  17. package/build/components/Input.js.map +1 -0
  18. package/build/components/MuxLogo.js +19 -0
  19. package/build/components/MuxLogo.js.map +1 -0
  20. package/build/components/Preview.css +16 -0
  21. package/build/components/Preview.js +95 -0
  22. package/build/components/Preview.js.map +1 -0
  23. package/build/components/SelectAsset.css +56 -0
  24. package/build/components/SelectAsset.js +162 -0
  25. package/build/components/SelectAsset.js.map +1 -0
  26. package/build/components/Setup.css +7 -0
  27. package/build/components/Setup.js +311 -0
  28. package/build/components/Setup.js.map +1 -0
  29. package/build/components/UploadPlaceholder.css +81 -0
  30. package/build/components/UploadPlaceholder.js +92 -0
  31. package/build/components/UploadPlaceholder.js.map +1 -0
  32. package/build/components/Uploader.css +28 -0
  33. package/build/components/Uploader.js +534 -0
  34. package/build/components/Uploader.js.map +1 -0
  35. package/build/components/Video.css +21 -0
  36. package/build/components/Video.js +360 -0
  37. package/build/components/Video.js.map +1 -0
  38. package/build/config.js +17 -0
  39. package/build/config.js.map +1 -0
  40. package/build/index.js +22 -0
  41. package/build/index.js.map +1 -0
  42. package/build/schema/mux.video.js +41 -0
  43. package/build/schema/mux.video.js.map +1 -0
  44. package/build/schema/mux.videoAsset.js +29 -0
  45. package/build/schema/mux.videoAsset.js.map +1 -0
  46. package/build/util/extractFiles.js +70 -0
  47. package/build/util/extractFiles.js.map +1 -0
  48. package/build/util/formatTime.js +28 -0
  49. package/build/util/formatTime.js.map +1 -0
  50. package/build/util/generateJwt.js +30 -0
  51. package/build/util/generateJwt.js.map +1 -0
  52. package/build/util/getPosterSrc.js +46 -0
  53. package/build/util/getPosterSrc.js.map +1 -0
  54. package/build/util/getStoryboardSrc.js +26 -0
  55. package/build/util/getStoryboardSrc.js.map +1 -0
  56. package/build/util/getVideoSrc.js +23 -0
  57. package/build/util/getVideoSrc.js.map +1 -0
  58. package/config.dist.json +3 -0
  59. package/package.json +85 -0
  60. package/sanity.json +16 -0
@@ -0,0 +1,823 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _ui = require("@sanity/ui");
9
+
10
+ var _pluginIcon = _interopRequireDefault(require("part:@sanity/base/plugin-icon"));
11
+
12
+ var _preview = require("part:@sanity/base/preview");
13
+
14
+ var _content = _interopRequireDefault(require("part:@sanity/components/dialogs/content"));
15
+
16
+ var _fullscreen = _interopRequireDefault(require("part:@sanity/components/dialogs/fullscreen"));
17
+
18
+ var _default2 = _interopRequireDefault(require("part:@sanity/components/formfields/default"));
19
+
20
+ var _spinner = _interopRequireDefault(require("part:@sanity/components/loading/spinner"));
21
+
22
+ var _formBuilder = require("part:@sanity/form-builder");
23
+
24
+ var _patchEvent = _interopRequireWildcard(require("part:@sanity/form-builder/patch-event"));
25
+
26
+ var _react = _interopRequireWildcard(require("react"));
27
+
28
+ var _rxjs = require("rxjs");
29
+
30
+ var _operators = require("rxjs/operators");
31
+
32
+ var _assets = require("../actions/assets");
33
+
34
+ var _secrets = require("../actions/secrets");
35
+
36
+ var _SanityClient = _interopRequireDefault(require("../clients/SanityClient"));
37
+
38
+ var _getPosterSrc = _interopRequireDefault(require("../util/getPosterSrc"));
39
+
40
+ var _Input = _interopRequireDefault(require("./Input.css"));
41
+
42
+ var _MuxLogo = _interopRequireDefault(require("./MuxLogo"));
43
+
44
+ var _SelectAsset = _interopRequireDefault(require("./SelectAsset"));
45
+
46
+ var _Setup = _interopRequireDefault(require("./Setup"));
47
+
48
+ var _Uploader = _interopRequireDefault(require("./Uploader"));
49
+
50
+ var _Video = _interopRequireDefault(require("./Video"));
51
+
52
+ var _config = _interopRequireDefault(require("../config"));
53
+
54
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
55
+
56
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
57
+
58
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
59
+
60
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
61
+
62
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
63
+
64
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
65
+
66
+ var NOOP = () => {
67
+ /* intentional noop */
68
+ };
69
+
70
+ var cachedSecrets = {
71
+ token: null,
72
+ secretKey: null,
73
+ enableSignedUrls: false,
74
+ signingKeyId: null,
75
+ signingKeyPrivate: null
76
+ };
77
+
78
+ function validateSecrets(secrets) {
79
+ if (!secrets.token || !secrets.secretKey) return false;
80
+ return true;
81
+ }
82
+
83
+ function getSecrets() {
84
+ if (cachedSecrets.token) {
85
+ return Promise.resolve({
86
+ isInitialSetup: true,
87
+ needsSetup: false,
88
+ secrets: cachedSecrets
89
+ });
90
+ }
91
+
92
+ return (0, _secrets.fetchSecrets)().then(_ref => {
93
+ var secrets = _ref.secrets,
94
+ exists = _ref.exists;
95
+ cachedSecrets.token = secrets.token;
96
+ cachedSecrets.secretKey = secrets.secretKey;
97
+ cachedSecrets.enableSignedUrls = secrets.enableSignedUrls;
98
+ cachedSecrets.signingKeyId = secrets.signingKeyId;
99
+ cachedSecrets.signingKeyPrivate = secrets.signingKeyPrivate;
100
+ return {
101
+ isInitialSetup: !exists,
102
+ needsSetup: !validateSecrets(cachedSecrets),
103
+ secrets: cachedSecrets
104
+ };
105
+ });
106
+ }
107
+
108
+ var _default = (0, _formBuilder.withDocument)(class MuxVideoInput extends _react.Component {
109
+ constructor(_props) {
110
+ super(_props);
111
+
112
+ _defineProperty(this, "state", {
113
+ assetDocument: null,
114
+ confirmRemove: false,
115
+ deleteOnMuxChecked: false,
116
+ deleteAssetDocumentChecked: true,
117
+ error: null,
118
+ hasFocus: false,
119
+ isInitialSetup: true,
120
+ isLoading: 'secrets',
121
+ needsSetup: true,
122
+ secrets: null,
123
+ isSigned: false,
124
+ showSetup: false,
125
+ showBrowser: false,
126
+ videoReadyToPlay: false,
127
+ thumbLoading: false
128
+ });
129
+
130
+ _defineProperty(this, "focus", () => {
131
+ this.handleFocus();
132
+ });
133
+
134
+ _defineProperty(this, "handleFocus", () => {
135
+ this.setState({
136
+ hasFocus: true
137
+ });
138
+ });
139
+
140
+ _defineProperty(this, "handleBlur", () => {
141
+ this.setState({
142
+ hasFocus: false
143
+ });
144
+ });
145
+
146
+ _defineProperty(this, "pollMux", () => {
147
+ var assetDocument = this.state.assetDocument;
148
+
149
+ if (!assetDocument) {
150
+ return;
151
+ }
152
+
153
+ if (this.pollInterval) {
154
+ return;
155
+ }
156
+
157
+ this.pollInterval = setInterval(() => {
158
+ (0, _assets.getAsset)(assetDocument.assetId).then(response => {
159
+ var props = response.data; // TODO: consider a deep comparison on `props` with asset data and only patch only if it's changed
160
+
161
+ _SanityClient.default.patch(assetDocument._id).set({
162
+ status: props.status,
163
+ data: props
164
+ }).commit({
165
+ returnDocuments: false
166
+ });
167
+ }).catch(error => {
168
+ this.setState({
169
+ error
170
+ });
171
+ });
172
+ }, 2000);
173
+ });
174
+
175
+ _defineProperty(this, "handleSetupButtonClicked", event => {
176
+ this.setState(prevState => ({
177
+ showSetup: !prevState.showStetup
178
+ }));
179
+ });
180
+
181
+ _defineProperty(this, "handleSaveSetup", _ref2 => {
182
+ var token = _ref2.token,
183
+ secretKey = _ref2.secretKey,
184
+ enableSignedUrls = _ref2.enableSignedUrls,
185
+ signingKeyId = _ref2.signingKeyId,
186
+ signingKeyPrivate = _ref2.signingKeyPrivate;
187
+ cachedSecrets.token = token;
188
+ cachedSecrets.secretKey = secretKey;
189
+ cachedSecrets.enableSignedUrls = enableSignedUrls;
190
+ cachedSecrets.signingKeyId = signingKeyId;
191
+ cachedSecrets.signingKeyPrivate = signingKeyPrivate;
192
+ this.setState({
193
+ showSetup: false,
194
+ secrets: cachedSecrets,
195
+ needsSetup: !validateSecrets(cachedSecrets)
196
+ });
197
+ });
198
+
199
+ _defineProperty(this, "handleCancelSaveSetup", () => {
200
+ this.setState({
201
+ showSetup: false
202
+ });
203
+ });
204
+
205
+ _defineProperty(this, "handleOnUploadComplete", result => {
206
+ var onChange = this.props.onChange;
207
+ var _id = result._id;
208
+ onChange(_patchEvent.default.from([(0, _patchEvent.setIfMissing)({
209
+ asset: {
210
+ _ref: _id
211
+ }
212
+ }, []), (0, _patchEvent.set)({
213
+ _ref: _id
214
+ }, ['asset'])]));
215
+ this.setState({
216
+ assetDocument: result.document
217
+ }, () => {
218
+ this.setupAssetListener();
219
+ });
220
+ });
221
+
222
+ _defineProperty(this, "handleRemoveVideoButtonClicked", event => {
223
+ event.preventDefault();
224
+ event.stopPropagation();
225
+ this.setState({
226
+ confirmRemove: true
227
+ });
228
+ });
229
+
230
+ _defineProperty(this, "handleRemoveVideo", () => {
231
+ var assetDocument = this.state.assetDocument;
232
+ this.setState({
233
+ isLoading: true
234
+ });
235
+
236
+ var unsetAsset = () => {
237
+ return new Promise((resolve, reject) => {
238
+ this.setState({
239
+ assetDocument: null,
240
+ confirmRemove: false,
241
+ isLoading: false
242
+ }, () => {
243
+ if (this.state.deleteOnMuxChecked || this.state.deleteAssetDocumentChecked) {
244
+ return _SanityClient.default.patch(this.props.document._id).unset(['video']).commit({
245
+ returnDocuments: false
246
+ }).then(() => {
247
+ if (!assetDocument) {
248
+ return resolve();
249
+ }
250
+
251
+ return _SanityClient.default.delete(assetDocument._id).then(() => {
252
+ resolve();
253
+ }).catch(error => {
254
+ reject(error);
255
+ });
256
+ });
257
+ }
258
+
259
+ return this.props.onChange(_patchEvent.default.from((0, _patchEvent.unset)()));
260
+ });
261
+ });
262
+ };
263
+
264
+ return unsetAsset().then(() => {
265
+ if (this.state.deleteOnMuxChecked) {
266
+ return (0, _assets.deleteAsset)(assetDocument.assetId).catch(error => {
267
+ this.setState({
268
+ error
269
+ });
270
+ });
271
+ }
272
+
273
+ return true;
274
+ }).catch(error => {
275
+ this.setState({
276
+ error
277
+ });
278
+ });
279
+ });
280
+
281
+ _defineProperty(this, "handleCancelRemove", event => {
282
+ this.setState({
283
+ confirmRemove: false,
284
+ deleteOnMuxChecked: true,
285
+ deleteAssetDocumentChecked: true
286
+ });
287
+ });
288
+
289
+ _defineProperty(this, "handleDeleteOnMuxCheckBoxClicked", event => {
290
+ this.setState(prevState => ({
291
+ deleteOnMuxChecked: !prevState.deleteOnMuxChecked
292
+ }));
293
+ });
294
+
295
+ _defineProperty(this, "handleDeleteAssetDocumentCheckBoxClicked", event => {
296
+ this.setState(prevState => ({
297
+ deleteAssetDocumentChecked: !prevState.deleteAssetDocumentChecked
298
+ }));
299
+ });
300
+
301
+ _defineProperty(this, "handleOpenThumb", event => {
302
+ if (!this.videoPlayer.current) {
303
+ return;
304
+ }
305
+
306
+ var _this$state = this.state,
307
+ assetDocument = _this$state.assetDocument,
308
+ isSigned = _this$state.isSigned;
309
+ var currentTime = this.videoPlayer.current.getVideoElement().currentTime;
310
+ var options = {
311
+ time: assetDocument.thumbTime,
312
+ width: 320,
313
+ height: 320,
314
+ fitMode: 'crop',
315
+ isSigned,
316
+ signingKeyId: cachedSecrets.signingKeyId,
317
+ signingKeyPrivate: cachedSecrets.signingKeyPrivate
318
+ };
319
+ var thumb = (0, _getPosterSrc.default)(assetDocument.playbackId, options);
320
+ var newThumb = (0, _getPosterSrc.default)(assetDocument.playbackId, _objectSpread(_objectSpread({}, options), {}, {
321
+ time: currentTime
322
+ }));
323
+ this.setState({
324
+ thumb,
325
+ newThumb
326
+ });
327
+ });
328
+
329
+ _defineProperty(this, "handleSetThumbButton", event => {
330
+ if (!this.videoPlayer.current) {
331
+ return;
332
+ }
333
+
334
+ this.setState({
335
+ thumbLoading: true
336
+ });
337
+ var _this$state2 = this.state,
338
+ assetDocument = _this$state2.assetDocument,
339
+ isSigned = _this$state2.isSigned;
340
+ var currentTime = this.videoPlayer.current.getVideoElement().currentTime;
341
+
342
+ _SanityClient.default.patch(assetDocument._id).set({
343
+ thumbTime: currentTime
344
+ }).commit({
345
+ returnDocuments: false
346
+ }).then(response => {
347
+ var options = {
348
+ time: currentTime,
349
+ width: 320,
350
+ height: 320,
351
+ fitMode: 'crop',
352
+ isSigned,
353
+ signingKeyId: cachedSecrets.signingKeyId,
354
+ signingKeyPrivate: cachedSecrets.signingKeyPrivate
355
+ };
356
+ var thumb = (0, _getPosterSrc.default)(assetDocument.playbackId, options);
357
+ this.setState({
358
+ thumb,
359
+ thumbLoading: false
360
+ });
361
+ }).catch(error => {
362
+ this.setState({
363
+ error,
364
+ thumbLoading: false
365
+ });
366
+ });
367
+ });
368
+
369
+ _defineProperty(this, "handleErrorClose", event => {
370
+ if (event) {
371
+ event.preventDefault();
372
+ }
373
+
374
+ this.setState({
375
+ error: null
376
+ });
377
+ });
378
+
379
+ _defineProperty(this, "handleCloseThumbPreview", event => {
380
+ this.setState({
381
+ thumb: null
382
+ });
383
+ });
384
+
385
+ _defineProperty(this, "handleBrowseButton", event => {
386
+ this.setState({
387
+ showBrowser: true
388
+ });
389
+ });
390
+
391
+ _defineProperty(this, "handleCloseBrowser", event => {
392
+ this.setState({
393
+ showBrowser: false
394
+ });
395
+ });
396
+
397
+ _defineProperty(this, "handleSelectAsset", asset => {
398
+ var onChange = this.props.onChange;
399
+ onChange(_patchEvent.default.from([(0, _patchEvent.setIfMissing)({
400
+ asset: {
401
+ _ref: asset._id
402
+ }
403
+ }, []), (0, _patchEvent.set)({
404
+ _ref: asset._id
405
+ }, ['asset'])]));
406
+ this.setState({
407
+ showBrowser: false,
408
+ assetDocument: asset
409
+ }, () => {
410
+ this.setupAssetListener();
411
+ });
412
+ });
413
+
414
+ _defineProperty(this, "handleVideoReadyToPlay", () => {
415
+ this.setState({
416
+ videoReadyToPlay: true
417
+ });
418
+ });
419
+
420
+ getSecrets().then(_ref3 => {
421
+ var _props$value;
422
+
423
+ var secrets = _ref3.secrets,
424
+ isInitialSetup = _ref3.isInitialSetup,
425
+ needsSetup = _ref3.needsSetup;
426
+ this.setState({
427
+ secrets,
428
+ isInitialSetup,
429
+ needsSetup,
430
+ isLoading: (_props$value = _props.value) === null || _props$value === void 0 ? void 0 : _props$value.asset // If there is an asset continue loading
431
+
432
+ });
433
+ }).catch(error => this.setState({
434
+ error
435
+ }));
436
+ this.setupButton = /*#__PURE__*/_react.default.createRef();
437
+ this.pollInterval = null;
438
+ this.video = /*#__PURE__*/_react.default.createRef();
439
+ this.removeVideoButton = /*#__PURE__*/_react.default.createRef();
440
+ this.videoPlayer = /*#__PURE__*/_react.default.createRef();
441
+ }
442
+
443
+ componentDidMount() {
444
+ this.setupAssetListener();
445
+ }
446
+
447
+ componentWillUnmount() {
448
+ if (this.subscription) {
449
+ this.subscription.unsubscribe();
450
+ }
451
+
452
+ if (this.pollInterval) {
453
+ clearInterval(this.pollInterval);
454
+ this.pollInterval = null;
455
+ }
456
+ }
457
+
458
+ getAsset() {
459
+ var value = this.props.value;
460
+ return value ? value.asset : null;
461
+ }
462
+
463
+ setupAssetListener() {
464
+ if (this.subscription) {
465
+ this.subscription.unsubscribe();
466
+ }
467
+
468
+ this.setState({
469
+ videoReadyToPlay: false
470
+ });
471
+ var asset = this.getAsset();
472
+
473
+ if (!asset) {
474
+ return;
475
+ }
476
+
477
+ this.subscription = (0, _preview.observePaths)(asset, ['thumbTime', 'data', 'assetId', 'playbackId', 'status']).pipe((0, _operators.tap)(assetDocument => {
478
+ var _assetDocument$data, _assetDocument$data$s, _assetDocument$data2, _assetDocument$data2$, _assetDocument$data3, _assetDocument$data3$;
479
+
480
+ this.setState({
481
+ assetDocument
482
+ });
483
+
484
+ if (assetDocument && assetDocument.status === 'errored') {
485
+ clearInterval(this.pollInterval);
486
+ this.pollInterval = null; // eslint-disable-next-line no-warning-comments
487
+ // todo: use client.observable
488
+
489
+ return this.handleRemoveVideo().then(() => {
490
+ this.setState({
491
+ isLoading: false,
492
+ error: new Error(assetDocument.data.errors.messages.join(' '))
493
+ });
494
+ });
495
+ } // Poll MUX if it's preparing the main document or its own static renditions
496
+
497
+
498
+ if ((assetDocument === null || assetDocument === void 0 ? void 0 : assetDocument.status) === 'preparing' || (assetDocument === null || assetDocument === void 0 ? void 0 : (_assetDocument$data = assetDocument.data) === null || _assetDocument$data === void 0 ? void 0 : (_assetDocument$data$s = _assetDocument$data.static_renditions) === null || _assetDocument$data$s === void 0 ? void 0 : _assetDocument$data$s.status) === 'preparing') {
499
+ this.pollMux();
500
+ } // If MP4 support is enabled: MUX will prepare static_renditions only _after_ an asset
501
+ // has been successfully uploaded.
502
+ // A _ready_ asset doesn't mean static mp4s are generated and ready for use!
503
+ // In these cases, wait for `static_renditions.status === 'ready'` before clearing the poll interval.
504
+
505
+
506
+ if (assetDocument && assetDocument.status === 'ready') {
507
+ switch (_config.default.mp4_support) {
508
+ case 'standard':
509
+ if ((assetDocument === null || assetDocument === void 0 ? void 0 : (_assetDocument$data2 = assetDocument.data) === null || _assetDocument$data2 === void 0 ? void 0 : (_assetDocument$data2$ = _assetDocument$data2.static_renditions) === null || _assetDocument$data2$ === void 0 ? void 0 : _assetDocument$data2$.status) === 'ready') {
510
+ clearInterval(this.pollInterval);
511
+ this.pollInterval = null;
512
+ }
513
+
514
+ break;
515
+
516
+ case 'none':
517
+ default:
518
+ clearInterval(this.pollInterval);
519
+ this.pollInterval = null;
520
+ break;
521
+ }
522
+ } // eslint-disable-next-line camelcase
523
+
524
+
525
+ var isSigned = (assetDocument === null || assetDocument === void 0 ? void 0 : (_assetDocument$data3 = assetDocument.data) === null || _assetDocument$data3 === void 0 ? void 0 : (_assetDocument$data3$ = _assetDocument$data3.playback_ids[0]) === null || _assetDocument$data3$ === void 0 ? void 0 : _assetDocument$data3$.policy) === 'signed';
526
+ this.setState({
527
+ assetDocument,
528
+ isSigned,
529
+ isLoading: false
530
+ });
531
+ return (0, _rxjs.of)(assetDocument);
532
+ })).subscribe();
533
+ }
534
+
535
+ renderSetup() {
536
+ var secrets = this.state.secrets;
537
+ return /*#__PURE__*/_react.default.createElement(_ui.Dialog, {
538
+ header: "Mux API Credentials",
539
+ width: 1,
540
+ onClose: this.handleCancelSaveSetup,
541
+ zOffset: 1000
542
+ }, /*#__PURE__*/_react.default.createElement(_Setup.default, {
543
+ secrets: secrets || null,
544
+ onSave: this.handleSaveSetup,
545
+ onCancel: this.handleCancelSaveSetup
546
+ }));
547
+ }
548
+
549
+ renderSetupButton() {
550
+ var _this$state3 = this.state,
551
+ isLoading = _this$state3.isLoading,
552
+ showSetup = _this$state3.showSetup,
553
+ needsSetup = _this$state3.needsSetup;
554
+ var renderSetup = !isLoading && showSetup;
555
+ return /*#__PURE__*/_react.default.createElement("div", {
556
+ className: _Input.default.setupButtonContainer
557
+ }, /*#__PURE__*/_react.default.createElement(_ui.Button, {
558
+ tone: needsSetup ? 'critical' : 'positive',
559
+ mode: "bleed",
560
+ onClick: this.handleSetupButtonClicked,
561
+ icon: _pluginIcon.default,
562
+ padding: 3,
563
+ radius: 3,
564
+ "aria-label": "Set up Mux credentials"
565
+ }), renderSetup && this.renderSetup());
566
+ }
567
+
568
+ renderSetupNotice() {
569
+ var _this$state4 = this.state,
570
+ isLoading = _this$state4.isLoading,
571
+ isInitialSetup = _this$state4.isInitialSetup;
572
+
573
+ if (isLoading) {
574
+ return null;
575
+ }
576
+
577
+ return /*#__PURE__*/_react.default.createElement(_ui.Stack, {
578
+ padding: 4,
579
+ space: 5,
580
+ style: {
581
+ backgroundColor: '#efefefef',
582
+ borderRadius: 3
583
+ }
584
+ }, /*#__PURE__*/_react.default.createElement(_MuxLogo.default, null), /*#__PURE__*/_react.default.createElement(_ui.Stack, {
585
+ space: 4
586
+ }, isInitialSetup && /*#__PURE__*/_react.default.createElement(_ui.Text, null, "Looks like this is the first time you are using the Mux video plugin in this dataset. Great!"), /*#__PURE__*/_react.default.createElement(_ui.Text, null, "Before you can upload video, you must set your Mux credentials."), /*#__PURE__*/_react.default.createElement(_ui.Text, null, "Click the plugin button in the field title to open Setup.")));
587
+ } // eslint-disable-next-line complexity
588
+
589
+
590
+ renderAsset() {
591
+ var _this$state5 = this.state,
592
+ assetDocument = _this$state5.assetDocument,
593
+ isSigned = _this$state5.isSigned;
594
+ var renderAsset = !!assetDocument;
595
+
596
+ if (!renderAsset) {
597
+ return null;
598
+ }
599
+
600
+ var isSignedAlert = isSigned ? /*#__PURE__*/_react.default.createElement(_ui.Card, {
601
+ padding: 3,
602
+ radius: 2,
603
+ shadow: 1,
604
+ tone: "positive"
605
+ }, /*#__PURE__*/_react.default.createElement(_ui.Text, {
606
+ size: 1
607
+ }, "This Mux asset is using a signed url.")) : null;
608
+ return /*#__PURE__*/_react.default.createElement(_ui.Stack, {
609
+ space: 2,
610
+ marginBottom: 2
611
+ }, isSignedAlert, /*#__PURE__*/_react.default.createElement(_Video.default, {
612
+ assetDocument: assetDocument,
613
+ ref: this.videoPlayer,
614
+ onReady: this.handleVideoReadyToPlay,
615
+ onCancel: this.handleRemoveVideo
616
+ }));
617
+ }
618
+
619
+ renderVideoButtons() {
620
+ var _this$state6 = this.state,
621
+ assetDocument = _this$state6.assetDocument,
622
+ confirmRemove = _this$state6.confirmRemove;
623
+ var readOnly = this.props.readOnly;
624
+
625
+ if (assetDocument && assetDocument.status === 'ready' && !readOnly) {
626
+ return [/*#__PURE__*/_react.default.createElement(_ui.Button, {
627
+ key: "browse",
628
+ mode: "ghost",
629
+ tone: "primary",
630
+ onClick: this.handleBrowseButton,
631
+ text: "Browse"
632
+ }), /*#__PURE__*/_react.default.createElement(_ui.Button, {
633
+ key: "thumbnail",
634
+ mode: "ghost",
635
+ tone: "primary",
636
+ disabled: this.state.videoReadyToPlay === false,
637
+ onClick: this.handleOpenThumb,
638
+ text: "Thumbnail"
639
+ }), /*#__PURE__*/_react.default.createElement(_ui.Button, {
640
+ key: "remove",
641
+ ref: this.removeVideoButton,
642
+ onClick: confirmRemove ? NOOP : this.handleRemoveVideoButtonClicked,
643
+ mode: "ghost",
644
+ tone: "critical",
645
+ text: "Remove"
646
+ })];
647
+ }
648
+
649
+ return null;
650
+ }
651
+
652
+ renderBrowser() {
653
+ return /*#__PURE__*/_react.default.createElement(_fullscreen.default, {
654
+ title: "Select video",
655
+ onClose: this.handleCloseBrowser,
656
+ isOpen: true
657
+ }, /*#__PURE__*/_react.default.createElement(_SelectAsset.default, {
658
+ onSelect: this.handleSelectAsset
659
+ }));
660
+ }
661
+
662
+ renderError() {
663
+ var error = this.state.error;
664
+
665
+ if (!error) {
666
+ return null;
667
+ }
668
+
669
+ return /*#__PURE__*/_react.default.createElement(_ui.Dialog, {
670
+ header: "Error",
671
+ onClose: this.handleErrorClose
672
+ }, /*#__PURE__*/_react.default.createElement(_content.default, {
673
+ size: "small"
674
+ }, error.message));
675
+ }
676
+
677
+ render() {
678
+ var _assetDocument$data4, _assetDocument$data4$, _assetDocument$data4$2;
679
+
680
+ var _this$props = this.props,
681
+ type = _this$props.type,
682
+ level = _this$props.level,
683
+ markers = _this$props.markers;
684
+ var _this$state7 = this.state,
685
+ isLoading = _this$state7.isLoading,
686
+ secrets = _this$state7.secrets,
687
+ hasFocus = _this$state7.hasFocus,
688
+ needsSetup = _this$state7.needsSetup,
689
+ error = _this$state7.error,
690
+ showBrowser = _this$state7.showBrowser,
691
+ confirmRemove = _this$state7.confirmRemove,
692
+ thumb = _this$state7.thumb,
693
+ assetDocument = _this$state7.assetDocument;
694
+ var cssAspectRatio = (assetDocument === null || assetDocument === void 0 ? void 0 : (_assetDocument$data4 = assetDocument.data) === null || _assetDocument$data4 === void 0 ? void 0 : (_assetDocument$data4$ = _assetDocument$data4.aspect_ratio) === null || _assetDocument$data4$ === void 0 ? void 0 : (_assetDocument$data4$2 = _assetDocument$data4$.split(':')) === null || _assetDocument$data4$2 === void 0 ? void 0 : _assetDocument$data4$2.join('/')) || 'auto';
695
+ return /*#__PURE__*/_react.default.createElement(_ui.ThemeProvider, {
696
+ theme: _ui.studioTheme
697
+ }, /*#__PURE__*/_react.default.createElement(_ui.Box, {
698
+ style: {
699
+ position: 'relative'
700
+ }
701
+ }, /*#__PURE__*/_react.default.createElement(_ui.Flex, {
702
+ align: "center",
703
+ justify: "space-between"
704
+ }, /*#__PURE__*/_react.default.createElement(_default2.default, {
705
+ label: type.title,
706
+ markers: markers,
707
+ description: type.description,
708
+ level: level,
709
+ className: _Input.default.formField
710
+ }), this.renderSetupButton()), isLoading === 'secrets' && /*#__PURE__*/_react.default.createElement(_ui.Box, {
711
+ marginBottom: 2
712
+ }, /*#__PURE__*/_react.default.createElement(_ui.Inline, {
713
+ align: "center",
714
+ space: 2
715
+ }, /*#__PURE__*/_react.default.createElement(_spinner.default, {
716
+ inline: true
717
+ }), /*#__PURE__*/_react.default.createElement(_ui.Text, {
718
+ size: 1
719
+ }, "Fetching credentials"))), needsSetup && this.renderSetupNotice(), !needsSetup && /*#__PURE__*/_react.default.createElement(_Uploader.default, {
720
+ buttons: this.renderVideoButtons(),
721
+ hasFocus: hasFocus // eslint-disable-next-line react/jsx-handler-names
722
+ ,
723
+ onBlur: this.blur // eslint-disable-next-line react/jsx-handler-names
724
+ ,
725
+ onFocus: this.focus,
726
+ onSetupButtonClicked: this.handleSetupButtonClicked,
727
+ onUploadComplete: this.handleOnUploadComplete,
728
+ secrets: secrets,
729
+ onBrowse: this.handleBrowseButton
730
+ }, this.renderAsset()), thumb && /*#__PURE__*/_react.default.createElement(_ui.Dialog, {
731
+ header: "Thumbnail",
732
+ zOffset: 1000,
733
+ onClose: this.handleCloseThumbPreview
734
+ }, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
735
+ space: 3,
736
+ padding: 3
737
+ }, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
738
+ space: 3
739
+ }, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
740
+ space: 2
741
+ }, /*#__PURE__*/_react.default.createElement(_ui.Text, {
742
+ size: 1,
743
+ weight: "semibold"
744
+ }, "Current:"), /*#__PURE__*/_react.default.createElement("img", {
745
+ style: {
746
+ maxWidth: '100%',
747
+ borderRadius: '0.1875rem',
748
+ display: 'block',
749
+ aspectRatio: cssAspectRatio
750
+ },
751
+ src: this.state.thumb,
752
+ width: 400
753
+ })), /*#__PURE__*/_react.default.createElement(_ui.Stack, {
754
+ space: 2
755
+ }, /*#__PURE__*/_react.default.createElement(_ui.Text, {
756
+ size: 1,
757
+ weight: "semibold"
758
+ }, "New:"), /*#__PURE__*/_react.default.createElement("img", {
759
+ style: {
760
+ maxWidth: '100%',
761
+ borderRadius: '0.1875rem',
762
+ display: 'block',
763
+ aspectRatio: cssAspectRatio
764
+ },
765
+ src: this.state.newThumb,
766
+ width: 400
767
+ }))), /*#__PURE__*/_react.default.createElement(_ui.Button, {
768
+ key: "thumbnail",
769
+ mode: "ghost",
770
+ tone: "primary",
771
+ disabled: this.state.videoReadyToPlay === false,
772
+ onClick: this.handleSetThumbButton,
773
+ loading: this.state.thumbLoading,
774
+ text: "Set new thumbnail"
775
+ }))), showBrowser && this.renderBrowser(), confirmRemove && /*#__PURE__*/_react.default.createElement(_ui.Dialog, {
776
+ header: "Remove video",
777
+ zOffset: 1000,
778
+ onClose: this.handleCancelRemove
779
+ }, /*#__PURE__*/_react.default.createElement(_ui.Box, {
780
+ padding: 4
781
+ }, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
782
+ space: 3
783
+ }, /*#__PURE__*/_react.default.createElement(_ui.Flex, {
784
+ align: "center"
785
+ }, /*#__PURE__*/_react.default.createElement(_ui.Checkbox, {
786
+ checked: this.state.deleteOnMuxChecked,
787
+ onChange: this.handleDeleteOnMuxCheckBoxClicked
788
+ }), /*#__PURE__*/_react.default.createElement(_ui.Text, {
789
+ style: {
790
+ margin: '0 10px'
791
+ }
792
+ }, "Delete asset on Mux")), /*#__PURE__*/_react.default.createElement(_ui.Flex, {
793
+ align: "center"
794
+ }, /*#__PURE__*/_react.default.createElement(_ui.Checkbox, {
795
+ disabled: this.state.deleteOnMuxChecked,
796
+ checked: this.state.deleteOnMuxChecked || this.state.deleteAssetDocumentChecked,
797
+ onChange: this.handleDeleteAssetDocumentCheckBoxClicked
798
+ }), /*#__PURE__*/_react.default.createElement(_ui.Text, {
799
+ style: {
800
+ margin: '0 10px'
801
+ }
802
+ }, "Delete video from dataset")), /*#__PURE__*/_react.default.createElement(_ui.Grid, {
803
+ columns: 2,
804
+ gap: 2
805
+ }, /*#__PURE__*/_react.default.createElement(_ui.Button, {
806
+ mode: "ghost",
807
+ tone: "default",
808
+ text: "Cancel",
809
+ onClick: this.handleCancelRemove,
810
+ loading: !!isLoading
811
+ }), /*#__PURE__*/_react.default.createElement(_ui.Button, {
812
+ mode: "default",
813
+ tone: "critical",
814
+ text: "Remove",
815
+ onClick: this.handleRemoveVideo,
816
+ loading: !!isLoading
817
+ }))))), error && this.renderError()));
818
+ }
819
+
820
+ });
821
+
822
+ exports.default = _default;
823
+ //# sourceMappingURL=Input.js.map