UNPKG

react-toast-plus

Version:

React Toast Plus: A flexible, customizable, and modern toast notification library for React.

632 lines (488 loc) 28.1 kB
# React Toast Plus React Toast Plus is a lightweight, customizable toast notification library for React. It offers support for various types of notifications, auto-close functionality, draggable close, and customizable transitions. This library is designed to be simple and highly customizable, allowing developers to easily integrate and style toasts in their React applications. ### ✨ Features - **🔥 Lightweight & Fast**: Built for speed and performance, React Toast Plus delivers snappy notifications with zero delay, making it perfect for modern web apps. - **Complete TypeScript Support**: With robust TypeScript integration, enjoy typed toast options that ensure your toasts are consistent and bug-free, whether you're handling `success`, `error`, or even custom notifications. - **Auto-Close with Precision Control**: Toasts can auto-close after a set time. Want more control? We pass the remaining time to you, enabling advanced scenarios like progress bars and animations. - **Pause and Resume Interaction**: Timers pause automatically when users hover over the toast or switch tabs, and resume when they return—giving users a seamless experience. - **Interactive Draggable Close**: Dismiss your toasts by dragging them off the screen, adding a fun, interactive touch to your notifications. - **Portal Support**: Use the built-in `portalSelector` to place toasts anywhere within your app structure, providing complete layout flexibility. - **Hot & Customizable**: React Toast Plus is all about flexibility. Create unique toasts with customizable components like `StyledToaster`, `StyledProgressBar`, and `StyledCloseButton`. You can even inject your own transitions and icons for a fully personalized user experience. - **Highly Customizable Progress Bar**: Style the progress bar to match your app, and provide real-time feedback with `StyledProgressBar`, making the lifetime of your toasts clearly visible. - **Multiple Placement Options**: Display toasts anywhere on the screen—top-right, bottom-center, or wherever fits your design best. - **Built-in Icons & Rich Icon Library**: React Toast Plus comes with built-in icons (`SuccessIcon`, `ErrorIcon`, `WarningIcon`, `InfoIcon`, `CloseIcon`) and custom icon support, making it easy to match your app's style. - **Styled Components Ready**: Using styled-components under the hood, React Toast Plus provides fully styled, theme-aware toasts right out of the box. Plug in your own styles with the exportable components (`StyledToaster`, `StyledToastContainer`, and more). - **Flexible API for Custom Components**: Build and render your own toast components via the `addToast.custom()` function, passing your custom toast along with all configurable options. --- ## Installation To install `react-toast-plus`, run: ```bash npm install react-toast-plus ``` Or with Yarn: ```bash yarn add react-toast-plus ``` ## Usage ### Basic Setup Wrap your application with the `ToastProvider` to enable toast notifications: ```typescript jsx import React from 'react'; import ReactDOM from 'react-dom'; import { ToastProvider } from 'react-toast-plus'; import App from './App'; ReactDOM.render( <ToastProvider> <App /> </ToastProvider>, document.getElementById('root') ); ``` ### Adding Toasts You can use the `useToast` hook to add toasts: ```typescript jsx import React from 'react'; import { useToast } from 'react-toast-plus'; const App = () => { const { addToast } = useToast(); const showToast = () => { addToast('This is a toast!'); }; return <button onClick={showToast}>Show Toast</button>; }; ``` ## Toast Types ### Success Toast ```tsx addToast.success("Success!"); ``` ### Error Toast ```tsx addToast.error("Something went wrong!"); ``` ### Info Toast ```tsx addToast.info("Here’s some information"); ``` ### Warning Toast ```tsx addToast.warning("This is a warning!"); ``` ### Custom JSX Toast ```tsx addToast.loading(<div>Custom JSX inside a toast!</div>); ``` ## Custom Toasts You can create custom toasts by passing either a React component or a function that returns JSX: ### Example with Custom Toast Component ```tsx const CustomToast: FunctionComponent<ToastProps> = ({ id, onClose }) => ( <div> <strong>Custom Toast Component</strong> <p>This is a custom toast using a component!</p> <button onClick={() => onClose(id)}>Close</button> </div> ); addToast.custom(CustomToast, { placement: "top-right", transition: "slide", lifetime: 5000, autoClose: true }); ``` ### Example with Custom JSX ```tsx addToast(({ id, onClose }) => ( <span> <strong>Custom JSX in Toast</strong> <span>This is a custom toast with JSX</span> <button onClick={() => onClose(id)}>Close</button> </span>), "success", { lifetime: 5000, autoClose: true, closeButton: { visible: false } } ); ``` ## Promise-based Toasts The `addToast.promise` method accepts a promise or a function that returns a promise: ### Basic Example ```tsx const resolvePromise = new Promise(resolve => setTimeout(resolve, 2000)); addToast.promise( resolvePromise, { pending: 'pending', success: 'success', error: 'error' } ) // example with Function that return Promise const someAsyncFunction = () => { return new Promise((resolve, reject) => { setTimeout(() => { const isSuccess = Math.random() > 0.5; if (isSuccess) { resolve("Success!"); } else { reject("Failed!"); } }, 4000); }); }; addToast.promise(someAsyncFunction, { pending: "Pending...", success: (data) => `Success: {data}`, error: (error) => `Error: ${error}` },{ transition: "slide", placement: "top-center", success: { lifetime: 3000, icon:"🤩" }, error: { lifetime: 5000, closeButton: { visible: false } } }); ``` ## Removing Toasts You can remove toasts using the following methods from `useToast()`: ### Remove a Specific Toast ```tsx const { removeToast } = useToast(); removeToast(toastId); // Removes the toast with the given id // if you want to delete by index removeToast.byIndex(0); // Removes the first toast ``` ### Remove All Toasts ```tsx const { removeAllToasts } = useToast(); removeAllToasts(); // Removes all active toasts ``` ## Updating Toasts You can update existing toasts using the `updateToast` function. Here's an example: ```tsx const { updateToast } = useToast(); const { id } = addToast("Loading..." ,'loading',{ placement:"bottom-right" }); setTimeout(() => { updateToast({ id, content: "Loaded!", type: "success" }); }, 4000); ``` ## Advanced Options for Toasts Here’s the full list of toast options: | **Option** | **Type** | **Description** | |-------------------------|------------------------------------------------------------------------------------------|-----------------------------------------------------------------------| | `className` | `string` | Custom class for the toast container. | | `style` | `React.CSSProperties` | Inline styles for the toast container. | | `lifetime` | `number` | Time (in milliseconds) the toast will be visible before auto-closing. | | `autoClose` | `boolean` | Determines whether the toast should auto-close. Default is `true`. | | `pauseOnHover` | `boolean` | Pauses the toast timer when the user hovers over it. | | `pauseOnFocusLoss` | `boolean` | Pauses the toast timer when the window loses focus. | | `draggableClose` | `boolean` | Allows the toast to be closed by dragging it. | | `closeOnClick` | `boolean` | Closes the toast when clicked. | | **closeButton** | `object` | Customization options for the close button. | | `closeButton.visible` | `boolean` | Shows or hides the close button. Default is `true`. | | `closeButton.className` | `string` | Custom class for the close button. | | `closeButton.style` | `React.CSSProperties` | Inline styles for the close button. | | **progressBar** | `object` | Customization options for the progress bar. | | `progressBar.visible` | `boolean` | Shows or hides the progress bar. Default is `true`. | | `progressBar.className` | `string` | Custom class for the progress bar. | | `progressBar.style` | `React.CSSProperties` | Inline styles for the progress bar. | | `transition` | `'fade' ,'bounce' , 'slide' ,'zoom'` | Type of transition effect for the toast. | | `transitionDuration` | `number` | Duration of the transition effect (in milliseconds). | | `placement` | ` 'top-left' , 'top-right','top-center' , 'bottom-left' ,'bottom-center' 'bottom-right'` | Placement of the toast on the screen. | | `icon` | `React.ReactNode` | Custom icon for the toast, can be a React component or JSX. | | **iconProps** | `object` | Customization options for the icon. | | `iconProps.visible` | `boolean` | Shows or hides the icon. Default is `true`. | | `iconProps.className` | `string` | Custom class for the icon. | | `iconProps.style` | `React.CSSProperties` | Inline styles for the icon. | ## ToastProps Provides all the properties passed to the toast component . | **Prop Name** | **Description** | |--------------------|---------------------------------------------------------------------------------------------------------------------------| | **id** | Unique identifier for the toast. | | **content** | The message or custom content to display in the toast. | | **onClose** | Function to trigger when the toast needs to be closed. | | **type** | Specifies the type of toast (e.g., success, error). | | **options** | Custom options for configuring the toast’s behavior and style check it here [ToastOptions](#advanced-options-for-toasts). | | **remainingTime** | Provides the time remaining before the toast auto-closes. | | **start** | Starts the auto-close timer for the toast. | | **pause** | Pauses the auto-close timer. | | **resume** | Resumes the paused auto-close timer. | | **clear** | Clears the auto-close timer. | | **isRunning** | Indicates if the timer is currently running. | | **isPaused** | Indicates if the timer is currently paused. | ## ToastProvider | Prop | Type | Default | Description | |--------------------|-----------|-------------|---------------------------------------------------------------------------------| | `newestFirst` | `boolean` | `true` | Whether to display the newest toast first. | | `gutter` | `number` | `8` | The space (in pixels) between each toast. | | `containerOptions` | `object` | `undefined` | Customize the toast container. See [containerOptions](#containerOptions) below. | | `toastOptions` | `object` | `undefined` | Default options for all toasts. See [toastOptions](#toastOptions) below. | | `toastStyles` | `object` | `undefined` | Customize the toast styles. See [toastStyles](#toastStyles) below. | ### Example for `newestFirst` ```typescript jsx <ToastProvider newestFirst={false}> <App /> </ToastProvider> ``` This will display the oldest toast first. ### Example for `gutter` ```typescript jsx <ToastProvider gutter={16}> <App /> </ToastProvider> ``` This will add a 16px space between each toast. ## containerOptions | Prop | Type | Description | |------------------|------------------------------------------|------------------------------------------------------------------------------------| | `className` | `string` | Add a custom class to the container. | | `style` | `React.CSSProperties` | Inline styles for the container. | | `component` | `React.ElementType<ToastContainerProps>` | A custom component to render the toast container. | | `portalSelector` | `Element ` or `DocumentFragment` | The DOM node or fragment where the toast container is rendered. Default is `body`. | ### Example with a custom container component ```tsx const CustomContainer: FunctionComponent<ToastContainerProps> = ({ children, ...props }) => { return <div className="custom-container" {...props}>{children}</div>; }; <ToastProvider containerOptions={{ component: CustomContainer }}> <App /> </ToastProvider> ``` This will render the toasts inside the custom container. ### Example with a portal ```tsx <ToastProvider containerOptions={{ portalSelector: document.getElementById('toast-root')!}}> <App /> </ToastProvider> ``` This will render the toasts inside the element with the ID `toast-root`. ## toastOptions | Prop Name | Type | Description | |------------------|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | ...toastOptions | [ToastOptions](#advanced-options-for-toasts) | Extends all properties from ToastOptions and serves as the default configuration for all toasts. Each toast type (e.g., success, error ,..etc) can override these defaults with its specific options. || **successOptions** | [ToastOptions](#advanced-options-for-toasts) | Specific options for success toasts. | | `errorOptions` | [ToastOptions](#advanced-options-for-toasts) | Specific options for error toasts. | | `warningOptions` | [ToastOptions](#advanced-options-for-toasts) | Specific options for warning toasts. | | `infoOptions` | [ToastOptions](#advanced-options-for-toasts) | Specific options for info toasts. | | `emptyOptions` | [ToastOptions](#advanced-options-for-toasts) | Specific options for empty toasts. | | `loadingOptions` | [ToastOptions](#advanced-options-for-toasts) | Specific options for loading toasts. | | `component` | `React.ElementType<`[ToastProps](#toastprops)`>` | Custom component to use for individual toasts. | ### Example for `toastOptions` ```typescript jsx <ToastProvider toastOptions={{ className: 'toast', lifetime: 3000 }}> <App /> </ToastProvider> ``` This will apply the class `toast` and set the lifetime of all toasts to 3000ms. ### Example for Typed options ```typescript jsx <ToastProvider toastOptions={{ closeOnClick: true, successOptions: { style: { backgroundColor: 'green' }, icon: <cutomIcon/> }, errorOptions: { closeButton: { visible: false } , lifetime: 5000 }, }}> <App /> </ToastProvider> ``` ### Example for Custom Component ```tsx const CustomToastComponent: FunctionComponent<ToastProps> = (props) => { const { content, id, onClose, options } = props; const { style, icon } = options || {}; const renderContent = () => { if (typeof content === "string") { return content; } else if (isValidElement(content)) { return content; } else if (typeof content === "function") { return content(props); } return null; }; return ( <div className="custom-toast" style={style}> <div className="custom-toast-content"> {icon} <div className="custom-toast-text">{renderContent()}</div> </div> <button onClick={() => onClose(id)}>Close</button> </div> ); }; <ToastProvider toastOptions={{ component: CustomToastComponent }}> <App /> </ToastProvider> ``` ## toastStyles | Prop Name | Type | Description | |------------------------|----------|---------------------------------------| | `toastMaxWidth` | `string` | Maximum width of the toast. | | `toastMinWidth` | `string` | Minimum width of the toast. | | `toastMinHeight` | `string` | Minimum height of the toast. | | `toastFontFamily` | `string` | Font family for the toast content. | | `toastBgColor` | `string` | Background color of the toast. | | `toastTextColor` | `string` | Text color of the toast content. | | `toastRadius` | `string` | Border radius of the toast. | | `toastPadding` | `string` | Padding inside the toast. | | `toastBoxShadow` | `string` | Box shadow of the toast. | | `toastEmptyColor` | `string` | color for empty toasts (icon). | | `toastSuccessColor` | `string` | color for success toasts (icon). | | `toastErrorColor` | `string` | color for error toasts (icon). | | `toastWarningColor` | `string` | color for warning toasts (icon). | | `toastInfoColor` | `string` | color for info toasts (icon). | | `toastLoaderColor` | `string` | Color for the loader in the toast. | | `toastLoaderAreaColor` | `string` | Background color for the loader area. | ### Example for `toastStyles` ```jsx <ToastProvider toastStyles={{ toastBgColor: '#333', toastTextColor: '#fff', }}> <App /> </ToastProvider> ``` This will set the background color to dark and the text color to white. # `useToastStore` The `useToastStore` hook provides access to the current toast notifications and a `dispatch` function to manage toast actions. ## Return Value The hook returns an object containing two keys: - **`toasts`**: An array of the current active toasts. - **`dispatch`**: A function to dispatch actions for toast management. ```ts const { toasts, dispatch } = useToastStore(); ``` ## Actions Below is a table of actions you can dispatch to manage toasts: | Action Type | Description | |---------------------|------------------------------------------------| | `ADD_TOAST` | Adds a new toast to the state. | | `REMOVE_TOAST` | Removes a toast by its `id`. | | `UPDATE_TOAST` | Updates an existing toast's properties. | | `REMOVE_ALL_TOASTS` | Removes all active toasts. | ### Usage Example ```tsx import {useToastStore ,ActionTypes} from 'react-toast-plus'; const ToastManager = () => { const {toasts, dispatch} = useToastStore(); return ( <div> {toasts.map((toast) => ( <div key={toast.id}>{toast.content}</div> ))} <button onClick={() => dispatch({ type: ActionTypes.ADD_TOAST, toast: { id: `${Date.now()}`, // Unique ID content: "New Toast Added!", type: "success", options: {autoClose: true, lifetime: 3000}, }, }) } > Add Toast </button> <button onClick={() => dispatch({ type: ActionTypes.REMOVE_ALL_TOASTS })} > Remove All Toasts </button> </div> ); }; ``` ## Custom Styled Components In addition to providing a powerful toast notification system, React Toast Plus also exports various styled components and icons that you can use to customize or create your own custom toasters. ### Available Styled Components You can import and use the following styled components in your custom `Toaster`: - `StyledToaster` - `StyledProgressBar` (requires props `type`, `duration`, and `state`) - `StyledCloseButton` - `StyledToastContainer` - `StyledToasterContent` - `StyledLoadingIcon` - `SuccessIcon` - `ErrorIcon` - `WarningIcon` - `InfoIcon` - `CloseIcon` ### Example Usage of Styled Components with Props Here’s an example where the `CustomToaster` is a `React.FunctionComponent<`[ToastProps](#toastprops)`>`, and values like `type`, `lifetime`, and `onClose` are passed via props. ```tsx import { StyledToaster, StyledProgressBar, StyledCloseButton, StyledToastContainer, StyledToasterContent, SuccessIcon, CloseIcon } from 'react-toast-plus'; import { ToastProps } from 'react-toast-plus'; const CustomToaster: React.FunctionComponent<ToastProps> = ({ id, type, onClose, options, isRunning, }) => { const { autoClose = true, lifetime = 5000, style } = options || {}; return ( <StyledToaster style={style}> <div style={{ width: 20, height: 20, }} > <SuccessIcon /> </div> <StyledToasterContent> <p>Hello from componemt</p> </StyledToasterContent> <StyledProgressBar type={type || "empty"} duration={lifetime} state={isRunning ? "running" : "paused"} /> <StyledCloseButton onClick={() => onClose && onClose(id)}> <CloseIcon /> </StyledCloseButton> </StyledToaster> ); }; ``` ### Triggering the Custom Toaster with Props Here’s how you can trigger the custom toaster with the `addToast.custom` method and pass the necessary props: ```tsx import { useToast } from 'react-toast-plus'; const MyComponent = () => { const { addToast } = useToast(); const showCustomToast = () => { addToast.custom(CustomToaster, { lifetime: 5000, autoClose: true, }); }; return ( <button onClick={showCustomToast}>Show Custom Toast</button> ); }; ``` ### Explanation - The `CustomToaster` component receives `ToastProps`, which include properties like `type`, `lifetime`, and `onClose`. - These props are passed into `StyledProgressBar` and other elements to render a custom toast. - The `addToast.custom` function is used to display the custom toast with options such as `isRuning`, `lifetime`, and `autoClose`. ```ts addToast.custom(CustomToaster, { lifetime: 5000, autoClose: true }); ``` ### 🛠️ Contributing Contributions, suggestions, and feedback are highly encouraged! Whether it's bug reports, new features, or improvements, feel free to check the [issues page](#) or submit a pull request. Let's collaborate and make React Toast Plus even better! ### 📄 License React Toast Plus is proudly open-source under the [MIT license](LICENSE). You’re free to use it in both personal and commercial projects. Enjoy!