feat(trigger): format event_parameters and improve

This commit is contained in:
zhsama 2025-10-16 14:00:21 +08:00
parent 1f6ab13fc5
commit 1c17a16830
1 changed files with 106 additions and 22 deletions

View File

@ -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<string, unknown> | 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<string, any>) => {
(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)
},