diff --git a/web/app/components/workflow/nodes/trigger-plugin/use-config.ts b/web/app/components/workflow/nodes/trigger-plugin/use-config.ts index 5a799d42e4..b3fef6b523 100644 --- a/web/app/components/workflow/nodes/trigger-plugin/use-config.ts +++ b/web/app/components/workflow/nodes/trigger-plugin/use-config.ts @@ -1,4 +1,4 @@ -import { useCallback, useMemo } from 'react' +import { useCallback, useEffect, useMemo } from 'react' import produce from 'immer' import type { PluginTriggerNodeType } from './types' import type { PluginTriggerVarInputs } from './types' @@ -9,7 +9,7 @@ import { useTriggerSubscriptions, } from '@/service/use-triggers' import { - addDefaultValue, + getConfiguredValue, toolParametersToFormSchemas, } from '@/app/components/tools/utils/to-form-schema' import type { InputVar } from '@/app/components/workflow/types' @@ -17,6 +17,60 @@ import type { TriggerWithProvider } from '@/app/components/workflow/block-select import type { Event } from '@/app/components/tools/types' import { VarKindType } from '../_base/types' +const normalizeEventParameters = ( + params: PluginTriggerVarInputs | Record | null | undefined, + { allowScalars = false }: { allowScalars?: boolean } = {}, +): PluginTriggerVarInputs => { + if (!params || typeof params !== 'object' || Array.isArray(params)) + return {} as PluginTriggerVarInputs + + return Object.entries(params).reduce((acc, [key, entry]) => { + if (!entry && entry !== 0 && entry !== false) + return acc + + if ( + typeof entry === 'object' + && !Array.isArray(entry) + && 'type' in entry + && 'value' in entry + ) { + const normalizedEntry = { ...(entry as PluginTriggerVarInputs[string]) } + if (normalizedEntry.type === VarKindType.mixed) + normalizedEntry.type = VarKindType.constant + acc[key] = normalizedEntry + return acc + } + + if (!allowScalars) + return acc + + if (typeof entry === 'string') { + acc[key] = { + type: VarKindType.constant, + value: entry, + } + return acc + } + + if (typeof entry === 'number' || typeof entry === 'boolean') { + acc[key] = { + type: VarKindType.constant, + value: entry, + } + return acc + } + + if (Array.isArray(entry) && entry.every(item => typeof item === 'string')) { + acc[key] = { + type: VarKindType.variable, + value: entry, + } + } + + return acc + }, {} as PluginTriggerVarInputs) +} + const useConfig = (id: string, payload: PluginTriggerNodeType) => { const { nodesReadOnly: readOnly } = useNodesReadOnly() const { data: triggerPlugins = [] } = useAllTriggerPlugins() @@ -31,9 +85,18 @@ const useConfig = (id: string, payload: PluginTriggerNodeType) => { provider_name, event_name: event_name, config = {}, - event_parameters = {}, + event_parameters: rawEventParameters = {}, } = inputs + const event_parameters = useMemo( + () => normalizeEventParameters(rawEventParameters as PluginTriggerVarInputs), + [rawEventParameters], + ) + const legacy_config_parameters = useMemo( + () => normalizeEventParameters(config as PluginTriggerVarInputs, { allowScalars: true }), + [config], + ) + // Construct provider for authentication check const authProvider = useMemo(() => { return provider_name || '' @@ -78,19 +141,44 @@ const useConfig = (id: string, payload: PluginTriggerNodeType) => { const triggerParameterValue = useMemo(() => { if (!triggerParameterSchema.length) - return {} + return {} as PluginTriggerVarInputs - const hasNewParameters = event_parameters && Object.keys(event_parameters).length > 0 - const baseValue = hasNewParameters ? event_parameters : (config || {}) + const hasStoredParameters = event_parameters && Object.keys(event_parameters).length > 0 + const baseValue = hasStoredParameters ? event_parameters : legacy_config_parameters - return addDefaultValue(baseValue, triggerParameterSchema) - }, [triggerParameterSchema, event_parameters, config]) + const configuredValue = getConfiguredValue(baseValue, triggerParameterSchema) as PluginTriggerVarInputs + return normalizeEventParameters(configuredValue) + }, [triggerParameterSchema, event_parameters, legacy_config_parameters]) + + useEffect(() => { + if (!triggerParameterSchema.length) + return + + if (event_parameters && Object.keys(event_parameters).length > 0) + return + + if (!triggerParameterValue || Object.keys(triggerParameterValue).length === 0) + return + + const newInputs = produce(inputs, (draft) => { + draft.event_parameters = triggerParameterValue + draft.config = triggerParameterValue + }) + doSetInputs(newInputs) + }, [ + doSetInputs, + event_parameters, + inputs, + triggerParameterSchema, + triggerParameterValue, + ]) const setTriggerParameterValue = useCallback( - (value: Record) => { + (value: PluginTriggerVarInputs) => { + const sanitizedValue = normalizeEventParameters(value) const newInputs = produce(inputs, (draft) => { - draft.event_parameters = value - draft.config = value + draft.event_parameters = sanitizedValue + draft.config = sanitizedValue }) doSetInputs(newInputs) }, @@ -100,20 +188,16 @@ const useConfig = (id: string, payload: PluginTriggerNodeType) => { const setInputVar = useCallback( (variable: InputVar, varDetail: InputVar) => { const newInputs = produce(inputs, (draft) => { - const nextEventParameters = { + const nextEventParameters = normalizeEventParameters({ ...(draft.event_parameters || {}), - } as PluginTriggerVarInputs - - nextEventParameters[variable.variable] = { - type: VarKindType.variable, - value: varDetail.variable, - } + [variable.variable]: { + type: VarKindType.variable, + value: varDetail.variable, + }, + } as PluginTriggerVarInputs) draft.event_parameters = nextEventParameters - draft.config = { - ...nextEventParameters, - [variable.variable]: varDetail.variable, - } + draft.config = nextEventParameters }) doSetInputs(newInputs) },