cosmo-ui
Version:
Common React components
47 lines (42 loc) • 1.31 kB
text/typescript
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,
},
},
}
}