diff --git a/src/App.tsx b/src/App.tsx index 9512da5..f6ddfab 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -21,6 +21,7 @@ function App() { const [state, setState] = React.useState(() => parseState() || defaults); const {secret, step, digits, algorithm} = state; const [offset, setOffset] = React.useState(0); + const [remaining, setRemaining] = React.useState(0); const [validSecret, decoded] = React.useMemo(() => { try { @@ -43,11 +44,16 @@ function App() { React.useEffect(() => { if (!validStep) return; const now = Date.now(); - const nextOffset = Math.floor(now / (1000 * step)) + 1; - const nextUpdate = nextOffset * step * 1000; - const timer = setTimeout(() => setOffset(nextOffset), nextUpdate - now); + const nextUpdate = Math.floor(now / 1000) * 1000 + 1000; + const timer = setTimeout(() => { + const now = Date.now(); + const offset = Math.floor(now / (1000 * step)); + const nextUpdate = (offset + 1) * step * 1000; + setRemaining((nextUpdate - now) / 1000); + setOffset(offset); + }, nextUpdate - now); return () => clearTimeout(timer); - }, [validStep, offset, step]); + }, [validStep, step, offset, remaining]); const showAdvanced = React.useCallback(() => { setAdvanced(true); @@ -102,6 +108,7 @@ function App() {