import { useCallback, useState } from 'react'; import useInterval from 'react-use/lib/useInterval'; import styled, { CSSProperties } from 'styled-components'; import { getTimerBucketIcon } from '../../util/timer'; import { SessionIcon } from '../icon/SessionIcon'; const ExpireTimerBucket = styled.div` font-size: var(--font-size-xs); letter-spacing: 0.3px; text-transform: uppercase; user-select: none; color: var(--text-secondary-color); align-self: center; `; type Props = { expirationDurationMs?: number; expirationTimestamp?: number | null; style?: CSSProperties; }; export const ExpireTimer = (props: Props) => { const { expirationDurationMs, expirationTimestamp, style } = props; const initialTimeLeft = Math.max(Math.round(((expirationTimestamp || 0) - Date.now()) / 1000), 0); const [timeLeft, setTimeLeft] = useState(initialTimeLeft); const update = useCallback(() => { if (expirationTimestamp) { const newTimeLeft = Math.max(Math.round((expirationTimestamp - Date.now()) / 1000), 0); if (newTimeLeft !== timeLeft) { setTimeLeft(newTimeLeft); } } }, [expirationTimestamp, timeLeft, setTimeLeft]); const updateFrequency = 500; useInterval(update, updateFrequency); if (!(expirationDurationMs && expirationTimestamp)) { return null; } const bucket = getTimerBucketIcon(expirationTimestamp, expirationDurationMs); return ( <ExpireTimerBucket style={style}> <SessionIcon iconType={bucket} iconSize="tiny" iconColor={'var(--secondary-text-color)'} /> </ExpireTimerBucket> ); };