diff --git a/frontend/web/src/components/intelligent_eval/ConfigSnapshots.tsx b/frontend/web/src/components/intelligent_eval/ConfigSnapshots.tsx index aa0b00a..4a5aa80 100644 --- a/frontend/web/src/components/intelligent_eval/ConfigSnapshots.tsx +++ b/frontend/web/src/components/intelligent_eval/ConfigSnapshots.tsx @@ -1,9 +1,9 @@ -import { useState } from 'react' +import { useEffect, useState } from 'react' import { Button, Card, Descriptions, Empty, Space, Table, Tag, message, } from 'antd' import type { ColumnsType } from 'antd/es/table' -import { ArrowLeftOutlined, DiffOutlined } from '@ant-design/icons' +import { ArrowLeftOutlined, DiffOutlined, ReloadOutlined } from '@ant-design/icons' import { intelligentEvalsApi, type ConfigSnapshot, type ConfigSnapshotComparison } from '../../api' import { colors } from '../../tokens' import { formatDateTime } from '../../utils/date' @@ -40,9 +40,10 @@ export default function ConfigSnapshots({ evalId, onBack }: ConfigSnapshotsProps } } - useState(() => { - void loadSnapshots() - }) + useEffect(() => { + if (evalId) void loadSnapshots() + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [evalId]) const handleViewDetail = async (snapshot: ConfigSnapshot) => { try { @@ -244,6 +245,7 @@ export default function ConfigSnapshots({ evalId, onBack }: ConfigSnapshotsProps {onBack && } onClick={onBack}>返回} 配置历史
+ } onClick={() => void loadSnapshots()}>刷新 } disabled={selectedForCompare.length !== 2} diff --git a/frontend/web/src/components/intelligent_eval/DecisionProcess.tsx b/frontend/web/src/components/intelligent_eval/DecisionProcess.tsx index 158771a..cf43aa4 100644 --- a/frontend/web/src/components/intelligent_eval/DecisionProcess.tsx +++ b/frontend/web/src/components/intelligent_eval/DecisionProcess.tsx @@ -1,9 +1,9 @@ -import { useState } from 'react' +import { useEffect, useState } from 'react' import { Button, Card, Empty, Select, Table, Tag, Timeline, message, } from 'antd' import type { ColumnsType } from 'antd/es/table' -import { ArrowLeftOutlined, DownloadOutlined } from '@ant-design/icons' +import { ArrowLeftOutlined, DownloadOutlined, ReloadOutlined } from '@ant-design/icons' import { intelligentEvalsApi, type DecisionLog } from '../../api' import { colors } from '../../tokens' import { formatDateTime } from '../../utils/date' @@ -38,9 +38,10 @@ export default function DecisionProcess({ evalId, onBack }: DecisionProcessProps } } - useState(() => { - void loadLogs() - }) + useEffect(() => { + if (evalId) void loadLogs() + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [evalId]) const handleExport = () => { if (!logs) return @@ -120,6 +121,7 @@ export default function DecisionProcess({ evalId, onBack }: DecisionProcessProps { label: '开始分析', value: 'start_analysis' }, ]} /> + } onClick={() => void loadLogs()}>刷新 } onClick={handleExport}>导出 diff --git a/frontend/web/src/hooks/useFiles.ts b/frontend/web/src/hooks/useFiles.ts index c4a839e..aad4b1b 100644 --- a/frontend/web/src/hooks/useFiles.ts +++ b/frontend/web/src/hooks/useFiles.ts @@ -6,13 +6,14 @@ import { type FileUploadConfig, } from '../api' import { categoryContains, findCategory } from '../utils/fileTree' +import { useOnTabActive } from './useOnTabActive' const DEFAULT_CONFIG: FileUploadConfig = { allowed_extensions: [], max_upload_size_mb: 50, } -export function useFiles() { +export function useFiles(tabPath?: string) { const [categories, setCategories] = useState