diff --git a/web/app/components/app/configuration/config-var/index.tsx b/web/app/components/app/configuration/config-var/index.tsx index 1c706d8a63..ad6ce48c0d 100644 --- a/web/app/components/app/configuration/config-var/index.tsx +++ b/web/app/components/app/configuration/config-var/index.tsx @@ -16,6 +16,7 @@ import { DEFAULT_VALUE_MAX_LEN, getMaxVarNameLength } from '@/config' import { checkKeys, getNewVar } from '@/utils/var' import Switch from '@/app/components/base/switch' import Toast from '@/app/components/base/toast' +import { Timeout } from 'ahooks/lib/useRequest/src/types' export type IConfigVarProps = { promptVariables: PromptVariable[] @@ -23,6 +24,8 @@ export type IConfigVarProps = { onPromptVariablesChange?: (promptVariables: PromptVariable[]) => void } +let conflictTimer: Timeout + const ConfigVar: FC = ({ promptVariables, readonly, onPromptVariablesChange }) => { const { t } = useTranslation() const hasVar = promptVariables.length > 0 @@ -34,11 +37,9 @@ const ConfigVar: FC = ({ promptVariables, readonly, onPromptVar return obj })() - const updatePromptVariable = (key: string, updateKey: string, newValue: any) => { - if (!(key in promptVariableObj)) - return - const newPromptVariables = promptVariables.map((item) => { - if (item.key === key) { + const updatePromptVariable = (index: number, updateKey: string, newValue: any) => { + const newPromptVariables = promptVariables.map((item, i) => { + if (i === index) { return { ...item, [updateKey]: newValue, @@ -51,11 +52,9 @@ const ConfigVar: FC = ({ promptVariables, readonly, onPromptVar onPromptVariablesChange?.(newPromptVariables) } - const batchUpdatePromptVariable = (key: string, updateKeys: string[], newValues: any[]) => { - if (!(key in promptVariableObj)) - return - const newPromptVariables = promptVariables.map((item) => { - if (item.key === key) { + const batchUpdatePromptVariable = (index: number, updateKeys: string[], newValues: any[]) => { + const newPromptVariables = promptVariables.map((item, i) => { + if (i === index) { const newItem: any = { ...item } updateKeys.forEach((updateKey, i) => { newItem[updateKey] = newValues[i] @@ -68,8 +67,8 @@ const ConfigVar: FC = ({ promptVariables, readonly, onPromptVar onPromptVariablesChange?.(newPromptVariables) } - const updatePromptKey = (index: number, newKey: string) => { + clearTimeout(conflictTimer) const { isValid, errorKey, errorMessageKey } = checkKeys([newKey], true) if (!isValid) { Toast.notify({ @@ -78,6 +77,7 @@ const ConfigVar: FC = ({ promptVariables, readonly, onPromptVar }) return } + const newPromptVariables = promptVariables.map((item, i) => { if (i === index) { return { @@ -85,10 +85,20 @@ const ConfigVar: FC = ({ promptVariables, readonly, onPromptVar key: newKey, } } - return item }) + conflictTimer = setTimeout(() => { + const isKeyExists = promptVariables.some(item => item.key.trim() === newKey.trim()) + if (isKeyExists) { + Toast.notify({ + type: 'error', + message: t(`appDebug.varKeyError.keyAlreadyExists`, { key: newKey }), + }) + return + } + },1000) + onPromptVariablesChange?.(newPromptVariables) } @@ -196,7 +206,7 @@ const ConfigVar: FC = ({ promptVariables, readonly, onPromptVar type="text" placeholder={key} value={name} - onChange={e => updatePromptVariable(key, 'name', e.target.value)} + onChange={e => updatePromptVariable(index, 'name', e.target.value)} maxLength={getMaxVarNameLength(name)} className="h-6 leading-6 block w-full rounded-md border-0 py-1.5 text-gray-900 placeholder:text-gray-400 focus:outline-none focus:ring-1 focus:ring-inset focus:ring-gray-200" />) diff --git a/web/i18n/lang/app-debug.en.ts b/web/i18n/lang/app-debug.en.ts index 9bfffc11c5..17d69affb4 100644 --- a/web/i18n/lang/app-debug.en.ts +++ b/web/i18n/lang/app-debug.en.ts @@ -121,6 +121,7 @@ const translation = { tooLong: 'Variable key: {{key}} too length. Can not be longer then 16 characters', notValid: 'Variable key: {{key}} is invalid. Can only contain letters, numbers, and underscores', notStartWithNumber: 'Variable key: {{key}} can not start with a number', + keyAlreadyExists:'Variable key: :{{key}} already exists', }, variableConig: { modalTitle: 'Field settings', diff --git a/web/i18n/lang/app-debug.zh.ts b/web/i18n/lang/app-debug.zh.ts index 84d1ed3b56..332b455273 100644 --- a/web/i18n/lang/app-debug.zh.ts +++ b/web/i18n/lang/app-debug.zh.ts @@ -117,6 +117,7 @@ const translation = { tooLong: '变量: {{key}} 长度太长。不能超过 16 个字符', notValid: '变量: {{key}} 非法。只能包含英文字符,数字和下划线', notStartWithNumber: '变量: {{key}} 不能以数字开头', + keyAlreadyExists:'变量:{{key}} 已存在', }, variableConig: { modalTitle: '变量设置',