import { ActionData, ActionDataState, } from "reducers/entityReducers/actionsReducer"; import { WidgetProps } from "widgets/BaseWidget"; import { ActionResponse } from "api/ActionAPI"; import { CanvasWidgetsReduxState } from "reducers/entityReducers/canvasWidgetsReducer"; import { MetaState } from "reducers/entityReducers/metaReducer"; import { PageListPayload } from "constants/ReduxActionConstants"; import { ActionConfig, PluginType } from "entities/Action"; import { AppDataState } from "reducers/entityReducers/appReducer"; import { DependencyMap, DynamicPath } from "utils/DynamicBindingUtils"; import { generateDataTreeAction } from "entities/DataTree/dataTreeAction"; import { generateDataTreeWidget } from "entities/DataTree/dataTreeWidget"; import { VALIDATION_TYPES } from "constants/WidgetValidation"; export type ActionDescription = { type: string; payload: T; }; export type ActionDispatcher = ( ...args: A ) => ActionDescription; export enum ENTITY_TYPE { ACTION = "ACTION", WIDGET = "WIDGET", APPSMITH = "APPSMITH", } export type RunActionPayload = { actionId: string; onSuccess: string; onError: string; params: Record | string; }; export enum EvaluationSubstitutionType { TEMPLATE = "TEMPLATE", PARAMETER = "PARAMETER", SMART_SUBSTITUTE = "SMART_SUBSTITUTE", } export interface DataTreeAction extends Omit { data: ActionResponse["body"]; actionId: string; config: Partial; pluginType: PluginType; name: string; run: | ActionDispatcher | Record; dynamicBindingPathList: DynamicPath[]; bindingPaths: Record; ENTITY_TYPE: ENTITY_TYPE.ACTION; dependencyMap: DependencyMap; } export interface DataTreeWidget extends WidgetProps { bindingPaths: Record; triggerPaths: Record; validationPaths: Record; ENTITY_TYPE: ENTITY_TYPE.WIDGET; } export interface DataTreeAppsmith extends Omit { ENTITY_TYPE: ENTITY_TYPE.APPSMITH; store: Record; } export type DataTreeObjectEntity = | DataTreeAction | DataTreeWidget | DataTreeAppsmith; export type DataTreeEntity = | DataTreeObjectEntity | PageListPayload | ActionDispatcher; export type DataTree = { [entityName: string]: DataTreeEntity; } & { actionPaths?: string[] }; type DataTreeSeed = { actions: ActionDataState; editorConfigs: Record; pluginDependencyConfig: Record; widgets: CanvasWidgetsReduxState; widgetsMeta: MetaState; pageList: PageListPayload; appData: AppDataState; }; export class DataTreeFactory { static create({ actions, widgets, widgetsMeta, pageList, appData, editorConfigs, pluginDependencyConfig, }: DataTreeSeed): DataTree { const dataTree: DataTree = {}; actions.forEach((action) => { const editorConfig = editorConfigs[action.config.pluginId]; const dependencyConfig = pluginDependencyConfig[action.config.pluginId]; dataTree[action.config.name] = generateDataTreeAction( action, editorConfig, dependencyConfig, ); }); Object.values(widgets).forEach((widget) => { dataTree[widget.widgetName] = generateDataTreeWidget( widget, widgetsMeta[widget.widgetId], ); }); dataTree.pageList = pageList; dataTree.appsmith = { ...appData, // combine both persistent and transient state with the transient state // taking precedence in case the key is the same store: { ...appData.store.persistent, ...appData.store.transient }, } as DataTreeAppsmith; (dataTree.appsmith as DataTreeAppsmith).ENTITY_TYPE = ENTITY_TYPE.APPSMITH; return dataTree; } }