import { Record as ImmutableRecord, List as ImmutableList } from 'immutable'; import { ALERT_SHOW, ALERT_DISMISS, ALERT_CLEAR, } from '../actions/alerts'; const AlertRecord = ImmutableRecord({ key: 0, title: '', message: '', severity: 'info', actionLabel: '', actionLink: '', action: () => {}, dismissAfter: 6000 as number | false, }); import type { AnyAction } from 'redux'; type PlainAlert = Record; type Alert = ReturnType; type State = ImmutableList; /** Get next key based on last alert. */ const getNextKey = (state: State): number => { const last = state.last(); return last ? last.key + 1 : 0; }; /** Import the alert. */ const importAlert = (state: State, alert: PlainAlert): State => { const key = getNextKey(state); const record = AlertRecord({ ...alert, key }); return state.push(record); }; /** Delete an alert by its key. */ const deleteAlert = (state: State, alert: PlainAlert): State => { return state.filterNot(item => item.key === alert.key); }; export default function alerts(state: State = ImmutableList(), action: AnyAction): State { switch (action.type) { case ALERT_SHOW: return importAlert(state, action); case ALERT_DISMISS: return deleteAlert(state, action.alert); case ALERT_CLEAR: return state.clear(); default: return state; } } export { Alert, };