'use client'
import { Button, toast } from '@saas-ui/react'
export const ToasterBasic = () => {
return (
<Button
variant="outline"
size="sm"
onClick={() =>
toast.create({
description: 'File saved successfully',
type: 'info',
})
}
>
Show Toast
</Button>
)
}
Usage
import { Toaster, toast } from '@saas-ui/react/toast'First, render the Toaster component in your app.
<Toaster />Then, create a toast by calling one of the toast functions.
toast.createtoast.successtoast.errortoast.warningtoast.infotoast.promise
toast.create({
title: 'Toast Title',
description: 'Toast Description',
})Examples
Persistent Toast
Set the type prop to "loading" to create a persistent toast.
'use client'
import { Button } from '@saas-ui/react'
import { toast } from '@saas-ui/react'
export const ToasterPersistent = () => {
return (
<Button
variant="outline"
size="sm"
onClick={() =>
toast.create({
description: 'File saved successfully',
type: 'loading',
})
}
>
Show Toast
</Button>
)
}
Types
Here's an example of each type of toast.
'use client'
import { Button, For, HStack } from '@saas-ui/react'
import { toast } from '@saas-ui/react'
export const ToasterWithStatus = () => {
return (
<HStack>
<For each={['success', 'error', 'warning', 'info']}>
{(type) => (
<Button
size="sm"
variant="outline"
key={type}
onClick={() =>
toast.create({
title: `Toast status is ${type}`,
type: type,
})
}
>
{type}
</Button>
)}
</For>
</HStack>
)
}
With Action
Use the action and actionLabel prop to add an action to the toast.
When the action trigger is clicked, the toast will be closed.
'use client'
import { Button } from '@saas-ui/react'
import { toast } from '@saas-ui/react'
export const ToasterWithAction = () => {
return (
<Button
variant="outline"
size="sm"
onClick={() =>
toast.success({
title: 'Update successful',
description: 'File saved successfully to the server',
action: {
label: 'Undo',
onClick: () => console.log('Undo'),
},
})
}
>
Click me
</Button>
)
}
Promise
Use the toaster.promise to create a toast that resolves when the promise is
resolved.
Next, you can define the toast options (title, description, etc.) for each state of the promise.
'use client'
import { Button } from '@saas-ui/react'
import { toast } from '@saas-ui/react'
export const ToasterWithPromise = () => {
return (
<Button
variant="outline"
size="sm"
onClick={() => {
const promise = new Promise<void>((resolve) => {
setTimeout(() => resolve(), 5000)
})
toast.promise(promise, {
success: {
title: 'Successfully uploaded!',
description: 'Looks great',
},
error: {
title: 'Upload failed',
description: 'Something wrong with the upload',
},
loading: { title: 'Uploading...', description: 'Please wait' },
})
}}
>
Show Toast
</Button>
)
}
Custom Duration
Use the duration prop to set the duration of the toast.
'use client'
import { Button } from '@saas-ui/react'
import { toast } from '@saas-ui/react'
export const ToasterWithDuration = () => {
return (
<Button
variant="outline"
size="sm"
onClick={() =>
toast.create({
description: 'File saved successfully',
duration: 6000,
})
}
>
Show Toast
</Button>
)
}
Pause and Play
Use the pause and resume methods on the toaster object to pause and play
the toast.
'use client'
import { useId, useState } from 'react'
import { Button, HStack } from '@saas-ui/react'
import { toast } from '@saas-ui/react'
import { HiPause, HiPlay } from 'react-icons/hi'
export const ToasterPauseAndPlay = () => {
const id = useId()
const [paused, setPaused] = useState(false)
const [shown, setShown] = useState(false)
const show = () => {
toast.success({
id,
title: 'This is a success toast',
onStatusChange: (details) => {
if (details.status === 'visible') {
setShown(true)
} else if (details.status === 'dismissing') {
setShown(false)
}
},
})
}
const pause = () => {
toast.pause(id)
setPaused(true)
}
const play = () => {
toast.resume(id)
setPaused(false)
}
return (
<HStack>
<Button variant="outline" size="sm" onClick={show} disabled={shown}>
Show Toast
</Button>
<Button
variant="outline"
size="sm"
onClick={pause}
disabled={!shown || paused}
>
<HiPause />
Pause Toast
</Button>
<Button
variant="outline"
size="sm"
onClick={play}
disabled={!shown || !paused}
>
<HiPlay />
Play Toast
</Button>
</HStack>
)
}
Lifecycle
Use the onStatusChange prop on the toaster function to listen for changes to
the toast's status.
'use client'
import { useState } from 'react'
import { HStack, Stack, Text } from '@saas-ui/react'
import { Button, toast } from '@saas-ui/react'
export const ToasterLifecycle = () => {
const [statusLog, setStatusLog] = useState<[number, string][]>([])
const [dismissed, setDismissed] = useState(true)
return (
<Stack align="flex-start">
<Button
disabled={!dismissed}
variant="outline"
size="sm"
onClick={() =>
toast.create({
description: 'This is a toast',
type: 'info',
onStatusChange({ status }) {
setDismissed(status === 'unmounted')
setStatusLog((prev) => [[Date.now(), status], ...prev])
},
})
}
>
Show Toast
</Button>
<Stack padding="2" width="full" role="log" borderWidth="1px" minH="100px">
{statusLog.map(([time, toastStatus], i) => {
const date = new Date(time)
return (
<HStack as="pre" fontFamily="mono" textStyle="sm" key={i}>
{date.toLocaleTimeString()}{' '}
<Text fontWeight="bold">{toastStatus}</Text>
</HStack>
)
})}
</Stack>
</Stack>
)
}
Maximum Visible Toasts
Set the max prop on the createToaster function to define the maximum number
of toasts that can be rendered at any one time. Any extra toasts will be queued
and rendered when a toast has been dismissed.
@/components/ui/toaster.tsx
const toaster = createToaster({
max: 3,
})Placement
Toasts can be displayed on all four corners of a page. We recommend picking one
desired position and configure it in the createToaster function.
@/components/ui/toaster.tsx
const toaster = createToaster({
position: 'top-right',
})Overlapping Toasts
By default, toasts are stacked on top of each other. To make the toasts overlap
each other, set the overlap prop to true in the createToaster function.
@/components/ui/toaster.tsx
const toaster = createToaster({
position: 'top-right',
overlap: true,
})Offset
Set the offset prop in the createToaster function to offset the toasts from
the edges of the screen.
@/components/ui/toaster.tsx
const toaster = createToaster({
offset: '20px',
})Alternatively, you can use the offset prop to set the offset for each edge of
the screen.
@/components/ui/toaster.tsx
const toaster = createToaster({
offset: { left: '20px', top: '20px', right: '20px', bottom: '20px' },
})