@folklore/hooks 0.0.8 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/cjs.js +1322 -8
  2. package/dist/es.js +1315 -8
  3. package/package.json +5 -3
package/dist/cjs.js CHANGED
@@ -2,18 +2,400 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
+ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
6
+ var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
5
7
  var react = require('react');
8
+ var services = require('@folklore/services');
9
+ var createDebug = require('debug');
6
10
  var EventsManager = require('@folklore/events');
7
- var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
8
11
  var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
9
- var _defineProperty = require('@babel/runtime/helpers/defineProperty');
10
12
 
11
13
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
14
 
13
- var EventsManager__default = /*#__PURE__*/_interopDefaultLegacy(EventsManager);
15
+ var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
14
16
  var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray);
17
+ var createDebug__default = /*#__PURE__*/_interopDefaultLegacy(createDebug);
18
+ var EventsManager__default = /*#__PURE__*/_interopDefaultLegacy(EventsManager);
15
19
  var _toConsumableArray__default = /*#__PURE__*/_interopDefaultLegacy(_toConsumableArray);
16
- var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
20
+
21
+ function usePlayerCurrentTime(player) {
22
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
23
+ _ref$id = _ref.id,
24
+ id = _ref$id === void 0 ? null : _ref$id,
25
+ _ref$disabled = _ref.disabled,
26
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
27
+ _ref$updateInterval = _ref.updateInterval,
28
+ updateInterval = _ref$updateInterval === void 0 ? 1000 : _ref$updateInterval,
29
+ _ref$onUpdate = _ref.onUpdate,
30
+ customOnUpdate = _ref$onUpdate === void 0 ? null : _ref$onUpdate,
31
+ _ref$getCurrentTime = _ref.getCurrentTime,
32
+ getCurrentTime = _ref$getCurrentTime === void 0 ? function (p) {
33
+ return p.currentTime;
34
+ } : _ref$getCurrentTime;
35
+
36
+ var _useState = react.useState(0),
37
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
38
+ currentTime = _useState2[0],
39
+ setCurrentTime = _useState2[1];
40
+
41
+ var realCurrentTime = react.useRef(currentTime);
42
+ var lastIdRef = react.useRef(id);
43
+ var idChanged = lastIdRef.current !== id;
44
+
45
+ if (idChanged) {
46
+ realCurrentTime.current = 0;
47
+ lastIdRef.current = id;
48
+ } // Check time update
49
+
50
+
51
+ react.useEffect(function () {
52
+ if (disabled || player === null) {
53
+ return function () {};
54
+ }
55
+
56
+ var canceled = false;
57
+
58
+ var updateTime = function updateTime(time) {
59
+ if (canceled) {
60
+ return;
61
+ }
62
+
63
+ realCurrentTime.current = time;
64
+ setCurrentTime(time);
65
+
66
+ if (customOnUpdate !== null) {
67
+ customOnUpdate(time);
68
+ }
69
+ };
70
+
71
+ var interval = setInterval(function () {
72
+ var time = getCurrentTime(player);
73
+
74
+ if (typeof time.then !== 'undefined') {
75
+ time.then(updateTime);
76
+ } else {
77
+ updateTime(time);
78
+ }
79
+ }, updateInterval);
80
+ return function () {
81
+ canceled = true;
82
+ clearInterval(interval);
83
+ };
84
+ }, [id, player, setCurrentTime, disabled, updateInterval, getCurrentTime]);
85
+ return realCurrentTime.current;
86
+ }
87
+
88
+ function ownKeys$4(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
89
+
90
+ function _objectSpread$4(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$4(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$4(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
91
+ var noPlayerError$2 = new Error('No player');
92
+ var debug$3 = createDebug__default["default"]('folklore:video:youtube');
93
+
94
+ var useDailymotionPlayer = function useDailymotionPlayer() {
95
+ var id = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
96
+ var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
97
+ var _params$width = params.width,
98
+ width = _params$width === void 0 ? 0 : _params$width,
99
+ _params$height = params.height,
100
+ height = _params$height === void 0 ? 0 : _params$height,
101
+ _params$duration = params.duration,
102
+ duration = _params$duration === void 0 ? 0 : _params$duration,
103
+ _params$autoplay = params.autoplay,
104
+ autoplay = _params$autoplay === void 0 ? false : _params$autoplay,
105
+ _params$muted = params.muted,
106
+ initialMuted = _params$muted === void 0 ? false : _params$muted,
107
+ _params$start = params.start,
108
+ start = _params$start === void 0 ? 0 : _params$start,
109
+ _params$controls = params.controls,
110
+ controls = _params$controls === void 0 ? true : _params$controls,
111
+ _params$queueAutoplay = params.queueAutoplayNext,
112
+ queueAutoplayNext = _params$queueAutoplay === void 0 ? false : _params$queueAutoplay,
113
+ _params$queueEnable = params.queueEnable,
114
+ queueEnable = _params$queueEnable === void 0 ? false : _params$queueEnable,
115
+ _params$sharingEnable = params.sharingEnable,
116
+ sharingEnable = _params$sharingEnable === void 0 ? false : _params$sharingEnable,
117
+ _params$uiLogo = params.uiLogo,
118
+ uiLogo = _params$uiLogo === void 0 ? false : _params$uiLogo,
119
+ _params$uiStartScreen = params.uiStartScreenInfo,
120
+ uiStartScreenInfo = _params$uiStartScreen === void 0 ? true : _params$uiStartScreen,
121
+ _params$timeUpdateInt = params.timeUpdateInterval,
122
+ timeUpdateInterval = _params$timeUpdateInt === void 0 ? 1000 : _params$timeUpdateInt,
123
+ _params$onTimeUpdate = params.onTimeUpdate,
124
+ customOnTimeUpdate = _params$onTimeUpdate === void 0 ? null : _params$onTimeUpdate;
125
+
126
+ var _useState = react.useState(typeof window.DM !== 'undefined'),
127
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
128
+ apiLoaded = _useState2[0],
129
+ setApiLoaded = _useState2[1];
130
+
131
+ var _useState3 = react.useState(false),
132
+ _useState4 = _slicedToArray__default["default"](_useState3, 2),
133
+ playerReady = _useState4[0],
134
+ setPlayerReady = _useState4[1];
135
+
136
+ var _useState5 = react.useState(false),
137
+ _useState6 = _slicedToArray__default["default"](_useState5, 2),
138
+ loaded = _useState6[0],
139
+ setLoaded = _useState6[1];
140
+
141
+ var apiRef = react.useRef(typeof window.DM !== 'undefined' ? window.DM : null);
142
+ var elementRef = react.useRef(null);
143
+ var playerRef = react.useRef(null);
144
+ var ready = apiLoaded && playerReady;
145
+
146
+ var _useState7 = react.useState(initialMuted),
147
+ _useState8 = _slicedToArray__default["default"](_useState7, 2),
148
+ muted = _useState8[0],
149
+ setMuted = _useState8[1];
150
+
151
+ var _useState9 = react.useState(initialMuted ? 0 : 1),
152
+ _useState10 = _slicedToArray__default["default"](_useState9, 2),
153
+ volume = _useState10[0],
154
+ setVolumeState = _useState10[1];
155
+
156
+ var _useState11 = react.useState({
157
+ playing: false,
158
+ paused: false,
159
+ ended: false,
160
+ buffering: false,
161
+ adPlaying: false
162
+ }),
163
+ _useState12 = _slicedToArray__default["default"](_useState11, 2),
164
+ playState = _useState12[0],
165
+ setPlayState = _useState12[1];
166
+
167
+ var _useState13 = react.useState({
168
+ width: width,
169
+ height: height,
170
+ duration: duration
171
+ }),
172
+ _useState14 = _slicedToArray__default["default"](_useState13, 2),
173
+ metadata = _useState14[0],
174
+ setMetadata = _useState14[1]; // Load SDK
175
+
176
+
177
+ react.useEffect(function () {
178
+ var canceled = false;
179
+
180
+ if (!apiLoaded && id !== null) {
181
+ services.loadDailymotion().then(function (api) {
182
+ if (!canceled) {
183
+ apiRef.current = api;
184
+ setApiLoaded(true);
185
+ debug$3('API Loaded');
186
+ }
187
+ });
188
+ }
189
+
190
+ return function () {
191
+ canceled = true;
192
+ };
193
+ }, [id]); // Create or update player
194
+
195
+ react.useEffect(function () {
196
+ var _apiRef$current = apiRef.current,
197
+ DM = _apiRef$current === void 0 ? null : _apiRef$current;
198
+ var _playerRef$current = playerRef.current,
199
+ currentPlayer = _playerRef$current === void 0 ? null : _playerRef$current;
200
+ var _elementRef$current = elementRef.current,
201
+ element = _elementRef$current === void 0 ? null : _elementRef$current;
202
+
203
+ if (!apiLoaded || id === null || element === null) {
204
+ return;
205
+ }
206
+
207
+ var playerParams = {
208
+ 'autoplay-d': autoplay,
209
+ // muted,
210
+ start: start,
211
+ controls: controls,
212
+ 'queue-autoplay-next': queueAutoplayNext,
213
+ 'queue-enable': queueEnable,
214
+ 'sharing-enable': sharingEnable,
215
+ 'ui-logo': uiLogo,
216
+ 'ui-start-screen-info': uiStartScreenInfo
217
+ };
218
+ var player = currentPlayer;
219
+
220
+ if (player !== null) {
221
+ player.load(id, {
222
+ params: playerParams
223
+ });
224
+ } else {
225
+ player = DM.player(element, {
226
+ video: id,
227
+ width: width,
228
+ height: height,
229
+ params: playerParams
230
+ });
231
+ playerRef.current = player;
232
+ }
233
+
234
+ if (!playerReady) {
235
+ setPlayerReady(true);
236
+ }
237
+ }, [apiLoaded, elementRef.current, id, width, height, autoplay, muted, start, controls, queueAutoplayNext, queueEnable, sharingEnable, uiLogo, uiStartScreenInfo]);
238
+ react.useEffect(function () {
239
+ var _playerRef$current2 = playerRef.current,
240
+ player = _playerRef$current2 === void 0 ? null : _playerRef$current2;
241
+
242
+ if (player === null) {
243
+ return function () {};
244
+ }
245
+
246
+ var currentPlayState = playState;
247
+ var currentMetadata = metadata;
248
+
249
+ function onPlaybackReady() {
250
+ setLoaded(true);
251
+ }
252
+
253
+ function onLoadedMetadata() {
254
+ currentMetadata = _objectSpread$4(_objectSpread$4({}, currentMetadata), {}, {
255
+ duration: player.duration
256
+ });
257
+ setMetadata(currentMetadata);
258
+ }
259
+
260
+ function onDurationChange() {
261
+ currentMetadata = _objectSpread$4(_objectSpread$4({}, currentMetadata), {}, {
262
+ duration: player.duration
263
+ });
264
+ setMetadata(currentMetadata);
265
+ }
266
+
267
+ function onVolumeChange() {
268
+ setMuted(player.muted);
269
+ setVolumeState(player.volume);
270
+ }
271
+
272
+ function onPlay() {
273
+ currentPlayState = _objectSpread$4(_objectSpread$4({}, currentPlayState), {}, {
274
+ playing: true,
275
+ paused: false,
276
+ ended: false
277
+ });
278
+ setPlayState(currentPlayState);
279
+ }
280
+
281
+ function onPause() {
282
+ currentPlayState = _objectSpread$4(_objectSpread$4({}, currentPlayState), {}, {
283
+ playing: false,
284
+ paused: true,
285
+ ended: false
286
+ });
287
+ setPlayState(currentPlayState);
288
+ }
289
+
290
+ function onEnd() {
291
+ currentPlayState = _objectSpread$4(_objectSpread$4({}, currentPlayState), {}, {
292
+ playing: false,
293
+ paused: false,
294
+ ended: true
295
+ });
296
+ setPlayState(currentPlayState);
297
+ }
298
+
299
+ function onPlaying() {
300
+ currentPlayState = _objectSpread$4(_objectSpread$4({}, currentPlayState), {}, {
301
+ buffering: false
302
+ });
303
+ setPlayState(currentPlayState);
304
+ }
305
+
306
+ function onWaiting() {
307
+ currentPlayState = _objectSpread$4(_objectSpread$4({}, currentPlayState), {}, {
308
+ buffering: true
309
+ });
310
+ setPlayState(currentPlayState);
311
+ }
312
+
313
+ function onAdStart() {
314
+ currentPlayState = _objectSpread$4(_objectSpread$4({}, currentPlayState), {}, {
315
+ adPlaying: true
316
+ });
317
+ setPlayState(currentPlayState);
318
+ }
319
+
320
+ function onAdEnd() {
321
+ currentPlayState = _objectSpread$4(_objectSpread$4({}, currentPlayState), {}, {
322
+ adPlaying: false
323
+ });
324
+ setPlayState(currentPlayState);
325
+ }
326
+
327
+ player.addEventListener('playback_ready', onPlaybackReady);
328
+ player.addEventListener('loadedmetadata', onLoadedMetadata);
329
+ player.addEventListener('durationchange', onDurationChange);
330
+ player.addEventListener('volumechange', onVolumeChange);
331
+ player.addEventListener('play', onPlay);
332
+ player.addEventListener('pause', onPause);
333
+ player.addEventListener('video_end', onEnd);
334
+ player.addEventListener('playing', onPlaying);
335
+ player.addEventListener('waiting', onWaiting);
336
+ player.addEventListener('ad_start', onAdStart);
337
+ player.addEventListener('ad_end', onAdEnd);
338
+ return function () {
339
+ player.removeEventListener('playback_ready', onPlaybackReady);
340
+ player.removeEventListener('loadedmetadata', onLoadedMetadata);
341
+ player.removeEventListener('durationchange', onDurationChange);
342
+ player.removeEventListener('volumechange', onVolumeChange);
343
+ player.removeEventListener('play', onPlay);
344
+ player.removeEventListener('pause', onPause);
345
+ player.removeEventListener('video_end', onEnd);
346
+ player.removeEventListener('playing', onPlaying);
347
+ player.removeEventListener('waiting', onWaiting);
348
+ player.removeEventListener('ad_start', onAdStart);
349
+ player.removeEventListener('ad_end', onAdEnd);
350
+ };
351
+ }, [playerRef.current, playerReady, id, setLoaded, setPlayState, setMetadata, setVolumeState, setMuted]);
352
+ var play = react.useCallback(function () {
353
+ var player = playerRef.current;
354
+ return player !== null ? player.play() : Promise.reject(noPlayerError$2);
355
+ }, []);
356
+ var pause = react.useCallback(function () {
357
+ var player = playerRef.current;
358
+ return player !== null ? player.pause() : Promise.reject(noPlayerError$2);
359
+ }, []);
360
+ var setVolume = react.useCallback(function (newVolume) {
361
+ var player = playerRef.current;
362
+ return player !== null ? player.setVolume(newVolume) : Promise.reject(noPlayerError$2);
363
+ }, []);
364
+ var mute = react.useCallback(function () {
365
+ var player = playerRef.current;
366
+ return player !== null ? player.setMute(true) : Promise.reject(noPlayerError$2);
367
+ }, []);
368
+ var unmute = react.useCallback(function () {
369
+ var player = playerRef.current;
370
+ return player !== null ? player.setMute(false) : Promise.reject(noPlayerError$2);
371
+ }, []);
372
+ var seek = react.useCallback(function (time) {
373
+ var player = playerRef.current;
374
+ return player !== null ? player.seek(time) : Promise.reject(noPlayerError$2);
375
+ }, []);
376
+ var playing = playState.playing;
377
+ var currentTime = usePlayerCurrentTime(playerRef.current, {
378
+ id: id,
379
+ disabled: !playing || timeUpdateInterval === null,
380
+ updateInterval: timeUpdateInterval,
381
+ onUpdate: customOnTimeUpdate
382
+ });
383
+ return _objectSpread$4(_objectSpread$4({
384
+ ref: elementRef,
385
+ player: playerRef.current,
386
+ ready: ready,
387
+ play: play,
388
+ pause: pause,
389
+ mute: mute,
390
+ unmute: unmute,
391
+ setVolume: setVolume,
392
+ seek: seek,
393
+ currentTime: currentTime,
394
+ loaded: loaded,
395
+ muted: muted,
396
+ volume: volume
397
+ }, metadata), playState);
398
+ };
17
399
 
18
400
  var eventsManager$1 = typeof document !== 'undefined' ? new EventsManager__default["default"](document) : null;
19
401
 
@@ -69,9 +451,212 @@ function useKeyboard() {
69
451
  useWindowEvent('keyup', keyMap !== null ? onKeyUp : null);
70
452
  }
71
453
 
72
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
454
+ function ownKeys$3(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
73
455
 
74
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
456
+ function _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$3(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$3(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
457
+ var debug$2 = createDebug__default["default"]('folklore:video:native');
458
+ var noPlayerError$1 = new Error('No player');
459
+
460
+ var useNativeVideoPlayer = function useNativeVideoPlayer(url) {
461
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
462
+ _ref$width = _ref.width,
463
+ width = _ref$width === void 0 ? 0 : _ref$width,
464
+ _ref$height = _ref.height,
465
+ height = _ref$height === void 0 ? 0 : _ref$height,
466
+ _ref$duration = _ref.duration,
467
+ duration = _ref$duration === void 0 ? 0 : _ref$duration,
468
+ _ref$initialMuted = _ref.initialMuted,
469
+ initialMuted = _ref$initialMuted === void 0 ? false : _ref$initialMuted,
470
+ _ref$timeUpdateInterv = _ref.timeUpdateInterval,
471
+ timeUpdateInterval = _ref$timeUpdateInterv === void 0 ? 1000 : _ref$timeUpdateInterv,
472
+ _ref$onTimeUpdate = _ref.onTimeUpdate,
473
+ customOnTimeUpdate = _ref$onTimeUpdate === void 0 ? null : _ref$onTimeUpdate;
474
+
475
+ var elementRef = react.useRef(null);
476
+
477
+ var _useState = react.useState(false),
478
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
479
+ loaded = _useState2[0],
480
+ setLoaded = _useState2[1];
481
+
482
+ var _useState3 = react.useState(initialMuted ? 0 : 1),
483
+ _useState4 = _slicedToArray__default["default"](_useState3, 2),
484
+ volume = _useState4[0],
485
+ setVolumeState = _useState4[1];
486
+
487
+ var _useState5 = react.useState({
488
+ playing: false,
489
+ paused: false,
490
+ ended: false,
491
+ buffering: false
492
+ }),
493
+ _useState6 = _slicedToArray__default["default"](_useState5, 2),
494
+ playState = _useState6[0],
495
+ setPlayState = _useState6[1];
496
+
497
+ var _useState7 = react.useState({
498
+ width: width,
499
+ height: height,
500
+ duration: duration
501
+ }),
502
+ _useState8 = _slicedToArray__default["default"](_useState7, 2),
503
+ metadata = _useState8[0],
504
+ setMetadata = _useState8[1];
505
+
506
+ var play = react.useCallback(function () {
507
+ var player = elementRef.current;
508
+ return player !== null ? player.play() : Promise.reject(noPlayerError$1);
509
+ }, []);
510
+ var pause = react.useCallback(function () {
511
+ var player = elementRef.current;
512
+ return player !== null ? player.pause() : Promise.reject(noPlayerError$1);
513
+ }, []);
514
+ var setVolume = react.useCallback(function (newVolume) {
515
+ var player = elementRef.current;
516
+
517
+ if (player !== null) {
518
+ player.volume = newVolume;
519
+ return Promise.resolve(newVolume);
520
+ }
521
+
522
+ return Promise.reject(noPlayerError$1);
523
+ }, []);
524
+ var mute = react.useCallback(function () {
525
+ var player = elementRef.current;
526
+
527
+ if (player !== null) {
528
+ player.muted = true;
529
+ return Promise.resolve(true);
530
+ }
531
+
532
+ return Promise.reject(noPlayerError$1);
533
+ }, []);
534
+ var unmute = react.useCallback(function () {
535
+ var player = elementRef.current;
536
+
537
+ if (player !== null) {
538
+ player.muted = false;
539
+ return Promise.resolve(false);
540
+ }
541
+
542
+ return Promise.reject(noPlayerError$1);
543
+ }, []);
544
+ var seek = react.useCallback(function (newTime) {
545
+ var player = elementRef.current;
546
+
547
+ if (player !== null) {
548
+ player.currentTime = newTime;
549
+ return Promise.resolve(newTime);
550
+ }
551
+
552
+ return Promise.reject(noPlayerError$1);
553
+ }, []);
554
+ var setLoop = react.useCallback(function (newLoop) {
555
+ var player = elementRef.current;
556
+
557
+ if (player !== null) {
558
+ player.loop = newLoop;
559
+ return Promise.resolve(newLoop);
560
+ }
561
+
562
+ return Promise.reject(noPlayerError$1);
563
+ }, []); // Bind player events
564
+
565
+ react.useEffect(function () {
566
+ var player = elementRef.current;
567
+
568
+ if (player === null) {
569
+ return function () {};
570
+ }
571
+
572
+ var onCanPlay = function onCanPlay() {
573
+ setLoaded(true);
574
+ debug$2('onCanPlay [URL: %s]', url);
575
+ };
576
+
577
+ var onMetadataLoaded = function onMetadataLoaded() {
578
+ var newMetadata = {
579
+ duration: player.duration,
580
+ width: player.videoWidth,
581
+ height: player.videoHeight
582
+ };
583
+ setMetadata(newMetadata);
584
+ debug$2('onMetadataLoaded [URL: %s]', url);
585
+ };
586
+
587
+ var onPlay = function onPlay() {
588
+ setPlayState({
589
+ playing: true,
590
+ paused: false,
591
+ ended: false,
592
+ buffering: false
593
+ });
594
+ debug$2('onPlay [URL: %s]', url);
595
+ };
596
+
597
+ var onPause = function onPause() {
598
+ setPlayState({
599
+ playing: false,
600
+ paused: true,
601
+ ended: false,
602
+ buffering: false
603
+ });
604
+ debug$2('onPause [URL: %s]', url);
605
+ };
606
+
607
+ var onEnded = function onEnded() {
608
+ setPlayState({
609
+ playing: false,
610
+ paused: false,
611
+ ended: true,
612
+ buffering: false
613
+ });
614
+ debug$2('onEnded [URL: %s]', url);
615
+ };
616
+
617
+ debug$2('Bind events [URL: %s]', url);
618
+ player.addEventListener('canplay', onCanPlay);
619
+ player.addEventListener('metadataloaded', onMetadataLoaded);
620
+ player.addEventListener('play', onPlay);
621
+ player.addEventListener('pause', onPause);
622
+ player.addEventListener('ended', onEnded);
623
+ return function () {
624
+ debug$2('Unbind events [URL: %s]', url);
625
+ player.removeEventListener('canplay', onCanPlay);
626
+ player.removeEventListener('metadataloaded', onMetadataLoaded);
627
+ player.removeEventListener('play', onPlay);
628
+ player.removeEventListener('pause', onPause);
629
+ player.removeEventListener('ended', onEnded);
630
+ };
631
+ }, [url, elementRef.current, setPlayState, setMetadata, setVolumeState, setLoaded]);
632
+ var playing = playState.playing;
633
+ var currentTime = usePlayerCurrentTime(elementRef.current, {
634
+ id: url,
635
+ disabled: !playing || timeUpdateInterval === null,
636
+ updateInterval: timeUpdateInterval,
637
+ onUpdate: customOnTimeUpdate
638
+ });
639
+ return _objectSpread$3(_objectSpread$3({
640
+ ref: elementRef,
641
+ player: elementRef.current,
642
+ play: play,
643
+ pause: pause,
644
+ mute: mute,
645
+ unmute: unmute,
646
+ setVolume: setVolume,
647
+ seek: seek,
648
+ setLoop: setLoop,
649
+ ready: true,
650
+ currentTime: currentTime,
651
+ loaded: loaded,
652
+ muted: volume === 0,
653
+ volume: volume
654
+ }, metadata), playState);
655
+ };
656
+
657
+ function ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
658
+
659
+ function _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$2(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
75
660
  var observersCache = new Map();
76
661
 
77
662
  var getOptionsKey = function getOptionsKey(_ref) {
@@ -94,7 +679,7 @@ var createObserver = function createObserver(Observer) {
94
679
 
95
680
  if (currentSubscriber !== null) {
96
681
  return subscribers.map(function (it) {
97
- return it.element === element && it.callbacks.indexOf(callback) === -1 ? _objectSpread(_objectSpread({}, it), {}, {
682
+ return it.element === element && it.callbacks.indexOf(callback) === -1 ? _objectSpread$2(_objectSpread$2({}, it), {}, {
98
683
  callbacks: [].concat(_toConsumableArray__default["default"](it.callbacks), [callback])
99
684
  }) : it;
100
685
  }).filter(function (it) {
@@ -110,7 +695,7 @@ var createObserver = function createObserver(Observer) {
110
695
 
111
696
  var removeSubscriber = function removeSubscriber(element, callback) {
112
697
  return subscribers.map(function (it) {
113
- return it.element === element ? _objectSpread(_objectSpread({}, it), {}, {
698
+ return it.element === element ? _objectSpread$2(_objectSpread$2({}, it), {}, {
114
699
  callbacks: it.callbacks.filter(function (subCallback) {
115
700
  return subCallback !== callback;
116
701
  })
@@ -309,10 +894,739 @@ var useResizeObserver = function useResizeObserver() {
309
894
  }, resizeObserverInitialEntry);
310
895
  };
311
896
 
897
+ function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
898
+
899
+ function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$1(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
900
+ var NO_PLAYER_ERROR = new Error('No player');
901
+
902
+ var getYoutubeVideoId = function getYoutubeVideoId(url) {
903
+ var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/;
904
+ var match = url.match(regExp);
905
+ return match && match[7].length === 11 ? match[7] : false;
906
+ };
907
+
908
+ var debug$1 = createDebug__default["default"]('folklore:video:youtube');
909
+ var isVideoId$1 = function isVideoId(url) {
910
+ return url !== null && url.match(/^https?:/) === null;
911
+ };
912
+
913
+ var getVideoId$1 = function getVideoId(url) {
914
+ if (url === null) {
915
+ return null;
916
+ }
917
+
918
+ if (isVideoId$1(url)) {
919
+ return url;
920
+ }
921
+
922
+ return getYoutubeVideoId(url);
923
+ };
924
+
925
+ function useYouTubePlayer(id) {
926
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
927
+ _ref$width = _ref.width,
928
+ width = _ref$width === void 0 ? 0 : _ref$width,
929
+ _ref$height = _ref.height,
930
+ height = _ref$height === void 0 ? 0 : _ref$height,
931
+ _ref$duration = _ref.duration,
932
+ duration = _ref$duration === void 0 ? 0 : _ref$duration,
933
+ _ref$autoplay = _ref.autoplay,
934
+ autoplay = _ref$autoplay === void 0 ? false : _ref$autoplay,
935
+ _ref$controls = _ref.controls,
936
+ controls = _ref$controls === void 0 ? true : _ref$controls,
937
+ _ref$timeUpdateInterv = _ref.timeUpdateInterval,
938
+ timeUpdateInterval = _ref$timeUpdateInterv === void 0 ? 1000 : _ref$timeUpdateInterv,
939
+ _ref$muted = _ref.muted,
940
+ initialMuted = _ref$muted === void 0 ? false : _ref$muted,
941
+ _ref$onVolumeChange = _ref.onVolumeChange,
942
+ customOnVolumeChange = _ref$onVolumeChange === void 0 ? null : _ref$onVolumeChange,
943
+ _ref$onTimeUpdate = _ref.onTimeUpdate,
944
+ customOnTimeUpdate = _ref$onTimeUpdate === void 0 ? null : _ref$onTimeUpdate;
945
+
946
+ var _useState = react.useState(typeof window.YT !== 'undefined'),
947
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
948
+ apiLoaded = _useState2[0],
949
+ setApiLoaded = _useState2[1];
950
+
951
+ var apiRef = react.useRef(typeof window.YT !== 'undefined' ? window.YT : null);
952
+ var elementRef = react.useRef(null);
953
+ var playerRef = react.useRef(null);
954
+ var playerElementRef = react.useRef(elementRef.current);
955
+ var videoId = react.useMemo(function () {
956
+ return getVideoId$1(id);
957
+ }, [id]);
958
+
959
+ var _useState3 = react.useState(false),
960
+ _useState4 = _slicedToArray__default["default"](_useState3, 2),
961
+ ready = _useState4[0],
962
+ setReady = _useState4[1];
963
+
964
+ var _useState5 = react.useState(initialMuted),
965
+ _useState6 = _slicedToArray__default["default"](_useState5, 2),
966
+ muted = _useState6[0],
967
+ setMuted = _useState6[1];
968
+
969
+ var _useState7 = react.useState({
970
+ playing: false,
971
+ paused: false,
972
+ ended: false,
973
+ buffering: false
974
+ }),
975
+ _useState8 = _slicedToArray__default["default"](_useState7, 2),
976
+ playState = _useState8[0],
977
+ setPlayState = _useState8[1];
978
+
979
+ var _useState9 = react.useState({
980
+ width: width,
981
+ height: height,
982
+ duration: duration
983
+ }),
984
+ _useState10 = _slicedToArray__default["default"](_useState9, 2),
985
+ metadata = _useState10[0],
986
+ setMetadata = _useState10[1];
987
+
988
+ react.useEffect(function () {
989
+ var canceled = false;
990
+
991
+ if (!apiLoaded && videoId !== null) {
992
+ services.loadYouTube().then(function (api) {
993
+ if (!canceled) {
994
+ apiRef.current = api;
995
+ setApiLoaded(true);
996
+ debug$1('API Loaded');
997
+ }
998
+ });
999
+ }
1000
+
1001
+ return function () {
1002
+ canceled = true;
1003
+ };
1004
+ }, [apiLoaded, videoId, setApiLoaded]);
1005
+ var play = react.useCallback(function () {
1006
+ var player = playerRef.current;
1007
+ return player !== null && typeof player.playVideo !== 'undefined' ? Promise.resolve(player.playVideo()) : Promise.reject(NO_PLAYER_ERROR);
1008
+ }, []);
1009
+ var pause = react.useCallback(function () {
1010
+ var player = playerRef.current;
1011
+ return player !== null && typeof player.pauseVideo !== 'undefined' ? Promise.resolve(player.pauseVideo()) : Promise.reject(NO_PLAYER_ERROR);
1012
+ }, []);
1013
+ var setVolume = react.useCallback(function (volume) {
1014
+ var player = playerRef.current;
1015
+ var promise = player !== null && typeof player.setVolume !== 'undefined' ? Promise.resolve(player.setVolume(volume * 100)) : Promise.reject(NO_PLAYER_ERROR);
1016
+
1017
+ if (customOnVolumeChange) {
1018
+ customOnVolumeChange(volume);
1019
+ }
1020
+
1021
+ return promise;
1022
+ }, [customOnVolumeChange]);
1023
+ var mute = react.useCallback(function () {
1024
+ var player = playerRef.current;
1025
+ return (player !== null && typeof player.mute !== 'undefined' ? Promise.resolve(player.mute()) : Promise.reject(NO_PLAYER_ERROR)).then(function () {
1026
+ return setMuted(true);
1027
+ });
1028
+ }, [setMuted]);
1029
+ var unmute = react.useCallback(function () {
1030
+ var player = playerRef.current;
1031
+ return (player !== null && typeof player.unMute !== 'undefined' ? Promise.resolve(player.unMute()) : Promise.reject(NO_PLAYER_ERROR)).then(function () {
1032
+ return setMuted(false);
1033
+ });
1034
+ }, []);
1035
+ var seek = react.useCallback(function (time) {
1036
+ var player = playerRef.current;
1037
+ return player !== null && typeof player.seekTo !== 'undefined' ? Promise.resolve(player.seekTo(time)) : Promise.reject(NO_PLAYER_ERROR);
1038
+ }, []);
1039
+ var setLoop = react.useCallback(function (loop) {
1040
+ var player = playerRef.current;
1041
+ return player !== null && typeof player.setLoop !== 'undefined' ? Promise.resolve(player.setLoop(loop)) : Promise.reject(NO_PLAYER_ERROR);
1042
+ }, []);
1043
+ var destroyPlayer = react.useCallback(function () {
1044
+ if (playerRef.current !== null) {
1045
+ debug$1('Unset player');
1046
+ playerRef.current = null;
1047
+ }
1048
+ }, []); // Detect iframe switch and destroy player
1049
+
1050
+ react.useEffect(function () {
1051
+ var currentPlayer = playerRef.current;
1052
+
1053
+ if (playerElementRef.current !== elementRef.current && currentPlayer !== null) {
1054
+ debug$1('iFrame switched');
1055
+ destroyPlayer();
1056
+ }
1057
+ }); // Create player
1058
+
1059
+ react.useEffect(function () {
1060
+ var _apiRef$current = apiRef.current,
1061
+ YT = _apiRef$current === void 0 ? null : _apiRef$current;
1062
+ var _playerRef$current = playerRef.current,
1063
+ currentPlayer = _playerRef$current === void 0 ? null : _playerRef$current;
1064
+ var _elementRef$current = elementRef.current,
1065
+ element = _elementRef$current === void 0 ? null : _elementRef$current;
1066
+
1067
+ if (!apiLoaded || videoId === null || element === null) {
1068
+ destroyPlayer();
1069
+ return;
1070
+ }
1071
+
1072
+ var player = currentPlayer;
1073
+
1074
+ if (player !== null) {
1075
+ debug$1('Switch video [ID: %s]', videoId);
1076
+ player.loadVideoById(videoId);
1077
+ } else {
1078
+ debug$1('Create player [ID: %s]', videoId);
1079
+ var iframe = elementRef.current;
1080
+
1081
+ var onReady = function onReady(_ref2) {
1082
+ var target = _ref2.target;
1083
+ player = target;
1084
+ playerRef.current = target;
1085
+ setReady(true);
1086
+ var newDuration = target.getDuration();
1087
+
1088
+ if (newDuration !== metadata.duration) {
1089
+ setMetadata(_objectSpread$1(_objectSpread$1({}, metadata), {}, {
1090
+ duration: newDuration
1091
+ }));
1092
+ }
1093
+
1094
+ debug$1('onReady [ID: %s]', videoId);
1095
+ };
1096
+
1097
+ var onStateChange = function onStateChange(_ref3) {
1098
+ var state = _ref3.data;
1099
+ var newState = {
1100
+ playing: state === YT.PlayerState.PLAYING,
1101
+ paused: state === YT.PlayerState.PAUSED,
1102
+ ended: state === YT.PlayerState.ENDED,
1103
+ buffering: state === YT.PlayerState.BUFFERING
1104
+ };
1105
+ setPlayState(newState);
1106
+ var stateLabel = null;
1107
+
1108
+ if (newState.playing) {
1109
+ stateLabel = 'playing';
1110
+ } else if (newState.paused) {
1111
+ stateLabel = 'paused';
1112
+ } else if (newState.ended) {
1113
+ stateLabel = 'ended';
1114
+ } else if (newState.buffering) {
1115
+ stateLabel = 'buffering';
1116
+ } else if (state === -1) {
1117
+ stateLabel = 'not started';
1118
+ } else if (state === 0) {
1119
+ stateLabel = 'stopped';
1120
+ }
1121
+
1122
+ debug$1('onStateChange %s [ID: %s]', stateLabel, videoId);
1123
+ };
1124
+
1125
+ player = new YT.Player(iframe, {
1126
+ videoId: videoId,
1127
+ playerVars: {
1128
+ controls: controls,
1129
+ autoplay: autoplay ? 1 : 0,
1130
+ mute: initialMuted,
1131
+ playsinline: true,
1132
+ rel: 0,
1133
+ showinfo: 0,
1134
+ modestbranding: 1
1135
+ },
1136
+ events: {
1137
+ onReady: onReady,
1138
+ onStateChange: onStateChange
1139
+ }
1140
+ });
1141
+ playerElementRef.current = iframe;
1142
+ }
1143
+
1144
+ playerRef.current = player;
1145
+ }, [apiLoaded, videoId, setPlayState, setReady, setMetadata, destroyPlayer]);
1146
+ var playing = playState.playing;
1147
+ var getCurrentTime = react.useCallback(function (p) {
1148
+ return p.getCurrentTime();
1149
+ }, []);
1150
+ var currentTime = usePlayerCurrentTime(playerRef.current, {
1151
+ id: videoId,
1152
+ disabled: !playing || timeUpdateInterval === null,
1153
+ updateInterval: timeUpdateInterval,
1154
+ onUpdate: customOnTimeUpdate,
1155
+ getCurrentTime: getCurrentTime
1156
+ });
1157
+ return _objectSpread$1(_objectSpread$1({
1158
+ ref: elementRef,
1159
+ player: playerRef.current,
1160
+ play: play,
1161
+ pause: pause,
1162
+ mute: mute,
1163
+ unmute: unmute,
1164
+ setVolume: setVolume,
1165
+ seek: seek,
1166
+ setLoop: setLoop,
1167
+ ready: ready,
1168
+ currentTime: currentTime,
1169
+ muted: muted,
1170
+ loaded: ready
1171
+ }, metadata), playState);
1172
+ }
1173
+
1174
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
1175
+
1176
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
1177
+ var debug = createDebug__default["default"]('folklore:video:vimeo');
1178
+ var isVideoId = function isVideoId(url) {
1179
+ return url !== null && url.match(/^[0-9]+$/);
1180
+ };
1181
+
1182
+ var getVideoId = function getVideoId(url) {
1183
+ if (url === null) {
1184
+ return null;
1185
+ }
1186
+
1187
+ if (isVideoId(url)) {
1188
+ return url;
1189
+ }
1190
+
1191
+ var match = url.match(/\/[0-9]+/);
1192
+ return match !== null ? match[1] : null;
1193
+ };
1194
+
1195
+ var noPlayerError = new Error('No player');
1196
+
1197
+ var useVimeoPlayer = function useVimeoPlayer(id) {
1198
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1199
+ _ref$width = _ref.width,
1200
+ width = _ref$width === void 0 ? 0 : _ref$width,
1201
+ _ref$height = _ref.height,
1202
+ height = _ref$height === void 0 ? 0 : _ref$height,
1203
+ _ref$duration = _ref.duration,
1204
+ duration = _ref$duration === void 0 ? 0 : _ref$duration,
1205
+ _ref$autoplay = _ref.autoplay,
1206
+ autoplay = _ref$autoplay === void 0 ? false : _ref$autoplay,
1207
+ _ref$autopause = _ref.autopause,
1208
+ autopause = _ref$autopause === void 0 ? true : _ref$autopause,
1209
+ _ref$byline = _ref.byline,
1210
+ byline = _ref$byline === void 0 ? false : _ref$byline,
1211
+ _ref$controls = _ref.controls,
1212
+ controls = _ref$controls === void 0 ? false : _ref$controls,
1213
+ _ref$initialMuted = _ref.initialMuted,
1214
+ initialMuted = _ref$initialMuted === void 0 ? false : _ref$initialMuted,
1215
+ _ref$timeUpdateInterv = _ref.timeUpdateInterval,
1216
+ timeUpdateInterval = _ref$timeUpdateInterv === void 0 ? 1000 : _ref$timeUpdateInterv,
1217
+ _ref$onTimeUpdate = _ref.onTimeUpdate,
1218
+ customOnTimeUpdate = _ref$onTimeUpdate === void 0 ? null : _ref$onTimeUpdate;
1219
+
1220
+ var _useState = react.useState(false),
1221
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
1222
+ apiLoaded = _useState2[0],
1223
+ setApiLoaded = _useState2[1];
1224
+
1225
+ var apiRef = react.useRef(null);
1226
+ var elementRef = react.useRef(null);
1227
+ var playerRef = react.useRef(null);
1228
+ var videoId = react.useMemo(function () {
1229
+ return getVideoId(id);
1230
+ }, [id]);
1231
+
1232
+ var _useState3 = react.useState(false),
1233
+ _useState4 = _slicedToArray__default["default"](_useState3, 2),
1234
+ ready = _useState4[0],
1235
+ setReady = _useState4[1];
1236
+
1237
+ var _useState5 = react.useState(false),
1238
+ _useState6 = _slicedToArray__default["default"](_useState5, 2),
1239
+ loaded = _useState6[0],
1240
+ setLoaded = _useState6[1];
1241
+
1242
+ var _useState7 = react.useState(initialMuted ? 0 : 1),
1243
+ _useState8 = _slicedToArray__default["default"](_useState7, 2),
1244
+ volume = _useState8[0],
1245
+ setVolumeState = _useState8[1];
1246
+
1247
+ var _useState9 = react.useState({
1248
+ playing: false,
1249
+ paused: false,
1250
+ ended: false,
1251
+ buffering: false
1252
+ }),
1253
+ _useState10 = _slicedToArray__default["default"](_useState9, 2),
1254
+ playState = _useState10[0],
1255
+ setPlayState = _useState10[1];
1256
+
1257
+ var _useState11 = react.useState({
1258
+ width: width,
1259
+ height: height,
1260
+ duration: duration
1261
+ }),
1262
+ _useState12 = _slicedToArray__default["default"](_useState11, 2),
1263
+ metadata = _useState12[0],
1264
+ setMetadata = _useState12[1]; // Load SDK
1265
+
1266
+
1267
+ react.useEffect(function () {
1268
+ var canceled = false;
1269
+
1270
+ if (!apiLoaded && id !== null) {
1271
+ services.loadVimeo().then(function (api) {
1272
+ if (!canceled) {
1273
+ apiRef.current = api;
1274
+ setApiLoaded(true);
1275
+ debug('API Loaded');
1276
+ }
1277
+ });
1278
+ }
1279
+
1280
+ return function () {
1281
+ canceled = true;
1282
+ };
1283
+ }, [id]);
1284
+ var play = react.useCallback(function () {
1285
+ var player = playerRef.current;
1286
+ return player !== null ? player.play() : Promise.reject(noPlayerError);
1287
+ }, []);
1288
+ var pause = react.useCallback(function () {
1289
+ var player = playerRef.current;
1290
+ return player !== null ? player.pause() : Promise.reject(noPlayerError);
1291
+ }, []);
1292
+ var setVolume = react.useCallback(function (newVolume) {
1293
+ var player = playerRef.current;
1294
+ return player !== null ? player.setVolume(newVolume) : Promise.reject(noPlayerError);
1295
+ }, []);
1296
+ var mute = react.useCallback(function () {
1297
+ var player = playerRef.current;
1298
+ return player !== null ? player.setVolume(0) : Promise.reject(noPlayerError);
1299
+ }, []);
1300
+ var unmute = react.useCallback(function () {
1301
+ var player = playerRef.current;
1302
+ return player !== null ? player.setVolume(1) : Promise.reject(noPlayerError);
1303
+ }, []);
1304
+ var seek = react.useCallback(function (time) {
1305
+ var player = playerRef.current;
1306
+ return player !== null ? player.setCurrentTime(time) : Promise.reject(noPlayerError);
1307
+ }, []);
1308
+ var setLoop = react.useCallback(function (loop) {
1309
+ var player = playerRef.current;
1310
+ return player !== null ? player.setLoop(loop) : Promise.reject(noPlayerError);
1311
+ }, []);
1312
+ var destroyVideo = react.useCallback(function () {
1313
+ var player = playerRef.current;
1314
+
1315
+ if (player !== null) {
1316
+ debug('Unload video');
1317
+ player.unload();
1318
+ }
1319
+
1320
+ if (player !== null) {
1321
+ debug('Unset video');
1322
+ playerRef.current = null;
1323
+ }
1324
+ }, []);
1325
+ var playerElementRef = react.useRef(elementRef.current);
1326
+ react.useEffect(function () {
1327
+ var currentPlayer = playerRef.current;
1328
+
1329
+ if (playerElementRef.current !== elementRef.current && currentPlayer !== null) {
1330
+ debug('iFrame switched');
1331
+ destroyVideo();
1332
+ }
1333
+ }); // Create player
1334
+
1335
+ react.useEffect(function () {
1336
+ var _apiRef$current = apiRef.current,
1337
+ Player = _apiRef$current === void 0 ? null : _apiRef$current;
1338
+ var _playerRef$current = playerRef.current,
1339
+ currentPlayer = _playerRef$current === void 0 ? null : _playerRef$current;
1340
+ var _elementRef$current = elementRef.current,
1341
+ element = _elementRef$current === void 0 ? null : _elementRef$current;
1342
+
1343
+ if (!apiLoaded || videoId === null || element === null) {
1344
+ destroyVideo();
1345
+ return;
1346
+ }
1347
+
1348
+ var player = currentPlayer;
1349
+
1350
+ if (player === null) {
1351
+ debug('Create player [ID: %s]', videoId);
1352
+ player = new Player(element, {
1353
+ id: videoId,
1354
+ autoplay: autoplay,
1355
+ autopause: autopause,
1356
+ byline: byline,
1357
+ controls: controls,
1358
+ muted: initialMuted,
1359
+ background: !controls
1360
+ });
1361
+ player.ready().then(function () {
1362
+ return setReady(true);
1363
+ }).catch(function (e) {
1364
+ debug('ERROR: %o', e);
1365
+ });
1366
+ playerElementRef.current = element;
1367
+ } else {
1368
+ debug('Load video [ID: %s]', videoId);
1369
+ player.loadVideo(videoId).catch(function (e) {
1370
+ debug('ERROR: %o', e);
1371
+ });
1372
+ }
1373
+
1374
+ playerRef.current = player;
1375
+ }, [apiLoaded, videoId, setReady, destroyVideo, setLoaded]); // Bind player events
1376
+
1377
+ react.useEffect(function () {
1378
+ var player = playerRef.current;
1379
+
1380
+ if (player === null) {
1381
+ return function () {};
1382
+ }
1383
+
1384
+ var canceled = false;
1385
+
1386
+ var onLoaded = function onLoaded() {
1387
+ Promise.all([player.getDuration(), player.getVideoWidth(), player.getVideoHeight(), player.getMuted()]).then(function (_ref2) {
1388
+ var _ref3 = _slicedToArray__default["default"](_ref2, 4),
1389
+ newDuration = _ref3[0],
1390
+ newWidth = _ref3[1],
1391
+ newHeight = _ref3[2],
1392
+ newMuted = _ref3[3];
1393
+
1394
+ if (canceled) {
1395
+ return;
1396
+ }
1397
+
1398
+ var newMetadata = {
1399
+ duration: newDuration,
1400
+ width: newWidth,
1401
+ height: newHeight
1402
+ };
1403
+ setMetadata(newMetadata);
1404
+
1405
+ if (newMuted) {
1406
+ setVolumeState(0);
1407
+ }
1408
+
1409
+ setLoaded(true);
1410
+ });
1411
+ debug('onLoaded [ID: %s]', videoId);
1412
+ };
1413
+
1414
+ var onPlay = function onPlay() {
1415
+ setPlayState({
1416
+ playing: true,
1417
+ paused: false,
1418
+ ended: false,
1419
+ buffering: false
1420
+ });
1421
+ debug('onPlay [ID: %s]', videoId);
1422
+ player.getMuted().then(function (newMuted) {
1423
+ if (!canceled && newMuted) {
1424
+ setVolumeState(0);
1425
+ }
1426
+ }).catch(function () {});
1427
+ };
1428
+
1429
+ var onPause = function onPause() {
1430
+ setPlayState({
1431
+ playing: false,
1432
+ paused: true,
1433
+ ended: false,
1434
+ buffering: false
1435
+ });
1436
+ debug('onPause [ID: %s]', videoId);
1437
+ };
1438
+
1439
+ var onVolumeChange = function onVolumeChange(_ref4) {
1440
+ var newVolume = _ref4.volume;
1441
+ return setVolumeState(newVolume);
1442
+ };
1443
+
1444
+ var onEnded = function onEnded() {
1445
+ setPlayState({
1446
+ playing: false,
1447
+ paused: false,
1448
+ ended: true,
1449
+ buffering: false
1450
+ });
1451
+ };
1452
+
1453
+ var onBufferStart = function onBufferStart() {
1454
+ setPlayState({
1455
+ playing: true,
1456
+ paused: false,
1457
+ ended: false,
1458
+ buffering: true
1459
+ });
1460
+ debug('onBufferStart [ID: %s]', videoId);
1461
+ };
1462
+
1463
+ var onBufferEnded = function onBufferEnded() {
1464
+ setPlayState({
1465
+ playing: true,
1466
+ paused: false,
1467
+ ended: false,
1468
+ buffering: false
1469
+ });
1470
+ debug('onBufferStart [ID: %s]', videoId);
1471
+ };
1472
+
1473
+ debug('Bind events [ID: %s]', videoId);
1474
+ player.on('loaded', onLoaded);
1475
+ player.on('play', onPlay);
1476
+ player.on('pause', onPause);
1477
+ player.on('volumechange', onVolumeChange);
1478
+ player.on('ended', onEnded);
1479
+ player.on('bufferstart', onBufferStart);
1480
+ player.on('bufferend', onBufferEnded);
1481
+ return function () {
1482
+ canceled = true;
1483
+ debug('Unbind events [ID: %s]', videoId);
1484
+ player.off('loaded', onLoaded);
1485
+ player.off('play', onPlay);
1486
+ player.off('pause', onPause);
1487
+ player.off('volumechange', onVolumeChange);
1488
+ player.off('ended', onEnded);
1489
+ player.off('bufferstart', onBufferStart);
1490
+ player.off('bufferend', onBufferEnded);
1491
+ };
1492
+ }, [videoId, playerRef.current, setPlayState, setMetadata, setVolumeState, setLoaded]);
1493
+ var playing = playState.playing;
1494
+ var getCurrentTime = react.useCallback(function (p) {
1495
+ return p.getCurrentTime();
1496
+ }, []);
1497
+ var currentTime = usePlayerCurrentTime(playerRef.current, {
1498
+ id: videoId,
1499
+ disabled: !playing || timeUpdateInterval === null,
1500
+ updateInterval: timeUpdateInterval,
1501
+ onUpdate: customOnTimeUpdate,
1502
+ getCurrentTime: getCurrentTime
1503
+ });
1504
+ return _objectSpread(_objectSpread({
1505
+ ref: elementRef,
1506
+ player: playerRef.current,
1507
+ play: play,
1508
+ pause: pause,
1509
+ mute: mute,
1510
+ unmute: unmute,
1511
+ setVolume: setVolume,
1512
+ seek: seek,
1513
+ setLoop: setLoop,
1514
+ ready: ready,
1515
+ currentTime: currentTime,
1516
+ loaded: loaded,
1517
+ muted: volume === 0,
1518
+ volume: volume
1519
+ }, metadata), playState);
1520
+ };
1521
+
1522
+ function useVideoPlayer(params) {
1523
+ var _ref = params || {},
1524
+ _ref$service = _ref.service,
1525
+ service = _ref$service === void 0 ? null : _ref$service,
1526
+ _ref$videoId = _ref.videoId,
1527
+ videoId = _ref$videoId === void 0 ? null : _ref$videoId,
1528
+ _ref$url = _ref.url,
1529
+ url = _ref$url === void 0 ? null : _ref$url,
1530
+ _ref$onLoaded = _ref.onLoaded,
1531
+ customOnLoaded = _ref$onLoaded === void 0 ? null : _ref$onLoaded,
1532
+ _ref$onPlay = _ref.onPlay,
1533
+ customOnPlay = _ref$onPlay === void 0 ? null : _ref$onPlay,
1534
+ _ref$onPause = _ref.onPause,
1535
+ customOnPause = _ref$onPause === void 0 ? null : _ref$onPause,
1536
+ _ref$onEnd = _ref.onEnd,
1537
+ customOnEnd = _ref$onEnd === void 0 ? null : _ref$onEnd,
1538
+ _ref$onMetadataChange = _ref.onMetadataChange,
1539
+ customOnMetadataChange = _ref$onMetadataChange === void 0 ? null : _ref$onMetadataChange,
1540
+ _ref$onBufferStart = _ref.onBufferStart,
1541
+ customOnBufferStart = _ref$onBufferStart === void 0 ? null : _ref$onBufferStart,
1542
+ _ref$onBufferEnded = _ref.onBufferEnded,
1543
+ customOnBufferEnded = _ref$onBufferEnded === void 0 ? null : _ref$onBufferEnded;
1544
+
1545
+ var dailymotionPlayer = useDailymotionPlayer(service === 'dailymotion' ? videoId || url : null, params);
1546
+ var youtubePlayer = useYouTubePlayer(service === 'youtube' ? videoId || url : null, params);
1547
+ var vimeoPlayer = useVimeoPlayer(service === 'vimeo' ? videoId || url : null, params);
1548
+ var nativePlayer = useNativeVideoPlayer(url, params);
1549
+ var player = null;
1550
+
1551
+ if (service === 'dailymotion') {
1552
+ player = dailymotionPlayer;
1553
+ } else if (service === 'youtube') {
1554
+ player = youtubePlayer;
1555
+ } else if (service === 'vimeo') {
1556
+ player = vimeoPlayer;
1557
+ } else {
1558
+ player = nativePlayer;
1559
+ }
1560
+
1561
+ var _ref2 = player || {},
1562
+ _ref2$playing = _ref2.playing,
1563
+ playing = _ref2$playing === void 0 ? false : _ref2$playing,
1564
+ _ref2$paused = _ref2.paused,
1565
+ paused = _ref2$paused === void 0 ? false : _ref2$paused,
1566
+ _ref2$buffering = _ref2.buffering,
1567
+ buffering = _ref2$buffering === void 0 ? false : _ref2$buffering,
1568
+ _ref2$ended = _ref2.ended,
1569
+ ended = _ref2$ended === void 0 ? false : _ref2$ended,
1570
+ _ref2$ready = _ref2.ready,
1571
+ ready = _ref2$ready === void 0 ? false : _ref2$ready,
1572
+ _ref2$width = _ref2.width,
1573
+ metaWidth = _ref2$width === void 0 ? null : _ref2$width,
1574
+ _ref2$height = _ref2.height,
1575
+ metaHeight = _ref2$height === void 0 ? null : _ref2$height,
1576
+ _ref2$duration = _ref2.duration,
1577
+ metaDuration = _ref2$duration === void 0 ? null : _ref2$duration;
1578
+
1579
+ react.useEffect(function () {
1580
+ if (ready && customOnLoaded !== null) {
1581
+ customOnLoaded();
1582
+ }
1583
+ }, [ready, customOnLoaded]);
1584
+ react.useEffect(function () {
1585
+ if (playing && customOnPlay !== null) {
1586
+ customOnPlay();
1587
+ }
1588
+ }, [playing, customOnPlay]);
1589
+ react.useEffect(function () {
1590
+ if (paused && customOnPause !== null) {
1591
+ customOnPause();
1592
+ }
1593
+ }, [paused, customOnPause]);
1594
+ react.useEffect(function () {
1595
+ if (buffering && customOnBufferStart !== null) {
1596
+ customOnBufferStart();
1597
+ } else if (!buffering && customOnBufferEnded !== null) {
1598
+ customOnBufferEnded();
1599
+ }
1600
+ }, [buffering, customOnBufferStart, customOnBufferEnded]);
1601
+ react.useEffect(function () {
1602
+ if (ended && customOnEnd !== null) {
1603
+ customOnEnd();
1604
+ }
1605
+ }, [ended, customOnEnd]);
1606
+ react.useEffect(function () {
1607
+ var hasMetadata = metaWidth !== null || metaHeight !== null || metaDuration !== null;
1608
+
1609
+ if (hasMetadata && customOnMetadataChange !== null) {
1610
+ customOnMetadataChange({
1611
+ width: metaWidth,
1612
+ height: metaHeight,
1613
+ duration: metaDuration
1614
+ });
1615
+ }
1616
+ }, [metaWidth, metaHeight, metaDuration, customOnMetadataChange]);
1617
+ return player;
1618
+ }
1619
+
312
1620
  exports.getObserver = getObserver;
1621
+ exports.useDailymotionPlayer = useDailymotionPlayer;
313
1622
  exports.useDocumentEvent = useDocumentEvent;
314
1623
  exports.useIntersectionObserver = useIntersectionObserver;
315
1624
  exports.useKeyboard = useKeyboard;
1625
+ exports.useNativeVideoPlayer = useNativeVideoPlayer;
316
1626
  exports.useObserver = useObserver;
1627
+ exports.usePlayerCurrentTime = usePlayerCurrentTime;
317
1628
  exports.useResizeObserver = useResizeObserver;
1629
+ exports.useVideoPlayer = useVideoPlayer;
1630
+ exports.useVimeoPlayer = useVimeoPlayer;
318
1631
  exports.useWindowEvent = useWindowEvent;
1632
+ exports.useYouTubePlayer = useYouTubePlayer;