Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@magicbell/magicbell-react

Package Overview
Dependencies
Maintainers
2
Versions
243
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@magicbell/magicbell-react

A set of React components to build a notification center

  • 4.2.1
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
5.2K
decreased by-20.51%
Maintainers
2
Weekly downloads
 
Created
Source

codecov TypeScript code style: prettier minified minified + gzip npm version

MagicBell-React

MagicBell-React is a set of React components to build a notification center for your site powered by magicbell.io.

Quick Start

npm i @magicbell/magicbell-react
# or
yarn add @magicbell/magicbell-react
import React from 'react';
import ReactDOM from 'react-dom';
import MagicBell, { NotificationCenter } from '@magicbell/magicbell-react';

ReactDOM.render(
  <MagicBell apiKey={MAGICBELL_API_KEY} userEmail="john@example.com">
    {() => <NotificationCenter height={300} />}
  </MagicBell>,
  document.body,
);

Check the storybook to explore all components.

Table of Contents

Introduction

This package is built using MobX. The notification store and its items are MobX observables. To use this package you don't need to know anything about MobX. However, if you build a component, make it observe changes to the observable objects we expose. This is as simple as this:

// Before
export default function MyComponent() {}

// After
import { observer } from 'mobx-react-lite';

function MyComponent() {}
export default observer(MyComponent);

The overhead of observer itself is negligible. You can read more about how to observe MobX objects at the official docs of mobx-react.

Once you make your custom component observe changes, it will be updated automatically.

MagicBell

The MagicBell component is the default export of this package and is the root component for building a widget. It initializes a connection to magicbell.io, renders a bell icon with the number of unseen notifications and keeps the widget updated in real time.

Demo

These are all the properties accepted by this component.

PropertyTypeDescription
apiKeystringThe API key of your magicbell.io project
userEmailstringThe email of the user you want to show notifications for
userKeystringThe HMAC for the user. It is recommended to enable HMAC authentication but not required
children({ toggleNotificationCenter }) => JSX.ElementThe children function to render a list of notifications for the user
themeIMagicBellThemeAn optional object containing custom color values for the widget, see Custom Themes
BellIconJSX.ElementAn optional react element to be displayed instead of the default bell icon
defaultIsOpenbooleanAn optional flag to set the default visibility state of the element returned by the children function. It is false by default.

Children function

This component expects a children function. This is how you render whatever you want to based on the state of the MagicBell.

You can use the notification center from this package (see NotificationCenter):

import React from 'react';
import ReactDOM from 'react-dom';
import MagicBell, { NotificationCenter } from '@magicbell/magicbell-react';

ReactDOM.render(
  <MagicBell apiKey={MAGICBELL_API_KEY} userEmail="john@example.com">
    {() => <NotificationCenter height={300} />}
  </MagicBell>,
  document.body,
);

or use your own:

import React from 'react';
import ReactDOM from 'react-dom';
import MagicBell from '@magicbell/magicbell-react';

ReactDOM.render(
  <MagicBell apiKey={MAGICBELL_API_KEY} userEmail="john@example.com">
    {({ toggleNotificationCenter }) => (
      <MyOwnNotificationCenter toggleNotificationCenter={toggleNotificationCenter} />
    )}
  </MagicBell>,
  document.body,
);

The MagicBell component does not render the component returned by the children function by default, only the bell is rendered. When the bell is clicked, the child component is toggled. This behaviour can be changed using the defaultIsOpen flag.

As shown above, the children function gets a function to manually toggle the notification center. You can access the notifications store through MagicBellContext.

import { useContext } from 'react';
const { notifications } = useContext(MagicBellContext);

MagicBellProvider

The MagicBellProvider component is the main component for building a custom notification center. It initializes a connection to magicbell.io, creates a MagicBellContext and keeps the list of notifications updated in real time.

This component wraps the children you provide in a MagicBellContext.Provider, so you can safely wrap your entire app in this component. Nothing else will be rendered.

import React from 'react';
import ReactDOM from 'react-dom';
import { MagicBellProvider } from '@magicbell/magicbell-react';

