import { omit } from 'lodash' import { PanelState, PanelAction, PanelInitAction, PanelDestroyAction, PanelResizeStartAction, PanelResizeAction, PanelResizeStopAction, } from './interfaces' import { PANEL_INIT, PANEL_DESTROY, PANEL_RESIZE_START, PANEL_RESIZE, PANEL_RESIZE_STOP, } from './actions' interface PanelsState { [key: string]: PanelState } const initialState: PanelsState = {} export const panelReducer = (state: PanelsState = initialState, action: PanelAction): PanelsState => { switch (action.type) { case PANEL_INIT: { return panelInit(state, action) } case PANEL_DESTROY: { return panelDestroy(state, action) } case PANEL_RESIZE_START: { return panelResizeStart(state, action) } case PANEL_RESIZE: { return panelResize(state, action) } case PANEL_RESIZE_STOP: { return panelResizeStop(state, action) } } return state } const panelUpdate = (state: PanelsState, id: string, fn: (a: Partial) => Partial): PanelsState => ({ ...state, [id]: { ...state[id], ...fn(state[id]), }, }) const panelInit = (state: PanelsState, action: PanelInitAction) => panelUpdate(state, action.id, (panel: PanelState) => panel ? panel : { intervals: action.intervals, dragging: false, idx: -1, }) const panelDestroy = (state: PanelsState, action: PanelDestroyAction): PanelsState => omit(state, action.id) as PanelsState const panelResizeStart = (state: PanelsState, action: PanelResizeStartAction): PanelsState => panelUpdate(state, action.id, () => ({ dragging: true, idx: action.idx, })) const panelResize = (state: PanelsState, action: PanelResizeAction): PanelsState => panelUpdate(state, action.id, () => ({ intervals: action.intervals, })) const panelResizeStop = (state: PanelsState, action: PanelResizeStopAction): PanelsState => panelUpdate(state, action.id, () => ({ dragging: false, }))