import React from "react"; import type { ToastToDismiss } from "."; import type { PromiseT, ToastT, ToastTypes } from "./toast"; /** * Type definition for toast titles * Allows for both static React nodes and functions that return React nodes */ type titleT = (() => React.ReactNode) | React.ReactNode; /** * Extended promise result type for complex toast results * Can be either a direct result object or a function that takes data and returns a result * * @template Data - The type of data that the promise resolves with */ type PromiseTExtendedResult = PromiseIExtendedResult | ((data: Data) => PromiseIExtendedResult | Promise); /** * Promise result type for toast content * Can be a string, React node, or a function that takes data and returns content * * @template Data - The type of data that the promise resolves with */ type PromiseTResult = string | React.ReactNode | ((data: Data) => React.ReactNode | string | Promise); /** * Promise external toast type without description * Used to allow overriding all properties except description */ type PromiseExternalToast = Omit; /** * Configuration for toast notifications that display promise states */ type PromiseData = PromiseExternalToast & { /** * Content to display while the promise is loading */ loading?: string | React.ReactNode; /** * Content to display when the promise resolves successfully */ success?: PromiseTResult | PromiseTExtendedResult; /** * Content to display when the promise rejects */ error?: PromiseTResult | PromiseTExtendedResult; /** * Additional description content */ description?: PromiseTResult; /** * Function to execute after the promise settles */ finally?: () => void | Promise; }; /** * External toast configuration type * Represents the user-facing API for creating toasts with optional ID */ type ExternalToast = Omit & { id?: number | string; }; /** * Interface for extended promise results * Used to provide additional configuration options along with the message * * @property {React.ReactNode} message - The main content to display */ interface PromiseIExtendedResult extends ExternalToast { message: React.ReactNode; } /** * Observer class for managing toast notifications * Implements the observer pattern to allow components to subscribe to toast updates */ declare class Observer { /** * List of functions that will be called when a toast is added or dismissed */ subscribers: Array<(toastData: ExternalToast | ToastToDismiss) => void>; /** * Collection of all toasts, including those that have been dismissed */ toasts: Array; /** * Set of IDs for toasts that have been dismissed */ dismissedToasts: Set; /** * Add a flag to track if a Toaster is mounted */ isToasterMounted: boolean; /** * Creates a new Observer instance and initializes collections */ constructor(); /** * Mark a Toaster as mounted */ markToasterMounted: () => void; /** * Mark a Toaster as unmounted */ markToasterUnmounted: () => void; /** * Check if a Toaster is mounted before executing toast functions */ checkToasterMounted: () => boolean; /** * Registers a subscriber function to be called when toasts are added or dismissed */ subscribe: (subscriber: (toastData: ExternalToast | ToastToDismiss) => void) => () => void; /** * Publishes a toast notification to all subscribers */ publish: (data: ToastT) => void; /** * Adds a toast to the collection and publishes it to all subscribers */ addToast: (data: ToastT) => void; /** * Creates a new toast or updates an existing one with the same ID */ create: (data: ExternalToast & { message?: titleT; type?: ToastTypes; promise?: PromiseT; jsx?: React.ReactElement; }) => string | number; /** * Dismisses a toast by ID or all toasts if no ID is provided */ dismiss: (id?: number | string) => string | number | undefined; message: (message: titleT | React.ReactNode, data?: ExternalToast) => string | number; error: (message: titleT | React.ReactNode, data?: ExternalToast) => string | number; success: (message: titleT | React.ReactNode, data?: ExternalToast) => string | number; info: (message: titleT | React.ReactNode, data?: ExternalToast) => string | number; warning: (message: titleT | React.ReactNode, data?: ExternalToast) => string | number; loading: (message: titleT | React.ReactNode, data?: ExternalToast) => string | number; /** * Creates a toast that updates based on the state of a promise */ promise: (promise: PromiseT, data?: PromiseData) => (string & { unwrap: () => Promise; }) | (number & { unwrap: () => Promise; }) | { unwrap: () => Promise; } | undefined; custom: (jsx: (id: number | string) => React.ReactElement, data?: ExternalToast) => string | number; /** * Gets all toasts that haven't been dismissed */ getActiveToasts: () => (ToastT | ToastToDismiss)[]; } /** * Singleton instance of the Observer class to manage toast state globally */ export declare const ToastState: Observer; /** * Main toast API that combines all toast creation methods and utilities * We use `Object.assign` to maintain the correct types as we would lose them otherwise */ export declare const toast: ((message: titleT, data?: ExternalToast) => string | number | undefined) & { custom: (jsx: (id: number | string) => React.ReactElement, data?: ExternalToast) => string | number; dismiss: (id?: number | string) => string | number | undefined; error: (message: titleT | React.ReactNode, data?: ExternalToast) => string | number; info: (message: titleT | React.ReactNode, data?: ExternalToast) => string | number; loading: (message: titleT | React.ReactNode, data?: ExternalToast) => string | number; message: (message: titleT | React.ReactNode, data?: ExternalToast) => string | number; promise: (promise: PromiseT, data?: PromiseData | undefined) => (string & { unwrap: () => Promise; }) | (number & { unwrap: () => Promise; }) | { unwrap: () => Promise; } | undefined; success: (message: titleT | React.ReactNode, data?: ExternalToast) => string | number; warning: (message: titleT | React.ReactNode, data?: ExternalToast) => string | number; } & { getHistory: () => (ToastT | ToastToDismiss)[]; getToasts: () => (ToastT | ToastToDismiss)[]; }; export type { ExternalToast };