UNPKG

@livelike/react-native

Version:

LiveLike React Native package

79 lines 2.41 kB
import React, { useEffect, useState } from 'react'; import { StyleSheet, View } from 'react-native'; import { useStyles } from '../../hooks'; const DEFAULT_INTERACTIVE_TIMER_UPDATE_INTERVAL = 500; export function LLWidgetInteractiveTimer(_ref) { let { interactiveTimeout, styles: stylesProp, onInteractiveTimeout, updateInterval = DEFAULT_INTERACTIVE_TIMER_UPDATE_INTERVAL } = _ref; const [timer, setTimer] = useState(interactiveTimeout ? 0 : undefined); const interactiveTimerStyles = useStyles({ componentStylesFn: getWidgetInteractiveTimerStyles, stylesProp }); useEffect(() => { if (interactiveTimeout === timer) { onInteractiveTimeout === null || onInteractiveTimeout === void 0 || onInteractiveTimeout(); } }, [interactiveTimeout, timer, onInteractiveTimeout]); useEffect(() => { if (!interactiveTimeout) { return; } let timeoutId; function updateTimer(timeoutInterval) { timeoutId = setTimeout(() => { setTimer(oldTimer => { const newTimer = Math.min(interactiveTimeout, (oldTimer ?? 0) + updateInterval); if (newTimer === interactiveTimeout) { clearTimeout(timeoutId); } else { updateTimer(Math.min(updateInterval, interactiveTimeout - newTimer)); } return newTimer; }); }, timeoutInterval); } updateTimer(Math.max(updateInterval, 0)); return () => { clearTimeout(timeoutId); }; }, [interactiveTimeout]); if (!interactiveTimeout || !timer) { return undefined; } const timerWidth = Math.round(timer / interactiveTimeout * 100); return /*#__PURE__*/React.createElement(View, { style: [interactiveTimerStyles.container] }, /*#__PURE__*/React.createElement(View, { style: [{ width: `${timerWidth}%` }, interactiveTimerStyles.innerContainer] })); } const getWidgetInteractiveTimerStyles = _ref2 => { let { theme } = _ref2; return StyleSheet.create({ container: { position: 'absolute', top: 0, left: 0, right: 0, display: 'flex', justifyContent: 'flex-start', height: 4, backgroundColor: theme.widgetSelectedOption }, innerContainer: { height: '100%', borderRadius: 2, backgroundColor: theme.primaryButtonBackground } }); }; //# sourceMappingURL=LLWidgetInteractiveTimer.js.map