import { omit } from 'lodash' import { AccordionState } from './interfaces' import { AccordionAction, AccordionExpandAction, AccordionCollapseAction, AccordionDestroyAction, ACCORDION_EXPAND, ACCORDION_COLLAPSE, ACCORDION_DESTROY, } from './actions' export interface AccordionsState { [key: string]: AccordionState } const initialAccordionsState: AccordionsState = {} export const accordionReducer = (state = initialAccordionsState, action: AccordionAction) => { switch (action.type) { case ACCORDION_EXPAND: { return accordionExpand(state, action) } case ACCORDION_COLLAPSE: { return accordionCollapse(state, action) } case ACCORDION_DESTROY: { return accordionDestroy(state, action) } } return state } const updateAccordion = (state: AccordionsState, id: string, fn: (a: AccordionState) => Partial): AccordionsState => ({ ...state, [id]: { ...state[id], ...fn(state[id]), }, }) const accordionExpand = (state: AccordionsState, action: AccordionExpandAction): AccordionsState => updateAccordion(state, action.id, () => ({ key: action.key })) const accordionCollapse = (state: AccordionsState, action: AccordionCollapseAction): AccordionsState => updateAccordion(state, action.id, () => ({ key: null })) const accordionDestroy = (state: AccordionsState, action: AccordionDestroyAction): AccordionsState => (omit(state, action.id) as AccordionsState)