Skip to main content

Notification

Notification is the least intrusive component from the group. It uses browser Notifications API to show user system notification.

Notifications are managed globally via useNotificationState hook. So developers can control notifications from anywhere in the app or website.

Demo

iOS Safari

Notifications API works differently in iOS Safari (and other browsers). They allow notifications only for progressive web applications. So you need to click Add to home screen and open the page from here to enable notifications.

Result
Loading...
Live Editor
//import {useNotificationState, Notification, ButtonGroup, Button} from 'koval-ui';

function Example(props) {
  const notificationId = 'foo';

  const {openNotification, closeNotification} = useNotificationState(notificationId);
  return (
    <Fragment>
      <ButtonGroup layout="vertical">
        <Button onClick={openNotification}>open notification</Button>
        <Button onClick={closeNotification}>close notification</Button>
      </ButtonGroup>
      <Notification
        id={notificationId}
        requireInteraction={false}
        title="Foo notification"
        body="Notification body"
        icon="https://picsum.photos/33/33"
      />
    </Fragment>
  );
}

Props

id

type: string

Unique id of notification.

onToggle

type: (isOpen: boolean) => void

Callback triggered when Notification toggles.

onDenied

type: () => void

Callback triggered when a user has denied notifications in browser settings

title

type: string

Defines a title for the notification, which is shown at the top of the notification window.

MDN docs

icon

type: string

URL of an image to be displayed in the notification.

MDN docs

body

type: string

Body text of the notification, which is displayed below the title.

MDN docs

requireInteraction

type: boolean

Indicates that a notification should remain active until the user clicks or dismisses it, rather than closing automatically.

MDN docs

useNotificationState hook interface

useNotificationState uses Koval Global Context, so it works anywhere in the application. Developers can put Notification in the other component.

Hook expects a developer to provide unique id of Notification as a parameter.

openNotification

Show a notification to the user. Will not work from a component scope. Needs to be run as a callback

const {openNotification} = useNotificationState('foo');

// Don't do this!
openNotification();

// This will work
const handleClick = useCallback(() => {
openNotification();
}, [openNotification]);

closeNotification

Hide notification.

const {closeNotification} = useNotificationState('foo');

const handleClick = useCallback(() => {
closeNotification();
}, [closeNotification]);

isOpen

Current visibility of notification

permission

Indicates the current permission granted by the user for the current origin to display web notifications.

  • default: The user decision is unknown. E.g. first visit.
  • granted: The user has explicitly granted permission for the current origin.
  • denied: The user has explicitly denied permission for the current origin.

MDN docs

Handling permissions

Browsers allow users to disable system notifications globally or for specific URL. ≈Notification component will emit onDenied callback and permission value received from the hook will be denied. You can fall back to using Toast.