ReactDOM.render(
  <MagicBellProvider apiKey={MAGICBELL_API_KEY} userEmail="john@example.com">
    <App />
  </MagicBellProvider>,
  document.body,
);

MagicBellProvider creates a React context object, so now you can access the MagicBellContext anywhere in your application.

These are all the properties accepted by this component.

PropertyTypeDescription
apiKeystringThe API key of your magicbell.io project
userEmailstringThe email of the user you want to show notifications for
userKeystringThe HMAC for the user. It is recommended to enable HMAC authentication but not required
childrenJSX.ElementThe children to be wrapped in a MagicBellContext.Provider
themeIMagicBellThemeAn optional object containing custom color values for the widget, see Custom Themes

NotificationCenter

The NotificationCenter component renders a header, a footer and an infinite scroll list of notifications.

These are all the properties accepted by this component.

PropertyTypeDescription
heightnumberHeight in pixels of the infinite scroll list
onAllRead() => voidAn optional callback function invoked when the "Mark All Read" button is clicked
onNotificationClick(notification) => voidAn optional callback function invoked when a notification is clicked

NotificationList

The NotificationList component renders an infinite scroll list of notifications. When the user scrolls to the bottom the next page of notifications are fetched and appended to the current array of notifications. By default it renders a ClickableNotification component for each item in the notifications store.

These are all the properties accepted by this component.

PropertyTypeDescription
heightnumberHeight in pixels of the infinite scroll list
onItemClick(notification) => voidAn optional callback function invoked when a notification is clicked
ListItem({ notification, onItemClick }) => JSX.ElementAn optional custom component to use for each item in the list

If the height property is not provided, then the window scroll will be used.

Example: notification center with a custom list item.

ClickableNotification

This component renders the title and content of a notification.

These are all the properties accepted by this component.

PropertyTypeDescription
notificationNotificationThe notification object
onClick(notification) => voidAn optional callback function invoked when the component is clicked

IMPORTANT: When a notification is clicked, the notification is marked as read. If you implement your own component, you might also want to mark the notification as read manually. E.g.:

import React from 'react';
import { observer } from 'mobx-react-lite';

function CustomNotification({ notification, onClick }) {
  const handleClick = () => {
    notification.markAsRead();
    onClick(notification);
  };

  return <div onClick={handleClick}>{notification.title}</div>;
}

export default observer(CustomNotification);

useMagicBellEvent

This a hook to listen to realtime events.

import { useMagicBellEvent } from '@magicbell/magicbell-react';

useMagicBellEvent('notifications.new', showPushNotification);

This is a list of events you can listen to:

Event nameDescription
*Any event
notifications.newA new notification for the authenticated user was created
notifications.readA notification was marked as read
notifications.read.allAll notifications were marked as read
notifications.unreadA notification was marked as unread
notifications.deleteA notification was deleted

MagicBellContext

This is a React context object which contains the store of notifications and the theme, so you can access these values wherever you need them.

import React, { useContext } from 'react';
import { MagicBellContext } from '@magicbell/magicbell-react';

function MyComponent() {
  const { theme, notifications } = useContext(MagicBellContext);
  return <p>You have {notifications.total} notifications</p>;
}

Custom Themes

Is is possible to change the default colors of some elements by providing to the MagicBell component a theme property.

This is the definition of the default theme:

{
  icon: {
    borderColor: '#335EEA',
  },
  header: {
    backgroundColor: '#335EEA',
    textColor: 'white',
  },
  footer: {
    backgroundColor: '#335EEA',
    textColor: 'white',
  },
  unseenBadge: {
    backgroundColor: '#DF4759',
    textColor: 'white',
  },
  notification: {
    default: {
      backgroundColor: 'white',
      textColor: '#2F323C',
      title: {
        textColor: '#161B2D',
      },
    },
    unread: {
      backgroundColor: '#D9E2EF',
      textColor: '#2F323C',
      title: {
        textColor: '#161B2D',
      },
    },
  },
}

You can override any attribute of this theme. Colors can be expressed in HEX or RGB(A).

