import { Button } from '@material-ui/core'; import CloseOutlinedIcon from '@material-ui/icons/CloseOutlined'; import { useSnackbar } from 'notistack'; import React, { SyntheticEvent, useEffect, useRef, useState } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators, Dispatch } from 'redux'; import actions from '../../redux/alerts/actionCreators'; import { Alert } from '../../redux/alerts/reducer'; import { State } from '../../redux/rootReducer'; export interface Props { readonly alerts: Alert[]; readonly removeSnackbar: typeof actions.removeSnackbar; } const Notifier = ({ removeSnackbar, alerts }: Props) => { const mounted = useRef(false); const { enqueueSnackbar, closeSnackbar } = useSnackbar(); const initialDisplayedIds: string[] = []; const [displayedIds, storeDisplayedIds] = useState(initialDisplayedIds); useEffect(() => { if (!mounted.current) { mounted.current = true; } else { alerts.forEach((alert: Alert) => { if (!displayedIds.includes(alert.key)) { enqueueSnackbar(alert.message, { action: () => ( ), onClose: ( event: SyntheticEvent, reason: string ) => { if (alert.onClose) { alert.onClose(event, reason); } closeSnackbar(alert.key); removeSnackbar(alert.key); }, ...alert, ContentProps: { style: { overflowWrap: 'break-word', maxWidth: '400px' }, }, }); storeDisplayedIds([...displayedIds, alert.key]); } }); } }); return null; }; const mapStateToProps = ({ alerts }: State) => ({ alerts, }); const mapDispatchToProps = (dispatch: Dispatch) => bindActionCreators( { removeSnackbar: actions.removeSnackbar, }, dispatch ); export default connect( mapStateToProps, mapDispatchToProps )(Notifier);