import _ from 'lodash' export const SET = 'LIST_SET' export const CLEAR = 'LIST_CLEAR' export const REQUEST = 'LIST_REQUEST' export const RECEIVE = 'LIST_RECEIVE' const defaultState = { data: {}, pendingActions: null, } export default function reduce(state = defaultState, action) { switch (action.type) { case SET: if (state.pendingActions) { return { ...state, pendingActions: [...state.pendingActions, action] } } return { ...state, data: { ...state.data, [action.id]: null, [action.item.id]: action.item } } case CLEAR: if (state.pendingActions) { return { ...state, pendingActions: [...state.pendingActions, action] } } return { ...state, data: { ...state.data, [action.id]: null } } case REQUEST: return { ...state, pendingActions: [] } case RECEIVE: return state.pendingActions.reduce(reduce, { ...state, pendingActions: null, data: _.fromPairs(action.list.map(item => [item.id, item])), }) default: return state } } /** * @public */ export function add(item) { return { type: SET, id: item.id, item } } /** * @public */ export function update(id, item) { return { type: SET, id, item } } /** * @public */ export function remove(id) { return { type: CLEAR, id } } /** * @public */ export function request() { return { type: REQUEST } } /** * @public */ export function receive(list) { return { type: RECEIVE, list } }