Snackbar
The snackbar component is used to give feedback after certain actions.
The snackbar is used to show alerts on top of an overlay. The snackbar will close itself when the close button is clicked, or after a timeout — the default is 5 seconds.
Source
Theme source
@saas-ui/core
- 2.11.4 (latest)
Snackbars can be configured to appear at either the top or the bottom of an application window, and it is possible to have more than one snackbar onscreen at a time.
Snackbar is a wrapper around the useToast, with some additional features.
- Convenience methods
- Support for an action button
Import#
import { useSnackbar } from '@saas-ui/react'
Usage#
import { Button } from '@chakra-ui/react'import { useSnackbar } from '@saas-ui/react'export default function SnackbarExample() {const snackbar = useSnackbar()return (<ButtononClick={() =>snackbar({title: 'Account created.',description: "We've created your account for you.",status: 'success',duration: 9000,isClosable: true,})}>Show Snackbar</Button>)}
Make sure to call
useSnackbarat least one component level below the<SaasProvider>or<ChakraProvider>because it needs access to the current theme.
Convenience methods#
Snackbar adds a bunch of convenience methods on top of the default useToast hook.
You can either pass a snackbar options object or simply a string, which is a shorthand for {title: '...'}
import { Button, HStack } from '@chakra-ui/react'import { useSnackbar } from '@saas-ui/react'export default function SnackbarExample() {const snackbar = useSnackbar()return (<HStack spacing={4}><Button onClick={() => snackbar.info('Your account has been created.')}>Show Info</Button><ButtononClick={() => snackbar.success('Your account has been created.')}>Show Success</Button><ButtononClick={() => snackbar.error("Your account couldn't be created.")}>Show Error</Button><ButtononClick={() =>snackbar.promise(new Promise((resolve) => setTimeout(resolve, 1000)),{loading: 'Creating your account...',success: 'Your account has been created.',error: "Your account couldn't be created.",})}>Show Promise</Button></HStack>)}
Promise#
Using the promise method, you can show a loading state while waiting for a promise to resolve.
The success and error option accept an optional function that receives the resolved value or the error, respectively.
If error is a function any errors thrown by the promise will be caught and passed to the function.
import { Button } from '@chakra-ui/react'import { useSnackbar } from '@saas-ui/react'export default function SnackbarPromise() {const snackbar = useSnackbar()return (<ButtononClick={() =>snackbar.promise(new Promise((resolve) =>setTimeout(() => resolve({ name: 'Elliot' }), 1000)),{loading: 'Creating your account...',success: (data) =>`Welcome ${data.name}, your account has been created.`,error: (error) => {console.error(error)return "Your account couldn't be created."},})}>Show Promise</Button>)}
Action#
import { Button } from '@chakra-ui/react'import { useSnackbar } from '@saas-ui/react'export default function SnackbarExample() {const snackbar = useSnackbar()return (<ButtononClick={() =>snackbar.success({title: 'Email sent',description: 'The email has been sent',action: <Button variant="subtle">Undo</Button>,})}>Show Snackbar</Button>)}
Custom component#
Display a custom component instead of the default Snackbar UI.
import { Button, Box } from '@chakra-ui/react'import { useSnackbar } from '@saas-ui/react'export default function CustomSnackbarExample() {const snackbar = useSnackbar()return (<ButtononClick={() =>snackbar({position: 'bottom-left',render: () => (<Box color="white" p={3} bg="blue.500">Hello World</Box>),})}>Show Snackbar</Button>)}
Closing Snackbars#
Snackbars can be closed imperatively, individually (via the close instance
method) or all together (via the closeAll instance method).
import { Button, Stack } from '@chakra-ui/react'import { useSnackbar } from '@saas-ui/react'export default function ClosingSnackbarExample() {const snackbar = useSnackbar()const snackbarIdRef = React.useRef()function close() {if (snackbarIdRef.current) {snackbar.close(snackbarIdRef.current)}}function closeAll() {// you may optionally pass an object of positions to exclusively close// keeping other positions opened// e.g. `{ positions: ['bottom'] }`snackbar.closeAll()}function addSnackbar() {snackbarIdRef.current = snackbar({ description: 'some text' })}return (<Stack isInline spacing={2}><Button onClick={addSnackbar} type="button">Snackbar</Button><Button onClick={close} type="button" variant="outline">Close last snackbar</Button><Button onClick={closeAll} type="button" variant="outline">Close all snackbars</Button></Stack>)}
Updating Snackbars#
Snackbars' options can be updated, by passing an id and the new options to the
update instance method.
import { Button, Stack } from '@chakra-ui/react'import { useSnackbar } from '@saas-ui/react'export default function UpdatingSnackbarExample() {const snackbar = useSnackbar()const snackbarIdRef = React.useRef()function update() {if (snackbarIdRef.current) {snackbar.update(snackbarIdRef.current, { description: 'new text' })}}function addSnackbar() {snackbarIdRef.current = snackbar({ description: 'some text' })}return (<Stack isInline spacing={2}><Button onClick={addSnackbar} type="button">Snackbar</Button><Button onClick={update} type="button" variant="outline">Update last snackbar</Button></Stack>)}
Status#
You can use status to change the color of your snackbars.
import { Button, Wrap, WrapItem } from '@chakra-ui/react'import { useSnackbar } from '@saas-ui/react'export default function SnackbarStatusExample() {const snackbar = useSnackbar()const statuses = ['success', 'error', 'warning', 'info']return (<Wrap>{statuses.map((status, i) => (<WrapItem key={i}><ButtononClick={() =>snackbar({title: `${status} snackbar`,status: status,isClosable: true,})}>Show {status} snackbar</Button></WrapItem>))}</Wrap>)}
Variants#
If you're using the Saas UI theme, Snackbar will automatically use the snackbar variant by default.
You can also use variants of the
Alert component.
import { Button, Wrap, WrapItem } from '@chakra-ui/react'import { useSnackbar } from '@saas-ui/react'export default function SnackbarVariantsExample() {const snackbar = useSnackbar()const variants = ['snackbar', 'solid', 'subtle', 'left-accent', 'top-accent']return (<Wrap>{variants.map((variant, i) => (<WrapItem key={i}><ButtononClick={() =>snackbar({title: `${variant} snackbar`,variant: variant,isClosable: true,})}>Show {variant} snackbar</Button></WrapItem>))}</Wrap>)}
Custom container styles#
The snackbar function now exposes a containerStyle property you can use to
override the default styles for the snackbar container.
import { Button } from '@chakra-ui/react'import { useSnackbar } from '@saas-ui/react'export default function Example() {// Via instantiationconst snackbar = useSnackbar({position: 'top',title: 'Container style is updated',containerStyle: {width: '800px',maxWidth: '100%',},})// Or via trigger// Style here will overwrite the entire style abovereturn (<ButtononClick={() => {snackbar({containerStyle: {border: '20px solid red',},})}}>Click me to show snackbar with custom container style.</Button>)}
Changing the snackbar position#
Using the position prop you can adjust where your snackbar will be popup from.
import { Button, Wrap, WrapItem } from '@chakra-ui/react'import { useSnackbar } from '@saas-ui/react'export default function PositionExample() {const snackbar = useSnackbar()const positions = ['top','top-right','top-left','bottom','bottom-right','bottom-left',]return (<Wrap>{positions.map((position, i) => (<WrapItem key={i}><ButtononClick={() =>snackbar({title: `${position} snackbar`,position: position,isClosable: true,})}>Show {position} snackbar</Button></WrapItem>))}</Wrap>)}
Preventing Duplicate Snackbar#
In some cases you might need to prevent duplicate of specific snackbars. To achieve
you need to pass an id and use the snackbar.isActive method to determine when
to call snackbar(...).
import { Button } from '@chakra-ui/react'import { useSnackbar } from '@saas-ui/react'export default function PreventDuplicateExample() {const snackbar = useSnackbar()const id = 'test-snackbar'return (<ButtononClick={() => {if (!snackbar.isActive(id)) {snackbar({id,title: 'Hey! You can create a duplicate snackbar',})}}}>Click me!</Button>)}
Stand alone snackbar#
You can use the createStandAloneSnackbar function to create a stand alone snackbar, that can be used outside of the React context.
If you are using a custom theme, you need to pass it to the
createStandAloneSnackbararguments. This will prevent any shift in font size when a snackbar is opened.
import { createStandAloneSnackbar } from '@saas-ui/react'const { SnackbarContainer, snackbar } = createStandAloneSnackbar()export default function StandAloneSnackbarExample() {return (<><SnackbarContainer /><ButtononClick={() => {snackbar({title: 'Look ma, I am a stand alone snackbar!',})}}>Click me!</Button></>)}
Was this helpful?