export const snackbarActions = unionize({
OPEN_SNACKBAR: ofType<{message: string; hideDuration?: number, kind?: SnackbarKind, link?: string}>(),
- CLOSE_SNACKBAR: ofType<{}>(),
+ CLOSE_SNACKBAR: ofType<{}|null>(),
SHIFT_MESSAGES: ofType<{}>()
});
CLOSE_SNACKBAR: (payload) => {
let newMessages: any = [...state.messages];// state.messages.filter(({ message }) => message !== payload);
- if (JSON.stringify(payload) === '{}') {
+ if (payload === undefined || JSON.stringify(payload) === '{}') {
newMessages.pop();
} else {
- newMessages = state.messages.filter(({ message }) => message !== payload);
+ newMessages = state.messages.filter((message, index) => index !== payload);
}
return {
};
const mapDispatchToProps = (dispatch: Dispatch): SnackbarEventProps => ({
- onClose: (event: any, reason: string, message: '') => {
+ onClose: (event: any, reason: string, id: undefined) => {
if (reason !== "clickaway") {
- dispatch(snackbarActions.CLOSE_SNACKBAR(message));
+ dispatch(snackbarActions.CLOSE_SNACKBAR(id));
}
},
onExited: () => {
autoHideDuration={props.autoHideDuration}>
<div data-cy="snackbar">
{
- props.messages.map(message => {
+ props.messages.map((message, index) => {
const [Icon, cssClass] = variants[message.kind];
return <SnackbarContent
- key={message.message}
+ key={`${index}-${message.message}`}
className={classNames(cssClass, classes.snackbarContent)}
aria-describedby="client-snackbar"
message={
{message.message}
</span>
}
- action={actions(message, props.onClick, props.onClose, classes)}
+ action={actions(message, props.onClick, props.onClose, classes, index)}
/>
})
}
}
));
-const actions = (props: SnackbarMessage, onClick, onClose, classes) => {
+const actions = (props: SnackbarMessage, onClick, onClose, classes, index) => {
const actions = [
<IconButton
key="close"
aria-label="Close"
color="inherit"
- onClick={e => onClose && onClose(e, '', props.message)}>
+ onClick={e => onClose && onClose(e, '', index)}>
<CloseIcon className={classes.icon} />
</IconButton>
];