Home Reference Source

src/reducers/alerts.js

import _ from 'lodash';
import { ADD, ADD_MULTI, REMOVE, REMOVE_ALL } from '../constants/alerts';
import { id as generateId } from '../utils/id';

export const defaultState = {
  id: null,
  severity: 'danger',
  label: null,
  text: null,
  details: null,
  icon: null,
  timeout: null,
  closeButton: null,
};

function resolve(state = defaultState, { type, payload }) {
  switch (type) {
    case ADD:
      return [
        {
          id: payload.id || generateId(),
          severity: payload.severity,
          label: payload.label,
          text: payload.text,
          details: payload.details,
          closeButton: payload.closeButton,
        },
      ];
    case ADD_MULTI:
      return [
        ...payload.alerts.map(item => ({
          ...item,
        })),
      ];
    default:
      return state;
  }
}

/**
 * Редюсер удаления/добваления алертов
 * @ignore
 */
export default function alerts(state = {}, action) {
  switch (action.type) {
    case ADD:
    case ADD_MULTI:
      return Object.assign({}, state, {
        [action.payload.key]: state[action.payload.key]
          ? state[action.payload.key].concat(
              resolve(state[action.payload.key], action)
            )
          : resolve(state[action.payload.key], action),
      });
    case REMOVE:
      return Object.assign({}, state, {
        [action.payload.key]: state[action.payload.key].filter(
          alert => alert.id !== action.payload.id
        ),
      });
    case REMOVE_ALL:
      return _.omit(state, action.payload.key);
    default:
      return state;
  }
}