@folklore/hooks 0.0.7 → 0.0.11

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 +1314 -8
  2. package/dist/es.js +1307 -8
  3. package/package.json +5 -3
package/dist/cjs.js CHANGED
@@ -2,18 +2,412 @@
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$1 = 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
+ _params$getVideoId = params.getVideoId,
126
+ getVideoId = _params$getVideoId === void 0 ? function (url) {
127
+ if (url === null || url.match(/^https?:/) === null) {
128
+ return null;
129
+ }
130
+
131
+ var match = url.match(/\/video\/([^/?]+)/);
132
+ return match !== null ? match[1] : null;
133
+ } : _params$getVideoId;
134
+
135
+ var _useState = react.useState(typeof window.DM !== 'undefined'),
136
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
137
+ apiLoaded = _useState2[0],
138
+ setApiLoaded = _useState2[1];
139
+
140
+ var _useState3 = react.useState(false),
141
+ _useState4 = _slicedToArray__default["default"](_useState3, 2),
142
+ playerReady = _useState4[0],
143
+ setPlayerReady = _useState4[1];
144
+
145
+ var _useState5 = react.useState(false),
146
+ _useState6 = _slicedToArray__default["default"](_useState5, 2),
147
+ loaded = _useState6[0],
148
+ setLoaded = _useState6[1];
149
+
150
+ var apiRef = react.useRef(typeof window.DM !== 'undefined' ? window.DM : null);
151
+ var elementRef = react.useRef(null);
152
+ var playerRef = react.useRef(null);
153
+ var ready = apiLoaded && playerReady;
154
+ var videoId = react.useMemo(function () {
155
+ return getVideoId(id);
156
+ }, [id]);
157
+
158
+ var _useState7 = react.useState(initialMuted),
159
+ _useState8 = _slicedToArray__default["default"](_useState7, 2),
160
+ muted = _useState8[0],
161
+ setMuted = _useState8[1];
162
+
163
+ var _useState9 = react.useState(initialMuted ? 0 : 1),
164
+ _useState10 = _slicedToArray__default["default"](_useState9, 2),
165
+ volume = _useState10[0],
166
+ setVolumeState = _useState10[1];
167
+
168
+ var _useState11 = react.useState({
169
+ playing: false,
170
+ paused: false,
171
+ ended: false,
172
+ buffering: false,
173
+ adPlaying: false
174
+ }),
175
+ _useState12 = _slicedToArray__default["default"](_useState11, 2),
176
+ playState = _useState12[0],
177
+ setPlayState = _useState12[1];
178
+
179
+ var _useState13 = react.useState({
180
+ width: width,
181
+ height: height,
182
+ duration: duration
183
+ }),
184
+ _useState14 = _slicedToArray__default["default"](_useState13, 2),
185
+ metadata = _useState14[0],
186
+ setMetadata = _useState14[1]; // Load SDK
187
+
188
+
189
+ react.useEffect(function () {
190
+ var canceled = false;
191
+
192
+ if (!apiLoaded && id !== null) {
193
+ services.loadDailymotion().then(function (api) {
194
+ if (!canceled) {
195
+ apiRef.current = api;
196
+ setApiLoaded(true);
197
+ debug$3('API Loaded');
198
+ }
199
+ });
200
+ }
201
+
202
+ return function () {
203
+ canceled = true;
204
+ };
205
+ }, [id]); // Create or update player
206
+
207
+ react.useEffect(function () {
208
+ var _apiRef$current = apiRef.current,
209
+ DM = _apiRef$current === void 0 ? null : _apiRef$current;
210
+ var _playerRef$current = playerRef.current,
211
+ currentPlayer = _playerRef$current === void 0 ? null : _playerRef$current;
212
+ var _elementRef$current = elementRef.current,
213
+ element = _elementRef$current === void 0 ? null : _elementRef$current;
214
+
215
+ if (!apiLoaded || videoId === null || element === null) {
216
+ return;
217
+ }
218
+
219
+ var playerParams = {
220
+ 'autoplay-d': autoplay,
221
+ // muted,
222
+ start: start,
223
+ controls: controls,
224
+ 'queue-autoplay-next': queueAutoplayNext,
225
+ 'queue-enable': queueEnable,
226
+ 'sharing-enable': sharingEnable,
227
+ 'ui-logo': uiLogo,
228
+ 'ui-start-screen-info': uiStartScreenInfo
229
+ };
230
+ var player = currentPlayer;
231
+
232
+ if (player !== null) {
233
+ player.load(id, {
234
+ params: playerParams
235
+ });
236
+ } else {
237
+ player = DM.player(element, {
238
+ video: videoId,
239
+ width: width,
240
+ height: height,
241
+ params: playerParams
242
+ });
243
+ playerRef.current = player;
244
+ }
245
+
246
+ if (!playerReady) {
247
+ setPlayerReady(true);
248
+ }
249
+ }, [apiLoaded, elementRef.current, videoId, width, height, autoplay, muted, start, controls, queueAutoplayNext, queueEnable, sharingEnable, uiLogo, uiStartScreenInfo]);
250
+ react.useEffect(function () {
251
+ var _playerRef$current2 = playerRef.current,
252
+ player = _playerRef$current2 === void 0 ? null : _playerRef$current2;
253
+
254
+ if (player === null) {
255
+ return function () {};
256
+ }
257
+
258
+ var currentPlayState = playState;
259
+ var currentMetadata = metadata;
260
+
261
+ function onPlaybackReady() {
262
+ setLoaded(true);
263
+ }
264
+
265
+ function onLoadedMetadata() {
266
+ currentMetadata = _objectSpread$4(_objectSpread$4({}, currentMetadata), {}, {
267
+ duration: player.duration
268
+ });
269
+ setMetadata(currentMetadata);
270
+ }
271
+
272
+ function onDurationChange() {
273
+ currentMetadata = _objectSpread$4(_objectSpread$4({}, currentMetadata), {}, {
274
+ duration: player.duration
275
+ });
276
+ setMetadata(currentMetadata);
277
+ }
278
+
279
+ function onVolumeChange() {
280
+ setMuted(player.muted);
281
+ setVolumeState(player.volume);
282
+ }
283
+
284
+ function onPlay() {
285
+ currentPlayState = _objectSpread$4(_objectSpread$4({}, currentPlayState), {}, {
286
+ playing: true,
287
+ paused: false,
288
+ ended: false
289
+ });
290
+ setPlayState(currentPlayState);
291
+ }
292
+
293
+ function onPause() {
294
+ currentPlayState = _objectSpread$4(_objectSpread$4({}, currentPlayState), {}, {
295
+ playing: false,
296
+ paused: true,
297
+ ended: false
298
+ });
299
+ setPlayState(currentPlayState);
300
+ }
301
+
302
+ function onEnd() {
303
+ currentPlayState = _objectSpread$4(_objectSpread$4({}, currentPlayState), {}, {
304
+ playing: false,
305
+ paused: false,
306
+ ended: true
307
+ });
308
+ setPlayState(currentPlayState);
309
+ }
310
+
311
+ function onPlaying() {
312
+ currentPlayState = _objectSpread$4(_objectSpread$4({}, currentPlayState), {}, {
313
+ buffering: false
314
+ });
315
+ setPlayState(currentPlayState);
316
+ }
317
+
318
+ function onWaiting() {
319
+ currentPlayState = _objectSpread$4(_objectSpread$4({}, currentPlayState), {}, {
320
+ buffering: true
321
+ });
322
+ setPlayState(currentPlayState);
323
+ }
324
+
325
+ function onAdStart() {
326
+ currentPlayState = _objectSpread$4(_objectSpread$4({}, currentPlayState), {}, {
327
+ adPlaying: true
328
+ });
329
+ setPlayState(currentPlayState);
330
+ }
331
+
332
+ function onAdEnd() {
333
+ currentPlayState = _objectSpread$4(_objectSpread$4({}, currentPlayState), {}, {
334
+ adPlaying: false
335
+ });
336
+ setPlayState(currentPlayState);
337
+ }
338
+
339
+ player.addEventListener('playback_ready', onPlaybackReady);
340
+ player.addEventListener('loadedmetadata', onLoadedMetadata);
341
+ player.addEventListener('durationchange', onDurationChange);
342
+ player.addEventListener('volumechange', onVolumeChange);
343
+ player.addEventListener('play', onPlay);
344
+ player.addEventListener('pause', onPause);
345
+ player.addEventListener('video_end', onEnd);
346
+ player.addEventListener('playing', onPlaying);
347
+ player.addEventListener('waiting', onWaiting);
348
+ player.addEventListener('ad_start', onAdStart);
349
+ player.addEventListener('ad_end', onAdEnd);
350
+ return function () {
351
+ player.removeEventListener('playback_ready', onPlaybackReady);
352
+ player.removeEventListener('loadedmetadata', onLoadedMetadata);
353
+ player.removeEventListener('durationchange', onDurationChange);
354
+ player.removeEventListener('volumechange', onVolumeChange);
355
+ player.removeEventListener('play', onPlay);
356
+ player.removeEventListener('pause', onPause);
357
+ player.removeEventListener('video_end', onEnd);
358
+ player.removeEventListener('playing', onPlaying);
359
+ player.removeEventListener('waiting', onWaiting);
360
+ player.removeEventListener('ad_start', onAdStart);
361
+ player.removeEventListener('ad_end', onAdEnd);
362
+ };
363
+ }, [playerRef.current, playerReady, videoId, setLoaded, setPlayState, setMetadata, setVolumeState, setMuted]);
364
+ var play = react.useCallback(function () {
365
+ var player = playerRef.current;
366
+ return player !== null ? player.play() : Promise.reject(noPlayerError$1);
367
+ }, []);
368
+ var pause = react.useCallback(function () {
369
+ var player = playerRef.current;
370
+ return player !== null ? player.pause() : Promise.reject(noPlayerError$1);
371
+ }, []);
372
+ var setVolume = react.useCallback(function (newVolume) {
373
+ var player = playerRef.current;
374
+ return player !== null ? player.setVolume(newVolume) : Promise.reject(noPlayerError$1);
375
+ }, []);
376
+ var mute = react.useCallback(function () {
377
+ var player = playerRef.current;
378
+ return player !== null ? player.setMute(true) : Promise.reject(noPlayerError$1);
379
+ }, []);
380
+ var unmute = react.useCallback(function () {
381
+ var player = playerRef.current;
382
+ return player !== null ? player.setMute(false) : Promise.reject(noPlayerError$1);
383
+ }, []);
384
+ var seek = react.useCallback(function (time) {
385
+ var player = playerRef.current;
386
+ return player !== null ? player.seek(time) : Promise.reject(noPlayerError$1);
387
+ }, []);
388
+ var playing = playState.playing;
389
+ var currentTime = usePlayerCurrentTime(playerRef.current, {
390
+ id: videoId,
391
+ disabled: !playing || timeUpdateInterval === null,
392
+ updateInterval: timeUpdateInterval,
393
+ onUpdate: customOnTimeUpdate
394
+ });
395
+ return _objectSpread$4(_objectSpread$4({
396
+ ref: elementRef,
397
+ player: playerRef.current,
398
+ ready: ready,
399
+ play: play,
400
+ pause: pause,
401
+ mute: mute,
402
+ unmute: unmute,
403
+ setVolume: setVolume,
404
+ seek: seek,
405
+ currentTime: currentTime,
406
+ loaded: loaded,
407
+ muted: muted,
408
+ volume: volume
409
+ }, metadata), playState);
410
+ };
17
411
 
