All files / Rindu/hooks useToast.ts

60% Statements 12/20
66.66% Branches 2/3
28.57% Functions 2/7
66.66% Lines 12/18

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 40 41 42 43 44 45 46 47 48 49 5019x   19x 19x     151x 151x 151x   151x                             151x   5x   5x                 5x         151x            
import { useCallback, useId } from "react";
 
import ToastContext from "context/ToastContext";
import { useCustomContext } from "hooks";
import type { IToast, UseToast } from "types/toast";
 
export function useToast(): UseToast {
  const { toasts, setToasts } = useCustomContext(ToastContext);
  const id = useId();
 
  const removeToast: UseToast["removeToast"] = useCallback(
    (toastId) => {
      const timeOut = toasts.find((toast) => toast.id === toastId)?.timeOut;
 
      Iif (timeOut) {
        clearTimeout(timeOut);
      }
 
      setToasts((allToast) => {
        return allToast.filter((toast) => toast.id !== toastId);
      });
    },
    [setToasts, toasts]
  );
 
  const addToast: UseToast["addToast"] = useCallback(
    (toast) => {
      const displayTime = toast.displayTime ?? 10000;
 
      const newToast: IToast = {
        ...toast,
        id,
        displayTime,
        timeOut: setTimeout(() => {
          removeToast(newToast.id);
        }, displayTime),
      };
 
      setToasts([newToast]);
    },
    [id, setToasts, removeToast]
  );
 
  return {
    toasts,
    addToast,
    removeToast,
  };
}