import { DynamicForm, DynamicFormRef, FormFieldConfig, FormFieldType, } from '@/components/dynamic-form'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import { Separator } from '@/components/ui/separator'; import { RunningStatus, RunningStatusOld } from '@/constants/knowledge'; import { isEqual } from 'lodash'; import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { FieldValues } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { DataSourceFormDefaultValues, DataSourceKey, getCommonExtraDefaultValues, getDataSourceFormBaseFields, getDataSourceFieldsWithExtras, mergeDataSourceFormValues, useDataSourceInfo, } from '../constant'; import { useAddDataSource, useFetchDataSourceDetail, useTestDataSource, useUpdateDataSourceStatus, } from '../hooks'; import { DataSourceLogsTable } from './log-table'; const SourceDetailPage = () => { const { t } = useTranslation(); const formRef = useRef(null); const { data: detail } = useFetchDataSourceDetail(); const { updateStatus, loading: statusUpdateLoading } = useUpdateDataSourceStatus(); const { dataSourceInfo } = useDataSourceInfo(); const detailInfo = useMemo(() => { if (detail) { return dataSourceInfo[detail.source]; } }, [detail, dataSourceInfo]); const [fields, setFields] = useState([]); const [isDirty, setIsDirty] = useState(false); const [defaultValues, setDefaultValues] = useState( DataSourceFormDefaultValues[ detail?.source as keyof typeof DataSourceFormDefaultValues ] as FieldValues, ); const customFields = useMemo(() => { return [ { label: t('setting.dataSourcePruneFreq'), name: 'prune_freq', type: FormFieldType.Number, required: false, shouldRender: (values: any) => !!values?.config?.sync_deleted_files, render: (fieldProps: FormFieldConfig) => { return ( {t('setting.minutes')} } /> ); }, }, { label: t('setting.dataSourceRefreshFreq'), name: 'refresh_freq', type: FormFieldType.Number, required: false, render: (fieldProps: FormFieldConfig) => ( {t('setting.minutes')} } /> ), }, { label: t('setting.dataSourceTimeoutSecs'), name: 'timeout_secs', type: FormFieldType.Number, required: false, render: (fieldProps: FormFieldConfig) => (
{t('setting.seconds')} } />
), }, ]; }, [t]); const { addLoading, handleAddOk } = useAddDataSource({ isEdit: true }); const { loading: testLoading, handleTest } = useTestDataSource(); const onSubmit = useCallback(() => { formRef?.current?.submit(); }, []); const isUnstarted = useMemo( () => detail?.status === RunningStatus.UNSTART || detail?.status === RunningStatusOld.UNSTART, [detail?.status], ); const isConnectorActive = useMemo( () => detail?.status === RunningStatus.RUNNING || detail?.status === RunningStatus.SCHEDULE || detail?.status === RunningStatusOld.RUNNING || detail?.status === RunningStatusOld.SCHEDULE, [detail?.status], ); const actionMode = useMemo(() => { if (isDirty) { return 'save' as const; } if (isUnstarted) { return 'save' as const; } if (isConnectorActive) { return 'stop' as const; } return 'resume' as const; }, [isConnectorActive, isDirty, isUnstarted]); const handlePrimaryAction = useCallback(() => { if (actionMode === 'save') { onSubmit(); return; } updateStatus( actionMode === 'resume' ? RunningStatus.SCHEDULE : RunningStatus.CANCEL, ); }, [actionMode, onSubmit, updateStatus]); const primaryActionLabel = useMemo(() => { if (actionMode === 'stop') return t('common.stop'); if (actionMode === 'resume') return t('common.resume'); return t('common.save'); }, [actionMode, t]); useEffect(() => { const baseFields = getDataSourceFormBaseFields(t).map((field) => { if (field.name === 'name') { return { ...field, disabled: true, }; } else { return { ...field, }; } }); if (detail) { const fields = [ ...baseFields, ...getDataSourceFieldsWithExtras(t, detail.source as any), ...customFields, ] as FormFieldConfig[]; const newFields = fields.map((field) => { return { ...field, horizontal: true, onChange: undefined, }; }); setFields(newFields); const defaultValueTemp = { ...mergeDataSourceFormValues( DataSourceFormDefaultValues[ detail?.source as keyof typeof DataSourceFormDefaultValues ] as FieldValues, getCommonExtraDefaultValues(), detail as FieldValues, ), }; setDefaultValues(defaultValueTemp); setIsDirty(false); } }, [detail, customFields, onSubmit, t]); useEffect(() => { const instance = formRef.current; if (!instance) return; setIsDirty(!isEqual(instance.getValues(), defaultValues)); return instance.watchDirty((_nextIsDirty, values) => { setIsDirty(!isEqual(values, defaultValues)); }); }, [defaultValues, fields]); return (
{/* */} {/* */} {detailInfo?.icon} {detail?.name}
handleAddOk(data)} defaultValues={defaultValues} />
{(detail?.source === DataSourceKey.REST_API || detail?.source === DataSourceKey.BIGQUERY) && ( )}
{t('setting.log')}
); }; export default SourceDetailPage;