UNPKG

@lifi/widget

Version:

LI.FI Widget for cross-chain bridging and swapping. It will drive your multi-chain strategy and attract new users from everywhere.

61 lines 2.42 kB
import { useCallback, useState } from 'react'; import { useInterval } from './useInterval.js'; import { getDelayFromExpiryTimestamp, getSecondsFromExpiry, getTimeFromSeconds, validateOnExpire, } from './utils.js'; const DEFAULT_DELAY = 1000; // This implementation was taken from the common js project - https://www.npmjs.com/package/react-timer-hook // modified to work in the Widget codebase with Typescript export function useTimer({ expiryTimestamp: expiry, onExpire, autoStart = true, }) { const [expiryTimestamp, setExpiryTimestamp] = useState(expiry); const [seconds, setSeconds] = useState(() => getSecondsFromExpiry(expiryTimestamp)); const [isRunning, setIsRunning] = useState(autoStart); const [didStart, setDidStart] = useState(autoStart); const [delay, setDelay] = useState(() => getDelayFromExpiryTimestamp(expiryTimestamp, DEFAULT_DELAY)); const handleExpire = useCallback(() => { validateOnExpire(onExpire) && onExpire(); setIsRunning(false); setDelay(0); }, [onExpire]); const pause = useCallback(() => { setIsRunning(false); }, []); const restart = useCallback((newExpiryTimestamp, newAutoStart = true) => { setDelay(getDelayFromExpiryTimestamp(newExpiryTimestamp, DEFAULT_DELAY)); setDidStart(newAutoStart); setIsRunning(newAutoStart); setExpiryTimestamp(newExpiryTimestamp); setSeconds(getSecondsFromExpiry(newExpiryTimestamp)); }, []); const resume = useCallback(() => { const time = new Date(); time.setMilliseconds(time.getMilliseconds() + seconds * 1000); restart(time); }, [seconds, restart]); const start = useCallback(() => { if (didStart) { setSeconds(getSecondsFromExpiry(expiryTimestamp)); setIsRunning(true); } else { resume(); } }, [expiryTimestamp, didStart, resume]); useInterval(() => { if (delay !== DEFAULT_DELAY) { setDelay(DEFAULT_DELAY); } const secondsValue = getSecondsFromExpiry(expiryTimestamp); setSeconds(secondsValue); if (secondsValue <= 0) { handleExpire(); } }, isRunning ? delay : 0); return { ...getTimeFromSeconds(seconds), start, pause, resume, restart, isRunning, }; } //# sourceMappingURL=useTimer.js.map