'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>
)
}
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.create
toast.success
toast.error
toast.warning
toast.info
toast.promise
toast.create({
title: 'Toast Title',
description: 'Toast Description',
})
Set the type
prop to "loading"
to create a persistent toast.
'use client'
import { Button } from '@chakra-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>
)
}
Here's an example of each type of toast.
'use client'
import { Button, For, HStack } from '@chakra-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>
)
}
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 '@chakra-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>
)
}
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 '@chakra-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>
)
}
Use the duration
prop to set the duration of the toast.
'use client'
import { Button } from '@chakra-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>
)
}
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 '@chakra-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>
)
}
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 '@chakra-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>
)
}
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,
})
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',
})
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,
})
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' },
})