npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@jannnik/react-awesome-toasts

v1.0.0

Published

Higly customizable React toast notifications (fork of https://github.com/blvdmitry/react-awesome-toasts)

Downloads

3

Readme

React Awesome Toasts

Easily customizable React notification system that manages its queue for you.

  • 🎙 Screen reader accessibility
  • 🔧 Server side rendering support
  • 📱 Responsive
  • 📘 Typescript support
  • 📦 React is the only dependency
  • 🎉 6kb gzipped

Get started

Install the package:

npm install @jannnik/react-awesome-toasts
// or
yarn add @jannnik/react-awesome-toasts

Wrap your app with ToastProvider:

import { ToastProvider } from '@jannnik/react-awesome-toasts'

const App = () => (
  <ToastProvider>
    App content
  </ToastProvider>
)

The main idea is that you get a dispatch function (see Hooks API reference - useReducer or understanding useReducer) using which you can trigger events such as showing and removing toasts.

Instead of the dispatch function you can also use basic helper functions which make the usage a bit more easy and enjoyable.

Examples

You can either use the with_toast decorator or a ToastConsumer to get access to the dispatch function. Using the dispatch function can be done manually or through helper functions such as show_toast and close_toast.

With High Order Component and dispatch function:

import { with_toast } from '@jannnik/react-awesome-toasts'

const ButtonWithToast = ({ dispatch }) => {
  const toast_props = {
    text: 'Message sent',
    action_text: 'Undo',
    aria_label: 'Message sent, click to undo',
    on_action_click: id => dispatch({ type: 'remove', payload: id }),
  }
  
  return <button onClick={() => dispatch({ type: 'show', payload: toast_props })}>Show toast</button>
}

export default with_toast(ButtonWithToast)

With High Order Component and helper function:

import { with_toast } from '@jannnik/react-awesome-toasts'
import { show_toast, close_toast } from '@jannnik/react-awesome-toasts'

const ButtonWithToast = ({ dispatch }) => {
  const toast_props = {
    text: 'Message sent',
    action_text: 'Undo',
    aria_label: 'Message sent, click to undo',
    on_action_click: close_toast(dispatch)
  }
  
  // the default for on_action_click is dismissing/closing the toast, so it could be left out in this case
  return <button onClick={() => show_toast(dispatch, toast_props)}>Show toast</button>
}

export default with_toast(ButtonWithToast)

With ToastConsumer:

import { ToastConsumer } from '@jannnik/react-awesome-toasts'
import { show_toast, close_toast } from '@jannnik/react-awesome-toasts'

const toast_props = {
  text: 'Message sent',
  action_text: 'Undo',
  aria_label: 'Message sent, click to undo',
}

const SomeComponent = () => (
  <ToastConsumer>
    {(dispatch: ToastContext) => (
      <button onClick={() => show_toast({ ...toast_props, on_action_click: close_toast })}>
        Show toast
      </button>    
    )}
  </ToastConsumer>
)

You can also use the show_simple_toast and show_full_toast.

  • show_simple_toast assumes on_action_click wants to close the toast and that text and aria_label are the same.
  • show_full_toast makes use of the ability to pass not only strings but also react elements as the text-property, it replaces newlines with <br />'s, assumes on_action_click wants to close the toast and allows specifying a variant of toast to show.

Dispatch events

Since you get direct access to the dispatch function offered by useReducer some available events are mostly ment for internal use.

| Event | Payload | Description | | ------------------------ | ----------- | -------------------------------------------------------------------------------------- | | "show" | toast props | Show a toast (or queue it when others are already being shown) using the given toast props (properties may be different when using a custom toast component) | | "remove-and-queue" | toast id | Remove the toast with the given id and queue a potentially waiting toast | | "remove" (internal) | toast id | Remove the toast with the given id without interacting with the queue (used internally when the hiding animation ends as "hide" already queues a new toast) | | "hide" (internal) | toast id | Queue a potentially waiting toast (used internally when the hiding animation starts) |

Presentational Toast component

By default ToastProvider uses the Toast component provided by the library. The Toast component is responsible for the accessibility and responsiveness of notifications. Keep in mind, that if your replace it with your custom component you will have to handle both of these features in your component if you need them in your app.

Default Toast component has follow properties:

| Property | Description | | ------------------------------------------------- | ---------------------------------- | | text string or (string | Element)[], required | Message to display in notification | | action_text string | Text of the action button | | on_action_click (id: string) => any | Action button click handler | | aria_label string | Default: text property value. Should be used for better accessibility. If text is not a string this property is required | | variant "error" | Variant of message |

Customization

ToastProvider accepts properties for customizing the behaviour of the notifications.

| Property | Description | | ---------------- | ---------------------------------------------------------------------- | | timeout number | Default: 4500. The time until a toast is dismissed, in milliseconds. | | component | Presentational component for displaying notifications. | | position top-right, bottom-right, top-left, bottom-left, top-center, bottom-center | Default: bottom-left. Position of the toasts on the screen. |

Helper functions

There are 4 helper functions available: show_toast, show_simple_toast, show_full_toast and close_toast

show_toast

const show_toast: (dispatch: ToastContext, payload: Props) => void

Show a toast using a dispatch function (ToastContext) and toast props.

show_simple_toast

const show_simple_toast: (dispatch: ToastContext, text: string, action_text: string) => void

Show a toast using a dispatch function (ToastContext) and a text and action_text value. The aria_label property of the normal toast props object is given by text and on_action_click closes the toast.

show_full_toast

const show_full_toast: (dispatch: ToastContext, text: string, action_text: string, variant?: 'error' | undefined) => void

Show a toast using a dispatch function (ToastContext) and a text, an action_text and an optional variant value. The aria_label property of the normal toast props object is given by text, on_action_click closes the toast and the text value is slightly transformed.

The text value is split by newlines and the resulting array is interleaved with <br /> components in order to properly render newlines (this is done after text is used as the aria label).

close_toast

const close_toast: (dispatch: ToastContext) => (id: string) => void

Given a dispatch function (ToastContext) and a toast id the specified toast is removed.

Accessibility

Default presentational Toast component provides accessibility features:

  • When toast is opened, action button gets focused if its present
  • When toast is hidden, previous focus is restored
  • When toast is shown, screen reader reads its message or aria_label value. Since action button gets focused automatically - it's nice to have an aria-label that mentions it, e.g. "Item deleted, click to undo."

Roadmap

  • Improve accessibility for focused toast actions
  • Check colors AA accessibility level