docs(agent-hooks-guide): add comprehensive guide for agent hooks usage and implementation
132 lines
4.2 KiB
TypeScript
132 lines
4.2 KiB
TypeScript
import React, { useEffect, useMemo, useState } from 'react';
|
||
import {
|
||
Dialog,
|
||
DialogTitle,
|
||
DialogContent,
|
||
DialogActions,
|
||
Button,
|
||
Box,
|
||
Divider,
|
||
} from '@mui/material';
|
||
import { useTranslation } from 'react-i18next';
|
||
import { useForm, FormProvider } from 'react-hook-form';
|
||
import GeneralForm from './GeneralForm';
|
||
import { RadioFormField } from '@/components/FormField';
|
||
import { ChunkMethodItem, PipelineSelectorItem } from '../configuration';
|
||
import { DocumentParserType, ParseType } from '@/constants/knowledge';
|
||
import { useKnowledgeOperations } from '@/hooks/knowledge-hooks';
|
||
import { useSnackbar } from '@/components/Provider/SnackbarProvider';
|
||
|
||
export interface CreateKnowledgeDialogProps {
|
||
open: boolean;
|
||
onClose: () => void;
|
||
onSuccess?: () => void;
|
||
}
|
||
|
||
function CreateKnowledgeDialog({ open, onClose, onSuccess }: CreateKnowledgeDialogProps) {
|
||
const { t } = useTranslation();
|
||
const { showMessage } = useSnackbar();
|
||
const { createKnowledge, loading, clearError } = useKnowledgeOperations();
|
||
|
||
// 表单实例与默认值
|
||
const form = useForm<any>({
|
||
defaultValues: {
|
||
name: '',
|
||
description: '',
|
||
permission: 'me',
|
||
avatar: undefined,
|
||
pagerank: 0,
|
||
embd_id: '',
|
||
// 解析相关
|
||
parser_id: DocumentParserType.Naive,
|
||
pipeline_id: '',
|
||
parseType: ParseType.BuildIn,
|
||
},
|
||
});
|
||
|
||
const [parseType, setParseType] = useState<ParseType>(ParseType.BuildIn);
|
||
|
||
// 同步 parseType 到表单并清理互斥字段
|
||
useEffect(() => {
|
||
form.setValue('parseType', parseType);
|
||
if (parseType === ParseType.BuildIn) {
|
||
// 选择内置解析时清空 pipeline_id
|
||
form.setValue('pipeline_id', '');
|
||
}
|
||
}, [parseType]);
|
||
|
||
const handleSubmit = async (data: any) => {
|
||
clearError();
|
||
try {
|
||
// 构建创建数据(basicData + 解析选择)
|
||
const requestData = {
|
||
name: data.name,
|
||
description: data.description,
|
||
permission: data.permission,
|
||
avatar: data.avatar,
|
||
pagerank: data.pagerank,
|
||
embd_id: data.embd_id,
|
||
// 解析相关字段:后端已支持 parser_id / pipeline_id
|
||
parser_id: data.parser_id,
|
||
pipeline_id: data.pipeline_id,
|
||
};
|
||
|
||
await createKnowledge(requestData);
|
||
showMessage.success(t('knowledgeConfiguration.createSuccess'));
|
||
onSuccess?.();
|
||
onClose();
|
||
} catch (err) {
|
||
// 错误提示由 hook 内部处理,这里保底提示
|
||
showMessage.error(t('knowledgeConfiguration.createFailed'));
|
||
}
|
||
};
|
||
|
||
const handleCancel = () => {
|
||
onClose();
|
||
};
|
||
|
||
return (
|
||
<Dialog open={open} onClose={onClose} maxWidth="md" fullWidth>
|
||
<DialogTitle>{t('knowledgeList.createKnowledgeBase')}</DialogTitle>
|
||
<FormProvider {...form}>
|
||
<DialogContent>
|
||
{/* 基础信息表单(名称、描述、权限、头像、嵌入模型、Pagerank 等) */}
|
||
<GeneralForm />
|
||
|
||
<Divider sx={{ my: 2 }} />
|
||
|
||
{/* 解析方式选择与联动(来自 ChunkMethodForm) */}
|
||
<Box sx={{ px: 1 }}>
|
||
<RadioFormField
|
||
name="parseType"
|
||
label={t('knowledgeConfiguration.parseType')}
|
||
defaultValue={parseType}
|
||
options={[
|
||
{ value: ParseType.BuildIn, label: 'Built-in' },
|
||
{ value: ParseType.Pipeline, label: 'Pipeline' },
|
||
]}
|
||
onChangeValue={(v) => setParseType(v as ParseType)}
|
||
/>
|
||
|
||
{/* 基于模式:内置显示切片方法,Pipeline 显示选择器 */}
|
||
<Box sx={{ mt: 2 }}>
|
||
{parseType === ParseType.BuildIn ? (
|
||
<ChunkMethodItem />
|
||
) : (
|
||
<PipelineSelectorItem />
|
||
)}
|
||
</Box>
|
||
</Box>
|
||
</DialogContent>
|
||
</FormProvider>
|
||
<DialogActions>
|
||
<Button onClick={handleCancel} disabled={loading}>{t('common.cancel')}</Button>
|
||
<Button onClick={form.handleSubmit(handleSubmit)} variant="contained" disabled={loading}>
|
||
{loading ? t('knowledgeConfiguration.creating') : t('knowledgeConfiguration.createAndNext')}
|
||
</Button>
|
||
</DialogActions>
|
||
</Dialog>
|
||
);
|
||
}
|
||
|
||
export default CreateKnowledgeDialog; |