18
412
  var eventsManager$1 = typeof document !== 'undefined' ? new EventsManager__default["default"](document) : null;
19
413
 
@@ -69,9 +463,212 @@ function useKeyboard() {
69
463
  useWindowEvent('keyup', keyMap !== null ? onKeyUp : null);
70
464
  }
71
465
 
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; }
466
+ 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
467
 
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; }
468
+ 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; }
469
+ var debug$2 = createDebug__default["default"]('folklore:video:native');
470
+ var noPlayerError = new Error('No player');
471
+
472
+ var useNativeVideoPlayer = function useNativeVideoPlayer(url) {
473
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
474
+ _ref$width = _ref.width,
475
+ width = _ref$width === void 0 ? 0 : _ref$width,
476
+ _ref$height = _ref.height,
477
+ height = _ref$height === void 0 ? 0 : _ref$height,
478
+ _ref$duration = _ref.duration,
479
+ duration = _ref$duration === void 0 ? 0 : _ref$duration,
480
+ _ref$initialMuted = _ref.initialMuted,
481
+ initialMuted = _ref$initialMuted === void 0 ? false : _ref$initialMuted,
482
+ _ref$timeUpdateInterv = _ref.timeUpdateInterval,
483
+ timeUpdateInterval = _ref$timeUpdateInterv === void 0 ? 1000 : _ref$timeUpdateInterv,
484
+ _ref$onTimeUpdate = _ref.onTimeUpdate,
485
+ customOnTimeUpdate = _ref$onTimeUpdate === void 0 ? null : _ref$onTimeUpdate;
486
+
487
+ var elementRef = react.useRef(null);
488
+
489
+ var _useState = react.useState(false),
490
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
491
+ loaded = _useState2[0],
492
+ setLoaded = _useState2[1];
493
+
494
+ var _useState3 = react.useState(initialMuted ? 0 : 1),
495
+ _useState4 = _slicedToArray__default["default"](_useState3, 2),
496
+ volume = _useState4[0],
497
+ setVolumeState = _useState4[1];
498
+
499
+ var _useState5 = react.useState({
500
+ playing: false,
501
+ paused: false,
502
+ ended: false,
503
+ buffering: false
504
+ }),
505
+ _useState6 = _slicedToArray__default["default"](_useState5, 2),
506
+ playState = _useState6[0],
507
+ setPlayState = _useState6[1];
508
+
509
+ var _useState7 = react.useState({
510
+ width: width,
511
+ height: height,
512
+ duration: duration
513
+ }),
514
+ _useState8 = _slicedToArray__default["default"](_useState7, 2),
515
+ metadata = _useState8[0],
516
+ setMetadata = _useState8[1];
517
+
518
+ var play = react.useCallback(function () {
519
+ var player = elementRef.current;
520
+ return player !== null ? player.play() : Promise.reject(noPlayerError);
521
+ }, []);
522
+ var pause = react.useCallback(function () {
523
+ var player = elementRef.current;
524
+ return player !== null ? player.pause() : Promise.reject(noPlayerError);
525
+ }, []);
526
+ var setVolume = react.useCallback(function (newVolume) {
527
+ var player = elementRef.current;
528
+
529
+ if (player !== null) {
530
+ player.volume = newVolume;
531
+ return Promise.resolve(newVolume);
532
+ }
533
+
534
+ return Promise.reject(noPlayerError);
535
+ }, []);
536
+ var mute = react.useCallback(function () {
537
+ var player = elementRef.current;
538
+
539
+ if (player !== null) {
540
+ player.muted = true;
541
+ return Promise.resolve(true);
542
+ }
543
+
544
+ return Promise.reject(noPlayerError);
545
+ }, []);
546
+ var unmute = react.useCallback(function () {
547
+ var player = elementRef.current;
548
+
549
+ if (player !== null) {
550
+ player.muted = false;
551
+ return Promise.resolve(false);
552
+ }
553
+
554
+ return Promise.reject(noPlayerError);
555
+ }, []);
556
+ var seek = react.useCallback(function (newTime) {
557
+ var player = elementRef.current;
558
+
559
+ if (player !== null) {
560
+ player.currentTime = newTime;
561
+ return Promise.resolve(newTime);
562
+ }
563
+
564
+ return Promise.reject(noPlayerError);
565
+ }, []);
566
+ var setLoop = react.useCallback(function (newLoop) {
567
+ var player = elementRef.current;
568
+
569
+ if (player !== null) {
570
+ player.loop = newLoop;
571
+ return Promise.resolve(newLoop);
572
+ }
573
+
574
+ return Promise.reject(noPlayerError);
575
+ }, []); // Bind player events
576
+
577
+ react.useEffect(function () {
578
+ var player = elementRef.current;
579
+
580
+ if (player === null) {
581
+ return function () {};
582
+ }
583
+
584
+ var onCanPlay = function onCanPlay() {
585
+ setLoaded(true);
586
+ debug$2('onCanPlay [URL: %s]', url);
587
+ };
588
+
589
+ var onMetadataLoaded = function onMetadataLoaded() {
590
+ var newMetadata = {
591
+ duration: player.duration,
592
+ width: player.videoWidth,
593
+ height: player.videoHeight
594
+ };
595
+ setMetadata(newMetadata);
596
+ debug$2('onMetadataLoaded [URL: %s]', url);
597
+ };
598
+
599
+ var onPlay = function onPlay() {
600
+ setPlayState({
601
+ playing: true,
602
+ paused: false,
603
+ ended: false,
604
+ buffering: false
605
+ });
606
+ debug$2('onPlay [URL: %s]', url);
607
+ };
608
+
609
+ var onPause = function onPause() {
610
+ setPlayState({
611
+ playing: false,
612
+ paused: true,
613
+ ended: false,
614
+ buffering: false
615
+ });
616
+ debug$2('onPause [URL: %s]', url);
617
+ };
618
+
619
+ var onEnded = function onEnded() {
620
+ setPlayState({
621
+ playing: false,
622
+ paused: false,
623
+ ended: true,
624
+ buffering: false
625
+ });
626
+ debug$2('onEnded [URL: %s]', url);
627
+ };
628
+
629
+ debug$2('Bind events [URL: %s]', url);
630
+ player.addEventListener('canplay', onCanPlay);
631
+ player.addEventListener('metadataloaded', onMetadataLoaded);
632
+ player.addEventListener('play', onPlay);
633
+ player.addEventListener('pause', onPause);
634
+ player.addEventListener('ended', onEnded);
635
+ return function () {
636
+ debug$2('Unbind events [URL: %s]', url);
637
+ player.removeEventListener('canplay', onCanPlay);
638
+ player.removeEventListener('metadataloaded', onMetadataLoaded);
639
+ player.removeEventListener('play', onPlay);
640
+ player.removeEventListener('pause', onPause);
641
+ player.removeEventListener('ended', onEnded);
642
+ };
643
+ }, [url, elementRef.current, setPlayState, setMetadata, setVolumeState, setLoaded]);
644
+ var playing = playState.playing;
645
+ var currentTime = usePlayerCurrentTime(elementRef.current, {
646
+ id: url,
647
+ disabled: !playing || timeUpdateInterval === null,
648
+ updateInterval: timeUpdateInterval,
649
+ onUpdate: customOnTimeUpdate
650
+ });
651
+ return _objectSpread$3(_objectSpread$3({
652
+ ref: elementRef,
653
+ player: elementRef.current,
654
+ play: play,
655
+ pause: pause,
656
+ mute: mute,
657
+ unmute: unmute,
658
+ setVolume: setVolume,
659
+ seek: seek,
660
+ setLoop: setLoop,
661
+ ready: true,
662
+ currentTime: currentTime,
663
+ loaded: loaded,
664
+ muted: volume === 0,
665
+ volume: volume
666
+ }, metadata), playState);
667
+ };
668
+
669
+ 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; }
670
+
671
+ 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
672
  var observersCache = new Map();
