GitHub Pages / build (push) Canceled after 0s
GitHub Pages / deploy (push) Canceled after 0s
Docker image / meta (push) Successful in 24s
Docs Docker image / meta (push) Successful in 7s
Docker image / build (amd64, linux/amd64, ubuntu-latest) (push) Failing after 59s
Docs Docker image / build (amd64, linux/amd64, ubuntu-latest) (push) Failing after 30s
Docker image / merge (push) Canceled after 0s
Docs Docker image / merge (push) Canceled after 0s
Docker image / build (arm64, linux/arm64, ubuntu-24.04-arm) (push) Canceled after 0s
Docs Docker image / build (arm64, linux/arm64, ubuntu-24.04-arm) (push) Canceled after 0s
33 lines
801 B
TypeScript
33 lines
801 B
TypeScript
import { useState, useEffect, useRef } from 'react';
|
|
|
|
const useCountdown = (duration: number) => {
|
|
const [countdown, setCountdown] = useState(0);
|
|
const [isSetup, toggleSetup] = useState(false);
|
|
const timer = useRef<NodeJS.Timeout>();
|
|
|
|
useEffect(() => {
|
|
if (isSetup) {
|
|
setCountdown(duration);
|
|
timer.current = setInterval(() => {
|
|
setCountdown((current) => current - 1);
|
|
}, 1000);
|
|
} else clearInterval(timer.current as NodeJS.Timeout);
|
|
}, [isSetup]);
|
|
|
|
useEffect(() => {
|
|
if (countdown === 0) {
|
|
toggleSetup(false);
|
|
}
|
|
}, [countdown]);
|
|
|
|
useEffect(() => () => clearInterval(timer.current as NodeJS.Timeout), []);
|
|
|
|
function setupCountdown() {
|
|
toggleSetup(true);
|
|
}
|
|
|
|
return { countdown, setupCountdown };
|
|
};
|
|
|
|
export default useCountdown;
|