Skip to main content
Version: Canary

Toast Notifications

Did you know that those little popup notifications that you sometimes see at the top of a page after you've performed an action are affectionately known as "toast" notifications? Because they pop up like a piece of toast from a toaster!

Example toast animation

Redwood supports these notifications out of the box thanks to the react-hot-toast package. We'll refer you to their docs since they're very thorough, but here's enough to get you going.

Add the Toaster Component​

To render toast notifications, start by adding the Toaster component. It's usually better to add it at the App or Layout-level than the Page:

web/src/layouts/MainLayout/MainLayout.js
import { Toaster } from '@redwoodjs/web/toast'

const MainLayout = ({ children }) => {
return (
<>
<Toaster />
<main>{children}</main>
</>
)
}

export default MainLayout

Call the toast function​

To render a basic toast notification with default styles, call the toast function:

web/src/layouts/MainLayout/MainLayout.js
import { toast } from '@redwoodjs/web/toast'

// ...

const PostForm = () => {
const [create, { loading, error }] = useMutation(CREATE_POST_MUTATION)

const onSubmit = async (data) => {
try {
await create({ variables: { input: data }})
toast('Post created')
}
catch (e) {
toast('Error creating post')
}
}

return (
// <Form onSubmit={onSubmit}> ... </Form>
)
})

export default PostForm

Call the toast variants​

To render a toast notification with default icons and default styles, call the toast variants:

web/src/components/PostForm/PostForm.js
import { toast } from '@redwoodjs/web/toast'

// ...

const PostForm = () => {
const [create, { loading, error }] = useMutation(CREATE_POST_MUTATION, {
onCompleted: () => {
toast.success('Post created')
}
onError: () => {
toast.error('Error creating post')
}
})

const onSubmit = (data) => {
create({ variables: { input: data }})
}

return (
// <Form onSubmit={onSubmit}> ... </Form>
)
})

export default PostForm

or render an async toast by calling the toast.promise function:

web/src/components/PostForm/PostForm.js
import { toast } from '@redwoodjs/web/toast'

// ...

const PostForm = () => {
const [create, { loading, error }] = useMutation(CREATE_POST_MUTATION)

const onSubmit = (data) => {
toast.promise(create({ variables: { input: data }}), {
loading: 'Creating post...',
success: 'Post created',
error: 'Error creating post',
})
}

return (
// <Form onSubmit={onSubmit}> ... </Form>
)
})

export default PostForm
warning

You can't use the onError callback in combination with the toast.promise function.