@cp949/mui
Version:
CP949 MUI React component library
23 lines (17 loc) • 647 B
text/typescript
import type { Dispatch, SetStateAction } from 'react';
import { useCallback, useRef, useState } from 'react';
import { useUnmount } from './useUnmount.js';
export const useRafState = <S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>] => {
const frame = useRef(0);
const [state, setState] = useState(initialState);
const setRafState = useCallback((value: S | ((prevState: S) => S)) => {
cancelAnimationFrame(frame.current);
frame.current = requestAnimationFrame(() => {
setState(value);
});
}, []);
useUnmount(() => {
cancelAnimationFrame(frame.current);
});
return [state, setRafState];
};