import { forwardRef, useImperativeHandle, useState } from 'react'; import { Form, Input, Select, Checkbox, InputNumber, Button, App } from 'antd'; import { useTranslation } from 'react-i18next'; import type { InnerToolModalRef, ToolItem, InnerConfigItem, InnerToolItem } from '../types' import RbModal from '@/components/RbModal' import { InnerConfigData } from '../constant' import RbAlert from '@/components/RbAlert'; import { updateTool, testConnection } from '@/api/tools' const FormItem = Form.Item; interface InnerToolModalProps { refreshTable: () => void; } const InnerToolModal = forwardRef(({ refreshTable }, ref) => { const { t } = useTranslation(); const { message } = App.useApp(); const [visible, setVisible] = useState(false); const [form] = Form.useForm(); const [loading, setLoading] = useState(false) const [editVo, setEditVo] = useState({} as ToolItem) const [config, setConfig] = useState({}); const search_type = Form.useWatch(['config', 'parameters', 'search_type'], form) // 封装取消方法,添加关闭弹窗逻辑 const handleClose = () => { setVisible(false); form.resetFields(); setLoading(false) setConfig({}) }; const handleOpen = (data: ToolItem) => { setEditVo(data) const { config_data } = data form.setFieldsValue({ config: { ...config_data, parameters: { search_type: 'web', ...(config_data as any).parameters }, } }) setConfig(InnerConfigData[config_data.tool_class].config) setVisible(true) }; // 封装保存方法,添加提交逻辑 const handleSave = () => { form .validateFields() .then((values) => { updateTool(editVo.id, { config: { ...editVo.config_data, ...values.config, } } as any) .then((res: any) => { message.success(t('common.saveSuccess')); testConnection(res.tool_id || editVo?.id) .finally(() => { setLoading(false); handleClose(); refreshTable() }) }) .catch(() => { setLoading(false); }) }) .catch((err) => { console.log('err', err) }); } // 暴露给父组件的方法 useImperativeHandle(ref, () => ({ handleOpen, handleClose })); return ( {editVo?.config_data?.tool_class && config && <>
{t('tool.configDesc')}
{t(`tool.${editVo?.config_data?.tool_class}_config_desc`)}
{t('tool.link')}:
{Object.keys(config).map((key) => { const range = key === 'pagesize' && search_type ? config[key].range?.[search_type] ?? [] : [ config[key].min, config[key].max ] return ( ({ ...vo, message: t(vo.message) })) : []} > {config[key].type === 'input' ? : config[key].type === 'number' ? : config[key].type === 'checkbox' ? {t(`tool.${key}`)} : config[key].type === 'select' && config[key].options ?