react-simple-toasts
Version:
Instant, lightweight toast notifications for React. No providers or containers needed.
55 lines (54 loc) • 1.87 kB
TypeScript
import { ReactElement, ReactNode, SyntheticEvent } from 'react';
import { Themes, ToastPosition as Position } from '../lib/constants';
import { ToastMessageProps } from '../component/toast-message';
export type ToastPosition = (typeof Position)[keyof typeof Position];
export type Theme = (typeof Themes)[keyof typeof Themes];
export type ToastClickHandler = (e: SyntheticEvent<HTMLDivElement>) => void | Promise<void>;
export interface ToastOptions {
duration?: number | null;
className?: string;
clickable?: boolean;
clickClosable?: boolean;
position?: ToastPosition;
offsetX?: number;
offsetY?: number;
gap?: number;
maxVisibleToasts?: number | null;
isReversedOrder?: boolean;
render?: ((message: ReactNode) => ReactNode) | null;
theme?: Theme | string | null;
zIndex?: number;
loading?: boolean | Promise<unknown>;
loadingText?: ReactNode;
onClick?: ToastClickHandler;
onClose?: () => void;
onCloseStart?: () => void;
}
export type ToastEnterEvent = {
target: HTMLDivElement;
width: number;
height: number;
};
export type ToastUpdateOptions = {
message?: ReactNode;
duration?: number;
loading?: boolean;
theme?: Theme;
};
export type ToastUpdateArgs = [message: ReactNode, duration?: ToastOptions['duration']] | [options: ToastUpdateOptions];
export interface Toast {
close: () => void;
updateDuration: (duration?: ToastOptions['duration']) => void;
update: (...args: ToastUpdateArgs) => void;
}
export interface ToastComponent {
id: number;
message: ReactNode;
position: ToastPosition;
component: ReactElement<ToastMessageProps>;
isExit?: boolean;
width?: number;
height?: number;
gap: number;
startCloseTimer: (duration?: number, callback?: () => void) => void;
}