cosmo-ui
Version:
Common React components
51 lines (43 loc) • 1.64 kB
text/typescript
import * as ModalActions from '../actions/modal'
import { ModalState } from '../data'
const initialModalState: ModalState = {
modalType: '',
modalProps: {},
modalHistory: [],
}
export const modalReducer = (state = initialModalState,
action: ModalActions.ModalAction): ModalState => {
switch (action.type) {
case ModalActions.SHOW_MODAL:
return showModal(state, action)
case ModalActions.HIDE_MODAL:
return hideModal(state, action)
case ModalActions.UPDATE_MODAL_PROPS:
return updateModal(state, action)
default:
return state
}
}
const showModal = (state = initialModalState, action: ModalActions.ShowModalAction) => {
const modalHistory = state.modalHistory.slice(0)
if (state.modalType !== '') {
modalHistory.push({ modalType: state.modalType, modalProps: state.modalProps })
}
return { ...state, modalType: action.modalType, modalProps: action.modalProps, modalHistory }
}
const hideModal = (state = initialModalState, action: ModalActions.HideModalAction) => {
const modalHistory = state.modalHistory.slice(0)
const oldState = (modalHistory.length > 0) ? modalHistory.pop() : null
if (oldState) {
return {
...state,
modalType: oldState.modalType,
modalProps: oldState.modalProps,
modalHistory,
}
} else {
return initialModalState
}
}
const updateModal = (state = initialModalState, action: ModalActions.UpdateModalPropsAction) =>
({ ...state, modalProps: action.modalProps })