@micromag/core 0.4.69 → 0.4.74

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/lib/hooks.js DELETED
@@ -1,2535 +0,0 @@
1
- 'use strict';
2
-
3
- var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
4
- var react = require('react');
5
- var core = require('@micromag/core');
6
- var utils = require('@micromag/core/utils');
7
- var _objectSpread = require('@babel/runtime/helpers/objectSpread2');
8
- var core$1 = require('@react-spring/core');
9
- var react$1 = require('@use-gesture/react');
10
- var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
11
- var forms = require('@folklore/forms');
12
- var _defineProperty = require('@babel/runtime/helpers/defineProperty');
13
- var classNames = require('classnames');
14
- var screenfull = require('screenfull');
15
- var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
16
- var isArray = require('lodash/isArray');
17
- var isObject = require('lodash/isObject');
18
- var raf = require('raf');
19
- var createDebug = require('debug');
20
- var contexts = require('@micromag/core/contexts');
21
- var isEmpty = require('lodash/isEmpty');
22
- var hooks = require('@folklore/hooks');
23
- var cssMediaquery = require('css-mediaquery');
24
- var dayjs = require('dayjs');
25
- var isString = require('lodash/isString');
26
- var reactIntl = require('react-intl');
27
- var clamp = require('lodash/clamp');
28
-
29
- function useActivityDetector() {
30
- var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
31
- _ref$element = _ref.element,
32
- providedElement = _ref$element === void 0 ? null : _ref$element,
33
- _ref$disabled = _ref.disabled,
34
- disabled = _ref$disabled === void 0 ? false : _ref$disabled,
35
- _ref$timeout = _ref.timeout,
36
- timeoutDelay = _ref$timeout === void 0 ? 2000 : _ref$timeout;
37
- var ref = react.useRef(providedElement);
38
- var _useState = react.useState(false),
39
- _useState2 = _slicedToArray(_useState, 2),
40
- detected = _useState2[0],
41
- setDetected = _useState2[1];
42
- var detectedRef = react.useRef(detected);
43
- if (providedElement !== null && providedElement !== ref.current) {
44
- ref.current = providedElement;
45
- }
46
- react.useEffect(function () {
47
- var _ref$current = ref.current,
48
- element = _ref$current === void 0 ? null : _ref$current;
49
- if (element === null || disabled) {
50
- return function () {};
51
- }
52
- var timeout = null;
53
- function onActivity() {
54
- if (timeout !== null) {
55
- clearTimeout(timeout);
56
- timeout = null;
57
- }
58
- if (!detectedRef.current) {
59
- detectedRef.current = true;
60
- setDetected(true);
61
- }
62
- timeout = setTimeout(function () {
63
- detectedRef.current = false;
64
- setDetected(false);
65
- }, timeoutDelay);
66
- }
67
- element.addEventListener('keydown', onActivity);
68
- element.addEventListener('mousedown', onActivity);
69
- element.addEventListener('mousemove', onActivity);
70
- element.addEventListener('mouseup', onActivity);
71
- element.addEventListener('pointerdown', onActivity);
72
- element.addEventListener('pointermove', onActivity);
73
- element.addEventListener('pointerup', onActivity);
74
- element.addEventListener('touchmove', onActivity);
75
- element.addEventListener('touchstart', onActivity);
76
- return function () {
77
- if (timeout !== null) {
78
- clearTimeout(timeout);
79
- timeout = null;
80
- }
81
- element.removeEventListener('keydown', onActivity);
82
- element.removeEventListener('mousedown', onActivity);
83
- element.removeEventListener('mousemove', onActivity);
84
- element.removeEventListener('mouseup', onActivity);
85
- element.removeEventListener('pointerdown', onActivity);
86
- element.removeEventListener('pointermove', onActivity);
87
- element.removeEventListener('pointerup', onActivity);
88
- element.removeEventListener('touchmove', onActivity);
89
- element.removeEventListener('touchstart', onActivity);
90
- };
91
- }, [providedElement, disabled, timeoutDelay]);
92
- return {
93
- ref: ref,
94
- detected: detected
95
- };
96
- }
97
-
98
- var useAnimationFrame = function useAnimationFrame(onFrame) {
99
- var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
100
- _ref$disabled = _ref.disabled,
101
- disabled = _ref$disabled === void 0 ? false : _ref$disabled;
102
- var requestRef = react.useRef(null);
103
- var startTimeRef = react.useRef(null);
104
- var _callback = function callback(time) {
105
- if (!startTimeRef.current) {
106
- startTimeRef.current = time;
107
- }
108
- var progress = time - startTimeRef.current;
109
- onFrame(progress);
110
- requestRef.current = requestAnimationFrame(_callback);
111
- };
112
- react.useEffect(function () {
113
- if (!disabled) {
114
- requestRef.current = requestAnimationFrame(_callback);
115
- }
116
- return function () {
117
- if (requestRef.current !== null) {
118
- cancelAnimationFrame(requestRef.current);
119
- }
120
- };
121
- }, [disabled]);
122
- };
123
-
124
- var useFormattedDate = function useFormattedDate() {
125
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
126
- var _ref = options || {},
127
- _ref$format = _ref.format,
128
- format = _ref$format === void 0 ? null : _ref$format,
129
- _ref$showToday = _ref.showToday,
130
- showToday = _ref$showToday === void 0 ? true : _ref$showToday;
131
- var intl = reactIntl.useIntl();
132
- var today = dayjs();
133
- return react.useCallback(function (date) {
134
- var dateToFormat = isString(date) ? dayjs(date) : date;
135
- if (showToday && dateToFormat.format('YYYY-MM-DD') === today.format('YYYY-MM-DD')) {
136
- return intl.formatMessage({
137
- id: "v4Qtl9",
138
- defaultMessage: [{
139
- "type": 0,
140
- "value": "Today"
141
- }]
142
- });
143
- }
144
- return intl.formatDate(dayjs(date).toDate(), _objectSpread({
145
- year: 'numeric',
146
- month: 'long',
147
- day: '2-digit'
148
- }, format));
149
- }, [today, showToday, format]);
150
- };
151
- var useFormattedTime = function useFormattedTime() {
152
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
153
- var _ref2 = options || {},
154
- _ref2$format = _ref2.format,
155
- format = _ref2$format === void 0 ? null : _ref2$format,
156
- _ref2$showNow = _ref2.showNow,
157
- showNow = _ref2$showNow === void 0 ? true : _ref2$showNow,
158
- _ref2$timeGap = _ref2.timeGap,
159
- timeGap = _ref2$timeGap === void 0 ? 2 : _ref2$timeGap;
160
- var intl = reactIntl.useIntl();
161
- var now = dayjs();
162
- return react.useCallback(function (date) {
163
- var dateToFormat = isString(date) ? dayjs(date) : date;
164
- if (showNow && dateToFormat.format('YYYY-MM-DD') === now.format('YYYY-MM-DD') && dateToFormat.hour() === now.hour() && dateToFormat.minute() > now.minute() - timeGap && dateToFormat.minute() < now.minute() + timeGap) {
165
- return intl.formatMessage({
166
- id: "3na7F8",
167
- defaultMessage: [{
168
- "type": 0,
169
- "value": "Now"
170
- }]
171
- });
172
- }
173
- return intl.formatTime(dateToFormat.toDate(), _objectSpread({
174
- hour: 'numeric',
175
- minute: 'numeric'
176
- }, format));
177
- }, [now, showNow, timeGap, format]);
178
- };
179
-
180
- var useDebounced = function useDebounced(handler, watchedValue) {
181
- var delay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 300;
182
- react.useEffect(function () {
183
- var timeoutHandler = setTimeout(function () {
184
- if (handler !== null) {
185
- handler(watchedValue);
186
- }
187
- }, delay);
188
- return function () {
189
- clearTimeout(timeoutHandler);
190
- };
191
- }, [watchedValue, delay]);
192
- };
193
-
194
- var eventsManager$1 = typeof document !== 'undefined' ? new core.EventsManager(document) : null;
195
- var useDocumentEvent = utils.createUseEvent(eventsManager$1);
196
-
197
- function useDragProgress(_ref) {
198
- var wantedProgress = _ref.progress,
199
- _ref$onTap = _ref.onTap,
200
- onTap = _ref$onTap === void 0 ? null : _ref$onTap,
201
- _ref$disabled = _ref.disabled,
202
- disabled = _ref$disabled === void 0 ? false : _ref$disabled,
203
- _ref$dragDisabled = _ref.dragDisabled,
204
- dragDisabled = _ref$dragDisabled === void 0 ? false : _ref$dragDisabled,
205
- _ref$computeProgress = _ref.computeProgress,
206
- computeProgress = _ref$computeProgress === void 0 ? null : _ref$computeProgress,
207
- _ref$onProgress = _ref.onProgress,
208
- onProgress = _ref$onProgress === void 0 ? null : _ref$onProgress,
209
- _ref$onPointerDown = _ref.onPointerDown,
210
- onPointerDown = _ref$onPointerDown === void 0 ? null : _ref$onPointerDown,
211
- _ref$onResolve = _ref.onResolve,
212
- _onResolve = _ref$onResolve === void 0 ? null : _ref$onResolve,
213
- _ref$onScroll = _ref.onScroll,
214
- onScroll = _ref$onScroll === void 0 ? null : _ref$onScroll,
215
- _ref$springParams = _ref.springParams,
216
- springParams = _ref$springParams === void 0 ? undefined : _ref$springParams,
217
- _ref$dragOptions = _ref.dragOptions,
218
- dragOptions = _ref$dragOptions === void 0 ? {
219
- filterTaps: true
220
- } : _ref$dragOptions;
221
- var draggingRef = react.useRef(false);
222
- var progressRef = react.useRef(wantedProgress);
223
- var wantedProgressRef = react.useRef(wantedProgress);
224
- if (wantedProgress !== wantedProgressRef.current) {
225
- wantedProgressRef.current = wantedProgress;
226
- }
227
- var _useState = react.useState(false),
228
- _useState2 = _slicedToArray(_useState, 2),
229
- dragging = _useState2[0],
230
- setDragging = _useState2[1];
231
- var _useState3 = react.useState(0),
232
- _useState4 = _slicedToArray(_useState3, 2),
233
- direction = _useState4[0],
234
- setDirection = _useState4[1];
235
-
236
- // In react-spring v10, useSpring(fn) without deps stores the initial update and
237
- // re-applies it via ctrl.start() in a layout effect on EVERY render, resetting the
238
- // spring to its initial value. To prevent this, we pass a dummy SpringRef as `ref`
239
- // in the props — when ctrl.ref is set, the layout effect queues updates instead of
240
- // starting them, so our imperative api.start() calls are not overridden.
241
- var imperativeRef = core$1.useSpringRef();
242
- var _useSpring = core$1.useSpring(function () {
243
- return _objectSpread({
244
- ref: imperativeRef,
245
- from: {
246
- progress: wantedProgress
247
- }
248
- }, springParams);
249
- }),
250
- _useSpring2 = _slicedToArray(_useSpring, 2),
251
- progress = _useSpring2[0].progress,
252
- api = _useSpring2[1];
253
- var onDrag = react.useCallback(function (gestureState) {
254
- var active = gestureState.active,
255
- tap = gestureState.tap;
256
- if (disabled) {
257
- draggingRef.current = false;
258
- return;
259
- }
260
- if (tap) {
261
- draggingRef.current = false;
262
- if (onTap !== null) onTap(gestureState);
263
- return;
264
- }
265
- if (dragDisabled) {
266
- draggingRef.current = false;
267
- return;
268
- }
269
- var newProgress = computeProgress(gestureState);
270
- draggingRef.current = active;
271
- setDirection(newProgress < wantedProgressRef.current ? -1 : 1);
272
- progressRef.current = newProgress;
273
- if (active !== dragging) {
274
- setDragging(active);
275
- }
276
- api.start(_objectSpread({
277
- progress: newProgress,
278
- immediate: active,
279
- onResolve: !active ? function (e) {
280
- setDirection(0);
281
- if (_onResolve !== null) _onResolve(e);
282
- } : function (e) {
283
- if (_onResolve !== null) _onResolve(e);
284
- }
285
- }, springParams));
286
- if (onProgress !== null) {
287
- onProgress(newProgress, gestureState);
288
- }
289
- }, [setDragging, disabled, onTap, computeProgress, dragging, onProgress, _onResolve]);
290
- var bind = react$1.useGesture({
291
- onDrag: onDrag,
292
- onPointerDown: onPointerDown !== null ? onPointerDown : function () {},
293
- onScroll: onScroll !== null ? onScroll : function () {}
294
- }, {
295
- drag: dragOptions
296
- });
297
- react.useEffect(function () {
298
- if (!draggingRef.current && wantedProgress !== progressRef.current) {
299
- setDirection(wantedProgress < progressRef.current ? -1 : 1);
300
- progressRef.current = wantedProgress;
301
- api.start(_objectSpread({
302
- progress: wantedProgress,
303
- immediate: disabled,
304
- onResolve: function onResolve(e) {
305
- setDirection(0);
306
- if (_onResolve !== null) _onResolve(e);
307
- }
308
- }, springParams));
309
- }
310
- }, [wantedProgress, disabled]);
311
- var transitioning = react.useMemo(function () {
312
- return wantedProgress !== progress.get() || progress.isAnimating || dragging;
313
- }, [wantedProgress, progress.isAnimating, dragging]);
314
- return {
315
- transitioning: transitioning,
316
- bind: bind,
317
- dragging: dragging,
318
- progress: progress,
319
- direction: direction
320
- };
321
- }
322
-
323
- var _excluded$3 = ["fields", "injectInFields"],
324
- _excluded2 = ["fields"];
325
-
326
- // eslint-disable-next-line
327
- var useForm = function useForm() {
328
- var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
329
- _ref$fields = _ref.fields,
330
- providedFields = _ref$fields === void 0 ? [] : _ref$fields,
331
- _ref$injectInFields = _ref.injectInFields,
332
- injectInFields = _ref$injectInFields === void 0 ? false : _ref$injectInFields,
333
- opts = _objectWithoutProperties(_ref, _excluded$3);
334
- var fieldsNames = react.useMemo(function () {
335
- return providedFields.length > 0 ? providedFields.map(function (_ref2) {
336
- var name = _ref2.name;
337
- return name;
338
- }) : [];
339
- }, [providedFields]);
340
- var _useBaseForm = forms.useForm(_objectSpread({
341
- fields: fieldsNames
342
- }, opts)),
343
- fields = _useBaseForm.fields,
344
- form = _objectWithoutProperties(_useBaseForm, _excluded2);
345
- return _objectSpread(_objectSpread({}, form), {}, {
346
- fields: injectInFields ? providedFields.map(function (it) {
347
- return _objectSpread(_objectSpread({}, it), fields[it.name] || null);
348
- }) : providedFields
349
- });
350
- };
351
-
352
- var useFormTransition = function useFormTransition() {
353
- var initialPaths = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
354
- var initialStyles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
355
- var paths = initialPaths || [];
356
- var styles = initialStyles || {};
357
- var lastPageRef = react.useRef(paths || []);
358
- var direction = react.useMemo(function () {
359
- var currentPartsCount = paths.length;
360
- if (lastPageRef.current) {
361
- var previousPartsCount = lastPageRef.current.length;
362
- lastPageRef.current = paths || [];
363
- return currentPartsCount > previousPartsCount ? 'right' : 'left';
364
- }
365
- return null;
366
- }, [paths]);
367
- var name = react.useMemo(function () {
368
- return {
369
- enter: classNames(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, styles.enterRight, direction === 'right'), styles.enterLeft, direction === 'left'), styles.enterTop, direction === 'top'), styles.enterBottom, direction === 'bottom')) || 'none',
370
- enterActive: classNames(_defineProperty(_defineProperty({}, styles.enterActiveHorizontal, direction === 'left' || direction === 'right'), styles.enterActiveVertical, direction === 'top' || direction === 'bottom')) || 'none',
371
- leave: styles.leave || 'none',
372
- leaveActive: classNames(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, styles.leaveActiveRight, direction === 'right'), styles.leaveActiveLeft, direction === 'left'), styles.leaveActiveTop, direction === 'top'), styles.leaveActiveBottom, direction === 'bottom')) || 'none'
373
- };
374
- }, [direction]);
375
- return {
376
- direction: direction,
377
- name: name,
378
- timeout: direction === 'left' || direction === 'right' ? 300 : 10
379
- };
380
- };
381
-
382
- var useFullscreen = function useFullscreen(element) {
383
- var enabled = screenfull.isEnabled;
384
- var _useState = react.useState(false),
385
- _useState2 = _slicedToArray(_useState, 2),
386
- active = _useState2[0],
387
- setActive = _useState2[1];
388
- var fullscreen = react.useCallback(function () {
389
- if (screenfull.isEnabled) {
390
- if (typeof element !== 'undefined' && element !== null) {
391
- screenfull.request(element);
392
- } else {
393
- screenfull.request();
394
- }
395
- }
396
- }, [element]);
397
- var unFullscreen = react.useCallback(function () {
398
- if (screenfull.isEnabled) {
399
- screenfull.exit();
400
- }
401
- }, []);
402
- var toggle = react.useCallback(function () {
403
- if (!active) {
404
- fullscreen();
405
- } else {
406
- unFullscreen();
407
- }
408
- }, [active, fullscreen, unFullscreen]);
409
- react.useEffect(function () {
410
- var onChange = function onChange() {
411
- setActive(screenfull.isFullscreen);
412
- };
413
- if (screenfull.isEnabled) {
414
- screenfull.on('change', onChange);
415
- }
416
- return function () {
417
- if (screenfull.isEnabled) {
418
- screenfull.off('change', onChange);
419
- }
420
- };
421
- }, []);
422
- return {
423
- toggle: toggle,
424
- fullscreen: fullscreen,
425
- unFullscreen: unFullscreen,
426
- active: active,
427
- enabled: enabled
428
- };
429
- };
430
-
431
- var _excluded$2 = ["entry"];
432
- var buildThresholdArray = function buildThresholdArray() {
433
- return [0, 1.0];
434
- };
435
- var observersCache = new Map();
436
- var getOptionsKey = function getOptionsKey(_ref) {
437
- var _ref$root = _ref.root,
438
- root = _ref$root === void 0 ? null : _ref$root,
439
- rootMargin = _ref.rootMargin,
440
- _ref$threshold = _ref.threshold,
441
- threshold = _ref$threshold === void 0 ? null : _ref$threshold;
442
- return "root_".concat(root, "_rootMargin_").concat(rootMargin || null, "_threshold_").concat(threshold);
443
- };
444
- var createObserver = function createObserver(Observer) {
445
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
446
- var subscribers = [];
447
- var addSubscriber = function addSubscriber(element, callback) {
448
- var currentSubscriber = subscribers.find(function (it) {
449
- return it.element === element;
450
- }) || null;
451
- if (currentSubscriber !== null) {
452
- return subscribers.map(function (it) {
453
- return it.element === element && it.callbacks.indexOf(callback) === -1 ? _objectSpread(_objectSpread({}, it), {}, {
454
- callbacks: [].concat(_toConsumableArray(it.callbacks), [callback])
455
- }) : it;
456
- }).filter(function (it) {
457
- return it.callbacks.length > 0;
458
- });
459
- }
460
- return [].concat(_toConsumableArray(subscribers), [{
461
- element: element,
462
- callbacks: [callback]
463
- }]);
464
- };
465
- var removeSubscriber = function removeSubscriber(element, callback) {
466
- return subscribers.map(function (it) {
467
- return it.element === element ? _objectSpread(_objectSpread({}, it), {}, {
468
- callbacks: it.callbacks.filter(function (subCallback) {
469
- return subCallback !== callback;
470
- })
471
- }) : it;
472
- }).filter(function (it) {
473
- return it.callbacks.length > 0;
474
- });
475
- };
476
- var onUpdate = function onUpdate(entries) {
477
- entries.forEach(function (entry) {
478
- subscribers.forEach(function (_ref2) {
479
- var element = _ref2.element,
480
- callbacks = _ref2.callbacks;
481
- if (element === entry.target) {
482
- callbacks.forEach(function (callback) {
483
- callback(entry);
484
- });
485
- }
486
- });
487
- });
488
- };
489
- var observer = new Observer(onUpdate, options);
490
- var unsubscribe = function unsubscribe(element) {
491
- var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
492
- subscribers = removeSubscriber(element, callback);
493
- if (typeof observer.unobserve === 'undefined') {
494
- observer.disconnect();
495
- subscribers.forEach(function (subscriber) {
496
- observer.observe(subscriber.element);
497
- });
498
- return;
499
- }
500
- var currentSubscriber = subscribers.find(function (it) {
501
- return it.element === element;
502
- }) || null;
503
- if (currentSubscriber === null) {
504
- observer.unobserve(element);
505
- }
506
- };
507
- var subscribe = function subscribe(element, callback) {
508
- var currentSubscriber = subscribers.find(function (it) {
509
- return it.element === element;
510
- }) || null;
511
- subscribers = addSubscriber(element, callback);
512
- if (currentSubscriber === null) {
513
- observer.observe(element);
514
- }
515
- };
516
- return {
517
- subscribe: subscribe,
518
- unsubscribe: unsubscribe,
519
- observer: observer
520
- };
521
- };
522
- var getObserver = function getObserver(Observer) {
523
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
524
- var observerKey = getOptionsKey(options);
525
- if (!observersCache.has(Observer)) {
526
- observersCache.set(Observer, {});
527
- }
528
- var observers = observersCache.get(Observer);
529
- if (typeof observers[observerKey] === 'undefined') {
530
- observers[observerKey] = createObserver(Observer, options);
531
- observersCache.set(Observer, observers);
532
- }
533
- return observers[observerKey];
534
- };
535
- var useObserver = function useObserver(Observer) {
536
- var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
537
- var initialEntry = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
538
- var _ref3 = opts || {},
539
- _ref3$root = _ref3.root,
540
- root = _ref3$root === void 0 ? null : _ref3$root,
541
- _ref3$rootMargin = _ref3.rootMargin,
542
- rootMargin = _ref3$rootMargin === void 0 ? null : _ref3$rootMargin,
543
- _ref3$threshold = _ref3.threshold,
544
- threshold = _ref3$threshold === void 0 ? null : _ref3$threshold,
545
- _ref3$disabled = _ref3.disabled,
546
- disabled = _ref3$disabled === void 0 ? false : _ref3$disabled;
547
- var _useState = react.useState(initialEntry),
548
- _useState2 = _slicedToArray(_useState, 2),
549
- entry = _useState2[0],
550
- setEntry = _useState2[1];
551
- var nodeRef = react.useRef(null);
552
- var currentElement = react.useRef(null);
553
- var elementChanged = nodeRef.current !== currentElement.current;
554
- react.useEffect(function () {
555
- var nodeElement = nodeRef.current;
556
- var callback = function callback(newEntry) {
557
- return setEntry(function (prev) {
558
- // Avoid re-renders when ResizeObserver fires with unchanged dimensions
559
- if (prev !== null && prev !== void 0 && prev.contentRect && newEntry !== null && newEntry !== void 0 && newEntry.contentRect) {
560
- var p = prev.contentRect;
561
- var n = newEntry.contentRect;
562
- if (p.width === n.width && p.height === n.height) {
563
- return prev;
564
- }
565
- }
566
- return newEntry;
567
- });
568
- };
569
- var unsubscribe = null;
570
- if (nodeElement !== null) {
571
- var newOpts = {};
572
- if (root !== null) {
573
- newOpts.root = root;
574
- }
575
- if (rootMargin !== null) {
576
- newOpts.rootMargin = rootMargin;
577
- }
578
- if (threshold !== null) {
579
- newOpts.threshold = threshold;
580
- }
581
- var _getObserver = getObserver(Observer, newOpts),
582
- subscribe = _getObserver.subscribe,
583
- localUnsubscribe = _getObserver.unsubscribe;
584
- unsubscribe = localUnsubscribe;
585
- subscribe(nodeElement, callback);
586
- }
587
- currentElement.current = nodeElement;
588
- return function () {
589
- if (unsubscribe !== null) {
590
- unsubscribe(nodeElement, callback);
591
- }
592
- };
593
- }, [Observer, elementChanged, disabled, root, rootMargin, threshold]);
594
- return {
595
- ref: nodeRef,
596
- entry: entry
597
- };
598
- };
599
-
600
- /**
601
- * Intersection Observer
602
- */
603
- var thresholdArray = buildThresholdArray();
604
- var intersectionObserverInitialEntry = {
605
- target: null,
606
- time: null,
607
- isVisible: false,
608
- isIntersecting: false,
609
- intersectionRatio: 0,
610
- intersectionRect: null,
611
- boundingClientRect: null,
612
- rootBounds: null
613
- };
614
- var useIntersectionObserver = function useIntersectionObserver() {
615
- var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
616
- _ref4$root = _ref4.root,
617
- root = _ref4$root === void 0 ? null : _ref4$root,
618
- _ref4$rootMargin = _ref4.rootMargin,
619
- rootMargin = _ref4$rootMargin === void 0 ? '0px' : _ref4$rootMargin,
620
- _ref4$threshold = _ref4.threshold,
621
- threshold = _ref4$threshold === void 0 ? thresholdArray : _ref4$threshold,
622
- _ref4$disabled = _ref4.disabled,
623
- disabled = _ref4$disabled === void 0 ? false : _ref4$disabled;
624
- return useObserver(typeof window !== 'undefined' ? IntersectionObserver : null, {
625
- root: root,
626
- rootMargin: rootMargin,
627
- threshold: threshold,
628
- disabled: disabled
629
- }, intersectionObserverInitialEntry);
630
- };
631
-
632
- /**
633
- * Resize Observer
634
- */
635
- var resizeObserverInitialEntry = {
636
- target: null,
637
- contentRect: null,
638
- contentBoxSize: null,
639
- borderBoxSize: null
640
- };
641
- var useResizeObserver = function useResizeObserver() {
642
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
643
- var _ref5 = options || {},
644
- _ref5$disabled = _ref5.disabled,
645
- disabled = _ref5$disabled === void 0 ? false : _ref5$disabled;
646
- return useObserver(typeof window !== 'undefined' ? ResizeObserver : null, {
647
- disabled: disabled
648
- }, resizeObserverInitialEntry);
649
- };
650
- var useDimensionObserver = function useDimensionObserver() {
651
- var _useResizeObserver = useResizeObserver.apply(void 0, arguments),
652
- entry = _useResizeObserver.entry,
653
- rest = _objectWithoutProperties(_useResizeObserver, _excluded$2);
654
- var _ref6 = entry || {},
655
- _ref6$contentRect = _ref6.contentRect,
656
- contentRect = _ref6$contentRect === void 0 ? null : _ref6$contentRect,
657
- _ref6$borderBoxSize = _ref6.borderBoxSize,
658
- borderBoxSize = _ref6$borderBoxSize === void 0 ? null : _ref6$borderBoxSize;
659
- var _ref7 = contentRect || {},
660
- _ref7$width = _ref7.width,
661
- width = _ref7$width === void 0 ? 0 : _ref7$width,
662
- _ref7$height = _ref7.height,
663
- height = _ref7$height === void 0 ? 0 : _ref7$height;
664
- var _ref8 = isArray(borderBoxSize) ? borderBoxSize[0] || {} : borderBoxSize || {},
665
- _ref8$blockSize = _ref8.blockSize,
666
- blockSize = _ref8$blockSize === void 0 ? null : _ref8$blockSize,
667
- _ref8$inlineSize = _ref8.inlineSize,
668
- inlineSize = _ref8$inlineSize === void 0 ? null : _ref8$inlineSize;
669
- return _objectSpread(_objectSpread({}, rest), {}, {
670
- entry: entry,
671
- width: inlineSize || width,
672
- height: blockSize || height
673
- });
674
- };
675
-
676
- var useIsVisible = function useIsVisible() {
677
- var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
678
- rootMargin = _ref.rootMargin,
679
- _ref$persist = _ref.persist,
680
- persist = _ref$persist === void 0 ? false : _ref$persist,
681
- _ref$disabled = _ref.disabled,
682
- disabled = _ref$disabled === void 0 ? false : _ref$disabled;
683
- var _useIntersectionObser = useIntersectionObserver({
684
- rootMargin: rootMargin,
685
- disabled: disabled
686
- }),
687
- ref = _useIntersectionObser.ref,
688
- isIntersecting = _useIntersectionObser.entry.isIntersecting;
689
- var wasIntersecting = react.useRef(isIntersecting);
690
- if (isIntersecting && !wasIntersecting.current) {
691
- wasIntersecting.current = isIntersecting;
692
- }
693
- var isVisible = !persist && isIntersecting || persist && wasIntersecting.current;
694
- return {
695
- ref: ref,
696
- visible: isVisible
697
- };
698
- };
699
-
700
- var fontsMap = {
701
- loading: [],
702
- active: []
703
- };
704
- var isFontLoading = function isFontLoading(name) {
705
- return fontsMap.loading.indexOf(name) !== -1;
706
- };
707
- var isFontActive = function isFontActive(name) {
708
- return fontsMap.active.indexOf(name) !== -1;
709
- };
710
- var addFontLoading = function addFontLoading(name) {
711
- fontsMap.active = fontsMap.active.filter(function (it) {
712
- return it !== name;
713
- });
714
- fontsMap.loading = [].concat(_toConsumableArray(fontsMap.loading), [name]);
715
- };
716
- var removeFontLoading = function removeFontLoading(name) {
717
- fontsMap.loading = fontsMap.loading.filter(function (it) {
718
- return it !== name;
719
- });
720
- };
721
- var addFontActive = function addFontActive(name) {
722
- fontsMap.loading = fontsMap.loading.filter(function (it) {
723
- return it !== name;
724
- });
725
- fontsMap.active = [].concat(_toConsumableArray(fontsMap.active), [name]);
726
- };
727
- var useLoadedFonts = function useLoadedFonts(fonts) {
728
- var _useState = react.useState(false),
729
- _useState2 = _slicedToArray(_useState, 2),
730
- loaded = _useState2[0],
731
- setLoaded = _useState2[1];
732
- react.useEffect(function () {
733
- var config = fonts.reduce(function (newConfig, font) {
734
- var _ref = isObject(font) ? font : {
735
- type: 'system',
736
- name: font
737
- },
738
- type = _ref.type,
739
- name = _ref.name,
740
- _ref$variants = _ref.variants,
741
- variants = _ref$variants === void 0 ? [] : _ref$variants;
742
- if ((type === 'google' || type === 'custom') && !isFontLoading(name) && !isFontActive(name)) {
743
- return _objectSpread(_objectSpread({}, newConfig), {}, _defineProperty({}, type, {
744
- families: [].concat(_toConsumableArray(newConfig !== null ? (newConfig[type] || {}).families || [] : []), [type === 'google' ? [name, (variants || []).filter(function (it) {
745
- return it !== null;
746
- }).join(',')].filter(function (it) {
747
- return it !== null && it.length > 0;
748
- }).join(':') : [name, (variants !== null ? [{
749
- fvd: 'n4'
750
- }].concat(_toConsumableArray(variants)) : []).map(function (_ref2) {
751
- var _ref2$fvd = _ref2.fvd,
752
- fvd = _ref2$fvd === void 0 ? null : _ref2$fvd,
753
- _ref2$weight = _ref2.weight,
754
- weight = _ref2$weight === void 0 ? null : _ref2$weight,
755
- _ref2$style = _ref2.style,
756
- style = _ref2$style === void 0 ? null : _ref2$style;
757
- return fvd || [style, weight].filter(function (it) {
758
- return it !== null;
759
- }).map(function (it) {
760
- return "".concat(it).substr(0, 1);
761
- }).join('');
762
- }).filter(function (it) {
763
- return it !== null && it.length > 0;
764
- }).join(',')].filter(function (it) {
765
- return it !== null && it.length > 0;
766
- }).join(':')])
767
- }));
768
- }
769
- return newConfig;
770
- }, null);
771
- var hasConfig = config !== null;
772
- if (hasConfig && typeof window !== 'undefined') {
773
- import('webfontloader').then(function (_ref3) {
774
- var WebFont = _ref3["default"];
775
- return WebFont.load(_objectSpread(_objectSpread({}, config), {}, {
776
- timeout: 3000,
777
- active: function active() {
778
- return setLoaded(true);
779
- },
780
- fontloading: function fontloading(name) {
781
- return addFontLoading(name);
782
- },
783
- fontactive: function fontactive(name) {
784
- return addFontActive(name);
785
- },
786
- fontinactive: function fontinactive(name) {
787
- return removeFontLoading(name);
788
- }
789
- }));
790
- });
791
- } else {
792
- setLoaded(true);
793
- }
794
- }, [fonts, setLoaded]);
795
- return {
796
- loaded: loaded
797
- };
798
- };
799
-
800
- var isTouchEvent = function isTouchEvent(event) {
801
- return 'touches' in event;
802
- };
803
- var preventDefault = function preventDefault(event) {
804
- if (!isTouchEvent(event)) return false;
805
- if (event.touches.length < 2 && event.preventDefault) {
806
- event.preventDefault();
807
- }
808
- return false;
809
- };
810
- var preventClickDefault = function preventClickDefault(e) {
811
- if (e.preventDefault) {
812
- e.preventDefault();
813
- }
814
- if (e.stopPropagation) {
815
- e.stopPropagation();
816
- }
817
- };
818
- var useLongPress = function useLongPress() {
819
- var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
820
- _ref$onLongPress = _ref.onLongPress,
821
- onLongPress = _ref$onLongPress === void 0 ? null : _ref$onLongPress,
822
- _ref$onLongPressStart = _ref.onLongPressStart,
823
- onLongPressStart = _ref$onLongPressStart === void 0 ? null : _ref$onLongPressStart,
824
- _ref$onLongPressEnd = _ref.onLongPressEnd,
825
- onLongPressEnd = _ref$onLongPressEnd === void 0 ? null : _ref$onLongPressEnd,
826
- _ref$onClick = _ref.onClick,
827
- onClick = _ref$onClick === void 0 ? null : _ref$onClick,
828
- _ref$shouldPreventDef = _ref.shouldPreventDefault,
829
- shouldPreventDefault = _ref$shouldPreventDef === void 0 ? true : _ref$shouldPreventDef,
830
- _ref$shouldStopPropag = _ref.shouldStopPropagation,
831
- shouldStopPropagation = _ref$shouldStopPropag === void 0 ? false : _ref$shouldStopPropag,
832
- _ref$preventClick = _ref.preventClick,
833
- preventClick = _ref$preventClick === void 0 ? false : _ref$preventClick,
834
- _ref$delay = _ref.delay,
835
- delay = _ref$delay === void 0 ? 350 : _ref$delay;
836
- var _useState = react.useState(false),
837
- _useState2 = _slicedToArray(_useState, 2),
838
- pressed = _useState2[0],
839
- setPressed = _useState2[1];
840
- var _useState3 = react.useState(false),
841
- _useState4 = _slicedToArray(_useState3, 2),
842
- triggered = _useState4[0],
843
- setTriggered = _useState4[1];
844
- var timeout = react.useRef(null);
845
- var target = react.useRef(null);
846
- var start = react.useCallback(function (event, props) {
847
- setPressed(true);
848
- if (shouldStopPropagation) {
849
- event.stopPropagation();
850
- }
851
- if (event.target !== null) {
852
- target.current = event.target;
853
- }
854
- if (onLongPressStart !== null) {
855
- onLongPressStart(event, props);
856
- }
857
- timeout.current = setTimeout(function () {
858
- if (shouldPreventDefault && target.current !== null) {
859
- target.current.addEventListener('touchend', preventDefault, {
860
- passive: false
861
- });
862
- target.current.addEventListener('click', preventClickDefault, {
863
- passive: false
864
- });
865
- }
866
- setTriggered(true);
867
- if (onLongPress !== null) {
868
- onLongPress(event, props);
869
- setPressed(false);
870
- }
871
- timeout.current = null;
872
- }, delay);
873
- }, [onLongPress, onLongPressStart, delay, setPressed, shouldPreventDefault]);
874
- var clear = react.useCallback(function (event, props) {
875
- var shouldTriggerClick = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
876
- setPressed(false);
877
- if (preventClick && triggered) {
878
- return;
879
- }
880
- if (timeout.current !== null) {
881
- clearTimeout(timeout.current);
882
- } else if (shouldPreventDefault && target.current !== null) {
883
- preventDefault(event);
884
- target.current.removeEventListener('touchend', preventDefault);
885
- setTimeout(function () {
886
- target.current.removeEventListener('click', preventClickDefault);
887
- }, 10);
888
- }
889
- if (shouldTriggerClick && !triggered && onClick !== null) {
890
- onClick(props);
891
- }
892
- onLongPressEnd(event, props, triggered);
893
- setTriggered(false);
894
- }, [shouldPreventDefault, onClick, onLongPressEnd, setPressed, triggered, preventClick]);
895
- var bind = function bind() {
896
- var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
897
- return {
898
- onMouseDown: function onMouseDown(e) {
899
- return start(e, props);
900
- },
901
- onTouchStart: function onTouchStart(e) {
902
- return start(e, props);
903
- },
904
- onMouseUp: function onMouseUp(e) {
905
- return clear(e, props);
906
- },
907
- onMouseLeave: function onMouseLeave(e) {
908
- return clear(e, props, false);
909
- },
910
- onTouchEnd: function onTouchEnd(e) {
911
- return clear(e, props);
912
- }
913
- };
914
- };
915
- return {
916
- bind: bind,
917
- pressed: pressed,
918
- triggered: triggered
919
- };
920
- };
921
-
922
- var progressSteps = [0.1, 0.25, 0.5, 0.75, 0.9];
923
- var useMediaApi = function useMediaApi() {
924
- var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
925
- _ref$url = _ref.url,
926
- url = _ref$url === void 0 ? null : _ref$url,
927
- _ref$onTimeUpdate = _ref.onTimeUpdate,
928
- onTimeUpdate = _ref$onTimeUpdate === void 0 ? null : _ref$onTimeUpdate,
929
- _ref$onProgressStep = _ref.onProgressStep,
930
- onProgressStep = _ref$onProgressStep === void 0 ? null : _ref$onProgressStep,
931
- _ref$onDurationChange = _ref.onDurationChange,
932
- onDurationChange = _ref$onDurationChange === void 0 ? null : _ref$onDurationChange,
933
- _ref$onVolumeChange = _ref.onVolumeChange,
934
- onVolumeChange = _ref$onVolumeChange === void 0 ? null : _ref$onVolumeChange,
935
- _ref$onPlay = _ref.onPlay,
936
- onPlay = _ref$onPlay === void 0 ? null : _ref$onPlay,
937
- _ref$onPause = _ref.onPause,
938
- onPause = _ref$onPause === void 0 ? null : _ref$onPause,
939
- _ref$onEnded = _ref.onEnded,
940
- onEnded = _ref$onEnded === void 0 ? null : _ref$onEnded,
941
- _ref$onSeeked = _ref.onSeeked,
942
- onSeeked = _ref$onSeeked === void 0 ? null : _ref$onSeeked,
943
- _ref$onSuspend = _ref.onSuspend,
944
- onSuspend = _ref$onSuspend === void 0 ? null : _ref$onSuspend,
945
- _ref$onLoadStart = _ref.onLoadStart,
946
- onLoadStart = _ref$onLoadStart === void 0 ? null : _ref$onLoadStart,
947
- _ref$onCanPlayThough = _ref.onCanPlayThough,
948
- onCanPlayThough = _ref$onCanPlayThough === void 0 ? null : _ref$onCanPlayThough,
949
- _ref$onCanPlay = _ref.onCanPlay,
950
- onCanPlay = _ref$onCanPlay === void 0 ? null : _ref$onCanPlay,
951
- _ref$onLoadedData = _ref.onLoadedData,
952
- onLoadedData = _ref$onLoadedData === void 0 ? null : _ref$onLoadedData,
953
- _ref$onLoadedMetadata = _ref.onLoadedMetadata,
954
- onLoadedMetadata = _ref$onLoadedMetadata === void 0 ? null : _ref$onLoadedMetadata;
955
- var ref = react.useRef(null);
956
- var _useState = react.useState(null),
957
- _useState2 = _slicedToArray(_useState, 2),
958
- currentTime = _useState2[0],
959
- setCurrentTime = _useState2[1];
960
- var _useState3 = react.useState(null),
961
- _useState4 = _slicedToArray(_useState3, 2),
962
- duration = _useState4[0],
963
- setDuration = _useState4[1];
964
- var _useState5 = react.useState(false),
965
- _useState6 = _slicedToArray(_useState5, 2),
966
- playing = _useState6[0],
967
- setPlaying = _useState6[1];
968
- var _useState7 = react.useState(false),
969
- _useState8 = _slicedToArray(_useState7, 2),
970
- ready = _useState8[0],
971
- setReady = _useState8[1];
972
- var _useState9 = react.useState(false),
973
- _useState0 = _slicedToArray(_useState9, 2),
974
- dataReady = _useState0[0],
975
- setDataReady = _useState0[1];
976
- var _useState1 = react.useState(true),
977
- _useState10 = _slicedToArray(_useState1, 2),
978
- initialPlay = _useState10[0],
979
- setInitialPlay = _useState10[1];
980
- var _useState11 = react.useState(false),
981
- _useState12 = _slicedToArray(_useState11, 2),
982
- suspended = _useState12[0],
983
- setSuspended = _useState12[1];
984
- var progressStepsReached = react.useRef({});
985
- var paused = !playing;
986
-
987
- // Exposed methods
988
-
989
- var play = react.useCallback(function () {
990
- var media = ref.current;
991
- if (media !== null) {
992
- media.play();
993
- }
994
- }, []);
995
- var pause = react.useCallback(function () {
996
- var media = ref.current;
997
- if (media !== null) {
998
- media.pause();
999
- }
1000
- }, []);
1001
- var stop = react.useCallback(function () {
1002
- var media = ref.current;
1003
- if (media !== null) {
1004
- media.pause();
1005
- media.currentTime = 0;
1006
- }
1007
- }, []);
1008
- var seek = react.useCallback(function (time) {
1009
- var media = ref.current;
1010
- if (media !== null) {
1011
- media.currentTime = time;
1012
- }
1013
- }, []);
1014
-
1015
- // const mute = useCallback(() => {
1016
- // const { current: media } = ref;
1017
- // if (media !== null) {
1018
- // media.muted = true;
1019
- // }
1020
- // }, []);
1021
-
1022
- // const unMute = useCallback(() => {
1023
- // const { current: media } = ref;
1024
- // if (media !== null) {
1025
- // media.muted = false;
1026
- // }
1027
- // }, []);
1028
-
1029
- // Media events callbacks
1030
-
1031
- var onCustomPlay = react.useCallback(function () {
1032
- if (onPlay !== null) {
1033
- onPlay({
1034
- initial: initialPlay
1035
- });
1036
- }
1037
- if (initialPlay) {
1038
- setInitialPlay(false);
1039
- }
1040
- setPlaying(true);
1041
- setSuspended(false);
1042
- }, [initialPlay, setPlaying, onPlay]);
1043
- var onCustomPlaying = react.useCallback(function () {
1044
- setPlaying(true);
1045
- setSuspended(false);
1046
- }, []);
1047
- var onCustomPause = react.useCallback(function (e) {
1048
- var eventMedia = e.currentTarget;
1049
- setPlaying(false);
1050
- if (onPause !== null) {
1051
- onPause({
1052
- midway: eventMedia.currentTime > 0 && eventMedia.currentTime < eventMedia.duration
1053
- });
1054
- }
1055
- }, [setPlaying, onPause]);
1056
- var onCustomEnded = react.useCallback(function (e) {
1057
- var eventMedia = e.currentTarget;
1058
- eventMedia.currentTime = 0;
1059
- if (onEnded !== null) {
1060
- onEnded();
1061
- }
1062
- setInitialPlay(true);
1063
- }, [setInitialPlay, onEnded]);
1064
- var onCustomTimeUpdate = react.useCallback(function (e) {
1065
- var eventMedia = e.currentTarget;
1066
- setCurrentTime(eventMedia.currentTime);
1067
- if (onTimeUpdate !== null) {
1068
- onTimeUpdate(eventMedia.currentTime);
1069
- }
1070
- var progress = eventMedia.currentTime / eventMedia.duration;
1071
- var currentSteps = progressStepsReached.current;
1072
- var stepsToTrack = progressSteps.filter(function (step) {
1073
- return progress > step && typeof currentSteps[step] === 'undefined';
1074
- });
1075
- stepsToTrack.forEach(function (step) {
1076
- if (onProgressStep !== null) {
1077
- onProgressStep(step);
1078
- }
1079
- currentSteps[step] = true;
1080
- });
1081
- }, [setCurrentTime, onTimeUpdate, onProgressStep]);
1082
- var onCustomDurationChange = react.useCallback(function (e) {
1083
- var eventMedia = e.currentTarget;
1084
- setDuration(eventMedia.duration);
1085
- if (onDurationChange !== null) {
1086
- onDurationChange(eventMedia.duration);
1087
- }
1088
- }, [setDuration, onDurationChange]);
1089
- var onCustomSeeked = react.useCallback(function (e) {
1090
- var eventMedia = e.currentTarget;
1091
- if (onSeeked !== null) {
1092
- onSeeked(eventMedia.currentTime);
1093
- }
1094
- }, [onSeeked]);
1095
- var onCustomVolumeChange = react.useCallback(function (e) {
1096
- var eventMedia = e.currentTarget;
1097
-
1098
- // setMuted(eventMedia.muted);
1099
- if (onVolumeChange !== null) {
1100
- onVolumeChange(eventMedia.volume);
1101
- }
1102
- }, [onVolumeChange]);
1103
- var onCustomLoadStart = react.useCallback(function () {
1104
- if (onLoadStart !== null) {
1105
- onLoadStart();
1106
- }
1107
- }, [setReady, onLoadStart]);
1108
- var onCustomCanPlayThrough = react.useCallback(function () {
1109
- setReady(true);
1110
- if (onCanPlayThough !== null) {
1111
- onCanPlayThough();
1112
- }
1113
- }, [setReady, onCanPlayThough]);
1114
- var onCustomCanPlay = react.useCallback(function () {
1115
- setReady(true);
1116
- if (onCanPlay !== null) {
1117
- onCanPlay();
1118
- }
1119
- }, [setReady, onCanPlay]);
1120
- var onCustomLoadedMetadata = react.useCallback(function () {
1121
- setReady(true);
1122
- if (onLoadedMetadata !== null) {
1123
- onLoadedMetadata();
1124
- }
1125
- }, [setReady, onLoadedMetadata]);
1126
- var onCustomLoadedData = react.useCallback(function () {
1127
- setDataReady(true);
1128
- if (onLoadedData !== null) {
1129
- onLoadedData();
1130
- }
1131
- }, [setDataReady, onLoadedData]);
1132
- var onCustomSuspended = react.useCallback(function () {
1133
- setSuspended(true);
1134
- if (onSuspend !== null) {
1135
- onSuspend();
1136
- }
1137
- }, [setSuspended, onSuspended]);
1138
- react.useEffect(function () {
1139
- var _ref$current = ref.current,
1140
- media = _ref$current === void 0 ? null : _ref$current;
1141
-
1142
- // console.log('actions', url);
1143
-
1144
- if (media !== null) {
1145
- media.addEventListener('volumechange', onCustomVolumeChange);
1146
- media.addEventListener('play', onCustomPlay);
1147
- media.addEventListener('playing', onCustomPlaying);
1148
- media.addEventListener('pause', onCustomPause);
1149
- media.addEventListener('ended', onCustomEnded);
1150
- media.addEventListener('seeked', onCustomSeeked);
1151
- // media.addEventListener('loadstart', onCustomLoadStart);
1152
- // media.addEventListener('canplaythrough', onCustomCanPlayThrough);
1153
- // media.addEventListener('canplay', onCustomCanPlay);
1154
- // media.addEventListener('loadedmetadata', onCustomLoadedMetadata);
1155
- // media.addEventListener('loadeddata', onCustomLoadedData);
1156
- }
1157
- return function () {
1158
- if (media !== null) {
1159
- media.removeEventListener('volumechange', onCustomVolumeChange);
1160
- media.removeEventListener('play', onCustomPlay);
1161
- media.removeEventListener('playing', onCustomPlaying);
1162
- media.removeEventListener('pause', onCustomPause);
1163
- media.removeEventListener('ended', onCustomEnded);
1164
- media.removeEventListener('seeked', onCustomSeeked);
1165
- // media.removeEventListener('loadstart', onCustomLoadStart);
1166
- // media.removeEventListener('canplaythrough', onCustomCanPlayThrough);
1167
- // media.removeEventListener('canplay', onCustomCanPlay);
1168
- // media.removeEventListener('loadedmetadata', onCustomLoadedMetadata);
1169
- }
1170
- };
1171
- }, [url, onCustomVolumeChange, onCustomPlay, onCustomPause, onCustomEnded, onCustomSeeked, onCustomSuspended
1172
- // onCustomLoadStart,
1173
- // onCustomCanPlayThrough,
1174
- // onCustomCanPlay,
1175
- // onCustomLoadedMetadata,
1176
- ]);
1177
- react.useEffect(function () {
1178
- var _ref$current2 = ref.current,
1179
- media = _ref$current2 === void 0 ? null : _ref$current2;
1180
- if (media !== null) {
1181
- media.addEventListener('loadstart', onCustomLoadStart);
1182
- media.addEventListener('canplaythrough', onCustomCanPlayThrough);
1183
- media.addEventListener('canplay', onCustomCanPlay);
1184
- media.addEventListener('loadedmetadata', onCustomLoadedMetadata);
1185
- media.addEventListener('loadeddata', onCustomLoadedData);
1186
- media.addEventListener('suspend', onCustomSuspended);
1187
- }
1188
- return function () {
1189
- if (media !== null) {
1190
- media.removeEventListener('loadstart', onCustomLoadStart);
1191
- media.removeEventListener('canplaythrough', onCustomCanPlayThrough);
1192
- media.removeEventListener('canplay', onCustomCanPlay);
1193
- media.removeEventListener('loadedmetadata', onCustomLoadedMetadata);
1194
- media.removeEventListener('suspend', onCustomSuspended);
1195
- }
1196
- };
1197
- }, [url, onCustomLoadStart, onCustomCanPlayThrough, onCustomCanPlay, onCustomLoadedMetadata, onCustomSuspended]);
1198
-
1199
- // Duration
1200
- react.useEffect(function () {
1201
- var _ref$current3 = ref.current,
1202
- media = _ref$current3 === void 0 ? null : _ref$current3;
1203
- if (media !== null) {
1204
- media.addEventListener('durationchange', onCustomDurationChange);
1205
- }
1206
- return function () {
1207
- if (media !== null) {
1208
- media.removeEventListener('durationchange', onCustomDurationChange);
1209
- }
1210
- };
1211
- }, [url, onCustomDurationChange]);
1212
-
1213
- // Timeupdate
1214
- react.useEffect(function () {
1215
- var _ref$current4 = ref.current,
1216
- media = _ref$current4 === void 0 ? null : _ref$current4;
1217
- // console.log('timeupdate', url);
1218
- if (media !== null) {
1219
- media.addEventListener('timeupdate', onCustomTimeUpdate);
1220
- }
1221
- return function () {
1222
- if (media !== null) {
1223
- media.removeEventListener('timeupdate', onCustomTimeUpdate);
1224
- }
1225
- };
1226
- }, [url, onCustomTimeUpdate, onCustomDurationChange]);
1227
- react.useEffect(function () {
1228
- var _ref$current5 = ref.current,
1229
- media = _ref$current5 === void 0 ? null : _ref$current5;
1230
- if (media !== null && media.readyState > 1) {
1231
- setDataReady(true);
1232
- } else {
1233
- setDataReady(false);
1234
- }
1235
- if (media !== null && media.readyState > 3) {
1236
- setReady(true);
1237
- } else {
1238
- setReady(false);
1239
- }
1240
- }, [url]);
1241
- return {
1242
- ref: ref,
1243
- play: play,
1244
- pause: pause,
1245
- stop: stop,
1246
- seek: seek,
1247
- currentTime: currentTime,
1248
- duration: duration,
1249
- playing: playing,
1250
- paused: paused,
1251
- ready: ready,
1252
- dataReady: dataReady,
1253
- suspended: suspended
1254
- };
1255
- };
1256
-
1257
- var useMediaBuffering = function useMediaBuffering() {
1258
- var mediaElement = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
1259
- var _useState = react.useState(false),
1260
- _useState2 = _slicedToArray(_useState, 2),
1261
- buffering = _useState2[0],
1262
- setBuffering = _useState2[1];
1263
- react.useEffect(function () {
1264
- if (mediaElement === null) {
1265
- return function () {};
1266
- }
1267
- function onBufferingEvent(e) {
1268
- // networkstate
1269
- if (mediaElement.networkState === mediaElement.NETWORK_LOADING) {
1270
- // The user agent is actively trying to download data.
1271
- setBuffering(true);
1272
- }
1273
-
1274
- // readystate
1275
- if (mediaElement.readyState < mediaElement.HAVE_FUTURE_DATA) {
1276
- // There is not enough data to keep playing from this point
1277
- setBuffering(true);
1278
- }
1279
- }
1280
- function onPlay() {
1281
- setBuffering(false);
1282
- }
1283
- function onPlaying() {
1284
- setBuffering(false);
1285
- }
1286
- function onPause() {
1287
- setBuffering(false);
1288
- }
1289
- function onEnded() {
1290
- setBuffering(false);
1291
- }
1292
- mediaElement.addEventListener('waiting', onBufferingEvent);
1293
- mediaElement.addEventListener('stalled', onBufferingEvent);
1294
- mediaElement.addEventListener('play', onPlay);
1295
- mediaElement.addEventListener('playing', onPlaying);
1296
- mediaElement.addEventListener('pause', onPause);
1297
- mediaElement.addEventListener('ended', onEnded);
1298
- return function () {
1299
- mediaElement.removeEventListener('waiting', onBufferingEvent);
1300
- mediaElement.removeEventListener('stalled', onBufferingEvent);
1301
- mediaElement.removeEventListener('play', onPlay);
1302
- mediaElement.removeEventListener('playing', onPlaying);
1303
- mediaElement.removeEventListener('pause', onPause);
1304
- mediaElement.removeEventListener('ended', onEnded);
1305
- };
1306
- }, [mediaElement]);
1307
-
1308
- // useEffect(() => {
1309
- // if (mediaElement === null) {
1310
- // return () => {};
1311
- // }
1312
- // let lastPlayPos = 0;
1313
- // let currentPlayPos = 0;
1314
- // let bufferingDetected = false;
1315
-
1316
- // function checkBuffering(player, checkInterval) {
1317
- // currentPlayPos = player.currentTime;
1318
-
1319
- // // checking offset should be at most the check interval
1320
- // // but allow for some margin
1321
- // const offset = (checkInterval - 20) / 1000;
1322
-
1323
- // // if no buffering is currently detected,
1324
- // // and the position does not seem to increase
1325
- // // and the player isn't manually paused...
1326
- // if (!bufferingDetected && currentPlayPos < lastPlayPos + offset && !player.paused) {
1327
- // console.log('buffering!');
1328
- // bufferingDetected = true;
1329
- // }
1330
-
1331
- // // if we were buffering but the player has advanced,
1332
- // // then there is no buffering
1333
- // if (bufferingDetected && currentPlayPos > lastPlayPos + offset && !player.paused) {
1334
- // console.log('not buffering anymore!');
1335
- // bufferingDetected = false;
1336
- // }
1337
- // lastPlayPos = currentPlayPos;
1338
-
1339
- // return bufferingDetected;
1340
- // }
1341
-
1342
- // const id = setInterval(() => {
1343
- // setBuffering(checkBuffering(mediaElement, interval));
1344
- // }, interval);
1345
-
1346
- // return () => {
1347
- // clearInterval(id);
1348
- // };
1349
- // }, [mediaElement, interval]);
1350
-
1351
- return {
1352
- buffering: buffering
1353
- };
1354
- };
1355
-
1356
- var useMediaState = function useMediaState() {
1357
- var mediaElement = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
1358
- var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1359
- _ref$playing = _ref.playing,
1360
- wantedPlaying = _ref$playing === void 0 ? false : _ref$playing,
1361
- _ref$muted = _ref.muted,
1362
- wantedMuted = _ref$muted === void 0 ? false : _ref$muted;
1363
- var src = mediaElement !== null ? mediaElement.currentSrc || mediaElement.src : null;
1364
- var debug = react.useMemo(function () {
1365
- var mediaKey = src !== null ? src.split('/')[src.split('/').length - 1].split('#')[0] || null : null;
1366
- return createDebug(mediaKey !== null ? "micromag:media:".concat(mediaKey) : 'micromag:media');
1367
- }, [src]);
1368
- var _useState = react.useState(wantedPlaying),
1369
- _useState2 = _slicedToArray(_useState, 2),
1370
- playing = _useState2[0],
1371
- setPlaying = _useState2[1];
1372
- var _useState3 = react.useState(false),
1373
- _useState4 = _slicedToArray(_useState3, 2),
1374
- buffering = _useState4[0],
1375
- setBuffering = _useState4[1];
1376
- var _useState5 = react.useState(mediaElement !== null && (mediaElement.muted || mediaElement.volume === 0) || wantedMuted),
1377
- _useState6 = _slicedToArray(_useState5, 2),
1378
- muted = _useState6[0],
1379
- setMuted = _useState6[1];
1380
- react.useEffect(function () {
1381
- debug('State change %o', {
1382
- playing: playing,
1383
- buffering: buffering,
1384
- muted: muted
1385
- });
1386
- }, [playing, buffering, muted, debug]);
1387
- react.useEffect(function () {
1388
- if (mediaElement === null) {
1389
- setPlaying(wantedPlaying);
1390
- setBuffering(false);
1391
- setMuted(wantedMuted);
1392
- debug('Unset media: %o', {
1393
- wantedPlaying: wantedPlaying,
1394
- wantedMuted: wantedMuted
1395
- });
1396
- }
1397
- }, [mediaElement, src, debug, wantedPlaying, wantedMuted]);
1398
- react.useEffect(function () {
1399
- if (mediaElement === null) {
1400
- return function () {};
1401
- }
1402
- function onBufferingEvent(e) {
1403
- // networkstate
1404
- if (mediaElement !== null && mediaElement.networkState === mediaElement.NETWORK_LOADING) {
1405
- debug('onBufferingEvent: NETWORK_LOADING');
1406
- setBuffering(true);
1407
- }
1408
-
1409
- // readystate
1410
- if (mediaElement !== null && mediaElement.readyState < mediaElement.HAVE_FUTURE_DATA) {
1411
- debug('onBufferingEvent: HAVE_FUTURE_DATA');
1412
- setBuffering(true);
1413
- }
1414
- }
1415
- function onPlay() {
1416
- debug('onPlay');
1417
- setPlaying(true);
1418
- setBuffering(false);
1419
- }
1420
- function onPlaying() {
1421
- debug('onPlaying');
1422
- setPlaying(true);
1423
- setBuffering(false);
1424
- }
1425
- function onTimeUpdate(e) {
1426
- debug('onTimeUpdate');
1427
- setPlaying(!e.currentTarget.paused && !e.currentTarget.ended);
1428
- setBuffering(false);
1429
- }
1430
- function onPause() {
1431
- debug('onPause');
1432
- setPlaying(false);
1433
- setBuffering(false);
1434
- }
1435
- function onEnded() {
1436
- debug('onEnded');
1437
- setPlaying(false);
1438
- setBuffering(false);
1439
- }
1440
- function onSuspend(e) {
1441
- debug('onSuspend');
1442
- setPlaying(!e.currentTarget.paused && !e.currentTarget.ended);
1443
- setBuffering(false);
1444
- }
1445
- function onVolumeChange() {
1446
- setMuted(mediaElement.muted || mediaElement.volume === 0);
1447
- }
1448
- if (mediaElement.paused || mediaElement.ended) {
1449
- setPlaying(false);
1450
- }
1451
- if (muted !== mediaElement.muted) {
1452
- setMuted(mediaElement.muted);
1453
- }
1454
- mediaElement.addEventListener('waiting', onBufferingEvent);
1455
- mediaElement.addEventListener('stalled', onBufferingEvent);
1456
- mediaElement.addEventListener('timeupdate', onTimeUpdate);
1457
- mediaElement.addEventListener('play', onPlay);
1458
- mediaElement.addEventListener('playing', onPlaying);
1459
- mediaElement.addEventListener('pause', onPause);
1460
- mediaElement.addEventListener('suspend', onSuspend);
1461
- mediaElement.addEventListener('ended', onEnded);
1462
- mediaElement.addEventListener('volumechange', onVolumeChange);
1463
- return function () {
1464
- mediaElement.removeEventListener('waiting', onBufferingEvent);
1465
- mediaElement.removeEventListener('stalled', onBufferingEvent);
1466
- mediaElement.removeEventListener('timeupdate', onTimeUpdate);
1467
- mediaElement.removeEventListener('play', onPlay);
1468
- mediaElement.removeEventListener('playing', onPlaying);
1469
- mediaElement.removeEventListener('pause', onPause);
1470
- mediaElement.removeEventListener('suspend', onSuspend);
1471
- mediaElement.removeEventListener('ended', onEnded);
1472
- mediaElement.removeEventListener('volumechange', onVolumeChange);
1473
- };
1474
- }, [mediaElement, debug, src]);
1475
- return {
1476
- playing: playing,
1477
- muted: muted,
1478
- buffering: buffering
1479
- };
1480
- };
1481
-
1482
- function useMediaTimestampOffset(element) {
1483
- var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1484
- _ref$attributeName = _ref.attributeName,
1485
- attributeName = _ref$attributeName === void 0 ? 'data-ts-offset' : _ref$attributeName;
1486
- var getTimestampOffset = function getTimestampOffset() {
1487
- return element !== null && element.hasAttribute(attributeName) ? parseFloat(element.getAttribute(attributeName)) : 0;
1488
- };
1489
- var _useState = react.useState(getTimestampOffset()),
1490
- _useState2 = _slicedToArray(_useState, 2),
1491
- timestampOffset = _useState2[0],
1492
- setTimestampOffset = _useState2[1];
1493
- var observerRef = react.useRef(null);
1494
- react.useEffect(function () {
1495
- if (element !== null) {
1496
- observerRef.current = new MutationObserver(function (mutations) {
1497
- mutations.forEach(function (_ref2) {
1498
- var mutationType = _ref2.type;
1499
- if (mutationType === 'attributes') {
1500
- setTimestampOffset(getTimestampOffset());
1501
- }
1502
- });
1503
- });
1504
- observerRef.current.observe(element, {
1505
- attributes: true,
1506
- attributeFilter: [attributeName]
1507
- });
1508
- }
1509
- return function () {
1510
- if (observerRef.current !== null) {
1511
- observerRef.current.disconnect();
1512
- }
1513
- };
1514
- }, [element]);
1515
- return timestampOffset;
1516
- }
1517
-
1518
- function useMediaCurrentTime(element) {
1519
- var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1520
- _ref$id = _ref.id,
1521
- id = _ref$id === void 0 ? null : _ref$id,
1522
- _ref$disabled = _ref.disabled,
1523
- disabled = _ref$disabled === void 0 ? false : _ref$disabled,
1524
- _ref$updateInterval = _ref.updateInterval,
1525
- updateInterval = _ref$updateInterval === void 0 ? 1000 : _ref$updateInterval,
1526
- _ref$onUpdate = _ref.onUpdate,
1527
- customOnUpdate = _ref$onUpdate === void 0 ? null : _ref$onUpdate;
1528
- var _useState = react.useState(0),
1529
- _useState2 = _slicedToArray(_useState, 2),
1530
- currentTime = _useState2[0],
1531
- setCurrentTime = _useState2[1];
1532
- var realCurrentTime = react.useRef(currentTime);
1533
- var tsOffset = useMediaTimestampOffset(element);
1534
- var finalId = id || element;
1535
- var lastIdRef = react.useRef(finalId);
1536
- var idChanged = lastIdRef.current !== finalId;
1537
- var disabledRef = react.useRef(disabled);
1538
- var disabledChanged = disabledRef.current !== disabled;
1539
- if (idChanged || disabledChanged) {
1540
- realCurrentTime.current = element !== null ? Math.max((element.currentTime || 0) - tsOffset, 0) : 0;
1541
- lastIdRef.current = finalId;
1542
- disabledRef.current = disabled;
1543
- }
1544
-
1545
- // Check time update
1546
- react.useEffect(function () {
1547
- if (element === null) {
1548
- return function () {};
1549
- }
1550
- function updateTime() {
1551
- var time = Math.max((element.currentTime || 0) - tsOffset, 0);
1552
- if (time !== realCurrentTime.current) {
1553
- realCurrentTime.current = time;
1554
- setCurrentTime(time);
1555
- if (customOnUpdate !== null) {
1556
- customOnUpdate(time);
1557
- }
1558
- }
1559
- return time;
1560
- }
1561
- if (disabled) {
1562
- updateTime();
1563
- return function () {};
1564
- }
1565
- var timeout = null;
1566
- function loop() {
1567
- var _element$duration = element.duration,
1568
- duration = _element$duration === void 0 ? 0 : _element$duration;
1569
- var time = updateTime();
1570
- var remainingTime = Math.floor(((duration || 0) - time) * 1000);
1571
- timeout = setTimeout(loop, Math.max(Math.min(updateInterval, remainingTime), updateInterval));
1572
- }
1573
- loop();
1574
- return function () {
1575
- if (element !== null) {
1576
- realCurrentTime.current = element.currentTime - tsOffset;
1577
- }
1578
- if (timeout !== null) {
1579
- clearInterval(timeout);
1580
- }
1581
- };
1582
- }, [id, element, setCurrentTime, disabled, updateInterval]);
1583
- return realCurrentTime.current;
1584
- }
1585
-
1586
- function useMediaDuration(element) {
1587
- var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1588
- _ref$id = _ref.id,
1589
- id = _ref$id === void 0 ? null : _ref$id;
1590
- var _useState = react.useState(element !== null ? element.duration || 0 : 0),
1591
- _useState2 = _slicedToArray(_useState, 2),
1592
- duration = _useState2[0],
1593
- setDuration = _useState2[1];
1594
- var tsOffset = useMediaTimestampOffset(element);
1595
- var realDuration = react.useRef(duration);
1596
- var finalId = id || element;
1597
- var lastIdRef = react.useRef(finalId);
1598
- var idChanged = lastIdRef.current !== finalId;
1599
- if (idChanged) {
1600
- realDuration.current = element !== null ? Math.max((element.duration || 0) - tsOffset, 0) : 0;
1601
- lastIdRef.current = finalId;
1602
- }
1603
- react.useEffect(function () {
1604
- if (element === null) {
1605
- realDuration.current = 0;
1606
- setDuration(0);
1607
- return function () {};
1608
- }
1609
- function updateDuration() {
1610
- var newDuration = Math.max((element.duration || 0) - tsOffset, 0);
1611
- if (newDuration !== realDuration.current) {
1612
- realDuration.current = newDuration;
1613
- setDuration(newDuration);
1614
- }
1615
- }
1616
- updateDuration();
1617
- element.addEventListener('canplay', updateDuration);
1618
- element.addEventListener('loadedmetadata', updateDuration);
1619
- element.addEventListener('durationchange', updateDuration);
1620
- return function () {
1621
- element.removeEventListener('canplay', updateDuration);
1622
- element.removeEventListener('loadedmetadata', updateDuration);
1623
- element.removeEventListener('durationchange', updateDuration);
1624
- };
1625
- }, [element, id, setDuration]);
1626
- return realDuration.current;
1627
- }
1628
-
1629
- function useMediaLoad(element) {
1630
- var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1631
- _ref$preload = _ref.preload,
1632
- preload = _ref$preload === void 0 ? 'auto' : _ref$preload,
1633
- _ref$shouldLoad = _ref.shouldLoad,
1634
- shouldLoad = _ref$shouldLoad === void 0 ? false : _ref$shouldLoad;
1635
- var firstPreloadRef = react.useRef(preload);
1636
- var firstShouldLoadRef = react.useRef(shouldLoad);
1637
- var hasLoadedRef = react.useRef(preload !== 'none' && preload !== 'metadata' && shouldLoad);
1638
- react.useEffect(function () {
1639
- var canLoad = preload !== 'none' && preload !== 'metadata' && shouldLoad;
1640
- var preloadHasChanged = firstPreloadRef.current !== preload;
1641
- var shouldLoadHasChanged = firstShouldLoadRef.current !== shouldLoad;
1642
- if (canLoad && (preloadHasChanged || shouldLoadHasChanged) && !hasLoadedRef.current && element !== null && typeof element.load !== 'undefined') {
1643
- hasLoadedRef.current = true;
1644
- element.load();
1645
- }
1646
- }, [element, shouldLoad, preload]);
1647
- }
1648
-
1649
- var _excluded$1 = ["disabled"];
1650
- function useMediaProgress() {
1651
- var media = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
1652
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
1653
- var _ref = options || {},
1654
- _ref$disabled = _ref.disabled,
1655
- disabled = _ref$disabled === void 0 ? false : _ref$disabled,
1656
- props = _objectWithoutProperties(_ref, _excluded$1);
1657
- var _useState = react.useState(!disabled),
1658
- _useState2 = _slicedToArray(_useState, 2),
1659
- playing = _useState2[0],
1660
- setPlaying = _useState2[1];
1661
- var duration = useMediaDuration(media, _objectSpread({
1662
- disabled: disabled || !playing
1663
- }, props));
1664
- var _useState3 = react.useState(0),
1665
- _useState4 = _slicedToArray(_useState3, 2),
1666
- progress = _useState4[0],
1667
- setProgress = _useState4[1];
1668
- var realProgressRef = react.useRef(progress);
1669
- var updateTimeRef = react.useRef(Date.now() / 1000);
1670
- var updateProgress = react.useCallback(function (newProgress) {
1671
- updateTimeRef.current = Date.now() / 1000;
1672
- realProgressRef.current = newProgress;
1673
- setProgress(newProgress);
1674
- }, [setProgress]);
1675
- react.useEffect(function () {
1676
- if (media !== null) {
1677
- var value = (media.currentTime || 0) > 0 && media.duration > 0 ? media.currentTime / media.duration : 0;
1678
- updateProgress(value);
1679
- setPlaying(!media.paused && media.readyState === 4);
1680
- } else {
1681
- updateProgress(0);
1682
- setPlaying(false);
1683
- }
1684
- }, [media, disabled, setPlaying]);
1685
- react.useEffect(function () {
1686
- if (media === null) {
1687
- return function () {};
1688
- }
1689
- function onResume(e) {
1690
- setPlaying(true);
1691
- var newProgress = media.currentTime / media.duration;
1692
- updateProgress(newProgress);
1693
- }
1694
- function onUpdate(e) {
1695
- setPlaying(!e.currentTarget.paused && !e.currentTarget.ended);
1696
- var newProgress = media.currentTime / media.duration;
1697
- updateProgress(newProgress);
1698
- }
1699
- function onPause() {
1700
- setPlaying(false);
1701
- var newProgress = media.currentTime / media.duration;
1702
- updateProgress(newProgress);
1703
- }
1704
- media.addEventListener('play', onResume);
1705
- media.addEventListener('playing', onResume);
1706
- media.addEventListener('seeked', onUpdate);
1707
- // media.addEventListener('timeupdate', onUpdate);
1708
- media.addEventListener('pause', onPause);
1709
- media.addEventListener('ended', onPause);
1710
- media.addEventListener('waiting', onPause);
1711
- media.addEventListener('stalled', onPause);
1712
- media.addEventListener('seeking', onPause);
1713
- media.addEventListener('suspend', onUpdate);
1714
- // if (media.paused) {
1715
- // onPause();
1716
- // } else {
1717
- // onResume();
1718
- // }
1719
- return function () {
1720
- media.removeEventListener('play', onResume);
1721
- media.removeEventListener('seeked', onResume);
1722
- media.removeEventListener('playing', onResume);
1723
- // media.removeEventListener('timeupdate', onResume);
1724
- media.removeEventListener('pause', onPause);
1725
- media.removeEventListener('ended', onPause);
1726
- media.removeEventListener('waiting', onPause);
1727
- media.removeEventListener('stalled', onPause);
1728
- media.removeEventListener('seeking', onPause);
1729
- media.removeEventListener('suspend', onUpdate);
1730
- };
1731
- }, [media, updateProgress, setPlaying, playing]);
1732
- react.useEffect(function () {
1733
- if (media === null || !playing || disabled) {
1734
- return function () {};
1735
- }
1736
- var handle;
1737
- var canceled = false;
1738
- function tick() {
1739
- if (canceled) {
1740
- return;
1741
- }
1742
- var newTime = Date.now() / 1000;
1743
- var elapsed = newTime - updateTimeRef.current;
1744
- var step = elapsed / duration;
1745
- var newProgress = realProgressRef.current < 0.1 ? media.currentTime / media.duration : realProgressRef.current + step;
1746
- updateProgress(newProgress);
1747
- handle = raf(tick);
1748
- }
1749
- tick();
1750
- return function () {
1751
- canceled = true;
1752
- raf.cancel(handle);
1753
- };
1754
- }, [media, playing, disabled, duration, updateProgress]);
1755
- return realProgressRef.current;
1756
- }
1757
-
1758
- function useMediaReady(element) {
1759
- var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1760
- _ref$id = _ref.id,
1761
- id = _ref$id === void 0 ? null : _ref$id;
1762
- var _useState = react.useState(element !== null && element.readyState > 0),
1763
- _useState2 = _slicedToArray(_useState, 2),
1764
- ready = _useState2[0],
1765
- setReady = _useState2[1];
1766
- var realReady = react.useRef(ready);
1767
- var lastIdRef = react.useRef(id);
1768
- var idChanged = lastIdRef.current !== id;
1769
- if (idChanged) {
1770
- realReady.current = false;
1771
- lastIdRef.current = id;
1772
- }
1773
- react.useEffect(function () {
1774
- if (element === null) {
1775
- return function () {};
1776
- }
1777
- function updateReady() {
1778
- var currentReady = ready;
1779
- if (element !== null && element.readyState > 0 && !ready) {
1780
- setReady(true);
1781
- currentReady = true;
1782
- } else if (ready && element !== null && element.readyState === 0) {
1783
- setReady(false);
1784
- currentReady = false;
1785
- }
1786
- realReady.current = currentReady;
1787
- return currentReady;
1788
- }
1789
- var currentReady = updateReady();
1790
- if (currentReady) {
1791
- return function () {};
1792
- }
1793
- element.addEventListener('loadstart', updateReady);
1794
- element.addEventListener('loadeddata', updateReady);
1795
- element.addEventListener('loadedmetadata', updateReady);
1796
- element.addEventListener('canplay', updateReady);
1797
- element.addEventListener('canplaythrough', updateReady);
1798
- return function () {
1799
- element.removeEventListener('loadstart', updateReady);
1800
- element.removeEventListener('loadeddata', updateReady);
1801
- element.removeEventListener('loadedmetadata', updateReady);
1802
- element.removeEventListener('canplay', updateReady);
1803
- element.removeEventListener('canplaythrough', updateReady);
1804
- };
1805
- }, [element, id]);
1806
- return realReady.current;
1807
- }
1808
-
1809
- var useMediasParser = function useMediasParser() {
1810
- var screensManager = contexts.useScreensManager();
1811
- var fieldsManager = contexts.useFieldsManager();
1812
-
1813
- // Convert medias object to path
1814
- var parser = react.useMemo(function () {
1815
- return new core.MediasParser({
1816
- screensManager: screensManager,
1817
- fieldsManager: fieldsManager
1818
- });
1819
- }, [screensManager, fieldsManager]);
1820
- var toPath = react.useCallback(function (story) {
1821
- return parser.toPath(story);
1822
- }, [parser]);
1823
- var fromPath = react.useCallback(function (story) {
1824
- return parser.fromPath(story);
1825
- }, [parser]);
1826
- return {
1827
- toPath: toPath,
1828
- fromPath: fromPath,
1829
- parser: parser
1830
- };
1831
- };
1832
-
1833
- function useMediaThumbnail(media) {
1834
- var file = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
1835
- var thumbnail = react.useMemo(function () {
1836
- if (isObject(file)) {
1837
- return file;
1838
- }
1839
- var _ref = media || {},
1840
- _ref$thumbnail_url = _ref.thumbnail_url,
1841
- defaultThumbnailUrl = _ref$thumbnail_url === void 0 ? null : _ref$thumbnail_url,
1842
- _ref$files = _ref.files,
1843
- files = _ref$files === void 0 ? null : _ref$files,
1844
- _ref$metadata = _ref.metadata,
1845
- metadata = _ref$metadata === void 0 ? null : _ref$metadata;
1846
- var _ref2 = metadata || {},
1847
- mediaWidth = _ref2.width,
1848
- mediaHeight = _ref2.height;
1849
- var filesArray = utils.getMediaFilesAsArray(files) || [];
1850
- var _ref3 = (file !== null ? filesArray.find(function (_ref4) {
1851
- var handle = _ref4.handle;
1852
- return handle === file;
1853
- }) || null : null) || {},
1854
- _ref3$url = _ref3.url,
1855
- url = _ref3$url === void 0 ? null : _ref3$url;
1856
- return url !== null || defaultThumbnailUrl !== null ? {
1857
- url: url || defaultThumbnailUrl,
1858
- metadata: {
1859
- width: mediaWidth,
1860
- height: mediaHeight
1861
- }
1862
- } : null;
1863
- }, [media, file]);
1864
- return thumbnail;
1865
- }
1866
-
1867
- function useMediaWaveform(media) {
1868
- var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1869
- _ref$fake = _ref.fake,
1870
- fake = _ref$fake === void 0 ? false : _ref$fake,
1871
- _ref$reduceBufferFact = _ref.reduceBufferFactor,
1872
- reduceBufferFactor = _ref$reduceBufferFact === void 0 ? 100 : _ref$reduceBufferFact;
1873
- var _ref2 = media || {},
1874
- _ref2$url = _ref2.url,
1875
- url = _ref2$url === void 0 ? null : _ref2$url,
1876
- _ref2$metadata = _ref2.metadata,
1877
- metadata = _ref2$metadata === void 0 ? null : _ref2$metadata;
1878
- var _ref3 = metadata || {},
1879
- _ref3$waveform = _ref3.waveform,
1880
- waveform = _ref3$waveform === void 0 ? null : _ref3$waveform;
1881
- var _useState = react.useState(null),
1882
- _useState2 = _slicedToArray(_useState, 2),
1883
- audioLevels = _useState2[0],
1884
- setAudioLevels = _useState2[1];
1885
- react.useEffect(function () {
1886
- var canceled = false;
1887
- var AudioContext = typeof window !== 'undefined' ? window.AudioContext || window.webkitAudioContext : null;
1888
- if (waveform !== null) {
1889
- setAudioLevels(waveform.map(function (it) {
1890
- return (it + 256 / 2) / 256;
1891
- }));
1892
- } else if (url !== null && fake) {
1893
- var fakeLength = 1000;
1894
- setAudioLevels(_toConsumableArray(new Array(fakeLength)).map(function () {
1895
- return Math.random();
1896
- }));
1897
- } else if (url !== null && AudioContext !== null) {
1898
- fetch(url, {
1899
- mode: 'cors'
1900
- }).then(function (response) {
1901
- if (canceled) {
1902
- throw new Error('Audio loading canceled');
1903
- }
1904
- return response.arrayBuffer();
1905
- }).then(function (arrayBuffer) {
1906
- if (canceled) {
1907
- throw new Error('Audio loading canceled');
1908
- }
1909
- var audioCtx = new AudioContext();
1910
- return audioCtx.decodeAudioData(arrayBuffer);
1911
- }).then(function (buffer) {
1912
- var channelsCount = buffer.numberOfChannels;
1913
- if (channelsCount > 0) {
1914
- var leftChannelData = buffer.getChannelData(0);
1915
- setAudioLevels(leftChannelData.reduce(function (newArray, level) {
1916
- // eslint-disable-next-line no-param-reassign
1917
- newArray[newArray.length] = Math.abs(level);
1918
- return newArray;
1919
- }, []));
1920
- }
1921
- })["catch"](function (e) {
1922
- throw e;
1923
- });
1924
- }
1925
- return function () {
1926
- if (url === null) {
1927
- canceled = true;
1928
- }
1929
- };
1930
- }, [url, waveform, setAudioLevels, reduceBufferFactor, fake]);
1931
- return audioLevels;
1932
- }
1933
-
1934
- // const debug = createDebug('core:useParsedStory');
1935
-
1936
- var useParsedStory = function useParsedStory(story) {
1937
- var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1938
- _ref$disabled = _ref.disabled,
1939
- disabled = _ref$disabled === void 0 ? false : _ref$disabled,
1940
- _ref$withTheme = _ref.withTheme,
1941
- withTheme = _ref$withTheme === void 0 ? true : _ref$withTheme,
1942
- _ref$withMedias = _ref.withMedias,
1943
- withMedias = _ref$withMedias === void 0 ? true : _ref$withMedias,
1944
- _ref$withFonts = _ref.withFonts,
1945
- withFonts = _ref$withFonts === void 0 ? true : _ref$withFonts,
1946
- _ref$withMigrations = _ref.withMigrations,
1947
- withMigrations = _ref$withMigrations === void 0 ? true : _ref$withMigrations;
1948
- var screensManager = contexts.useScreensManager();
1949
- var fieldsManager = contexts.useFieldsManager();
1950
- var parser = react.useMemo(function () {
1951
- return new core.StoryParser({
1952
- screensManager: screensManager,
1953
- fieldsManager: fieldsManager,
1954
- fieldsPattern: screensManager.getFieldsPattern()
1955
- });
1956
- }, [screensManager, fieldsManager]);
1957
- var newStory = react.useMemo(function () {
1958
- if (disabled) {
1959
- return story;
1960
- }
1961
- return parser.parse(story, {
1962
- withMedias: withMedias,
1963
- withTheme: withTheme,
1964
- withFonts: withFonts,
1965
- withMigrations: withMigrations
1966
- });
1967
- }, [parser, disabled, withMedias, withTheme, withFonts, story]);
1968
- return newStory;
1969
- };
1970
-
1971
- function usePlaceholderStyle(selector, placeholderStyle) {
1972
- var styles = placeholderStyle !== null ? Object.keys(placeholderStyle).reduce(function (styles, key) {
1973
- var value = placeholderStyle[key];
1974
- return !isEmpty(value) ? _objectSpread(_objectSpread({}, styles), {}, _defineProperty({}, key.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase(), value)) : styles;
1975
- }, {}) : null;
1976
- return styles !== null && Object.keys(styles).length > 0 ? "\n ".concat(selector, "::placeholder {\n ").concat(Object.keys(styles).map(function (key) {
1977
- return "".concat(key, ": ").concat(styles[key], ";");
1978
- }).join('\n'), "\n }\n ") : null;
1979
- }
1980
-
1981
- function useProgressSteps() {
1982
- var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
1983
- _ref$disabled = _ref.disabled,
1984
- disabled = _ref$disabled === void 0 ? false : _ref$disabled,
1985
- currentTime = _ref.currentTime,
1986
- duration = _ref.duration,
1987
- _ref$onStep = _ref.onStep,
1988
- onStep = _ref$onStep === void 0 ? null : _ref$onStep,
1989
- _ref$steps = _ref.steps,
1990
- steps = _ref$steps === void 0 ? [0.1, 0.25, 0.5, 0.75, 0.9] : _ref$steps;
1991
- var progressStepsReached = react.useRef({});
1992
- react.useEffect(function () {
1993
- if (duration === 0 || disabled) {
1994
- return;
1995
- }
1996
- var progress = currentTime / duration;
1997
- var currentSteps = progressStepsReached.current;
1998
- var stepsToTrack = steps.filter(function (step) {
1999
- return progress > step && typeof currentSteps[step] === 'undefined';
2000
- });
2001
- stepsToTrack.forEach(function (step) {
2002
- if (onStep !== null) {
2003
- onStep(step, {
2004
- duration: duration,
2005
- currentTime: currentTime
2006
- });
2007
- }
2008
- currentSteps[step] = true;
2009
- });
2010
- }, [duration, currentTime, disabled]);
2011
- }
2012
-
2013
- var _excluded = ["width", "height"];
2014
- var useDevicePixelRatio = function useDevicePixelRatio() {
2015
- var _useState = react.useState(1),
2016
- _useState2 = _slicedToArray(_useState, 2),
2017
- pixelRatio = _useState2[0],
2018
- setPixelRatio = _useState2[1];
2019
- react.useEffect(function () {
2020
- setPixelRatio(typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1);
2021
- }, [setPixelRatio]);
2022
- return pixelRatio;
2023
- };
2024
- var useScreenSize = function useScreenSize(_ref) {
2025
- var _ref$width = _ref.width,
2026
- width = _ref$width === void 0 ? null : _ref$width,
2027
- _ref$height = _ref.height,
2028
- height = _ref$height === void 0 ? null : _ref$height,
2029
- _ref$landscape = _ref.landscape,
2030
- landscape = _ref$landscape === void 0 ? false : _ref$landscape,
2031
- _ref$menuOverScreen = _ref.menuOverScreen,
2032
- menuOverScreen = _ref$menuOverScreen === void 0 ? false : _ref$menuOverScreen,
2033
- _ref$screens = _ref.screens,
2034
- initialScreens = _ref$screens === void 0 ? null : _ref$screens,
2035
- _ref$mediaType = _ref.mediaType,
2036
- mediaType = _ref$mediaType === void 0 ? 'screen' : _ref$mediaType,
2037
- _ref$media = _ref.media,
2038
- providedMedia = _ref$media === void 0 ? null : _ref$media,
2039
- _ref$scale = _ref.scale,
2040
- scale = _ref$scale === void 0 ? null : _ref$scale;
2041
- var devicePixelRatio = useDevicePixelRatio();
2042
- var screens = initialScreens || [];
2043
- var screenSize = react.useMemo(function () {
2044
- var media = providedMedia !== null ? providedMedia : {
2045
- type: mediaType,
2046
- width: "".concat(width, "px"),
2047
- height: "".concat(height, "px")
2048
- };
2049
- var matchingScreens = _toConsumableArray(screens).reverse().filter(function (_ref2) {
2050
- var _ref2$mediaQuery = _ref2.mediaQuery,
2051
- mediaQuery = _ref2$mediaQuery === void 0 ? null : _ref2$mediaQuery;
2052
- return mediaQuery === null || cssMediaquery.match(mediaQuery, media);
2053
- });
2054
- return {
2055
- screen: matchingScreens.length > 0 ? matchingScreens[0].name : null,
2056
- screens: _toConsumableArray(matchingScreens).reverse().map(function (_ref3) {
2057
- var name = _ref3.name;
2058
- return name;
2059
- }),
2060
- width: width,
2061
- height: height,
2062
- landscape: landscape,
2063
- menuOverScreen: menuOverScreen,
2064
- resolution: scale !== null ? scale * devicePixelRatio : devicePixelRatio,
2065
- imageResolution: scale !== null ? Math.max(scale, devicePixelRatio) : devicePixelRatio
2066
- };
2067
- }, [screens, providedMedia, mediaType, width, height, landscape, menuOverScreen]);
2068
- return screenSize;
2069
- };
2070
- var useScreenSizeFromElement = function useScreenSizeFromElement() {
2071
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
2072
- var _ref4 = options || {},
2073
- _ref4$width = _ref4.width,
2074
- width = _ref4$width === void 0 ? null : _ref4$width,
2075
- _ref4$height = _ref4.height,
2076
- height = _ref4$height === void 0 ? null : _ref4$height,
2077
- opts = _objectWithoutProperties(_ref4, _excluded);
2078
- var _useDimensionObserver = useDimensionObserver(),
2079
- ref = _useDimensionObserver.ref,
2080
- _useDimensionObserver2 = _useDimensionObserver.width,
2081
- calculatedWidth = _useDimensionObserver2 === void 0 ? 0 : _useDimensionObserver2,
2082
- _useDimensionObserver3 = _useDimensionObserver.height,
2083
- calculatedHeight = _useDimensionObserver3 === void 0 ? 0 : _useDimensionObserver3;
2084
- var devicePixelRatio = useDevicePixelRatio();
2085
- var fullWidth = width !== null ? width : calculatedWidth;
2086
- var fullHeight = height !== null ? height : calculatedHeight;
2087
- var _ref5 = opts || {},
2088
- _ref5$screenWidth = _ref5.screenWidth,
2089
- screenWidth = _ref5$screenWidth === void 0 ? 320 : _ref5$screenWidth,
2090
- _ref5$screenHeight = _ref5.screenHeight,
2091
- screenHeight = _ref5$screenHeight === void 0 ? 480 : _ref5$screenHeight,
2092
- _ref5$withoutMaxSize = _ref5.withoutMaxSize,
2093
- withoutMaxSize = _ref5$withoutMaxSize === void 0 ? false : _ref5$withoutMaxSize,
2094
- _ref5$landscapeMinHei = _ref5.landscapeMinHeight,
2095
- landscapeMinHeight = _ref5$landscapeMinHei === void 0 ? 600 : _ref5$landscapeMinHei,
2096
- _ref5$menuAlwaysOverS = _ref5.menuAlwaysOverScreen,
2097
- menuAlwaysOverScreen = _ref5$menuAlwaysOverS === void 0 ? true : _ref5$menuAlwaysOverS,
2098
- _ref5$landscapeMinRat = _ref5.landscapeMinRatio,
2099
- landscapeMinRatio = _ref5$landscapeMinRat === void 0 ? 2 / 3 : _ref5$landscapeMinRat,
2100
- _ref5$withoutScale = _ref5.withoutScale,
2101
- withoutScale = _ref5$withoutScale === void 0 ? false : _ref5$withoutScale;
2102
- var screenRatio = screenWidth / screenHeight;
2103
- var elementRatio = fullWidth / fullHeight;
2104
- var landscape = fullHeight > 0 && elementRatio > (landscapeMinRatio || screenRatio);
2105
- var landscapeWithMaxSize = landscape && !withoutMaxSize;
2106
- var finalWidth = fullWidth;
2107
- var finalHeight = fullHeight;
2108
- var menuOverScreen = !landscape;
2109
- if (landscapeWithMaxSize) {
2110
- if (fullHeight < landscapeMinHeight || menuAlwaysOverScreen) {
2111
- menuOverScreen = true;
2112
- } else {
2113
- finalHeight = fullHeight - 100;
2114
- }
2115
- finalWidth = Math.round(finalHeight * screenRatio);
2116
- }
2117
- if (finalWidth % 2 === 1) {
2118
- finalWidth -= 1;
2119
- }
2120
- if (finalHeight % 2 === 1) {
2121
- finalHeight -= 1;
2122
- }
2123
- var scale = finalWidth > 0 ? finalWidth / screenWidth : null;
2124
- var screenSize = useScreenSize(_objectSpread({
2125
- width: withoutScale || scale === null ? finalWidth : screenWidth,
2126
- height: withoutScale || scale === null ? finalHeight : finalHeight / scale,
2127
- landscape: landscape,
2128
- menuOverScreen: menuOverScreen,
2129
- scale: !withoutScale ? scale : null
2130
- }, opts));
2131
- return {
2132
- ref: ref,
2133
- fullWidth: fullWidth,
2134
- fullHeight: fullHeight,
2135
- screenSize: screenSize,
2136
- scale: !withoutScale ? scale : null,
2137
- resolution: !withoutScale ? scale * devicePixelRatio : devicePixelRatio
2138
- };
2139
- };
2140
- var useScreenSizeFromWindow = function useScreenSizeFromWindow(opts) {
2141
- var windowSize = hooks.useWindowSize();
2142
- return useScreenSize(_objectSpread(_objectSpread({}, opts), windowSize));
2143
- };
2144
-
2145
- var getValueFromSpring = function getValueFromSpring(s) {
2146
- var _ref = s || {},
2147
- _ref$value = _ref.value,
2148
- v = _ref$value === void 0 ? null : _ref$value;
2149
- var _ref2 = v || {},
2150
- p = _ref2.progress;
2151
- return p;
2152
- };
2153
- function useSpringValue(wantedProgress, immediate, params) {
2154
- var _useState = react.useState(wantedProgress),
2155
- _useState2 = _slicedToArray(_useState, 2),
2156
- progress = _useState2[0],
2157
- setProgress = _useState2[1];
2158
- var onChange = react.useCallback(function (spring) {
2159
- return setProgress(getValueFromSpring(spring));
2160
- }, [setProgress]);
2161
- core$1.useSpring(_objectSpread({
2162
- progress: wantedProgress,
2163
- onChange: onChange,
2164
- immediate: immediate
2165
- }, params));
2166
- return immediate ? wantedProgress : progress;
2167
- }
2168
-
2169
- function checkWebpSupport() {
2170
- return new Promise(function (resolve) {
2171
- var img = document.createElement('img');
2172
- img.onload = function () {
2173
- resolve(img.width > 0 && img.height > 0);
2174
- };
2175
- img.onerror = function () {
2176
- resolve(false);
2177
- };
2178
- img.src = 'data:image/webp;base64,UklGRiQAAABXRUJQVlA4IBgAAAAwAQCdASoCAAEAAQAcJaQAA3AA/v3AgAA=';
2179
- });
2180
- }
2181
- function useSupportsWebp() {
2182
- var defaultValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
2183
- var _useState = react.useState(defaultValue),
2184
- _useState2 = _slicedToArray(_useState, 2),
2185
- supportsWebp = _useState2[0],
2186
- setSupportsWebp = _useState2[1];
2187
- react.useEffect(function () {
2188
- var canceled = false;
2189
- checkWebpSupport().then(function (newSupport) {
2190
- if (!canceled && newSupport !== supportsWebp) {
2191
- setSupportsWebp(newSupport);
2192
- }
2193
- });
2194
- return function () {
2195
- canceled = true;
2196
- };
2197
- }, []);
2198
- return supportsWebp;
2199
- }
2200
-
2201
- var useSwipe = function useSwipe() {
2202
- var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
2203
- _ref$width = _ref.width,
2204
- width = _ref$width === void 0 ? null : _ref$width,
2205
- _ref$items = _ref.items,
2206
- initialItems = _ref$items === void 0 ? null : _ref$items,
2207
- _ref$withSpring = _ref.withSpring,
2208
- withSpring = _ref$withSpring === void 0 ? true : _ref$withSpring,
2209
- _ref$swipeWidthThresh = _ref.swipeWidthThreshold,
2210
- swipeWidthThreshold = _ref$swipeWidthThresh === void 0 ? 3 : _ref$swipeWidthThresh,
2211
- _ref$animateScale = _ref.animateScale,
2212
- animateScale = _ref$animateScale === void 0 ? false : _ref$animateScale,
2213
- _ref$disabled = _ref.disabled,
2214
- disabled = _ref$disabled === void 0 ? false : _ref$disabled,
2215
- _ref$lockAxis = _ref.lockAxis,
2216
- lockAxis = _ref$lockAxis === void 0 ? false : _ref$lockAxis,
2217
- _ref$onSwipeStart = _ref.onSwipeStart,
2218
- onSwipeStart = _ref$onSwipeStart === void 0 ? null : _ref$onSwipeStart,
2219
- _ref$onSwipeEnd = _ref.onSwipeEnd,
2220
- onSwipeEnd = _ref$onSwipeEnd === void 0 ? null : _ref$onSwipeEnd,
2221
- _ref$onSwipeCancel = _ref.onSwipeCancel,
2222
- onSwipeCancel = _ref$onSwipeCancel === void 0 ? null : _ref$onSwipeCancel,
2223
- _ref$onTap = _ref.onTap,
2224
- onTap = _ref$onTap === void 0 ? null : _ref$onTap;
2225
- var items = initialItems || [];
2226
- var swipingIndex = react.useRef(null);
2227
- var index = react.useRef(0);
2228
- var lockedAxis = react.useRef(null);
2229
- var hasWidth = width !== null;
2230
- var _useWindowSize = hooks.useWindowSize(),
2231
- windowWidth = _useWindowSize.width;
2232
- var currentWidth = hasWidth ? width : windowWidth;
2233
- var count = items.length;
2234
- var getItem = react.useCallback(function () {
2235
- var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
2236
- var idx = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
2237
- var scale = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
2238
- return {
2239
- x: x,
2240
- zIndex: idx,
2241
- scale: scale
2242
- };
2243
- });
2244
- var getItems = react.useCallback(function () {
2245
- var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
2246
- _ref2$down = _ref2.down,
2247
- down = _ref2$down === void 0 ? false : _ref2$down,
2248
- _ref2$mx = _ref2.mx,
2249
- mx = _ref2$mx === void 0 ? 0 : _ref2$mx;
2250
- return items.map(function (item, i) {
2251
- var x = disabled ? 0 : (i - index.current) * currentWidth + (down ? mx : 0);
2252
- var scale = !animateScale || disabled || !down ? 1 : 1 - Math.abs(mx) / currentWidth / 2;
2253
- return getItem(x, i, scale);
2254
- });
2255
- }, [disabled, items, index, currentWidth, animateScale]);
2256
-
2257
- // Initial items state
2258
- var _useSprings = core$1.useSprings(items.length, function (i) {
2259
- return {
2260
- x: disabled ? 0 : i * currentWidth,
2261
- y: 0,
2262
- zIndex: i,
2263
- config: _objectSpread({}, !withSpring ? {
2264
- duration: 1
2265
- } : null)
2266
- };
2267
- }),
2268
- _useSprings2 = _slicedToArray(_useSprings, 2),
2269
- itemsWithProps = _useSprings2[0],
2270
- set = _useSprings2[1];
2271
- var bind = react$1.useDrag(function (_ref3) {
2272
- var down = _ref3.down,
2273
- _ref3$movement = _slicedToArray(_ref3.movement, 2),
2274
- mx = _ref3$movement[0],
2275
- my = _ref3$movement[1],
2276
- _ref3$direction = _slicedToArray(_ref3.direction, 1),
2277
- xDir = _ref3$direction[0],
2278
- cancel = _ref3.cancel,
2279
- tap = _ref3.tap;
2280
- if (disabled) {
2281
- cancel();
2282
- return;
2283
- }
2284
- if (!down && swipingIndex.current === index.current) {
2285
- lockedAxis.current = null;
2286
- if (onSwipeCancel !== null) {
2287
- onSwipeCancel(index.current);
2288
- }
2289
- }
2290
-
2291
- // Block first and last moves
2292
- /*
2293
- if (down && index.current === items.length - 1 && xDir < 0) {
2294
- cancel();
2295
- return;
2296
- }
2297
- if (down && index.current === 0 && xDir > 0) {
2298
- cancel();
2299
- return;
2300
- }
2301
- */
2302
-
2303
- var movementX = !lockAxis || lockedAxis.current === 'x' ? mx : 0;
2304
- var movementY = !lockAxis || lockedAxis.current === 'y' ? my : 0;
2305
- if (down) {
2306
- // Snap to next slide
2307
- if (Math.abs(movementX) > currentWidth / swipeWidthThreshold) {
2308
- index.current = clamp(index.current + (xDir > 0 ? -1 : 1), 0, count - 1);
2309
- lockedAxis.current = null;
2310
- cancel();
2311
- if (onSwipeEnd !== null) {
2312
- onSwipeEnd(index.current);
2313
- }
2314
- return;
2315
- }
2316
- }
2317
- set(getItems({
2318
- down: down,
2319
- mx: movementX,
2320
- my: movementY
2321
- }));
2322
-
2323
- // saving current swiping index in a ref in order to have a section called only once when swipe just started or a tap was detected
2324
- if (swipingIndex.current !== index.current) {
2325
- if (down && !tap) {
2326
- if (onSwipeStart !== null) {
2327
- onSwipeStart(index.current);
2328
- }
2329
- }
2330
- if (!down && tap) {
2331
- if (onTap !== null) {
2332
- onTap();
2333
- }
2334
- }
2335
- }
2336
-
2337
- // lock swiping on axis from initial 3 pixels distance (Y axis requires to swipe down)
2338
- if (lockAxis && down && lockedAxis.current === null) {
2339
- var distanceX = Math.abs(mx);
2340
- var distanceY = Math.abs(my);
2341
- if (distanceX !== distanceY && (distanceY > 2 || distanceX > 2)) {
2342
- lockedAxis.current = distanceY > distanceX ? 'y' : 'x';
2343
- }
2344
- }
2345
- swipingIndex.current = down && !tap ? index.current : null;
2346
- }, {
2347
- filterTaps: true
2348
- });
2349
- var reset = react.useCallback(function () {
2350
- set(getItems());
2351
- }, [disabled, items, index, currentWidth]);
2352
- var setIndex = react.useCallback(function (idx) {
2353
- index.current = idx;
2354
- reset();
2355
- }, [reset]);
2356
-
2357
- // Reset on resize or others
2358
- react.useEffect(function () {
2359
- set(getItems());
2360
- }, [items, width, set, disabled]);
2361
- return {
2362
- items: itemsWithProps,
2363
- bind: bind,
2364
- index: index.current,
2365
- setIndex: setIndex
2366
- };
2367
- };
2368
-
2369
- var useThemeParser = function useThemeParser() {
2370
- var screensManager = contexts.useScreensManager();
2371
- var parser = react.useMemo(function () {
2372
- return new core.ThemeParser({
2373
- screensManager: screensManager
2374
- });
2375
- }, [screensManager]);
2376
- var parse = react.useCallback(function (story) {
2377
- return parser.parse(story);
2378
- }, [parser]);
2379
- return parse;
2380
- };
2381
-
2382
- var getScreenOptions = function getScreenOptions(screenContext, opts) {
2383
- var _ref = screenContext || {},
2384
- _ref$data = _ref.data,
2385
- ctxData = _ref$data === void 0 ? null : _ref$data;
2386
- var _ref2 = ctxData || {},
2387
- _ref2$id = _ref2.id,
2388
- ctxScreenId = _ref2$id === void 0 ? null : _ref2$id,
2389
- ctxScreenType = _ref2.type;
2390
- var _ref3 = opts || {},
2391
- _ref3$screenId = _ref3.screenId,
2392
- optsScreenId = _ref3$screenId === void 0 ? null : _ref3$screenId,
2393
- _ref3$screenType = _ref3.screenType,
2394
- optsScreenType = _ref3$screenType === void 0 ? null : _ref3$screenType;
2395
- var screenId = ctxScreenId !== null ? ctxScreenId : optsScreenId;
2396
- var screenType = ctxScreenType !== null ? ctxScreenType : optsScreenType;
2397
- return {
2398
- screenId: screenId,
2399
- screenType: screenType
2400
- };
2401
- };
2402
- var hasTracking = function hasTracking(tracking) {
2403
- return typeof tracking !== 'undefined';
2404
- };
2405
- var useTrackScreenView = function useTrackScreenView() {
2406
- var tracking = contexts.useTracking();
2407
- if (!hasTracking(tracking)) {
2408
- return function () {};
2409
- }
2410
- return react.useCallback(function () {
2411
- var screen = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
2412
- var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
2413
- if (screen !== null && index !== null) {
2414
- tracking.trackScreenView(screen, index);
2415
- }
2416
- }, []);
2417
- };
2418
- var useTrackScreenEvent = function useTrackScreenEvent() {
2419
- var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
2420
- var tracking = contexts.useTracking();
2421
- if (!hasTracking(tracking)) {
2422
- return function () {};
2423
- }
2424
- var screenContext = contexts.useScreen();
2425
- if (screenContext.renderContext !== 'view') {
2426
- return function () {};
2427
- }
2428
- return react.useCallback(function () {
2429
- var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
2430
- var label = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
2431
- var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
2432
- if (type !== null && action !== null) {
2433
- tracking.trackEvent("screen_".concat(type), action, label, _objectSpread(_objectSpread({}, opts), getScreenOptions(screenContext, opts)));
2434
- }
2435
- }, [screenContext]);
2436
- };
2437
- var useTrackScreenMedia = function useTrackScreenMedia() {
2438
- var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
2439
- var tracking = contexts.useTracking();
2440
- if (!hasTracking(tracking)) {
2441
- return function () {};
2442
- }
2443
- var screenContext = contexts.useScreen();
2444
- if (screenContext.renderContext !== 'view') {
2445
- return function () {};
2446
- }
2447
- return react.useCallback(function () {
2448
- var media = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
2449
- var action = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
2450
- var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
2451
- if (type !== null && media !== null && action !== null) {
2452
- tracking.trackMedia("screen_".concat(type), media, action, _objectSpread(_objectSpread({}, opts), getScreenOptions(screenContext, opts)));
2453
- }
2454
- }, [screenContext]);
2455
- };
2456
- var useTrackEvent = function useTrackEvent() {
2457
- var tracking = contexts.useTracking();
2458
- if (!hasTracking(tracking)) {
2459
- return function () {};
2460
- }
2461
- return react.useCallback(function () {
2462
- var category = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
2463
- var action = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
2464
- var label = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
2465
- var opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
2466
- if (category !== null && action !== null) {
2467
- tracking.trackEvent(category, action, label, opts);
2468
- }
2469
- }, []);
2470
- };
2471
- var useTrackMedia = function useTrackMedia() {
2472
- var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
2473
- var tracking = contexts.useTracking();
2474
- if (!hasTracking(tracking)) {
2475
- return function () {};
2476
- }
2477
- return react.useCallback(function () {
2478
- var media = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
2479
- var action = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
2480
- var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
2481
- if (type !== null && media !== null && action !== null) {
2482
- tracking.trackMedia(type, media, action, opts);
2483
- }
2484
- }, []);
2485
- };
2486
-
2487
- var eventsManager = typeof window !== 'undefined' ? new core.EventsManager(window) : null;
2488
- var useWindowEvent = utils.createUseEvent(eventsManager);
2489
-
2490
- exports.getObserver = getObserver;
2491
- exports.useActivityDetector = useActivityDetector;
2492
- exports.useAnimationFrame = useAnimationFrame;
2493
- exports.useDebounce = useDebounced;
2494
- exports.useDevicePixelRatio = useDevicePixelRatio;
2495
- exports.useDimensionObserver = useDimensionObserver;
2496
- exports.useDocumentEvent = useDocumentEvent;
2497
- exports.useDragProgress = useDragProgress;
2498
- exports.useForm = useForm;
2499
- exports.useFormTransition = useFormTransition;
2500
- exports.useFormattedDate = useFormattedDate;
2501
- exports.useFormattedTime = useFormattedTime;
2502
- exports.useFullscreen = useFullscreen;
2503
- exports.useIntersectionObserver = useIntersectionObserver;
2504
- exports.useIsVisible = useIsVisible;
2505
- exports.useLoadedFonts = useLoadedFonts;
2506
- exports.useLongPress = useLongPress;
2507
- exports.useMediaApi = useMediaApi;
2508
- exports.useMediaBuffering = useMediaBuffering;
2509
- exports.useMediaCurrentTime = useMediaCurrentTime;
2510
- exports.useMediaDuration = useMediaDuration;
2511
- exports.useMediaLoad = useMediaLoad;
2512
- exports.useMediaProgress = useMediaProgress;
2513
- exports.useMediaReady = useMediaReady;
2514
- exports.useMediaState = useMediaState;
2515
- exports.useMediaThumbnail = useMediaThumbnail;
2516
- exports.useMediaTimestampOffset = useMediaTimestampOffset;
2517
- exports.useMediaWaveform = useMediaWaveform;
2518
- exports.useMediasParser = useMediasParser;
2519
- exports.useObserver = useObserver;
2520
- exports.useParsedStory = useParsedStory;
2521
- exports.usePlaceholderStyle = usePlaceholderStyle;
2522
- exports.useProgressSteps = useProgressSteps;
2523
- exports.useResizeObserver = useResizeObserver;
2524
- exports.useScreenSizeFromElement = useScreenSizeFromElement;
2525
- exports.useScreenSizeFromWindow = useScreenSizeFromWindow;
2526
- exports.useSpringValue = useSpringValue;
2527
- exports.useSupportsWebp = useSupportsWebp;
2528
- exports.useSwipe = useSwipe;
2529
- exports.useThemeParser = useThemeParser;
2530
- exports.useTrackEvent = useTrackEvent;
2531
- exports.useTrackMedia = useTrackMedia;
2532
- exports.useTrackScreenEvent = useTrackScreenEvent;
2533
- exports.useTrackScreenMedia = useTrackScreenMedia;
2534
- exports.useTrackScreenView = useTrackScreenView;
2535
- exports.useWindowEvent = useWindowEvent;