File size: 867 Bytes
f0743f4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import { useState, useRef, useEffect } from 'react';
import type { ReactNode } from 'react';

const useDelayedRender = (delay: number) => {
  const [delayed, setDelayed] = useState(true);
  const timerPromiseRef = useRef<Promise<void> | null>(null);

  useEffect(() => {
    if (delayed) {
      const timerPromise = new Promise<void>((resolve) => {
        const timeout = setTimeout(() => {
          setDelayed(false);
          resolve();
        }, delay);

        return () => {
          clearTimeout(timeout);
        };
      });

      timerPromiseRef.current = timerPromise;
    }

    return () => {
      timerPromiseRef.current = null;
    };
  }, [delay, delayed]);

  return (fn: () => ReactNode) => {
    if (delayed && timerPromiseRef.current) {
      throw timerPromiseRef.current;
    }
    return fn();
  };
};

export default useDelayedRender;