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: '', }); 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; } }