import React from 'react';
import ReactDOM from 'react-dom';
import MagicBell, { NotificationCenter } from '@magicbell/magicbell-react';

const customTheme = {
  icon: {
    borderColor: 'rgba(160, 30, 120, 0.5)',
  },
  header: {
    textColor: 'black',
  },
};

ReactDOM.render(
  <MagicBell apiKey={MAGICBELL_API_KEY} userEmail="john@example.com" theme={customTheme}>
    {() => <NotificationCenter height="300" />}
  </MagicBell>,
  document.body,
);

The notification model

The Notification class implements this interface.

interface INotification {
  // Attributes
  id: string;
  title: string;
  content: string | null;
  actionUrl: string;
  metaData: any;
  readAt: number | null;
  seenAt: number | null;
  sentAt: number;

  // Getters/setters
  isRead: boolean;
  isSeen: boolean;

  // Read-only properties
  summary: string | null;
  seenAtDate: Dayjs | null;
  sentAtDate: Dayjs;
  readAtDate: Dayjs | null;

  // Methods
  fetch: () => Promise;
  markAsRead: () => Promise;
  markAsUnread: () => Promise;
  delete: () => Promise;
}

All attributes are MobX observables.

summary

The content truncated to 150 characters.

seenAtDate

A date representation of the seenAt attribute. It returns an immutable instance of Dayjs. Dayjs exposes an API similar to moment.js.

notification.seenAtDate.format('DD/MM/YYYY'); // '01/04/2021'
notification.seenAtDate.fromNow(); // 1mo
notification.seenAtDate.to('2021-01-01'); // in 4mo
notification.seenAtDate.add(2, 'day');
readAtDate

A date representation of the readAt attribute. It returns an immutable instance of Dayjs.

sentAtDate

A date representation of the sentAt attribute. It returns an immutable instance of Dayjs.

fetch

Fetches the notification from the magicbell.io server. All fetched attributes are assigned to the current object.

markAsRead

This method makes a POST request to the read notification API endpoint of magicbell.io. It sets the readAt attribute as well.

markAsUnread

This method makes a POST request to the unread notification API endpoint of magicbell.io. It sets the readAt attribute to null as well.

delete

This method makes a DELETE request to the notification API endpoint of magicbell.io. If the notification belongs to a store, it will remove itself from the store.

The notification store

This store implements this interface:

interface INotificationStore {
  // Attributes
  unseenCount: number;
  total: number;
  perPage: number;
  totalPages: number;
  currentPage: number;
  items: Notification[];

  // Read only properties
  length: number;
  isEmpty: boolean;
  hasNextPage: boolean;

  // Methods
  at: (number) => Notification | null;
  map: (fn) => any[];
  fetch: (params) => Promise;
  fetchNextPage: () => Promise;
  create: (data) => Promise<Notification>;
  markAllAsRead: () => Promise;
  markAllAsSeen: () => Promise;
  remove: () => void;
}

All attributes are MobX observables.

length

Number of notifications in the items array.

at

Get a notificaiton from the items array, specified by index.

map

Creates an array of values by running each notification in items array thru iteratee. The iteratee is invoked with three arguments: (notification, index, itemsArray).

fetch

Fetch notifications from the magicbell server. The pagination data is also updated. All provided parameters are included in the request.

The response is appended to the current array of notifications, so it can be used as the view model for an infinite scroll list.

fetchNextPage

This method is simply wrapping the fetch method, sending as a parameter the next page of notifications.

create

Create a new notification.

It is equivalent to creating a Notification instance with some attributes, saving the notification to the server, and adding it to the array of items after being successfully created.

markAllAsRead

Makes a POST request to the read notifications API endpoint. It also marks all notifications in the collection as read.

markAllAsSeen

Makes a POST request to the seen notifications API endpoint. It also sets the unseenCount to 0 and marks all notifications in the collection as seen.

remove

Removes the given notification from the items array. It does not make any request to the server. If you want to delete a notification, use the delete method of the notification object instead.

Keywords

FAQs

Package last updated on 10 Sep 2020

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc