import { forwardRef, useImperativeHandle, useState } from 'react'; import { Form, Input, Button, Space } from 'antd'; import { useTranslation } from 'react-i18next'; import type { TreeDataNode } from 'antd'; import type { ToolItem, JsonToolModalRef, ExecuteData } from '../types' import RbModal from '@/components/RbModal'; import FormItem from 'antd/es/form/FormItem'; import CodeBlock from '@/components/Markdown/CodeBlock'; import { execute } from '@/api/tools'; const JsonToolModal = forwardRef((_props, ref) => { const { t } = useTranslation(); const [visible, setVisible] = useState(false); const [form] = Form.useForm<{ json: string; json_path: string; }>(); const [data, setData] = useState({} as ToolItem) const [formatValue, setFormatValue] = useState | null>(null) // 转换数据结构为Tree组件需要的格式 const convertToTreeData = (data: Record, parentKey = ''): TreeDataNode[] => { if (data.children) { return convertToTreeData(data.children, parentKey); } return Object.entries(data).map(([key, item]) => { const nodeKey = parentKey ? `${parentKey}-${key}` : key; const title = `${key}: ${item.value || ''}`; const node: TreeDataNode = { key: nodeKey, title, }; if (item.children) { node.children = convertToTreeData(item.children, nodeKey); } return node; }); }; // 封装取消方法,添加关闭弹窗逻辑 const handleClose = () => { setVisible(false); form.resetFields(); setData({} as ToolItem) }; const handleOpen = (data: ToolItem) => { setData(data) setVisible(true); }; const handleParse = async () => { try { const text = await navigator.clipboard.readText(); form.setFieldValue('json', text); } catch (err) { console.error('Failed to read clipboard:', err); } } const handleOperate = (type: string) => { const json = form.getFieldValue('json') const json_path = form.getFieldValue('json_path') if (!json || !data.id) return let params: ExecuteData = { tool_id: data.id, parameters: { operation: type, input_data: json, json_path } } if (type === 'parse') { params = { ...params, parameters: { ...params.parameters, } } } execute(params) .then(res => { const { data } = res as { data: string; } setFormatValue(data); }) } const clear = () => { form.setFieldValue('json', undefined) setFormatValue(null) } // 暴露给父组件的方法 useImperativeHandle(ref, () => ({ handleOpen, handleClose })); return (
{t('tool.enterJson')} } > {typeof formatValue === "string" && formatValue ? :
{t('tool.noResult')}
}
); }); export default JsonToolModal;