@ttoss/react-notifications
Version:
ttoss notifications module for React apps.
285 lines (229 loc) • 9.07 kB
Markdown
# @ttoss/react-notifications
## About
This module provides a simple way to show notifications in your application using ttoss ecosystem.
## Installation
```shell
pnpm add @ttoss/notifications @ttoss/components @ttoss/react-icons @ttoss/ui @emotion/react
```
## Getting Started
### Provider
Add a provider on top of your application and set [Modal app element](https://reactcommunity.org/react-modal/accessibility/).
```tsx
import { NotificationsProvider } from '@ttoss/react-notifications';
import { ThemeProvider } from '@ttoss/ui';
import { Modal } from '@ttoss/components';
ReactDOM.render(
<React.StrictMode>
<ThemeProvider>
<NotificationsProvider>
<App />
</NotificationsProvider>
</ThemeProvider>
</React.StrictMode>,
document.getElementById('root')
);
Modal.setAppElement('#root');
```
### Loading
This modules provides a global loading bar that you can use on every part of your App.
```tsx
import { useNotifications } from '@ttoss/react-notifications';
import { Box, Button } from '@ttoss/ui';
const Component = () => {
const { isLoading, setLoading } = useNotifications();
return (
<Box>
<Button onClick={() => setLoading(true)} disabled={isLoading}>
Click Me!
</Button>
</Box>
);
};
```
### Modal
Set `viewType` to `modal` to show a modal notification.
```tsx
import { useNotifications } from '@ttoss/react-notifications';
import { Box, Button } from '@ttoss/ui';
const Component = () => {
const { addNotification } = useNotifications();
return (
<Box>
<Button
onClick={() =>
addNotification({
message: "I'm a notification",
type: 'info',
viewType: 'modal',
})
}
>
Click Me!
</Button>
</Box>
);
};
```
### Toast
Set `viewType` to `toast` to show a toast notification.
```tsx
import { useNotifications } from '@ttoss/react-notifications';
import { Box, Button } from '@ttoss/ui';
const Component = () => {
const { addNotification } = useNotifications();
return (
<Box>
<Button
onClick={() =>
addNotification({
message: "I'm a notification",
type: 'info',
viewType: 'toast',
})
}
>
Click Me!
</Button>
</Box>
);
};
```
### NotificationsBox
You can use `NotificationsBox` to show the notifications in a specific place. You can render as many `NotificationsBox` as you want in your application.
```tsx
import { NotificationsBox } from '@ttoss/react-notifications';
import { Box } from '@ttoss/ui';
const Component = () => {
return (
<Box>
<NotificationsBox />
</Box>
);
};
const App = () => {
return (
<Box>
<NotificationsBox />
<Component />
</Box>
);
};
```
In the example above, both `NotificationsBox` will show the notifications.
To render the notifications in a specific `NotificationsBox`, you can set the `boxId` in the notification, which is the `id` of the `NotificationsBox` you want to show the notification.
```tsx
import { useNotifications, NotificationsBox } from '@ttoss/react-notifications';
import { Box, Button } from '@ttoss/ui';
const Component = () => {
const { addNotification } = useNotifications();
return (
<Box>
<NotificationsBox id="my-box" />
<Button
onClick={() =>
addNotification({
message: "I'm a notification",
type: 'info',
boxId: 'my-box',
})
}
>
Click Me!
</Button>
</Box>
);
};
```
### NotificationsHeader
You can use `NotificationsHeader` to display notifications with `viewType: 'header'` in a specific place, such as your application's header. Only notifications with `viewType: 'header'` will be shown by this component.
```tsx
import {
NotificationsHeader,
useNotifications,
} from '@ttoss/react-notifications';
import { Box, Button } from '@ttoss/ui';
const Header = () => {
const { addNotification } = useNotifications();
return (
<Box>
<NotificationsHeader />
<Button
onClick={() =>
addNotification({
message: "I'm a header notification",
type: 'info',
viewType: 'header',
})
}
>
Show Header Notification
</Button>
</Box>
);
};
```
### Persistent Notifications
You can create persistent notifications that will not be removed when `clearNotifications()` is called by setting the `persist` property to `true`. This is useful for important notifications that should remain visible until manually dismissed.
```tsx
import { useNotifications } from '@ttoss/react-notifications';
import { Box, Button } from '@ttoss/ui';
const Component = () => {
const { addNotification, clearNotifications } = useNotifications();
return (
<Box>
<Button
onClick={() =>
addNotification({
message: "I'm a persistent notification",
type: 'warning',
persist: true, // This notification will not be cleared by clearNotifications()
})
}
>
Add Persistent Notification
</Button>
<Button
onClick={() =>
addNotification({
message: "I'm a regular notification",
type: 'info',
persist: false, // This notification will be cleared by clearNotifications()
})
}
>
Add Regular Notification
</Button>
<Button onClick={clearNotifications}>
Clear All Non-Persistent Notifications
</Button>
</Box>
);
};
```
#### Recommendation
"You can place the `NotificationsBox` component at the root of your application to handle notifications rendering automatically, eliminating the need to manage it manually elsewhere. If you need a specific `NotificationsBox`, simply render the `NotificationsBox` in the desired location and use the `boxId` property to differentiate it."
## API
### Notification Properties
| Property | Type | Default | Description |
| ---------- | --------------------------------------------- | -------------- | ----------------------------------------------------------------------------- |
| `id` | `string \| number` | Auto-generated | Unique identifier for the notification |
| `title` | `string` | - | Optional title for the notification |
| `message` | `string` | **Required** | The notification message content |
| `type` | `'warning' \| 'error' \| 'info' \| 'success'` | **Required** | The type of notification |
| `viewType` | `'toast' \| 'modal' \| 'box' \| 'header'` | `'box'` | Where the notification should be displayed |
| `toast` | `ToastOptions` | - | Additional options for toast notifications |
| `boxId` | `string \| number` | - | ID of the specific NotificationsBox to display the notification |
| `persist` | `boolean` | `false` | Whether the notification should persist when `clearNotifications()` is called |
### useNotifications Hook
The `useNotifications` hook returns an object with the following properties:
| Property | Type | Description |
| -------------------- | -------------------------------------------------------- | -------------------------------------------------- |
| `notifications` | `Notification[]` | Array of current notifications |
| `addNotification` | `(notification: Notification \| Notification[]) => void` | Function to add one or more notifications |
| `removeNotification` | `(id: string \| number) => void` | Function to remove a specific notification by ID |
| `clearNotifications` | `() => void` | Function to clear all non-persistent notifications |
| `isLoading` | `boolean` | Current loading state |
| `setLoading` | `(loading: boolean) => void` | Function to set the loading state |
| `defaultViewType` | `'toast' \| 'modal' \| 'box' \| 'header'` | The default view type for notifications |
## License
[MIT](https://github.com/ttoss/ttoss/blob/main/LICENSE)