Spaces:
Configuration error
Configuration error
| import React from 'react' | |
| import { useDispatch, useSelector } from 'react-redux' | |
| import { useSnackbar } from 'notistack' | |
| import { removeSnackbar } from 'store/actions' | |
| let displayed = [] | |
| const useNotifier = () => { | |
| const dispatch = useDispatch() | |
| const notifier = useSelector((state) => state.notifier) | |
| const { notifications } = notifier | |
| const { enqueueSnackbar, closeSnackbar } = useSnackbar() | |
| const storeDisplayed = (id) => { | |
| displayed = [...displayed, id] | |
| } | |
| const removeDisplayed = (id) => { | |
| displayed = [...displayed.filter((key) => id !== key)] | |
| } | |
| React.useEffect(() => { | |
| notifications.forEach(({ key, message, options = {}, dismissed = false }) => { | |
| if (dismissed) { | |
| // dismiss snackbar using notistack | |
| closeSnackbar(key) | |
| return | |
| } | |
| // do nothing if snackbar is already displayed | |
| if (displayed.includes(key)) return | |
| // display snackbar using notistack | |
| enqueueSnackbar(message, { | |
| key, | |
| ...options, | |
| onClose: (event, reason, myKey) => { | |
| if (options.onClose) { | |
| options.onClose(event, reason, myKey) | |
| } | |
| }, | |
| onExited: (event, myKey) => { | |
| // remove this snackbar from redux store | |
| dispatch(removeSnackbar(myKey)) | |
| removeDisplayed(myKey) | |
| } | |
| }) | |
| // keep track of snackbars that we've displayed | |
| storeDisplayed(key) | |
| }) | |
| }, [notifications, closeSnackbar, enqueueSnackbar, dispatch]) | |
| } | |
| export default useNotifier | |