@micromag/core 0.3.156 → 0.3.162

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/es/contexts.js CHANGED
@@ -986,7 +986,11 @@ var PlaybackProvider = function PlaybackProvider(_ref) {
986
986
  return true;
987
987
  }
988
988
 
989
- return typeof media.dataset.hasAudio !== 'undefined' ? media.dataset.hasAudio : null;
989
+ if (typeof media.dataset.hasAudio === 'undefined') {
990
+ return null;
991
+ }
992
+
993
+ return media.dataset.hasAudio === 'true' || media.dataset.hasAudio === true;
990
994
  }, [media]);
991
995
  var value = useMemo(function () {
992
996
  return {
@@ -1931,10 +1935,17 @@ var useViewerEvents = function useViewerEvents() {
1931
1935
 
1932
1936
  return events;
1933
1937
  };
1934
- var useViewerInteraction = function useViewerInteraction() {
1938
+ var useViewerContainer = function useViewerContainer() {
1935
1939
  var _useViewerContext3 = useViewerContext(),
1936
- disableInteraction = _useViewerContext3.disableInteraction,
1937
- enableInteraction = _useViewerContext3.enableInteraction;
1940
+ _useViewerContext3$co = _useViewerContext3.containerRef,
1941
+ containerRef = _useViewerContext3$co === void 0 ? null : _useViewerContext3$co;
1942
+
1943
+ return containerRef !== null ? containerRef.current : null;
1944
+ };
1945
+ var useViewerInteraction = function useViewerInteraction() {
1946
+ var _useViewerContext4 = useViewerContext(),
1947
+ disableInteraction = _useViewerContext4.disableInteraction,
1948
+ enableInteraction = _useViewerContext4.enableInteraction;
1938
1949
 
1939
1950
  return {
1940
1951
  disableInteraction: disableInteraction,
@@ -1942,9 +1953,9 @@ var useViewerInteraction = function useViewerInteraction() {
1942
1953
  };
1943
1954
  };
1944
1955
  var useViewerWebView = function useViewerWebView() {
1945
- var _useViewerContext4 = useViewerContext(),
1946
- webView = _useViewerContext4.webView,
1947
- setWebView = _useViewerContext4.setWebView;
1956
+ var _useViewerContext5 = useViewerContext(),
1957
+ webView = _useViewerContext5.webView,
1958
+ setWebView = _useViewerContext5.setWebView;
1948
1959
 
1949
1960
  var value = useMemo(function () {
1950
1961
  return _objectSpread(_objectSpread({}, webView), {}, {
@@ -1967,6 +1978,10 @@ var useViewerWebView = function useViewerWebView() {
1967
1978
  var propTypes$1 = {
1968
1979
  children: PropTypes.node.isRequired,
1969
1980
  events: PropTypes.instanceOf(EventEmitter),
1981
+ containerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.shape({
1982
+ // eslint-disable-next-line react/forbid-prop-types
1983
+ current: PropTypes.any
1984
+ })]),
1970
1985
  menuVisible: PropTypes.bool,
1971
1986
  menuOverScreen: PropTypes.bool,
1972
1987
  topHeight: PropTypes.number,
@@ -1982,6 +1997,7 @@ var defaultProps$1 = _objectSpread({}, defaultValue);
1982
1997
 
1983
1998
  var ViewerProvider = function ViewerProvider(_ref) {
1984
1999
  var children = _ref.children,
2000
+ containerRef = _ref.containerRef,
1985
2001
  events = _ref.events,
1986
2002
  menuVisible = _ref.menuVisible,
1987
2003
  menuOverScreen = _ref.menuOverScreen,
@@ -2000,6 +2016,7 @@ var ViewerProvider = function ViewerProvider(_ref) {
2000
2016
 
2001
2017
  var value = useMemo(function () {
2002
2018
  return {
2019
+ containerRef: containerRef,
2003
2020
  events: events,
2004
2021
  menuVisible: menuVisible,
2005
2022
  menuOverScreen: menuOverScreen,
@@ -2013,7 +2030,7 @@ var ViewerProvider = function ViewerProvider(_ref) {
2013
2030
  webView: webView,
2014
2031
  setWebView: setWebView
2015
2032
  };
2016
- }, [events, menuVisible, menuOverScreen, topHeight, bottomHeight, bottomSidesWidth, gotoNextScreen, gotoPreviousScreen, disableInteraction, enableInteraction, webView, setWebView]);
2033
+ }, [containerRef, events, menuVisible, menuOverScreen, topHeight, bottomHeight, bottomSidesWidth, gotoNextScreen, gotoPreviousScreen, disableInteraction, enableInteraction, webView, setWebView]);
2017
2034
  return /*#__PURE__*/React.createElement(ViewerContext.Provider, {
2018
2035
  value: value
2019
2036
  }, children);
@@ -2076,4 +2093,4 @@ var VisitorProvider = function VisitorProvider(_ref) {
2076
2093
  VisitorProvider.propTypes = propTypes;
2077
2094
  VisitorProvider.defaultProps = defaultProps;
2078
2095
 
2079
- export { ComponentsContext, ComponentsProvider, ELEMENTS_NAMESPACE, EditorContext, EditorProvider, FIELDS_NAMESPACE, FORMS_NAMESPACE, FieldContext, FieldContextProvider, FieldsContext, FieldsProvider, FieldsValueContext, FieldsValueContextProvider, FontsContext, FontsProvider, GoogleApiClientContext, GoogleApiClientProvider, GoogleKeysContext, GoogleKeysProvider, GoogleMapsClientContext, GoogleMapsClientProvider, MODALS_NAMESPACE, ModalsContext, ModalsProvider, PanelsContext, PanelsProvider, PlaybackContext, PlaybackProvider, RoutesContext, RoutesProvider, SCREENS_NAMESPACE, ScreenContext, ScreenProvider, ScreenSizeContext, ScreenSizeProvider, ScreensContext, ScreensProvider, StoryContext, StoryProvider, TrackingProvider, UppyContext, UppyProvider, UserInteractionContext, UserInteractionProvider, ViewerContext, ViewerProvider, VisitorContext, VisitorProvider, useComponent, useComponents, useComponentsManager, useEditor, useElementComponent, useElementsComponents, useElementsComponentsManager, useFieldComponent, useFieldContext, useFieldDefinition, useFieldsComponents, useFieldsComponentsManager, useFieldsManager, useFieldsValue, useFonts, useFormComponent, useFormsComponents, useFormsComponentsManager, useGetColors, useGoogleApiClient, useGoogleFonts, useGoogleKeys, useGoogleMapsClient, useModalComponent, useModals, useModalsComponents, useModalsComponentsManager, usePanels, usePlaybackContext, usePlaybackMediaRef, useRouteBack, useRoutePush, useRoutes, useScreen, useScreenComponent, useScreenData, useScreenDefinition, useScreenRenderContext, useScreenSize, useScreenState, useScreensComponents, useScreensComponentsManager, useScreensManager, useSetVisitor, useStory, useStoryContext, useTracking, useUppy, useUrlGenerator, useUserInteracted, useViewerContext, useViewerEvents, useViewerInteraction, useViewerNavigation, useViewerWebView, useVisitor, useVisitorContext, withGoogleApiClient, withGoogleMapsClient, withModals, withPanels };
2096
+ export { ComponentsContext, ComponentsProvider, ELEMENTS_NAMESPACE, EditorContext, EditorProvider, FIELDS_NAMESPACE, FORMS_NAMESPACE, FieldContext, FieldContextProvider, FieldsContext, FieldsProvider, FieldsValueContext, FieldsValueContextProvider, FontsContext, FontsProvider, GoogleApiClientContext, GoogleApiClientProvider, GoogleKeysContext, GoogleKeysProvider, GoogleMapsClientContext, GoogleMapsClientProvider, MODALS_NAMESPACE, ModalsContext, ModalsProvider, PanelsContext, PanelsProvider, PlaybackContext, PlaybackProvider, RoutesContext, RoutesProvider, SCREENS_NAMESPACE, ScreenContext, ScreenProvider, ScreenSizeContext, ScreenSizeProvider, ScreensContext, ScreensProvider, StoryContext, StoryProvider, TrackingProvider, UppyContext, UppyProvider, UserInteractionContext, UserInteractionProvider, ViewerContext, ViewerProvider, VisitorContext, VisitorProvider, useComponent, useComponents, useComponentsManager, useEditor, useElementComponent, useElementsComponents, useElementsComponentsManager, useFieldComponent, useFieldContext, useFieldDefinition, useFieldsComponents, useFieldsComponentsManager, useFieldsManager, useFieldsValue, useFonts, useFormComponent, useFormsComponents, useFormsComponentsManager, useGetColors, useGoogleApiClient, useGoogleFonts, useGoogleKeys, useGoogleMapsClient, useModalComponent, useModals, useModalsComponents, useModalsComponentsManager, usePanels, usePlaybackContext, usePlaybackMediaRef, useRouteBack, useRoutePush, useRoutes, useScreen, useScreenComponent, useScreenData, useScreenDefinition, useScreenRenderContext, useScreenSize, useScreenState, useScreensComponents, useScreensComponentsManager, useScreensManager, useSetVisitor, useStory, useStoryContext, useTracking, useUppy, useUrlGenerator, useUserInteracted, useViewerContainer, useViewerContext, useViewerEvents, useViewerInteraction, useViewerNavigation, useViewerWebView, useVisitor, useVisitorContext, withGoogleApiClient, withGoogleMapsClient, withModals, withPanels };
package/es/hooks.js CHANGED
@@ -14,6 +14,7 @@ import screenfull from 'screenfull';
14
14
  import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
15
15
  import isArray from 'lodash/isArray';
16
16
  import isObject from 'lodash/isObject';
17
+ import raf from 'raf';
17
18
  import { useScreensManager, useFieldsManager, useTracking, useScreen } from '@micromag/core/contexts';
18
19
  import { match } from 'css-mediaquery';
19
20
  import { useSprings } from '@react-spring/core';
@@ -22,18 +23,26 @@ import clamp from 'lodash/clamp';
22
23
 
23
24
  function useActivityDetector() {
24
25
  var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
26
+ _ref$element = _ref.element,
27
+ providedElement = _ref$element === void 0 ? null : _ref$element,
25
28
  _ref$disabled = _ref.disabled,
26
29
  disabled = _ref$disabled === void 0 ? false : _ref$disabled,
27
30
  _ref$timeout = _ref.timeout,
28
31
  timeoutDelay = _ref$timeout === void 0 ? 2000 : _ref$timeout;
29
32
 
30
- var ref = useRef(null);
33
+ var ref = useRef(providedElement);
31
34
 
32
35
  var _useState = useState(false),
33
36
  _useState2 = _slicedToArray(_useState, 2),
34
37
  detected = _useState2[0],
35
38
  setDetected = _useState2[1];
36
39
 
40
+ var detectedRef = useRef(detected);
41
+
42
+ if (providedElement !== null && providedElement !== ref.current) {
43
+ ref.current = providedElement;
44
+ }
45
+
37
46
  useEffect(function () {
38
47
  var _ref$current = ref.current,
39
48
  element = _ref$current === void 0 ? null : _ref$current;
@@ -44,28 +53,49 @@ function useActivityDetector() {
44
53
 
45
54
  var timeout = null;
46
55
 
47
- function onMove() {
56
+ function onActivity() {
48
57
  if (timeout !== null) {
49
58
  clearTimeout(timeout);
50
59
  timeout = null;
51
60
  }
52
61
 
53
- setDetected(true);
62
+ if (!detectedRef.current) {
63
+ detectedRef.current = true;
64
+ setDetected(true);
65
+ }
66
+
54
67
  timeout = setTimeout(function () {
68
+ detectedRef.current = false;
55
69
  setDetected(false);
56
70
  }, timeoutDelay);
57
71
  }
58
72
 
59
- element.addEventListener('mousemove', onMove);
73
+ element.addEventListener('keydown', onActivity);
74
+ element.addEventListener('mousedown', onActivity);
75
+ element.addEventListener('mousemove', onActivity);
76
+ element.addEventListener('mouseup', onActivity);
77
+ element.addEventListener('pointerdown', onActivity);
78
+ element.addEventListener('pointermove', onActivity);
79
+ element.addEventListener('pointerup', onActivity);
80
+ element.addEventListener('touchmove', onActivity);
81
+ element.addEventListener('touchstart', onActivity);
60
82
  return function () {
61
83
  if (timeout !== null) {
62
84
  clearTimeout(timeout);
63
85
  timeout = null;
64
86
  }
65
87
 
66
- element.removeEventListener('mousemove', onMove);
88
+ element.removeEventListener('keydown', onActivity);
89
+ element.removeEventListener('mousedown', onActivity);
90
+ element.removeEventListener('mousemove', onActivity);
91
+ element.removeEventListener('mouseup', onActivity);
92
+ element.removeEventListener('pointerdown', onActivity);
93
+ element.removeEventListener('pointermove', onActivity);
94
+ element.removeEventListener('pointerup', onActivity);
95
+ element.removeEventListener('touchmove', onActivity);
96
+ element.removeEventListener('touchstart', onActivity);
67
97
  };
68
- }, [disabled, timeoutDelay]);
98
+ }, [providedElement, disabled, timeoutDelay]);
69
99
  return {
70
100
  ref: ref,
71
101
  detected: detected
@@ -166,7 +196,7 @@ var useFormattedTime = function useFormattedTime() {
166
196
  var eventsManager$1 = typeof document !== 'undefined' ? new EventsManager(document) : null;
167
197
  var useDocumentEvent = createUseEvent(eventsManager$1);
168
198
 
169
- var _excluded$2 = ["fields", "injectInFields"],
199
+ var _excluded$3 = ["fields", "injectInFields"],
170
200
  _excluded2 = ["fields"];
171
201
 
172
202
  var useForm = function useForm() {
@@ -175,7 +205,7 @@ var useForm = function useForm() {
175
205
  providedFields = _ref$fields === void 0 ? [] : _ref$fields,
176
206
  _ref$injectInFields = _ref.injectInFields,
177
207
  injectInFields = _ref$injectInFields === void 0 ? false : _ref$injectInFields,
178
- opts = _objectWithoutProperties(_ref, _excluded$2);
208
+ opts = _objectWithoutProperties(_ref, _excluded$3);
179
209
 
180
210
  var fieldsNames = useMemo(function () {
181
211
  return providedFields.length > 0 ? providedFields.map(function (_ref2) {
@@ -282,7 +312,7 @@ var useFullscreen = function useFullscreen(element) {
282
312
  };
283
313
  };
284
314
 
285
- var _excluded$1 = ["entry"];
315
+ var _excluded$2 = ["entry"];
286
316
 
287
317
  var buildThresholdArray = function buildThresholdArray() {
288
318
  return [0, 1.0];
@@ -528,7 +558,7 @@ var useResizeObserver = function useResizeObserver() {
528
558
  var useDimensionObserver = function useDimensionObserver() {
529
559
  var _useResizeObserver = useResizeObserver.apply(void 0, arguments),
530
560
  entry = _useResizeObserver.entry,
531
- rest = _objectWithoutProperties(_useResizeObserver, _excluded$1);
561
+ rest = _objectWithoutProperties(_useResizeObserver, _excluded$2);
532
562
 
533
563
  var _ref5 = entry || {},
534
564
  _ref5$contentRect = _ref5.contentRect,
@@ -1165,47 +1195,63 @@ function useMediaCurrentTime(element) {
1165
1195
  setCurrentTime = _useState2[1];
1166
1196
 
1167
1197
  var realCurrentTime = useRef(currentTime);
1168
- var lastIdRef = useRef(id);
1169
- var idChanged = lastIdRef.current !== id;
1170
-
1171
- if (idChanged) {
1172
- realCurrentTime.current = 0;
1173
- lastIdRef.current = id;
1198
+ var finalId = id || element;
1199
+ var lastIdRef = useRef(finalId);
1200
+ var idChanged = lastIdRef.current !== finalId;
1201
+ var disabledRef = useRef(disabled);
1202
+ var disabledChanged = disabledRef.current !== disabled;
1203
+
1204
+ if (idChanged || disabledChanged) {
1205
+ realCurrentTime.current = element !== null ? element.currentTime || 0 : 0;
1206
+ lastIdRef.current = finalId;
1207
+ disabledRef.current = disabled;
1174
1208
  } // Check time update
1175
1209
 
1176
1210
 
1177
1211
  useEffect(function () {
1178
- if (disabled || element === null) {
1212
+ if (element === null) {
1179
1213
  return function () {};
1180
1214
  }
1181
1215
 
1182
- var canceled = false;
1216
+ function updateTime() {
1217
+ var time = element.currentTime || 0;
1183
1218
 
1184
- var updateTime = function updateTime(time) {
1185
- if (canceled) {
1186
- return;
1219
+ if (time !== realCurrentTime.current) {
1220
+ realCurrentTime.current = time;
1221
+ setCurrentTime(time);
1222
+
1223
+ if (customOnUpdate !== null) {
1224
+ customOnUpdate(time);
1225
+ }
1187
1226
  }
1188
1227
 
1189
- realCurrentTime.current = time;
1190
- setCurrentTime(time);
1228
+ return time;
1229
+ }
1191
1230
 
1192
- if (customOnUpdate !== null) {
1193
- customOnUpdate(time);
1194
- }
1195
- };
1231
+ if (disabled) {
1232
+ updateTime();
1233
+ return function () {};
1234
+ }
1196
1235
 
1197
- var interval = setInterval(function () {
1198
- var time = element.currentTime;
1236
+ var timeout = null;
1199
1237
 
1200
- if (typeof time.then !== 'undefined') {
1201
- time.then(updateTime);
1202
- } else {
1203
- updateTime(time);
1204
- }
1205
- }, updateInterval);
1238
+ function loop() {
1239
+ var _element$duration = element.duration,
1240
+ duration = _element$duration === void 0 ? 0 : _element$duration;
1241
+ var time = updateTime();
1242
+ var remainingTime = Math.floor(((duration || 0) - time) * 1000);
1243
+ timeout = setTimeout(loop, Math.max(Math.min(updateInterval, remainingTime), updateInterval));
1244
+ }
1245
+
1246
+ loop();
1206
1247
  return function () {
1207
- canceled = true;
1208
- clearInterval(interval);
1248
+ if (element !== null) {
1249
+ realCurrentTime.current = element.currentTime;
1250
+ }
1251
+
1252
+ if (timeout !== null) {
1253
+ clearInterval(timeout);
1254
+ }
1209
1255
  };
1210
1256
  }, [id, element, setCurrentTime, disabled, updateInterval]);
1211
1257
  return realCurrentTime.current;
@@ -1222,12 +1268,13 @@ function useMediaDuration(element) {
1222
1268
  setDuration = _useState2[1];
1223
1269
 
1224
1270
  var realDuration = useRef(duration);
1225
- var lastIdRef = useRef(id);
1226
- var idChanged = lastIdRef.current !== id;
1271
+ var finalId = id || element;
1272
+ var lastIdRef = useRef(finalId);
1273
+ var idChanged = lastIdRef.current !== finalId;
1227
1274
 
1228
1275
  if (idChanged) {
1229
1276
  realDuration.current = element !== null ? element.duration || 0 : 0;
1230
- lastIdRef.current = id;
1277
+ lastIdRef.current = finalId;
1231
1278
  }
1232
1279
 
1233
1280
  useEffect(function () {
@@ -1236,14 +1283,20 @@ function useMediaDuration(element) {
1236
1283
  }
1237
1284
 
1238
1285
  function updateDuration() {
1239
- realDuration.current = element.duration || 0;
1240
- setDuration(element.duration || 0);
1286
+ var newDuration = element.duration || 0;
1287
+
1288
+ if (newDuration !== realDuration.current) {
1289
+ realDuration.current = newDuration;
1290
+ setDuration(newDuration);
1291
+ }
1241
1292
  }
1242
1293
 
1243
1294
  updateDuration();
1295
+ element.addEventListener('canplay', updateDuration);
1244
1296
  element.addEventListener('loadedmetadata', updateDuration);
1245
1297
  element.addEventListener('durationchange', updateDuration);
1246
1298
  return function () {
1299
+ element.removeEventListener('canplay', updateDuration);
1247
1300
  element.removeEventListener('loadedmetadata', updateDuration);
1248
1301
  element.removeEventListener('durationchange', updateDuration);
1249
1302
  };
@@ -1274,6 +1327,113 @@ function useMediaLoad(element) {
1274
1327
  }, [element, shouldLoad, preload]);
1275
1328
  }
1276
1329
 
1330
+ var _excluded$1 = ["disabled"];
1331
+
1332
+ function useMediaProgress(media) {
1333
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1334
+ _ref$disabled = _ref.disabled,
1335
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
1336
+ props = _objectWithoutProperties(_ref, _excluded$1);
1337
+
1338
+ var _useState = useState(!disabled),
1339
+ _useState2 = _slicedToArray(_useState, 2),
1340
+ playing = _useState2[0],
1341
+ setPlaying = _useState2[1];
1342
+
1343
+ var currentTime = useMediaCurrentTime(media, _objectSpread({
1344
+ disabled: disabled || !playing
1345
+ }, props));
1346
+ var duration = useMediaDuration(media, _objectSpread({
1347
+ disabled: disabled || !playing
1348
+ }, props));
1349
+
1350
+ var _useState3 = useState(currentTime > 0 && duration > 0 ? currentTime / duration : 0),
1351
+ _useState4 = _slicedToArray(_useState3, 2),
1352
+ progress = _useState4[0],
1353
+ setProgress = _useState4[1];
1354
+
1355
+ var realProgressRef = useRef(progress);
1356
+ var updateTimeRef = useRef(new Date().getTime());
1357
+ var updateProgress = useCallback(function (newProgress) {
1358
+ updateTimeRef.current = new Date().getTime();
1359
+ realProgressRef.current = newProgress;
1360
+ setProgress(newProgress);
1361
+ }, [setProgress]);
1362
+ useEffect(function () {
1363
+ if (media === null) {
1364
+ return function () {};
1365
+ }
1366
+
1367
+ function onResume() {
1368
+ setPlaying(true);
1369
+ updateProgress(media.currentTime / media.duration);
1370
+ }
1371
+
1372
+ function onPause() {
1373
+ setPlaying(false);
1374
+ updateProgress(media.currentTime / media.duration);
1375
+ }
1376
+
1377
+ media.addEventListener('play', onResume);
1378
+ media.addEventListener('seeked', onResume);
1379
+ media.addEventListener('playing', onResume);
1380
+ media.addEventListener('pause', onPause);
1381
+ media.addEventListener('ended', onPause);
1382
+ media.addEventListener('waiting', onPause);
1383
+ media.addEventListener('stalled', onPause);
1384
+ media.addEventListener('seeking', onPause); // media.addEventListener('suspend', onPause);
1385
+ // if (media.paused) {
1386
+ // onPause();
1387
+ // } else {
1388
+ // onResume();
1389
+ // }
1390
+
1391
+ return function () {
1392
+ media.removeEventListener('play', onResume);
1393
+ media.removeEventListener('seeked', onResume);
1394
+ media.removeEventListener('playing', onResume);
1395
+ media.removeEventListener('pause', onPause);
1396
+ media.removeEventListener('ended', onPause);
1397
+ media.removeEventListener('waiting', onPause);
1398
+ media.removeEventListener('stalled', onPause);
1399
+ media.removeEventListener('seeking', onPause); // media.removeEventListener('suspend', onPause);
1400
+ };
1401
+ }, [media, updateProgress]);
1402
+ useEffect(function () {
1403
+ if (media === null) {
1404
+ return function () {};
1405
+ }
1406
+
1407
+ if (!playing || disabled) {
1408
+ return function () {};
1409
+ }
1410
+
1411
+ var handle;
1412
+ var canceled = false;
1413
+
1414
+ function tick() {
1415
+ if (canceled) {
1416
+ return;
1417
+ }
1418
+
1419
+ var newTime = new Date().getTime();
1420
+ var elapsed = newTime - updateTimeRef.current;
1421
+ updateTimeRef.current = newTime;
1422
+ var step = elapsed / (duration * 1000);
1423
+ var newProgress = realProgressRef.current + step;
1424
+ updateProgress(newProgress);
1425
+ handle = raf(tick);
1426
+ }
1427
+
1428
+ tick();
1429
+ return function () {
1430
+ canceled = true;
1431
+ raf.cancel(handle);
1432
+ };
1433
+ }, [media, playing, disabled, duration, updateProgress]);
1434
+ return realProgressRef.current;
1435
+ }
1436
+
1277
1437
  function useMediaReady(element) {
1278
1438
  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1279
1439
  _ref$id = _ref.id,
@@ -2012,4 +2172,4 @@ var useTrackMedia = function useTrackMedia() {
2012
2172
  var eventsManager = typeof window !== 'undefined' ? new EventsManager(window) : null;
2013
2173
  var useWindowEvent = createUseEvent(eventsManager);
2014
2174
 
2015
- export { getObserver, useActivityDetector, useAnimationFrame, useDimensionObserver, useDocumentEvent, useForm, useFormTransition, useFormattedDate, useFormattedTime, useFullscreen, useIntersectionObserver, useIsVisible, useLoadedFonts, useLongPress, useMediaApi, useMediaCurrentTime, useMediaDuration, useMediaLoad, useMediaReady, useMediaThumbnail, useMediaWaveform, useMediasParser, useObserver, useParsedStory, useProgressSteps, useResizeObserver, useScreenSizeFromElement, useScreenSizeFromWindow, useSwipe, useThemeParser, useTrackEvent, useTrackMedia, useTrackScreenEvent, useTrackScreenMedia, useTrackScreenView, useWindowEvent };
2175
+ export { getObserver, useActivityDetector, useAnimationFrame, useDimensionObserver, useDocumentEvent, useForm, useFormTransition, useFormattedDate, useFormattedTime, useFullscreen, useIntersectionObserver, useIsVisible, useLoadedFonts, useLongPress, useMediaApi, useMediaCurrentTime, useMediaDuration, useMediaLoad, useMediaProgress, useMediaReady, useMediaThumbnail, useMediaWaveform, useMediasParser, useObserver, useParsedStory, useProgressSteps, useResizeObserver, useScreenSizeFromElement, useScreenSizeFromWindow, useSwipe, useThemeParser, useTrackEvent, useTrackMedia, useTrackScreenEvent, useTrackScreenMedia, useTrackScreenView, useWindowEvent };
package/lib/contexts.js CHANGED
@@ -1021,7 +1021,11 @@ var PlaybackProvider = function PlaybackProvider(_ref) {
1021
1021
  return true;
1022
1022
  }
1023
1023
 
1024
- return typeof media.dataset.hasAudio !== 'undefined' ? media.dataset.hasAudio : null;
1024
+ if (typeof media.dataset.hasAudio === 'undefined') {
1025
+ return null;
1026
+ }
1027
+
1028
+ return media.dataset.hasAudio === 'true' || media.dataset.hasAudio === true;
1025
1029
  }, [media]);
1026
1030
  var value = React.useMemo(function () {
1027
1031
  return {
@@ -1966,10 +1970,17 @@ var useViewerEvents = function useViewerEvents() {
1966
1970
 
1967
1971
  return events;
1968
1972
  };
1969
- var useViewerInteraction = function useViewerInteraction() {
1973
+ var useViewerContainer = function useViewerContainer() {
1970
1974
  var _useViewerContext3 = useViewerContext(),
1971
- disableInteraction = _useViewerContext3.disableInteraction,
1972
- enableInteraction = _useViewerContext3.enableInteraction;
1975
+ _useViewerContext3$co = _useViewerContext3.containerRef,
1976
+ containerRef = _useViewerContext3$co === void 0 ? null : _useViewerContext3$co;
1977
+
1978
+ return containerRef !== null ? containerRef.current : null;
1979
+ };
1980
+ var useViewerInteraction = function useViewerInteraction() {
1981
+ var _useViewerContext4 = useViewerContext(),
1982
+ disableInteraction = _useViewerContext4.disableInteraction,
1983
+ enableInteraction = _useViewerContext4.enableInteraction;
1973
1984
 
1974
1985
  return {
1975
1986
  disableInteraction: disableInteraction,
@@ -1977,9 +1988,9 @@ var useViewerInteraction = function useViewerInteraction() {
1977
1988
  };
1978
1989
  };
1979
1990
  var useViewerWebView = function useViewerWebView() {
1980
- var _useViewerContext4 = useViewerContext(),
1981
- webView = _useViewerContext4.webView,
1982
- setWebView = _useViewerContext4.setWebView;
1991
+ var _useViewerContext5 = useViewerContext(),
1992
+ webView = _useViewerContext5.webView,
1993
+ setWebView = _useViewerContext5.setWebView;
1983
1994
 
1984
1995
  var value = React.useMemo(function () {
1985
1996
  return _objectSpread__default["default"](_objectSpread__default["default"]({}, webView), {}, {
@@ -2002,6 +2013,10 @@ var useViewerWebView = function useViewerWebView() {
2002
2013
  var propTypes$1 = {
2003
2014
  children: PropTypes__default["default"].node.isRequired,
2004
2015
  events: PropTypes__default["default"].instanceOf(EventEmitter__default["default"]),
2016
+ containerRef: PropTypes__default["default"].oneOfType([PropTypes__default["default"].func, PropTypes__default["default"].shape({
2017
+ // eslint-disable-next-line react/forbid-prop-types
2018
+ current: PropTypes__default["default"].any
2019
+ })]),
2005
2020
  menuVisible: PropTypes__default["default"].bool,
2006
2021
  menuOverScreen: PropTypes__default["default"].bool,
2007
2022
  topHeight: PropTypes__default["default"].number,
@@ -2017,6 +2032,7 @@ var defaultProps$1 = _objectSpread__default["default"]({}, defaultValue);
2017
2032
 
2018
2033
  var ViewerProvider = function ViewerProvider(_ref) {
2019
2034
  var children = _ref.children,
2035
+ containerRef = _ref.containerRef,
2020
2036
  events = _ref.events,
2021
2037
  menuVisible = _ref.menuVisible,
2022
2038
  menuOverScreen = _ref.menuOverScreen,
@@ -2035,6 +2051,7 @@ var ViewerProvider = function ViewerProvider(_ref) {
2035
2051
 
2036
2052
  var value = React.useMemo(function () {
2037
2053
  return {
2054
+ containerRef: containerRef,
2038
2055
  events: events,
2039
2056
  menuVisible: menuVisible,
2040
2057
  menuOverScreen: menuOverScreen,
@@ -2048,7 +2065,7 @@ var ViewerProvider = function ViewerProvider(_ref) {
2048
2065
  webView: webView,
2049
2066
  setWebView: setWebView
2050
2067
  };
2051
- }, [events, menuVisible, menuOverScreen, topHeight, bottomHeight, bottomSidesWidth, gotoNextScreen, gotoPreviousScreen, disableInteraction, enableInteraction, webView, setWebView]);
2068
+ }, [containerRef, events, menuVisible, menuOverScreen, topHeight, bottomHeight, bottomSidesWidth, gotoNextScreen, gotoPreviousScreen, disableInteraction, enableInteraction, webView, setWebView]);
2052
2069
  return /*#__PURE__*/React__default["default"].createElement(ViewerContext.Provider, {
2053
2070
  value: value
2054
2071
  }, children);
@@ -2213,6 +2230,7 @@ exports.useTracking = useTracking;
2213
2230
  exports.useUppy = useUppy;
2214
2231
  exports.useUrlGenerator = useUrlGenerator;
2215
2232
  exports.useUserInteracted = useUserInteracted;
2233
+ exports.useViewerContainer = useViewerContainer;
2216
2234
  exports.useViewerContext = useViewerContext;
2217
2235
  exports.useViewerEvents = useViewerEvents;
2218
2236
  exports.useViewerInteraction = useViewerInteraction;
package/lib/hooks.js CHANGED
@@ -18,6 +18,7 @@ var screenfull = require('screenfull');
18
18
  var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
19
19
  var isArray = require('lodash/isArray');
20
20
  var isObject = require('lodash/isObject');
21
+ var raf = require('raf');
21
22
  var contexts = require('@micromag/core/contexts');
22
23
  var cssMediaquery = require('css-mediaquery');
23
24
  var core$1 = require('@react-spring/core');
@@ -55,22 +56,31 @@ var screenfull__default = /*#__PURE__*/_interopDefaultLegacy(screenfull);
55
56
  var _toConsumableArray__default = /*#__PURE__*/_interopDefaultLegacy(_toConsumableArray);
56
57
  var isArray__default = /*#__PURE__*/_interopDefaultLegacy(isArray);
57
58
  var isObject__default = /*#__PURE__*/_interopDefaultLegacy(isObject);
59
+ var raf__default = /*#__PURE__*/_interopDefaultLegacy(raf);
58
60
  var clamp__default = /*#__PURE__*/_interopDefaultLegacy(clamp);
59
61
 
60
62
  function useActivityDetector() {
61
63
  var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
64
+ _ref$element = _ref.element,
65
+ providedElement = _ref$element === void 0 ? null : _ref$element,
62
66
  _ref$disabled = _ref.disabled,
63
67
  disabled = _ref$disabled === void 0 ? false : _ref$disabled,
64
68
  _ref$timeout = _ref.timeout,
65
69
  timeoutDelay = _ref$timeout === void 0 ? 2000 : _ref$timeout;
66
70
 
67
- var ref = react.useRef(null);
71
+ var ref = react.useRef(providedElement);
68
72
 
69
73
  var _useState = react.useState(false),
70
74
  _useState2 = _slicedToArray__default["default"](_useState, 2),
71
75
  detected = _useState2[0],
72
76
  setDetected = _useState2[1];
73
77
 
78
+ var detectedRef = react.useRef(detected);
79
+
80
+ if (providedElement !== null && providedElement !== ref.current) {
81
+ ref.current = providedElement;
82
+ }
83
+
74
84
  react.useEffect(function () {
75
85
  var _ref$current = ref.current,
76
86
  element = _ref$current === void 0 ? null : _ref$current;
@@ -81,28 +91,49 @@ function useActivityDetector() {
81
91
 
82
92
  var timeout = null;
83
93
 
84
- function onMove() {
94
+ function onActivity() {
85
95
  if (timeout !== null) {
86
96
  clearTimeout(timeout);
87
97
  timeout = null;
88
98
  }
89
99
 
90
- setDetected(true);
100
+ if (!detectedRef.current) {
101
+ detectedRef.current = true;
102
+ setDetected(true);
103
+ }
104
+
91
105
  timeout = setTimeout(function () {
106
+ detectedRef.current = false;
92
107
  setDetected(false);
93
108
  }, timeoutDelay);
94
109
  }
95
110
 
96
- element.addEventListener('mousemove', onMove);
111
+ element.addEventListener('keydown', onActivity);
112
+ element.addEventListener('mousedown', onActivity);
113
+ element.addEventListener('mousemove', onActivity);
114
+ element.addEventListener('mouseup', onActivity);
115
+ element.addEventListener('pointerdown', onActivity);
116
+ element.addEventListener('pointermove', onActivity);
117
+ element.addEventListener('pointerup', onActivity);
118
+ element.addEventListener('touchmove', onActivity);
119
+ element.addEventListener('touchstart', onActivity);
97
120
  return function () {
98
121
  if (timeout !== null) {
99
122
  clearTimeout(timeout);
100
123
  timeout = null;
101
124
  }
102
125
 
103
- element.removeEventListener('mousemove', onMove);
126
+ element.removeEventListener('keydown', onActivity);
127
+ element.removeEventListener('mousedown', onActivity);
128
+ element.removeEventListener('mousemove', onActivity);
129
+ element.removeEventListener('mouseup', onActivity);
130
+ element.removeEventListener('pointerdown', onActivity);
131
+ element.removeEventListener('pointermove', onActivity);
132
+ element.removeEventListener('pointerup', onActivity);
133
+ element.removeEventListener('touchmove', onActivity);
134
+ element.removeEventListener('touchstart', onActivity);
104
135
  };
105
- }, [disabled, timeoutDelay]);
136
+ }, [providedElement, disabled, timeoutDelay]);
106
137
  return {
107
138
  ref: ref,
108
139
  detected: detected
@@ -203,7 +234,7 @@ var useFormattedTime = function useFormattedTime() {
203
234
  var eventsManager$1 = typeof document !== 'undefined' ? new core.EventsManager(document) : null;
204
235
  var useDocumentEvent = utils.createUseEvent(eventsManager$1);
205
236
 
206
- var _excluded$2 = ["fields", "injectInFields"],
237
+ var _excluded$3 = ["fields", "injectInFields"],
207
238
  _excluded2 = ["fields"];
208
239
 
209
240
  var useForm = function useForm() {
@@ -212,7 +243,7 @@ var useForm = function useForm() {
212
243
  providedFields = _ref$fields === void 0 ? [] : _ref$fields,
213
244
  _ref$injectInFields = _ref.injectInFields,
214
245
  injectInFields = _ref$injectInFields === void 0 ? false : _ref$injectInFields,
215
- opts = _objectWithoutProperties__default["default"](_ref, _excluded$2);
246
+ opts = _objectWithoutProperties__default["default"](_ref, _excluded$3);
216
247
 
217
248
  var fieldsNames = react.useMemo(function () {
218
249
  return providedFields.length > 0 ? providedFields.map(function (_ref2) {
@@ -319,7 +350,7 @@ var useFullscreen = function useFullscreen(element) {
319
350
  };
320
351
  };
321
352
 
322
- var _excluded$1 = ["entry"];
353
+ var _excluded$2 = ["entry"];
323
354
 
324
355
  var buildThresholdArray = function buildThresholdArray() {
325
356
  return [0, 1.0];
@@ -565,7 +596,7 @@ var useResizeObserver = function useResizeObserver() {
565
596
  var useDimensionObserver = function useDimensionObserver() {
566
597
  var _useResizeObserver = useResizeObserver.apply(void 0, arguments),
567
598
  entry = _useResizeObserver.entry,
568
- rest = _objectWithoutProperties__default["default"](_useResizeObserver, _excluded$1);
599
+ rest = _objectWithoutProperties__default["default"](_useResizeObserver, _excluded$2);
569
600
 
570
601
  var _ref5 = entry || {},
571
602
  _ref5$contentRect = _ref5.contentRect,
@@ -1202,47 +1233,63 @@ function useMediaCurrentTime(element) {
1202
1233
  setCurrentTime = _useState2[1];
1203
1234
 
1204
1235
  var realCurrentTime = react.useRef(currentTime);
1205
- var lastIdRef = react.useRef(id);
1206
- var idChanged = lastIdRef.current !== id;
1207
-
1208
- if (idChanged) {
1209
- realCurrentTime.current = 0;
1210
- lastIdRef.current = id;
1236
+ var finalId = id || element;
1237
+ var lastIdRef = react.useRef(finalId);
1238
+ var idChanged = lastIdRef.current !== finalId;
1239
+ var disabledRef = react.useRef(disabled);
1240
+ var disabledChanged = disabledRef.current !== disabled;
1241
+
1242
+ if (idChanged || disabledChanged) {
1243
+ realCurrentTime.current = element !== null ? element.currentTime || 0 : 0;
1244
+ lastIdRef.current = finalId;
1245
+ disabledRef.current = disabled;
1211
1246
  } // Check time update
1212
1247
 
1213
1248
 
1214
1249
  react.useEffect(function () {
1215
- if (disabled || element === null) {
1250
+ if (element === null) {
1216
1251
  return function () {};
1217
1252
  }
1218
1253
 
1219
- var canceled = false;
1254
+ function updateTime() {
1255
+ var time = element.currentTime || 0;
1220
1256
 
1221
- var updateTime = function updateTime(time) {
1222
- if (canceled) {
1223
- return;
1257
+ if (time !== realCurrentTime.current) {
1258
+ realCurrentTime.current = time;
1259
+ setCurrentTime(time);
1260
+
1261
+ if (customOnUpdate !== null) {
1262
+ customOnUpdate(time);
1263
+ }
1224
1264
  }
1225
1265
 
1226
- realCurrentTime.current = time;
1227
- setCurrentTime(time);
1266
+ return time;
1267
+ }
1228
1268
 
1229
- if (customOnUpdate !== null) {
1230
- customOnUpdate(time);
1231
- }
1232
- };
1269
+ if (disabled) {
1270
+ updateTime();
1271
+ return function () {};
1272
+ }
1233
1273
 
1234
- var interval = setInterval(function () {
1235
- var time = element.currentTime;
1274
+ var timeout = null;
1236
1275
 
1237
- if (typeof time.then !== 'undefined') {
1238
- time.then(updateTime);
1239
- } else {
1240
- updateTime(time);
1241
- }
1242
- }, updateInterval);
1276
+ function loop() {
1277
+ var _element$duration = element.duration,
1278
+ duration = _element$duration === void 0 ? 0 : _element$duration;
1279
+ var time = updateTime();
1280
+ var remainingTime = Math.floor(((duration || 0) - time) * 1000);
1281
+ timeout = setTimeout(loop, Math.max(Math.min(updateInterval, remainingTime), updateInterval));
1282
+ }
1283
+
1284
+ loop();
1243
1285
  return function () {
1244
- canceled = true;
1245
- clearInterval(interval);
1286
+ if (element !== null) {
1287
+ realCurrentTime.current = element.currentTime;
1288
+ }
1289
+
1290
+ if (timeout !== null) {
1291
+ clearInterval(timeout);
1292
+ }
1246
1293
  };
1247
1294
  }, [id, element, setCurrentTime, disabled, updateInterval]);
1248
1295
  return realCurrentTime.current;
@@ -1259,12 +1306,13 @@ function useMediaDuration(element) {
1259
1306
  setDuration = _useState2[1];
1260
1307
 
1261
1308
  var realDuration = react.useRef(duration);
1262
- var lastIdRef = react.useRef(id);
1263
- var idChanged = lastIdRef.current !== id;
1309
+ var finalId = id || element;
1310
+ var lastIdRef = react.useRef(finalId);
1311
+ var idChanged = lastIdRef.current !== finalId;
1264
1312
 
1265
1313
  if (idChanged) {
1266
1314
  realDuration.current = element !== null ? element.duration || 0 : 0;
1267
- lastIdRef.current = id;
1315
+ lastIdRef.current = finalId;
1268
1316
  }
1269
1317
 
1270
1318
  react.useEffect(function () {
@@ -1273,14 +1321,20 @@ function useMediaDuration(element) {
1273
1321
  }
1274
1322
 
1275
1323
  function updateDuration() {
1276
- realDuration.current = element.duration || 0;
1277
- setDuration(element.duration || 0);
1324
+ var newDuration = element.duration || 0;
1325
+
1326
+ if (newDuration !== realDuration.current) {
1327
+ realDuration.current = newDuration;
1328
+ setDuration(newDuration);
1329
+ }
1278
1330
  }
1279
1331
 
1280
1332
  updateDuration();
1333
+ element.addEventListener('canplay', updateDuration);
1281
1334
  element.addEventListener('loadedmetadata', updateDuration);
1282
1335
  element.addEventListener('durationchange', updateDuration);
1283
1336
  return function () {
1337
+ element.removeEventListener('canplay', updateDuration);
1284
1338
  element.removeEventListener('loadedmetadata', updateDuration);
1285
1339
  element.removeEventListener('durationchange', updateDuration);
1286
1340
  };
@@ -1311,6 +1365,113 @@ function useMediaLoad(element) {
1311
1365
  }, [element, shouldLoad, preload]);
1312
1366
  }
1313
1367
 
1368
+ var _excluded$1 = ["disabled"];
1369
+
1370
+ function useMediaProgress(media) {
1371
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1372
+ _ref$disabled = _ref.disabled,
1373
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
1374
+ props = _objectWithoutProperties__default["default"](_ref, _excluded$1);
1375
+
1376
+ var _useState = react.useState(!disabled),
1377
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
1378
+ playing = _useState2[0],
1379
+ setPlaying = _useState2[1];
1380
+
1381
+ var currentTime = useMediaCurrentTime(media, _objectSpread__default["default"]({
1382
+ disabled: disabled || !playing
1383
+ }, props));
1384
+ var duration = useMediaDuration(media, _objectSpread__default["default"]({
1385
+ disabled: disabled || !playing
1386
+ }, props));
1387
+
1388
+ var _useState3 = react.useState(currentTime > 0 && duration > 0 ? currentTime / duration : 0),
1389
+ _useState4 = _slicedToArray__default["default"](_useState3, 2),
1390
+ progress = _useState4[0],
1391
+ setProgress = _useState4[1];
1392
+
1393
+ var realProgressRef = react.useRef(progress);
1394
+ var updateTimeRef = react.useRef(new Date().getTime());
1395
+ var updateProgress = react.useCallback(function (newProgress) {
1396
+ updateTimeRef.current = new Date().getTime();
1397
+ realProgressRef.current = newProgress;
1398
+ setProgress(newProgress);
1399
+ }, [setProgress]);
1400
+ react.useEffect(function () {
1401
+ if (media === null) {
1402
+ return function () {};
1403
+ }
1404
+
1405
+ function onResume() {
1406
+ setPlaying(true);
1407
+ updateProgress(media.currentTime / media.duration);
1408
+ }
1409
+
1410
+ function onPause() {
1411
+ setPlaying(false);
1412
+ updateProgress(media.currentTime / media.duration);
1413
+ }
1414
+
1415
+ media.addEventListener('play', onResume);
1416
+ media.addEventListener('seeked', onResume);
1417
+ media.addEventListener('playing', onResume);
1418
+ media.addEventListener('pause', onPause);
1419
+ media.addEventListener('ended', onPause);
1420
+ media.addEventListener('waiting', onPause);
1421
+ media.addEventListener('stalled', onPause);
1422
+ media.addEventListener('seeking', onPause); // media.addEventListener('suspend', onPause);
1423
+ // if (media.paused) {
1424
+ // onPause();
1425
+ // } else {
1426
+ // onResume();
1427
+ // }
1428
+
1429
+ return function () {
1430
+ media.removeEventListener('play', onResume);
1431
+ media.removeEventListener('seeked', onResume);
1432
+ media.removeEventListener('playing', onResume);
1433
+ media.removeEventListener('pause', onPause);
1434
+ media.removeEventListener('ended', onPause);
1435
+ media.removeEventListener('waiting', onPause);
1436
+ media.removeEventListener('stalled', onPause);
1437
+ media.removeEventListener('seeking', onPause); // media.removeEventListener('suspend', onPause);
1438
+ };
1439
+ }, [media, updateProgress]);
1440
+ react.useEffect(function () {
1441
+ if (media === null) {
1442
+ return function () {};
1443
+ }
1444
+
1445
+ if (!playing || disabled) {
1446
+ return function () {};
1447
+ }
1448
+
1449
+ var handle;
1450
+ var canceled = false;
1451
+
1452
+ function tick() {
1453
+ if (canceled) {
1454
+ return;
1455
+ }
1456
+
1457
+ var newTime = new Date().getTime();
1458
+ var elapsed = newTime - updateTimeRef.current;
1459
+ updateTimeRef.current = newTime;
1460
+ var step = elapsed / (duration * 1000);
1461
+ var newProgress = realProgressRef.current + step;
1462
+ updateProgress(newProgress);
1463
+ handle = raf__default["default"](tick);
1464
+ }
1465
+
1466
+ tick();
1467
+ return function () {
1468
+ canceled = true;
1469
+ raf__default["default"].cancel(handle);
1470
+ };
1471
+ }, [media, playing, disabled, duration, updateProgress]);
1472
+ return realProgressRef.current;
1473
+ }
1474
+
1314
1475
  function useMediaReady(element) {
1315
1476
  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1316
1477
  _ref$id = _ref.id,
@@ -2067,6 +2228,7 @@ exports.useMediaApi = useMediaApi;
2067
2228
  exports.useMediaCurrentTime = useMediaCurrentTime;
2068
2229
  exports.useMediaDuration = useMediaDuration;
2069
2230
  exports.useMediaLoad = useMediaLoad;
2231
+ exports.useMediaProgress = useMediaProgress;
2070
2232
  exports.useMediaReady = useMediaReady;
2071
2233
  exports.useMediaThumbnail = useMediaThumbnail;
2072
2234
  exports.useMediaWaveform = useMediaWaveform;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@micromag/core",
3
- "version": "0.3.156",
3
+ "version": "0.3.162",
4
4
  "description": "",
5
5
  "keywords": [
6
6
  "javascript"
@@ -117,6 +117,7 @@
117
117
  "lodash": "^4.17.21",
118
118
  "param-case": "^3.0.4",
119
119
  "prop-types": "^15.7.2",
120
+ "raf": "^3.4.1",
120
121
  "react-helmet": "^6.1.0",
121
122
  "react-intl": "^5.12.1",
122
123
  "react-router": "^5.2.0",
@@ -132,5 +133,5 @@
132
133
  "publishConfig": {
133
134
  "access": "public"
134
135
  },
135
- "gitHead": "026d0eb445367f824d3d07a04a0fa90cc00d49f2"
136
+ "gitHead": "ffd4deb967b364580d292f0e02af777abac02967"
136
137
  }