import { createReducer } from "utils/ReducerUtils"; import type { ReduxAction } from "@appsmith/constants/ReduxActionConstants"; import { ReduxActionTypes, ReduxActionErrorTypes, } from "@appsmith/constants/ReduxActionConstants"; import type { DefaultPlugin, Plugin } from "api/PluginApi"; import type { PluginFormPayloadWithId, PluginFormsPayload, GetPluginFormConfigRequest, } from "actions/pluginActions"; import type { FormEditorConfigs, FormSettingsConfigs, FormDependencyConfigs, FormDatasourceButtonConfigs, } from "utils/DynamicBindingUtils"; export interface PluginDataState { list: Plugin[]; defaultPluginList: DefaultPlugin[]; loading: boolean; formConfigs: Record; editorConfigs: FormEditorConfigs; settingConfigs: FormSettingsConfigs; dependencies: FormDependencyConfigs; datasourceFormButtonConfigs: FormDatasourceButtonConfigs; fetchingSinglePluginForm: Record; fetchingDefaultPlugins: boolean; } const initialState: PluginDataState = { list: [], defaultPluginList: [], loading: false, formConfigs: {}, editorConfigs: {}, settingConfigs: {}, datasourceFormButtonConfigs: {}, dependencies: {}, fetchingSinglePluginForm: {}, fetchingDefaultPlugins: false, }; const pluginsReducer = createReducer(initialState, { [ReduxActionTypes.FETCH_PLUGINS_REQUEST]: (state: PluginDataState) => { return { ...state, loading: true }; }, [ReduxActionTypes.FETCH_PLUGINS_SUCCESS]: ( state: PluginDataState, action: ReduxAction, ) => { return { ...state, loading: false, list: action.payload, }; }, [ReduxActionErrorTypes.FETCH_PLUGINS_ERROR]: (state: PluginDataState) => { return { ...state, loading: false, }; }, [ReduxActionTypes.FETCH_PLUGIN_FORM_CONFIGS_SUCCESS]: ( state: PluginDataState, action: ReduxAction, ) => { return { ...state, ...action.payload, }; }, [ReduxActionTypes.GET_PLUGIN_FORM_CONFIG_INIT]: ( state: PluginDataState, action: ReduxAction, ) => { return { ...state, fetchingSinglePluginForm: { ...state.fetchingSinglePluginForm, [action.payload.id]: true, }, }; }, [ReduxActionTypes.FETCH_PLUGIN_FORM_SUCCESS]: ( state: PluginDataState, action: ReduxAction, ) => { return { ...state, fetchingSinglePluginForm: { ...state.fetchingSinglePluginForm, [action.payload.id]: false, }, formConfigs: { ...state.formConfigs, [action.payload.id]: action.payload.form, }, editorConfigs: { ...state.editorConfigs, [action.payload.id]: action.payload.editor, }, settingConfigs: { ...state.settingConfigs, [action.payload.id]: action.payload.setting, }, datasourceFormButtonConfigs: { ...state.datasourceFormButtonConfigs, [action.payload.id]: action.payload.formButton, }, }; }, [ReduxActionErrorTypes.FETCH_PLUGIN_FORM_ERROR]: ( state: PluginDataState, action: ReduxAction, ) => { return { ...state, fetchingSinglePluginForm: { ...state.fetchingSinglePluginForm, [action.payload.id]: false, }, }; }, [ReduxActionTypes.GET_DEFAULT_PLUGINS_REQUEST]: (state: PluginDataState) => { return { ...state, fetchingDefaultPlugins: true, }; }, [ReduxActionTypes.GET_DEFAULT_PLUGINS_SUCCESS]: ( state: PluginDataState, action: ReduxAction, ) => { return { ...state, fetchingDefaultPlugins: false, defaultPluginList: action.payload, }; }, }); export default pluginsReducer;