76
673
 
77
674
  var getOptionsKey = function getOptionsKey(_ref) {
@@ -94,7 +691,7 @@ var createObserver = function createObserver(Observer) {
94
691
 
95
692
  if (currentSubscriber !== null) {
96
693
  return subscribers.map(function (it) {
97
- return it.element === element && it.callbacks.indexOf(callback) === -1 ? _objectSpread(_objectSpread({}, it), {}, {
694
+ return it.element === element && it.callbacks.indexOf(callback) === -1 ? _objectSpread$2(_objectSpread$2({}, it), {}, {
98
695
  callbacks: [].concat(_toConsumableArray__default["default"](it.callbacks), [callback])
99
696
  }) : it;
100
697
  }).filter(function (it) {
@@ -110,7 +707,7 @@ var createObserver = function createObserver(Observer) {
110
707
 
111
708
  var removeSubscriber = function removeSubscriber(element, callback) {
112
709
  return subscribers.map(function (it) {
113
- return it.element === element ? _objectSpread(_objectSpread({}, it), {}, {
710
+ return it.element === element ? _objectSpread$2(_objectSpread$2({}, it), {}, {
114
711
  callbacks: it.callbacks.filter(function (subCallback) {
115
712
  return subCallback !== callback;
116
713
  })
@@ -309,10 +906,719 @@ var useResizeObserver = function useResizeObserver() {
309
906
  }, resizeObserverInitialEntry);
310
907
  };
311
908
 
909
+ 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; }
910
+
911
+ 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; }
912
+ var NO_PLAYER_ERROR$1 = new Error('No player');
913
+ var debug$1 = createDebug__default["default"]('folklore:video:youtube');
914
+
915
+ function useYouTubePlayer(id) {
916
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
917
+ _ref$width = _ref.width,
918
+ width = _ref$width === void 0 ? 0 : _ref$width,
919
+ _ref$height = _ref.height,
920
+ height = _ref$height === void 0 ? 0 : _ref$height,
921
+ _ref$duration = _ref.duration,
922
+ duration = _ref$duration === void 0 ? 0 : _ref$duration,
923
+ _ref$autoplay = _ref.autoplay,
924
+ autoplay = _ref$autoplay === void 0 ? false : _ref$autoplay,
925
+ _ref$controls = _ref.controls,
926
+ controls = _ref$controls === void 0 ? true : _ref$controls,
927
+ _ref$timeUpdateInterv = _ref.timeUpdateInterval,
928
+ timeUpdateInterval = _ref$timeUpdateInterv === void 0 ? 1000 : _ref$timeUpdateInterv,
929
+ _ref$muted = _ref.muted,
930
+ initialMuted = _ref$muted === void 0 ? false : _ref$muted,
931
+ _ref$onVolumeChange = _ref.onVolumeChange,
932
+ customOnVolumeChange = _ref$onVolumeChange === void 0 ? null : _ref$onVolumeChange,
933
+ _ref$onTimeUpdate = _ref.onTimeUpdate,
934
+ customOnTimeUpdate = _ref$onTimeUpdate === void 0 ? null : _ref$onTimeUpdate,
935
+ _ref$getVideoId = _ref.getVideoId,
936
+ getVideoId = _ref$getVideoId === void 0 ? function (url) {
937
+ if (url === null || url.match(/^https?:/) === null) {
938
+ return null;
939
+ }
940
+
941
+ var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/;
942
+ var match = url.match(regExp);
943
+ return match && match[7].length === 11 ? match[7] : null;
944
+ } : _ref$getVideoId;
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(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$1);
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$1);
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$1);
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$1)).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$1)).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$1);
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$1);
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 NO_PLAYER_ERROR = new Error('No player');
1179
+
1180
+ var useVimeoPlayer = function useVimeoPlayer(id) {
1181
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1182
+ _ref$width = _ref.width,
1183
+ width = _ref$width === void 0 ? 0 : _ref$width,
1184
+ _ref$height = _ref.height,
1185
+ height = _ref$height === void 0 ? 0 : _ref$height,
1186
+ _ref$duration = _ref.duration,
1187
+ duration = _ref$duration === void 0 ? 0 : _ref$duration,
1188
+ _ref$autoplay = _ref.autoplay,
1189
+ autoplay = _ref$autoplay === void 0 ? false : _ref$autoplay,
1190
+ _ref$autopause = _ref.autopause,
1191
+ autopause = _ref$autopause === void 0 ? true : _ref$autopause,
1192
+ _ref$byline = _ref.byline,
1193
+ byline = _ref$byline === void 0 ? false : _ref$byline,
1194
+ _ref$controls = _ref.controls,
1195
+ controls = _ref$controls === void 0 ? false : _ref$controls,
1196
+ _ref$initialMuted = _ref.initialMuted,
1197
+ initialMuted = _ref$initialMuted === void 0 ? false : _ref$initialMuted,
1198
+ _ref$timeUpdateInterv = _ref.timeUpdateInterval,
1199
+ timeUpdateInterval = _ref$timeUpdateInterv === void 0 ? 1000 : _ref$timeUpdateInterv,
1200
+ _ref$onTimeUpdate = _ref.onTimeUpdate,
1201
+ customOnTimeUpdate = _ref$onTimeUpdate === void 0 ? null : _ref$onTimeUpdate,
1202
+ _ref$getVideoId = _ref.getVideoId,
1203
+ getVideoId = _ref$getVideoId === void 0 ? function (url) {
1204
+ if (url === null || url.match(/^[0-9]+$/) !== null) {
1205
+ return url;
1206
+ }
1207
+
1208
+ var match = url.match(/\/[0-9]+/);
1209
+ return match !== null ? match[1] : null;
1210
+ } : _ref$getVideoId;
1211
+
1212
+ var _useState = react.useState(false),
1213
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
1214
+ apiLoaded = _useState2[0],
1215
+ setApiLoaded = _useState2[1];
1216
+
1217
+ var apiRef = react.useRef(null);
1218
+ var elementRef = react.useRef(null);
1219
+ var playerRef = react.useRef(null);
1220
+ var videoId = react.useMemo(function () {
1221
+ return getVideoId(id);
1222
+ }, [id]);
1223
+
1224
+ var _useState3 = react.useState(false),
1225
+ _useState4 = _slicedToArray__default["default"](_useState3, 2),
1226
+ ready = _useState4[0],
1227
+ setReady = _useState4[1];
1228
+
1229
+ var _useState5 = react.useState(false),
1230
+ _useState6 = _slicedToArray__default["default"](_useState5, 2),
1231
+ loaded = _useState6[0],
1232
+ setLoaded = _useState6[1];
1233
+
1234
+ var _useState7 = react.useState(initialMuted ? 0 : 1),
1235
+ _useState8 = _slicedToArray__default["default"](_useState7, 2),
1236
+ volume = _useState8[0],
1237
+ setVolumeState = _useState8[1];
1238
+
1239
+ var _useState9 = react.useState({
1240
+ playing: false,
1241
+ paused: false,
1242
+ ended: false,
1243
+ buffering: false
1244
+ }),
1245
+ _useState10 = _slicedToArray__default["default"](_useState9, 2),
1246
+ playState = _useState10[0],
1247
+ setPlayState = _useState10[1];
1248
+
1249
+ var _useState11 = react.useState({
1250
+ width: width,
1251
+ height: height,
1252
+ duration: duration
1253
+ }),
1254
+ _useState12 = _slicedToArray__default["default"](_useState11, 2),
1255
+ metadata = _useState12[0],
1256
+ setMetadata = _useState12[1]; // Load SDK
1257
+
1258
+
1259
+ react.useEffect(function () {
1260
+ var canceled = false;
1261
+
1262
+ if (!apiLoaded && id !== null) {
1263
+ services.loadVimeo().then(function (api) {
1264
+ if (!canceled) {
1265
+ apiRef.current = api;
1266
+ setApiLoaded(true);
1267
+ debug('API Loaded');
1268
+ }
1269
+ });
1270
+ }
1271
+
1272
+ return function () {
1273
+ canceled = true;
1274
+ };
1275
+ }, [id]);
1276
+ var play = react.useCallback(function () {
1277
+ var player = playerRef.current;
1278
+ return player !== null ? player.play() : Promise.reject(NO_PLAYER_ERROR);
1279
+ }, []);
1280
+ var pause = react.useCallback(function () {
1281
+ var player = playerRef.current;
1282
+ return player !== null ? player.pause() : Promise.reject(NO_PLAYER_ERROR);
1283
+ }, []);
1284
+ var setVolume = react.useCallback(function (newVolume) {
1285
+ var player = playerRef.current;
1286
+ return player !== null ? player.setVolume(newVolume) : Promise.reject(NO_PLAYER_ERROR);
1287
+ }, []);
1288
+ var mute = react.useCallback(function () {
1289
+ var player = playerRef.current;
1290
+ return player !== null ? player.setVolume(0) : Promise.reject(NO_PLAYER_ERROR);
1291
+ }, []);
1292
+ var unmute = react.useCallback(function () {
1293
+ var player = playerRef.current;
1294
+ return player !== null ? player.setVolume(1) : Promise.reject(NO_PLAYER_ERROR);
1295
+ }, []);
1296
+ var seek = react.useCallback(function (time) {
1297
+ var player = playerRef.current;
1298
+ return player !== null ? player.setCurrentTime(time) : Promise.reject(NO_PLAYER_ERROR);
1299
+ }, []);
1300
+ var setLoop = react.useCallback(function (loop) {
1301
+ var player = playerRef.current;
1302
+ return player !== null ? player.setLoop(loop) : Promise.reject(NO_PLAYER_ERROR);
1303
+ }, []);
1304
+ var destroyVideo = react.useCallback(function () {
1305
+ var player = playerRef.current;
1306
+
1307
+ if (player !== null) {
1308
+ debug('Unload video');
1309
+ player.unload();
1310
+ }
1311
+
1312
+ if (player !== null) {
1313
+ debug('Unset video');
1314
+ playerRef.current = null;
1315
+ }
1316
+ }, []);
1317
+ var playerElementRef = react.useRef(elementRef.current);
1318
+ react.useEffect(function () {
1319
+ var currentPlayer = playerRef.current;
1320
+
1321
+ if (playerElementRef.current !== elementRef.current && currentPlayer !== null) {
1322
+ debug('iFrame switched');
1323
+ destroyVideo();
1324
+ }
1325
+ }); // Create player
1326
+
1327
+ react.useEffect(function () {
1328
+ var _apiRef$current = apiRef.current,
1329
+ Player = _apiRef$current === void 0 ? null : _apiRef$current;
1330
+ var _playerRef$current = playerRef.current,
1331
+ currentPlayer = _playerRef$current === void 0 ? null : _playerRef$current;
1332
+ var _elementRef$current = elementRef.current,
1333
+ element = _elementRef$current === void 0 ? null : _elementRef$current;
1334
+
1335
+ if (!apiLoaded || videoId === null || element === null) {
1336
+ destroyVideo();
1337
+ return;
1338
+ }
1339
+
1340
+ var player = currentPlayer;
1341
+
1342
+ if (player === null) {
1343
+ debug('Create player [ID: %s]', videoId);
1344
+ player = new Player(element, {
1345
+ id: videoId,
1346
+ autoplay: autoplay,
1347
+ autopause: autopause,
1348
+ byline: byline,
1349
+ controls: controls,
1350
+ muted: initialMuted,
1351
+ background: !controls
1352
+ });
1353
+ player.ready().then(function () {
1354
+ return setReady(true);
1355
+ }).catch(function (e) {
1356
+ debug('ERROR: %o', e);
1357
+ });
1358
+ playerElementRef.current = element;
1359
+ } else {
1360
+ debug('Load video [ID: %s]', videoId);
1361
+ player.loadVideo(videoId).catch(function (e) {
1362
+ debug('ERROR: %o', e);
1363
+ });
1364
+ }
1365
+
1366
+ playerRef.current = player;
1367
+ }, [apiLoaded, videoId, setReady, destroyVideo, setLoaded]); // Bind player events
1368
+
1369
+ react.useEffect(function () {
1370
+ var player = playerRef.current;
1371
+
1372
+ if (player === null) {
1373
+ return function () {};
1374
+ }
1375
+
1376
+ var canceled = false;
1377
+
1378
+ var onLoaded = function onLoaded() {
1379
+ Promise.all([player.getDuration(), player.getVideoWidth(), player.getVideoHeight(), player.getMuted()]).then(function (_ref2) {
1380
+ var _ref3 = _slicedToArray__default["default"](_ref2, 4),
1381
+ newDuration = _ref3[0],
1382
+ newWidth = _ref3[1],
1383
+ newHeight = _ref3[2],
1384
+ newMuted = _ref3[3];
1385
+
1386
+ if (canceled) {
1387
+ return;
1388
+ }
1389
+
1390
+ var newMetadata = {
1391
+ duration: newDuration,
1392
+ width: newWidth,
1393
+ height: newHeight
1394
+ };
1395
+ setMetadata(newMetadata);
1396
+
1397
+ if (newMuted) {
1398
+ setVolumeState(0);
1399
+ }
1400
+
1401
+ setLoaded(true);
1402
+ });
1403
+ debug('onLoaded [ID: %s]', videoId);
1404
+ };
1405
+
1406
+ var onPlay = function onPlay() {
1407
+ setPlayState({
1408
+ playing: true,
1409
+ paused: false,
1410
+ ended: false,
1411
+ buffering: false
1412
+ });
1413
+ debug('onPlay [ID: %s]', videoId);
1414
+ player.getMuted().then(function (newMuted) {
1415
+ if (!canceled && newMuted) {
1416
+ setVolumeState(0);
1417
+ }
1418
+ }).catch(function () {});
1419
+ };
1420
+
1421
+ var onPause = function onPause() {
1422
+ setPlayState({
1423
+ playing: false,
1424
+ paused: true,
1425
+ ended: false,
1426
+ buffering: false
1427
+ });
1428
+ debug('onPause [ID: %s]', videoId);
1429
+ };
1430
+
1431
+ var onVolumeChange = function onVolumeChange(_ref4) {
1432
+ var newVolume = _ref4.volume;
1433
+ return setVolumeState(newVolume);
1434
+ };
1435
+
1436
+ var onEnded = function onEnded() {
1437
+ setPlayState({
1438
+ playing: false,
1439
+ paused: false,
1440
+ ended: true,
1441
+ buffering: false
1442
+ });
1443
+ };
1444
+
1445
+ var onBufferStart = function onBufferStart() {
1446
+ setPlayState({
1447
+ playing: true,
1448
+ paused: false,
1449
+ ended: false,
1450
+ buffering: true
1451
+ });
1452
+ debug('onBufferStart [ID: %s]', videoId);
1453
+ };
1454
+
1455
+ var onBufferEnded = function onBufferEnded() {
1456
+ setPlayState({
1457
+ playing: true,
1458
+ paused: false,
1459
+ ended: false,
1460
+ buffering: false
1461
+ });
1462
+ debug('onBufferStart [ID: %s]', videoId);
1463
+ };
1464
+
1465
+ debug('Bind events [ID: %s]', videoId);
1466
+ player.on('loaded', onLoaded);
1467
+ player.on('play', onPlay);
1468
+ player.on('pause', onPause);
1469
+ player.on('volumechange', onVolumeChange);
1470
+ player.on('ended', onEnded);
1471
+ player.on('bufferstart', onBufferStart);
1472
+ player.on('bufferend', onBufferEnded);
1473
+ return function () {
1474
+ canceled = true;
1475
+ debug('Unbind events [ID: %s]', videoId);
1476
+ player.off('loaded', onLoaded);
1477
+ player.off('play', onPlay);
1478
+ player.off('pause', onPause);
1479
+ player.off('volumechange', onVolumeChange);
1480
+ player.off('ended', onEnded);
1481
+ player.off('bufferstart', onBufferStart);
1482
+ player.off('bufferend', onBufferEnded);
1483
+ };
1484
+ }, [videoId, playerRef.current, setPlayState, setMetadata, setVolumeState, setLoaded]);
1485
+ var playing = playState.playing;
1486
+ var getCurrentTime = react.useCallback(function (p) {
1487
+ return p.getCurrentTime();
1488
+ }, []);
1489
+ var currentTime = usePlayerCurrentTime(playerRef.current, {
1490
+ id: videoId,
1491
+ disabled: !playing || timeUpdateInterval === null,
1492
+ updateInterval: timeUpdateInterval,
1493
+ onUpdate: customOnTimeUpdate,
1494
+ getCurrentTime: getCurrentTime
1495
+ });
1496
+ return _objectSpread(_objectSpread({
1497
+ ref: elementRef,
1498
+ player: playerRef.current,
1499
+ play: play,
1500
+ pause: pause,
1501
+ mute: mute,
1502
+ unmute: unmute,
1503
+ setVolume: setVolume,
1504
+ seek: seek,
1505
+ setLoop: setLoop,
1506
+ ready: ready,
1507
+ currentTime: currentTime,
1508
+ loaded: loaded,
1509
+ muted: volume === 0,
1510
+ volume: volume
1511
+ }, metadata), playState);
1512
+ };
1513
+
1514
+ function useVideoPlayer(params) {
1515
+ var _ref = params || {},
1516
+ _ref$service = _ref.service,
1517
+ service = _ref$service === void 0 ? null : _ref$service,
1518
+ _ref$videoId = _ref.videoId,
1519
+ videoId = _ref$videoId === void 0 ? null : _ref$videoId,
1520
+ _ref$url = _ref.url,
1521
+ url = _ref$url === void 0 ? null : _ref$url,
1522
+ _ref$onLoaded = _ref.onLoaded,
1523
+ customOnLoaded = _ref$onLoaded === void 0 ? null : _ref$onLoaded,
1524
+ _ref$onPlay = _ref.onPlay,
1525
+ customOnPlay = _ref$onPlay === void 0 ? null : _ref$onPlay,
1526
+ _ref$onPause = _ref.onPause,
1527
+ customOnPause = _ref$onPause === void 0 ? null : _ref$onPause,
1528
+ _ref$onEnd = _ref.onEnd,
1529
+ customOnEnd = _ref$onEnd === void 0 ? null : _ref$onEnd,
1530
+ _ref$onMetadataChange = _ref.onMetadataChange,
1531
+ customOnMetadataChange = _ref$onMetadataChange === void 0 ? null : _ref$onMetadataChange,
1532
+ _ref$onBufferStart = _ref.onBufferStart,
1533
+ customOnBufferStart = _ref$onBufferStart === void 0 ? null : _ref$onBufferStart,
1534
+ _ref$onBufferEnded = _ref.onBufferEnded,
1535
+ customOnBufferEnded = _ref$onBufferEnded === void 0 ? null : _ref$onBufferEnded;
1536
+
1537
+ var dailymotionPlayer = useDailymotionPlayer(service === 'dailymotion' ? videoId || url : null, params);
1538
+ var youtubePlayer = useYouTubePlayer(service === 'youtube' ? videoId || url : null, params);
1539
+ var vimeoPlayer = useVimeoPlayer(service === 'vimeo' ? videoId || url : null, params);
1540
+ var nativePlayer = useNativeVideoPlayer(url, params);
1541
+ var player = null;
1542
+
1543
+ if (service === 'dailymotion') {
1544
+ player = dailymotionPlayer;
1545
+ } else if (service === 'youtube') {
1546
+ player = youtubePlayer;
1547
+ } else if (service === 'vimeo') {
1548
+ player = vimeoPlayer;
1549
+ } else {
1550
+ player = nativePlayer;
1551
+ }
1552
+
1553
+ var _ref2 = player || {},
1554
+ _ref2$playing = _ref2.playing,
1555
+ playing = _ref2$playing === void 0 ? false : _ref2$playing,
1556
+ _ref2$paused = _ref2.paused,
1557
+ paused = _ref2$paused === void 0 ? false : _ref2$paused,
1558
+ _ref2$buffering = _ref2.buffering,
1559
+ buffering = _ref2$buffering === void 0 ? false : _ref2$buffering,
1560
+ _ref2$ended = _ref2.ended,
1561
+ ended = _ref2$ended === void 0 ? false : _ref2$ended,
1562
+ _ref2$ready = _ref2.ready,
1563
+ ready = _ref2$ready === void 0 ? false : _ref2$ready,
1564
+ _ref2$width = _ref2.width,
1565
+ metaWidth = _ref2$width === void 0 ? null : _ref2$width,
1566
+ _ref2$height = _ref2.height,
1567
+ metaHeight = _ref2$height === void 0 ? null : _ref2$height,
1568
+ _ref2$duration = _ref2.duration,
1569
+ metaDuration = _ref2$duration === void 0 ? null : _ref2$duration;
1570
+
1571
+ react.useEffect(function () {
1572
+ if (ready && customOnLoaded !== null) {
1573
+ customOnLoaded();
1574
+ }
1575
+ }, [ready, customOnLoaded]);
1576
+ react.useEffect(function () {
1577
+ if (playing && customOnPlay !== null) {
1578
+ customOnPlay();
1579
+ }
1580
+ }, [playing, customOnPlay]);
1581
+ react.useEffect(function () {
1582
+ if (paused && customOnPause !== null) {
1583
+ customOnPause();
1584
+ }
1585
+ }, [paused, customOnPause]);
1586
+ react.useEffect(function () {
1587
+ if (buffering && customOnBufferStart !== null) {
1588
+ customOnBufferStart();
1589
+ } else if (!buffering && customOnBufferEnded !== null) {
1590
+ customOnBufferEnded();
1591
+ }
1592
+ }, [buffering, customOnBufferStart, customOnBufferEnded]);
1593
+ react.useEffect(function () {
1594
+ if (ended && customOnEnd !== null) {
1595
+ customOnEnd();
1596
+ }
1597
+ }, [ended, customOnEnd]);
1598
+ react.useEffect(function () {
1599
+ var hasMetadata = metaWidth !== null || metaHeight !== null || metaDuration !== null;
1600
+
1601
+ if (hasMetadata && customOnMetadataChange !== null) {
1602
+ customOnMetadataChange({
1603
+ width: metaWidth,
1604
+ height: metaHeight,
1605
+ duration: metaDuration
1606
+ });
1607
+ }
1608
+ }, [metaWidth, metaHeight, metaDuration, customOnMetadataChange]);
1609
+ return player;
1610
+ }
1611
+
312
1612
  exports.getObserver = getObserver;
1613
+ exports.useDailymotionPlayer = useDailymotionPlayer;
313
1614
  exports.useDocumentEvent = useDocumentEvent;
314
1615
  exports.useIntersectionObserver = useIntersectionObserver;
315
1616
  exports.useKeyboard = useKeyboard;
1617
+ exports.useNativeVideoPlayer = useNativeVideoPlayer;
316
1618
  exports.useObserver = useObserver;
1619
+ exports.usePlayerCurrentTime = usePlayerCurrentTime;
317
1620
  exports.useResizeObserver = useResizeObserver;
1621
+ exports.useVideoPlayer = useVideoPlayer;
1622
+ exports.useVimeoPlayer = useVimeoPlayer;
318
1623
  exports.useWindowEvent = useWindowEvent;
1624
+ exports.useYouTubePlayer = useYouTubePlayer;