@gluestack-ui/toast
Version:
A universal headless toast component for React Native, Next.js & React
104 lines (93 loc) • 2.58 kB
text/typescript
import type {
Dispatch,
MutableRefObject,
ReactNode,
SetStateAction,
} from 'react';
export type ToastPlacement =
| 'top'
| 'top right'
| 'top left'
| 'bottom'
| 'bottom left'
| 'bottom right';
export interface InterfaceToastProps {
/**
* The delay before the toast hides (in milliseconds). If set to `null`, toast will never dismiss.
* @default 5000
*/
duration?: number | null;
/**
* The `id` of the toast. Mostly used when you need to prevent duplicate. By default, we generate a unique `id` for each toast
*/
id?: string;
/**
* Callback function to run side effects after the toast has closed.
*/
onCloseComplete?: () => void;
/**
* The placement of the toast. Defaults to bottom
* @default bottom
*/
placement?: ToastPlacement;
/**
* Render a component toast component. Any component passed will receive 1 prop: `id`
*/
render?: (props: ToastComponentProps) => ReactNode;
/**
* If true and the keyboard is opened, the Toast will move up equivalent to the keyboard height.
* @default false
*/
avoidKeyboard?: boolean;
/**
* container Style object for the toast
* @default 0
*/
containerStyle?: React.CSSProperties;
}
export interface ToastComponentProps {
id: string;
}
export interface VisibleToasts {
[key: string]: boolean;
}
export interface IToast {
id: string;
component: ReactNode;
config?: IToastProps;
}
export type IToastInfo = {
[key in ToastPlacement]: Array<IToast>;
};
export type IToastContext = {
toastInfo: IToastInfo;
setToastInfo: Dispatch<SetStateAction<IToastInfo>>;
setToast: (props: IToastProps) => string;
removeToast: (id: string) => void;
hideAll: () => void;
isActive: (id: string) => boolean;
visibleToasts: VisibleToasts;
setVisibleToasts: Dispatch<SetStateAction<VisibleToasts>>;
hideToast: (id: string) => void;
avoidKeyboard?: boolean;
bottomInset?: number;
AnimationWrapper: MutableRefObject<any | null>;
AnimatePresence: MutableRefObject<any | null>;
};
export type IToastComponentType<
StyledToast,
StyledToastTitle,
StyledToastDescription
> = React.ForwardRefExoticComponent<
InnerForwardRefExoticComponent<StyledToast>
> & {
Title: React.ForwardRefExoticComponent<
InnerForwardRefExoticComponent<StyledToastTitle>
>;
Description: React.ForwardRefExoticComponent<
InnerForwardRefExoticComponent<StyledToastDescription>
>;
};
type InnerForwardRefExoticComponent<T> = React.PropsWithoutRef<T> &
React.RefAttributes<T>;
export type IToastProps = InterfaceToastProps;