From 2aa2a1ac180f78b64c2fa9d1e028db6d29763320 Mon Sep 17 00:00:00 2001 From: CNWei Date: Wed, 4 Nov 2026 23:27:43 +0800 Subject: [PATCH] =?UTF-8?q?fix(frontend):=20=E7=8E=AF=E5=A2=83=E6=8E=A2?= =?UTF-8?q?=E6=B5=8B=E4=B8=8D=E5=86=8D=E6=98=BE=E7=A4=BA=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E6=80=81=EF=BC=8C=E5=8F=AA=E5=9C=A8=E6=9C=80=E7=BB=88=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 探测期间保留上一次最终结果,移除正在探测提示;首次无结果时保持空状态;占位结果不参与自动回填,最终结果返回后一次性更新。 --- frontend/src/components/TaskEditorModal.tsx | 44 +++++++++++---------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/frontend/src/components/TaskEditorModal.tsx b/frontend/src/components/TaskEditorModal.tsx index 9d67ed4..3b793f3 100644 --- a/frontend/src/components/TaskEditorModal.tsx +++ b/frontend/src/components/TaskEditorModal.tsx @@ -1,5 +1,10 @@ import { zodResolver } from '@hookform/resolvers/zod' -import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' +import { + keepPreviousData, + useMutation, + useQuery, + useQueryClient, +} from '@tanstack/react-query' import { Button, Checkbox, @@ -225,6 +230,8 @@ export function TaskEditorModal({ actionType === 'script' && isPythonScript && Boolean(debouncedWorkingDir.trim()), + // 探测期间保留上一次最终结果,不显示“正在检测”这种中间状态。 + placeholderData: keepPreviousData, retry: false, staleTime: 15_000, }) @@ -246,7 +253,9 @@ export function TaskEditorModal({ onError: (error) => toast.error(error.message), }) const linkedVenv = - isPythonScript && venvProbe.data?.status === 'linked' + isPythonScript && + !venvProbe.isPlaceholderData && + venvProbe.data?.status === 'linked' ? venvProbe.data : null const previewVirtualEnv = isPythonScript @@ -289,7 +298,7 @@ export function TaskEditorModal({ // 探测到虚拟环境就自动填进「虚拟环境目录」,但用户自己改过就保留用户的值。 useEffect(() => { - if (!open || !isPythonScript) { + if (!open || !isPythonScript || venvProbe.isPlaceholderData) { return } const probe = venvProbe.data @@ -318,7 +327,7 @@ export function TaskEditorModal({ shouldDirty: true, shouldValidate: true, }) - }, [debouncedVenv, debouncedWorkingDir, getValues, isPythonScript, open, scriptPreview.working_dir, setValue, venvProbe.data]) + }, [debouncedVenv, debouncedWorkingDir, getValues, isPythonScript, open, scriptPreview.working_dir, setValue, venvProbe.data, venvProbe.isPlaceholderData]) // 打开后把焦点给第一个可编辑字段:新建时是任务标识,编辑时 ID 已锁定,跳名称。 // 原生 dialog 默认聚焦关闭按钮,不符合编辑表单的节奏。 @@ -626,7 +635,6 @@ export function TaskEditorModal({ @@ -1026,7 +1034,6 @@ function formatScriptCommandPreview( interface VenvDetectorBarProps { workingDir: string probe: VenvProbeResponse | undefined - pending: boolean failed: boolean creating: boolean onCreate: () => void @@ -1035,7 +1042,6 @@ interface VenvDetectorBarProps { function VenvDetectorBar({ workingDir, probe, - pending, failed, creating, onCreate, @@ -1048,20 +1054,16 @@ function VenvDetectorBar({ ) } - if (pending) { - return ( -
- ⏳ 正在探测解释器... -
- ) - } - - if (failed || !probe) { - return ( -
- ● 环境探测失败,可稍后重试 -
- ) + if (!probe) { + if (failed) { + return ( +
+ ● 环境探测失败,可稍后重试 +
+ ) + } + // 还没有最终结果:保持空状态,不显示跳动的“正在检测”。 + return
} if (probe.status === 'linked') {