import type {Dispatch, SetStateAction} from 'react'; import {useState} from 'react'; import {useRafCallback} from '../useRafCallback/index.js'; import {useUnmountEffect} from '../useUnmountEffect/index.js'; export function useRafState(initialState: S | (() => S)): [S, Dispatch>]; export function useRafState(): [S | undefined, Dispatch>]; /** * Like `React.useState`, but state is only updated within animation frame. */ export function useRafState(initialState?: S | (() => S)): [S | undefined, Dispatch>] { // eslint-disable-next-line react/hook-use-state const [state, innerSetState] = useState(initialState); const [setState, cancelRaf] = useRafCallback(innerSetState); useUnmountEffect(cancelRaf); // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion return [state, setState as Dispatch>]; }