jrshikoku/lib/useInterval.ts
harukin-expo-dev-env 1a10bee3c8 部分整理とts化
2024-08-20 07:34:59 +00:00

46 lines
976 B
TypeScript

import { useEffect, useRef, useState } from "react";
type Control = {
start: () => void;
stop: () => void;
};
type State = "RUNNING" | "STOPPED";
type Fn = () => void;
export const useInterval = (fn: Fn, interval: number, autostart = true) => {
const onUpdateRef = useRef<Fn>();
const [state, setState] = useState("RUNNING");
const start = () => {
setState("RUNNING");
};
const stop = () => {
setState("STOPPED");
};
useEffect(() => {
onUpdateRef.current = fn;
}, [fn]);
useEffect(() => {
if (autostart) {
setState("RUNNING");
}
}, [autostart]);
useEffect(() => {
let timerId;
if (state === "RUNNING") {
timerId = setInterval(() => {
onUpdateRef.current?.();
}, interval);
} else {
timerId && clearInterval(timerId);
}
return () => {
timerId && clearInterval(timerId);
};
}, [interval, state]);
return [state, { start, stop }];
};
export default useInterval;