xref: /MusicFree/src/hooks/useDelayFalsy.ts (revision fa03bfa6e9357a1548fc6d9e4116c55d491f29bc)
1*fa03bfa6S猫头猫import {useRef, useState} from 'react';
2*fa03bfa6S猫头猫
3*fa03bfa6S猫头猫export default function useDelayFalsy<T extends any = any>(
4*fa03bfa6S猫头猫  init?: T,
5*fa03bfa6S猫头猫  ms: number = 0,
6*fa03bfa6S猫头猫) {
7*fa03bfa6S猫头猫  const [_state, _setState] = useState<T | undefined>(init);
8*fa03bfa6S猫头猫  const timer = useRef<any>();
9*fa03bfa6S猫头猫
10*fa03bfa6S猫头猫  function setState(st: T) {
11*fa03bfa6S猫头猫    if (st === undefined || st === null || st === false) {
12*fa03bfa6S猫头猫      timer.current = setTimeout(() => {
13*fa03bfa6S猫头猫        _setState(st);
14*fa03bfa6S猫头猫        timer.current = undefined;
15*fa03bfa6S猫头猫      }, ms);
16*fa03bfa6S猫头猫      return;
17*fa03bfa6S猫头猫    }
18*fa03bfa6S猫头猫    timer.current && clearTimeout(timer.current);
19*fa03bfa6S猫头猫    timer.current = undefined;
20*fa03bfa6S猫头猫    _setState(st);
21*fa03bfa6S猫头猫  }
22*fa03bfa6S猫头猫
23*fa03bfa6S猫头猫  return [_state, setState, _setState] as [
24*fa03bfa6S猫头猫    ...ReturnType<typeof useState<T>>,
25*fa03bfa6S猫头猫    ReturnType<typeof useState<T>>[1],
26*fa03bfa6S猫头猫  ];
27*fa03bfa6S猫头猫}
28