1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- import { useCallback, useEffect, useRef } from "react";
- import { CloseIcon } from "./icons";
- import "./Toast.scss";
- import { ToolButton } from "./ToolButton";
- const DEFAULT_TOAST_TIMEOUT = 5000;
- export const Toast = ({
- message,
- onClose,
- closable = false,
- // To prevent autoclose, pass duration as Infinity
- duration = DEFAULT_TOAST_TIMEOUT,
- }: {
- message: string;
- onClose: () => void;
- closable?: boolean;
- duration?: number;
- }) => {
- const timerRef = useRef<number>(0);
- const shouldAutoClose = duration !== Infinity;
- const scheduleTimeout = useCallback(() => {
- if (!shouldAutoClose) {
- return;
- }
- timerRef.current = window.setTimeout(() => onClose(), duration);
- }, [onClose, duration, shouldAutoClose]);
- useEffect(() => {
- if (!shouldAutoClose) {
- return;
- }
- scheduleTimeout();
- return () => clearTimeout(timerRef.current);
- }, [scheduleTimeout, message, duration, shouldAutoClose]);
- const onMouseEnter = shouldAutoClose
- ? () => clearTimeout(timerRef?.current)
- : undefined;
- const onMouseLeave = shouldAutoClose ? scheduleTimeout : undefined;
- return (
- <div
- className="Toast"
- onMouseEnter={onMouseEnter}
- onMouseLeave={onMouseLeave}
- >
- <p className="Toast__message">{message}</p>
- {closable && (
- <ToolButton
- icon={CloseIcon}
- aria-label="close"
- type="icon"
- onClick={onClose}
- className="close"
- />
- )}
- </div>
- );
- };
|