import { ContextHelpAction, ContextHelpActionTypes, } from './context-help.actions'; import { ContextHelp } from './context-help.model'; export interface ContextHelpModels { [id: string]: ContextHelp; } export interface ContextHelpState { allIconsVisible: boolean; models: ContextHelpModels; } const initialState: ContextHelpState = { allIconsVisible: false, models: {} }; export function contextHelpReducer(state: ContextHelpState = initialState, action: ContextHelpAction): ContextHelpState { switch (action.type) { case ContextHelpActionTypes.CONTEXT_HELP_TOGGLE_ICONS: { return { ...state, allIconsVisible: !state.allIconsVisible }; } case ContextHelpActionTypes.CONTEXT_HELP_ADD: { const newModels = { ...state.models, [action.model.id]: action.model }; return { ...state, models: newModels }; } case ContextHelpActionTypes.CONTEXT_HELP_REMOVE: { const { [action.id]: _, ...remainingModels } = state.models; return { ...state, models: remainingModels }; } case ContextHelpActionTypes.CONTEXT_HELP_TOGGLE_TOOLTIP: { return modifyTooltipVisibility(state, action.id, v => !v); } case ContextHelpActionTypes.CONTEXT_HELP_SHOW_TOOLTIP: { return modifyTooltipVisibility(state, action.id, _ => true); } case ContextHelpActionTypes.CONTEXT_HELP_HIDE_TOOLTIP: { return modifyTooltipVisibility(state, action.id, _ => false); } default: { return state; } } } function modifyTooltipVisibility(state: ContextHelpState, id: string, modify: (vis: boolean) => boolean): ContextHelpState { const { [id]: matchingModel, ...otherModels } = state.models; const modifiedModel = { ...matchingModel, isTooltipVisible: modify(matchingModel.isTooltipVisible) }; const newModels = { ...otherModels, [id]: modifiedModel }; return { ...state, models: newModels }; }