aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/frontend/src/utils/useDelayedSnackbar.ts
blob: 03ad6caa6a441096f82b76af120b514669029e6a (plain) (blame)
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
39
import {
  useSnackbar,
  type SnackbarKey,
  type SnackbarMessage,
  type OptionsObject,
} from 'notistack';
import { useCallback } from 'react';

export default function useDelayedSnackbar(
  defaultDelay = 0,
): (
  message: SnackbarMessage,
  options?: OptionsObject | undefined,
  delay?: number | undefined,
) => () => void {
  const { enqueueSnackbar, closeSnackbar } = useSnackbar();
  return useCallback(
    (
      message: SnackbarMessage,
      options?: OptionsObject | undefined,
      delay = defaultDelay,
    ) => {
      let key: SnackbarKey | undefined;
      let timeout: number | undefined = setTimeout(() => {
        timeout = undefined;
        key = enqueueSnackbar(message, options);
      }, delay);
      return () => {
        if (timeout !== undefined) {
          clearTimeout(timeout);
        }
        if (key !== undefined) {
          closeSnackbar(key);
        }
      };
    },
    [defaultDelay, enqueueSnackbar, closeSnackbar],
  );
}