@micromag/core 0.3.161 → 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
@@ -1935,10 +1935,17 @@ var useViewerEvents = function useViewerEvents() {
1935
1935
 
1936
1936
  return events;
1937
1937
  };
1938
- var useViewerInteraction = function useViewerInteraction() {
1938
+ var useViewerContainer = function useViewerContainer() {
1939
1939
  var _useViewerContext3 = useViewerContext(),
1940
- disableInteraction = _useViewerContext3.disableInteraction,
1941
- 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;
1942
1949
 
1943
1950
  return {
1944
1951
  disableInteraction: disableInteraction,
@@ -1946,9 +1953,9 @@ var useViewerInteraction = function useViewerInteraction() {
1946
1953
  };
1947
1954
  };
1948
1955
  var useViewerWebView = function useViewerWebView() {
1949
- var _useViewerContext4 = useViewerContext(),
1950
- webView = _useViewerContext4.webView,
1951
- setWebView = _useViewerContext4.setWebView;
1956
+ var _useViewerContext5 = useViewerContext(),
1957
+ webView = _useViewerContext5.webView,
1958
+ setWebView = _useViewerContext5.setWebView;
1952
1959
 
1953
1960
  var value = useMemo(function () {
1954
1961
  return _objectSpread(_objectSpread({}, webView), {}, {
@@ -1971,6 +1978,10 @@ var useViewerWebView = function useViewerWebView() {
1971
1978
  var propTypes$1 = {
1972
1979
  children: PropTypes.node.isRequired,
1973
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
+ })]),
1974
1985
  menuVisible: PropTypes.bool,
1975
1986
  menuOverScreen: PropTypes.bool,
1976
1987
  topHeight: PropTypes.number,
@@ -1986,6 +1997,7 @@ var defaultProps$1 = _objectSpread({}, defaultValue);
1986
1997
 
1987
1998
  var ViewerProvider = function ViewerProvider(_ref) {
1988
1999
  var children = _ref.children,
2000
+ containerRef = _ref.containerRef,
1989
2001
  events = _ref.events,
1990
2002
  menuVisible = _ref.menuVisible,
1991
2003
  menuOverScreen = _ref.menuOverScreen,
@@ -2004,6 +2016,7 @@ var ViewerProvider = function ViewerProvider(_ref) {
2004
2016
 
2005
2017
  var value = useMemo(function () {
2006
2018
  return {
2019
+ containerRef: containerRef,
2007
2020
  events: events,
2008
2021
  menuVisible: menuVisible,
2009
2022
  menuOverScreen: menuOverScreen,
@@ -2017,7 +2030,7 @@ var ViewerProvider = function ViewerProvider(_ref) {
2017
2030
  webView: webView,
2018
2031
  setWebView: setWebView
2019
2032
  };
2020
- }, [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]);
2021
2034
  return /*#__PURE__*/React.createElement(ViewerContext.Provider, {
2022
2035
  value: value
2023
2036
  }, children);
@@ -2080,4 +2093,4 @@ var VisitorProvider = function VisitorProvider(_ref) {
2080
2093
  VisitorProvider.propTypes = propTypes;
2081
2094
  VisitorProvider.defaultProps = defaultProps;
2082
2095
 
2083
- 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,12 +23,14 @@ 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),
@@ -35,6 +38,11 @@ function useActivityDetector() {
35
38
  setDetected = _useState2[1];
36
39
 
37
40
  var detectedRef = useRef(detected);
41
+
42
+ if (providedElement !== null && providedElement !== ref.current) {
43
+ ref.current = providedElement;
44
+ }
45
+
38
46
  useEffect(function () {
39
47
  var _ref$current = ref.current,
40
48
  element = _ref$current === void 0 ? null : _ref$current;
@@ -87,7 +95,7 @@ function useActivityDetector() {
87
95
  element.removeEventListener('touchmove', onActivity);
88
96
  element.removeEventListener('touchstart', onActivity);
89
97
  };
90
- }, [disabled, timeoutDelay]);
98
+ }, [providedElement, disabled, timeoutDelay]);
91
99
  return {
92
100
  ref: ref,
93
101
  detected: detected
@@ -188,7 +196,7 @@ var useFormattedTime = function useFormattedTime() {
188
196
  var eventsManager$1 = typeof document !== 'undefined' ? new EventsManager(document) : null;
189
197
  var useDocumentEvent = createUseEvent(eventsManager$1);
190
198
 
191
- var _excluded$2 = ["fields", "injectInFields"],
199
+ var _excluded$3 = ["fields", "injectInFields"],
192
200
  _excluded2 = ["fields"];
193
201
 
194
202
  var useForm = function useForm() {
@@ -197,7 +205,7 @@ var useForm = function useForm() {
197
205
  providedFields = _ref$fields === void 0 ? [] : _ref$fields,
198
206
  _ref$injectInFields = _ref.injectInFields,
199
207
  injectInFields = _ref$injectInFields === void 0 ? false : _ref$injectInFields,
200
- opts = _objectWithoutProperties(_ref, _excluded$2);
208
+ opts = _objectWithoutProperties(_ref, _excluded$3);
201
209
 
202
210
  var fieldsNames = useMemo(function () {
203
211
  return providedFields.length > 0 ? providedFields.map(function (_ref2) {
@@ -304,7 +312,7 @@ var useFullscreen = function useFullscreen(element) {
304
312
  };
305
313
  };
306
314
 
307
- var _excluded$1 = ["entry"];
315
+ var _excluded$2 = ["entry"];
308
316
 
309
317
  var buildThresholdArray = function buildThresholdArray() {
310
318
  return [0, 1.0];
@@ -550,7 +558,7 @@ var useResizeObserver = function useResizeObserver() {
550
558
  var useDimensionObserver = function useDimensionObserver() {
551
559
  var _useResizeObserver = useResizeObserver.apply(void 0, arguments),
552
560
  entry = _useResizeObserver.entry,
553
- rest = _objectWithoutProperties(_useResizeObserver, _excluded$1);
561
+ rest = _objectWithoutProperties(_useResizeObserver, _excluded$2);
554
562
 
555
563
  var _ref5 = entry || {},
556
564
  _ref5$contentRect = _ref5.contentRect,
@@ -1190,10 +1198,13 @@ function useMediaCurrentTime(element) {
1190
1198
  var finalId = id || element;
1191
1199
  var lastIdRef = useRef(finalId);
1192
1200
  var idChanged = lastIdRef.current !== finalId;
1201
+ var disabledRef = useRef(disabled);
1202
+ var disabledChanged = disabledRef.current !== disabled;
1193
1203
 
1194
- if (idChanged) {
1204
+ if (idChanged || disabledChanged) {
1195
1205
  realCurrentTime.current = element !== null ? element.currentTime || 0 : 0;
1196
1206
  lastIdRef.current = finalId;
1207
+ disabledRef.current = disabled;
1197
1208
  } // Check time update
1198
1209
 
1199
1210
 
@@ -1203,7 +1214,7 @@ function useMediaCurrentTime(element) {
1203
1214
  }
1204
1215
 
1205
1216
  function updateTime() {
1206
- var time = element.currentTime;
1217
+ var time = element.currentTime || 0;
1207
1218
 
1208
1219
  if (time !== realCurrentTime.current) {
1209
1220
  realCurrentTime.current = time;
@@ -1225,13 +1236,19 @@ function useMediaCurrentTime(element) {
1225
1236
  var timeout = null;
1226
1237
 
1227
1238
  function loop() {
1239
+ var _element$duration = element.duration,
1240
+ duration = _element$duration === void 0 ? 0 : _element$duration;
1228
1241
  var time = updateTime();
1229
- var remainingTime = Math.floor((element.duration - time) * 1000);
1230
- timeout = setTimeout(loop, Math.min(updateInterval, remainingTime));
1242
+ var remainingTime = Math.floor(((duration || 0) - time) * 1000);
1243
+ timeout = setTimeout(loop, Math.max(Math.min(updateInterval, remainingTime), updateInterval));
1231
1244
  }
1232
1245
 
1233
1246
  loop();
1234
1247
  return function () {
1248
+ if (element !== null) {
1249
+ realCurrentTime.current = element.currentTime;
1250
+ }
1251
+
1235
1252
  if (timeout !== null) {
1236
1253
  clearInterval(timeout);
1237
1254
  }
@@ -1310,6 +1327,113 @@ function useMediaLoad(element) {
1310
1327
  }, [element, shouldLoad, preload]);
1311
1328
  }
1312
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
+
1313
1437
  function useMediaReady(element) {
1314
1438
  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1315
1439
  _ref$id = _ref.id,
@@ -2048,4 +2172,4 @@ var useTrackMedia = function useTrackMedia() {
2048
2172
  var eventsManager = typeof window !== 'undefined' ? new EventsManager(window) : null;
2049
2173
  var useWindowEvent = createUseEvent(eventsManager);
2050
2174
 
2051
- 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
@@ -1970,10 +1970,17 @@ var useViewerEvents = function useViewerEvents() {
1970
1970
 
1971
1971
  return events;
1972
1972
  };
1973
- var useViewerInteraction = function useViewerInteraction() {
1973
+ var useViewerContainer = function useViewerContainer() {
1974
1974
  var _useViewerContext3 = useViewerContext(),
1975
- disableInteraction = _useViewerContext3.disableInteraction,
1976
- 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;
1977
1984
 
1978
1985
  return {
1979
1986
  disableInteraction: disableInteraction,
@@ -1981,9 +1988,9 @@ var useViewerInteraction = function useViewerInteraction() {
1981
1988
  };
1982
1989
  };
1983
1990
  var useViewerWebView = function useViewerWebView() {
1984
- var _useViewerContext4 = useViewerContext(),
1985
- webView = _useViewerContext4.webView,
1986
- setWebView = _useViewerContext4.setWebView;
1991
+ var _useViewerContext5 = useViewerContext(),
1992
+ webView = _useViewerContext5.webView,
1993
+ setWebView = _useViewerContext5.setWebView;
1987
1994
 
1988
1995
  var value = React.useMemo(function () {
1989
1996
  return _objectSpread__default["default"](_objectSpread__default["default"]({}, webView), {}, {
@@ -2006,6 +2013,10 @@ var useViewerWebView = function useViewerWebView() {
2006
2013
  var propTypes$1 = {
2007
2014
  children: PropTypes__default["default"].node.isRequired,
2008
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
+ })]),
2009
2020
  menuVisible: PropTypes__default["default"].bool,
2010
2021
  menuOverScreen: PropTypes__default["default"].bool,
2011
2022
  topHeight: PropTypes__default["default"].number,
@@ -2021,6 +2032,7 @@ var defaultProps$1 = _objectSpread__default["default"]({}, defaultValue);
2021
2032
 
2022
2033
  var ViewerProvider = function ViewerProvider(_ref) {
2023
2034
  var children = _ref.children,
2035
+ containerRef = _ref.containerRef,
2024
2036
  events = _ref.events,
2025
2037
  menuVisible = _ref.menuVisible,
2026
2038
  menuOverScreen = _ref.menuOverScreen,
@@ -2039,6 +2051,7 @@ var ViewerProvider = function ViewerProvider(_ref) {
2039
2051
 
2040
2052
  var value = React.useMemo(function () {
2041
2053
  return {
2054
+ containerRef: containerRef,
2042
2055
  events: events,
2043
2056
  menuVisible: menuVisible,
2044
2057
  menuOverScreen: menuOverScreen,
@@ -2052,7 +2065,7 @@ var ViewerProvider = function ViewerProvider(_ref) {
2052
2065
  webView: webView,
2053
2066
  setWebView: setWebView
2054
2067
  };
2055
- }, [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]);
2056
2069
  return /*#__PURE__*/React__default["default"].createElement(ViewerContext.Provider, {
2057
2070
  value: value
2058
2071
  }, children);
@@ -2217,6 +2230,7 @@ exports.useTracking = useTracking;
2217
2230
  exports.useUppy = useUppy;
2218
2231
  exports.useUrlGenerator = useUrlGenerator;
2219
2232
  exports.useUserInteracted = useUserInteracted;
2233
+ exports.useViewerContainer = useViewerContainer;
2220
2234
  exports.useViewerContext = useViewerContext;
2221
2235
  exports.useViewerEvents = useViewerEvents;
2222
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,16 +56,19 @@ 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),
@@ -72,6 +76,11 @@ function useActivityDetector() {
72
76
  setDetected = _useState2[1];
73
77
 
74
78
  var detectedRef = react.useRef(detected);
79
+
80
+ if (providedElement !== null && providedElement !== ref.current) {
81
+ ref.current = providedElement;
82
+ }
83
+
75
84
  react.useEffect(function () {
76
85
  var _ref$current = ref.current,
77
86
  element = _ref$current === void 0 ? null : _ref$current;
@@ -124,7 +133,7 @@ function useActivityDetector() {
124
133
  element.removeEventListener('touchmove', onActivity);
125
134
  element.removeEventListener('touchstart', onActivity);
126
135
  };
127
- }, [disabled, timeoutDelay]);
136
+ }, [providedElement, disabled, timeoutDelay]);
128
137
  return {
129
138
  ref: ref,
130
139
  detected: detected
@@ -225,7 +234,7 @@ var useFormattedTime = function useFormattedTime() {
225
234
  var eventsManager$1 = typeof document !== 'undefined' ? new core.EventsManager(document) : null;
226
235
  var useDocumentEvent = utils.createUseEvent(eventsManager$1);
227
236
 
228
- var _excluded$2 = ["fields", "injectInFields"],
237
+ var _excluded$3 = ["fields", "injectInFields"],
229
238
  _excluded2 = ["fields"];
230
239
 
231
240
  var useForm = function useForm() {
@@ -234,7 +243,7 @@ var useForm = function useForm() {
234
243
  providedFields = _ref$fields === void 0 ? [] : _ref$fields,
235
244
  _ref$injectInFields = _ref.injectInFields,
236
245
  injectInFields = _ref$injectInFields === void 0 ? false : _ref$injectInFields,
237
- opts = _objectWithoutProperties__default["default"](_ref, _excluded$2);
246
+ opts = _objectWithoutProperties__default["default"](_ref, _excluded$3);
238
247
 
239
248
  var fieldsNames = react.useMemo(function () {
240
249
  return providedFields.length > 0 ? providedFields.map(function (_ref2) {
@@ -341,7 +350,7 @@ var useFullscreen = function useFullscreen(element) {
341
350
  };
342
351
  };
343
352
 
344
- var _excluded$1 = ["entry"];
353
+ var _excluded$2 = ["entry"];
345
354
 
346
355
  var buildThresholdArray = function buildThresholdArray() {
347
356
  return [0, 1.0];
@@ -587,7 +596,7 @@ var useResizeObserver = function useResizeObserver() {
587
596
  var useDimensionObserver = function useDimensionObserver() {
588
597
  var _useResizeObserver = useResizeObserver.apply(void 0, arguments),
589
598
  entry = _useResizeObserver.entry,
590
- rest = _objectWithoutProperties__default["default"](_useResizeObserver, _excluded$1);
599
+ rest = _objectWithoutProperties__default["default"](_useResizeObserver, _excluded$2);
591
600
 
592
601
  var _ref5 = entry || {},
593
602
  _ref5$contentRect = _ref5.contentRect,
@@ -1227,10 +1236,13 @@ function useMediaCurrentTime(element) {
1227
1236
  var finalId = id || element;
1228
1237
  var lastIdRef = react.useRef(finalId);
1229
1238
  var idChanged = lastIdRef.current !== finalId;
1239
+ var disabledRef = react.useRef(disabled);
1240
+ var disabledChanged = disabledRef.current !== disabled;
1230
1241
 
1231
- if (idChanged) {
1242
+ if (idChanged || disabledChanged) {
1232
1243
  realCurrentTime.current = element !== null ? element.currentTime || 0 : 0;
1233
1244
  lastIdRef.current = finalId;
1245
+ disabledRef.current = disabled;
1234
1246
  } // Check time update
1235
1247
 
1236
1248
 
@@ -1240,7 +1252,7 @@ function useMediaCurrentTime(element) {
1240
1252
  }
1241
1253
 
1242
1254
  function updateTime() {
1243
- var time = element.currentTime;
1255
+ var time = element.currentTime || 0;
1244
1256
 
1245
1257
  if (time !== realCurrentTime.current) {
1246
1258
  realCurrentTime.current = time;
@@ -1262,13 +1274,19 @@ function useMediaCurrentTime(element) {
1262
1274
  var timeout = null;
1263
1275
 
1264
1276
  function loop() {
1277
+ var _element$duration = element.duration,
1278
+ duration = _element$duration === void 0 ? 0 : _element$duration;
1265
1279
  var time = updateTime();
1266
- var remainingTime = Math.floor((element.duration - time) * 1000);
1267
- timeout = setTimeout(loop, Math.min(updateInterval, remainingTime));
1280
+ var remainingTime = Math.floor(((duration || 0) - time) * 1000);
1281
+ timeout = setTimeout(loop, Math.max(Math.min(updateInterval, remainingTime), updateInterval));
1268
1282
  }
1269
1283
 
1270
1284
  loop();
1271
1285
  return function () {
1286
+ if (element !== null) {
1287
+ realCurrentTime.current = element.currentTime;
1288
+ }
1289
+
1272
1290
  if (timeout !== null) {
1273
1291
  clearInterval(timeout);
1274
1292
  }
@@ -1347,6 +1365,113 @@ function useMediaLoad(element) {
1347
1365
  }, [element, shouldLoad, preload]);
1348
1366
  }
1349
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
+
1350
1475
  function useMediaReady(element) {
1351
1476
  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1352
1477
  _ref$id = _ref.id,
@@ -2103,6 +2228,7 @@ exports.useMediaApi = useMediaApi;
2103
2228
  exports.useMediaCurrentTime = useMediaCurrentTime;
2104
2229
  exports.useMediaDuration = useMediaDuration;
2105
2230
  exports.useMediaLoad = useMediaLoad;
2231
+ exports.useMediaProgress = useMediaProgress;
2106
2232
  exports.useMediaReady = useMediaReady;
2107
2233
  exports.useMediaThumbnail = useMediaThumbnail;
2108
2234
  exports.useMediaWaveform = useMediaWaveform;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@micromag/core",
3
- "version": "0.3.161",
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": "badf4dd6125aa3169f3d01afc712be5b8181d898"
136
+ "gitHead": "ffd4deb967b364580d292f0e02af777abac02967"
136
137
  }