import { TrayAction } from '../actions' import { OPEN_TRAY_ITEM, CLOSE_TRAY_ITEM, TOGGLE_TRAY_ITEM, } from '../constants' import { TrayModel, TrayItemModel } from '../data' export interface TrayState { [trayName: string]: TrayModel } export const initiaTrayState: TrayState = {} export const trayReducer = (state = initiaTrayState, action: TrayAction): TrayState => { switch (action.type) { case OPEN_TRAY_ITEM: { return setItemOpenState(state, action, true) } case CLOSE_TRAY_ITEM: { return setItemOpenState(state, action, false) } case TOGGLE_TRAY_ITEM: { const itemState = (state[action.trayName] || {})[action.itemName] return setItemOpenState(state, action, itemState && itemState.open ? false : true) } default: { return state } } } const setItemOpenState = (state = initiaTrayState, action: TrayAction, open: boolean) => { const currentTrayState = state[action.trayName] || {} return { ...state, [action.trayName]: { ...state[action.trayName], [action.itemName]: { ...currentTrayState[action.itemName], open, }, }, } }