@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.
68 lines • 2.59 kB
JavaScript
import { useCallback, useEffect, useState } from 'react';
import { getMillisecondsFromExpiry, getTimeFromMilliseconds, } from './time.js';
import { useInterval } from './useInterval.js';
import { validateExpiryTimestamp, validateOnExpire } from './validate.js';
const SECOND_INTERVAL = 1000;
/**
* `useTimer` from https://github.com/amrlabib/react-timer-hook
*/
export function useTimer({ expiryTimestamp: expiry, onExpire = () => { }, autoStart = true, interval: customInterval = SECOND_INTERVAL, }) {
const [expiryTimestamp, setExpiryTimestamp] = useState(expiry);
const [milliseconds, setMilliseconds] = useState(getMillisecondsFromExpiry(expiryTimestamp));
const [isRunning, setIsRunning] = useState(autoStart);
const [didStart, setDidStart] = useState(autoStart);
const [interval, setInterval] = useState(customInterval);
const handleExpire = useCallback(() => {
if (validateOnExpire(onExpire)) {
onExpire();
}
setIsRunning(false);
setInterval(null);
}, [onExpire]);
const pause = useCallback(() => {
setIsRunning(false);
}, []);
const restart = useCallback((newExpiryTimestamp, newAutoStart = true) => {
setInterval(customInterval);
setDidStart(newAutoStart);
setIsRunning(newAutoStart);
setExpiryTimestamp(newExpiryTimestamp);
setMilliseconds(getMillisecondsFromExpiry(newExpiryTimestamp));
}, [customInterval]);
const resume = useCallback(() => {
const time = new Date();
time.setMilliseconds(time.getMilliseconds() + milliseconds);
restart(time);
}, [milliseconds, restart]);
const start = useCallback(() => {
if (didStart) {
setMilliseconds(getMillisecondsFromExpiry(expiryTimestamp));
setIsRunning(true);
}
else {
resume();
}
}, [expiryTimestamp, didStart, resume]);
useInterval(() => {
const millisecondsValue = getMillisecondsFromExpiry(expiryTimestamp);
setMilliseconds(millisecondsValue);
if (millisecondsValue <= 0) {
handleExpire();
}
else if (interval && millisecondsValue < interval) {
setInterval(millisecondsValue);
}
}, isRunning ? interval : null);
useEffect(() => {
validateExpiryTimestamp(expiryTimestamp);
}, [expiryTimestamp]);
return {
...getTimeFromMilliseconds(milliseconds),
start,
pause,
resume,
restart,
isRunning,
};
}
//# sourceMappingURL=useTimer.js.map