import { createImmerReducer } from "utils/AppsmithUtils"; import { ReduxActionTypes, UpdateCanvasPayload, ReduxAction, } from "constants/ReduxActionConstants"; import { WidgetProps } from "widgets/BaseWidget"; import { UpdateWidgetPropertyPayload } from "actions/controlActions"; import { set } from "lodash"; const initialState: CanvasWidgetsReduxState = {}; export type FlattenedWidgetProps = WidgetProps & { children?: string[]; }; const canvasWidgetsReducer = createImmerReducer(initialState, { [ReduxActionTypes.INIT_CANVAS_LAYOUT]: ( state: CanvasWidgetsReduxState, action: ReduxAction, ) => { return action.payload.widgets; }, [ReduxActionTypes.UPDATE_LAYOUT]: ( state: CanvasWidgetsReduxState, action: ReduxAction, ) => { return action.payload.widgets; }, [ReduxActionTypes.UPDATE_WIDGET_PROPERTY]: ( state: CanvasWidgetsReduxState, action: ReduxAction, ) => { // We loop over all updates Object.entries(action.payload.updates).forEach( ([propertyPath, propertyValue]) => { // since property paths could be nested, we use lodash set method set(state[action.payload.widgetId], propertyPath, propertyValue); }, ); }, }); export interface CanvasWidgetsReduxState { [widgetId: string]: FlattenedWidgetProps; } export default canvasWidgetsReducer;