Change the default Notification Component
MagicBell exposes components and hooks that can help you to create your own notification inbox in a breeze. To change the default notification component:
- Define your custom component for rendering notifications
- Pass it to the
FloatingNotificationInbox
component using theNotificationItem
property
Creating a custom notification component
The useNotification
hook will return data you can use to render a notification in your custom component. It also gives your component real-time capabilities, so it will be automatically updated to reflect changes in other tabs, for example.
import React from 'react';
import MagicBell, { useNotification } from '@magicbell/magicbell-react';
export default function CustomNotification({ notification }) {
const state = useNotification(notification);
const handleClick = () => state.markAsRead();
return (
<div>
<a href={state.actionUrl}>
<b>{state.title}</b>
<p>{state.content}</p>
</a>
<button onClick={handleClick}>Mark as read</button>
<div>
);
}
Then, pass it to the FloatingNotificationInbox
component:
import React from 'react';
import MagicBell from '@magicbell/magicbell-react';
import CustomNotification from './CustomNotification';
export default function Notifications() {
return (
<MagicBell apiKey="MAGICBELL_API_KEY" userEmail="[email protected]">
{(props) => (
<FloatingNotificationInbox
height={500}
NotificationItem={CustomNotification}
{...props}
/>
)}
</MagicBell>
);
}
Styling your custom component
You can choose any method of your liking to style your custom notification component. However, MagicBell comes with a theme context, which you can leverage if you want to.
You may access MagicBell's theme context using the useTheme
hook from our react package.
import React from 'react';
import MagicBell, { useNotification, useTheme } from '@magicbell/magicbell-react';
export default function CustomNotification(notification) {
const state = useNotification(notification);
const theme = useTheme();
return (
<a
href={state.actionUrl}
style={{
backgroundColor: theme.notification.default.backgroundColor,
fontSize: theme.notification.default.fontSize,
}}
>
<b>{state.title}</b>
<p>{state.content}</p>
</a>
);
}
Please refer to our theming guide for a complete description of the theme context.