Skip to content

Instantly share code, notes, and snippets.

@german-bortoli
Forked from akinncar/SnackBarContext.tsx
Created May 19, 2022 12:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save german-bortoli/b71d3a171ea8a304031d776e7dfa8a3a to your computer and use it in GitHub Desktop.
Save german-bortoli/b71d3a171ea8a304031d776e7dfa8a3a to your computer and use it in GitHub Desktop.
SnackBar Material UI Context Typescript Boilerplate
import { Snackbar } from '@material-ui/core';
import { Alert, Color } from '@material-ui/lab';
import React, { createContext, useContext } from 'react';
type SnackBarContextActions = {
showSnackBar: (text: string, typeColor: Color) => void;
};
const SnackBarContext = createContext({} as SnackBarContextActions);
interface SnackBarContextProviderProps {
children: React.ReactNode;
}
const SnackBarProvider: React.FC<SnackBarContextProviderProps> = ({
children,
}) => {
const [open, setOpen] = React.useState<boolean>(false);
const [message, setMessage] = React.useState<string>('');
const [typeColor, setTypeColor] = React.useState<Color>('info');
const showSnackBar = (text: string, color: Color) => {
setMessage(text);
setTypeColor(color);
setOpen(true);
};
const handleClose = () => {
setOpen(false);
setTypeColor('info');
};
return (
<SnackBarContext.Provider value={{ showSnackBar }}>
<Snackbar
open={open}
autoHideDuration={6000}
anchorOrigin={{ vertical: 'top', horizontal: 'center' }}
onClose={handleClose}>
<Alert onClose={handleClose} severity={typeColor}>
{message}
</Alert>
</Snackbar>
{children}
</SnackBarContext.Provider>
);
};
const useSnackBar = (): SnackBarContextActions => {
const context = useContext(SnackBarContext);
if (!context) {
throw new Error('useSnackBar must be used within an SnackBarProvider');
}
return context;
};
export { SnackBarProvider, useSnackBar };
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment