From 850375158cc111ca7d4eb7b12cb4811e7a158e9b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=88=B1=E7=AC=91=E7=9A=84=E6=AF=9B=E6=AF=9B=E8=99=AB?=
<315515767@qq.com>
Date: Tue, 4 Aug 2026 19:57:11 +0800
Subject: [PATCH] =?UTF-8?q?fix(settings):=20=E6=8F=90=E7=A4=BA=E8=AF=8D?=
=?UTF-8?q?=E5=81=8F=E5=A5=BD=20-=20StrictMode=20=E5=8F=8C=E8=AF=B7?=
=?UTF-8?q?=E6=B1=82=E7=AB=9E=E6=80=81=E4=B8=8E=E5=8A=A0=E8=BD=BD=E5=A4=B1?=
=?UTF-8?q?=E8=B4=A5=E9=94=99=E8=AF=AF=E6=80=81=E7=BC=BA=E5=A4=B1=20(#125)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 引入 useRef 请求计数器,消除 React 18 StrictMode 双请求引起的状态竞态
- 新增 loadError 状态,加载失败时展示带重试按钮的错误态
- 避免网络错误时误导性地显示「暂无可配置的提示词模板」
Co-authored-by: sikongyue <3155157671@qq.com>
---
.../settings/prompt-preferences-pane.tsx | 24 ++++++++++++++++---
1 file changed, 21 insertions(+), 3 deletions(-)
diff --git a/web/src/pages/settings/prompt-preferences-pane.tsx b/web/src/pages/settings/prompt-preferences-pane.tsx
index ed0fc43b3..11d5077b4 100644
--- a/web/src/pages/settings/prompt-preferences-pane.tsx
+++ b/web/src/pages/settings/prompt-preferences-pane.tsx
@@ -1,6 +1,6 @@
import { Alert, App, Button, Input, Segmented, Select, Skeleton, Tabs, Tag } from "antd";
import { RotateCcw, Save, ShieldCheck, Undo2 } from "lucide-react";
-import { useEffect, useMemo, useState } from "react";
+import { useEffect, useMemo, useRef, useState } from "react";
import { PromptCodeEditor } from "@/components/prompt/prompt-code-editor";
import {
@@ -28,17 +28,27 @@ export function PromptPreferencesPane() {
const [rewriteContent, setRewriteContent] = useState("");
const [loading, setLoading] = useState(true);
const [saving, setSaving] = useState(false);
+ const [loadError, setLoadError] = useState("");
+ const requestIdRef = useRef(0);
const reload = async (preferredOperation?: string) => {
+ const reqId = ++requestIdRef.current;
setLoading(true);
+ setLoadError("");
try {
const result = await listUserPromptPreferences();
+ if (reqId !== requestIdRef.current) return;
setPreferences(result.preferences);
setSelectedOperation((current) => preferredOperation || current || result.preferences[0]?.definition.operation || "");
} catch (error) {
- message.error(error instanceof Error ? error.message : "读取提示词偏好失败");
+ if (reqId !== requestIdRef.current) return;
+ const msg = error instanceof Error ? error.message : "读取提示词偏好失败";
+ setLoadError(msg);
+ message.error(msg);
} finally {
- setLoading(false);
+ if (reqId === requestIdRef.current) {
+ setLoading(false);
+ }
}
};
@@ -123,6 +133,14 @@ export function PromptPreferencesPane() {
};
if (loading && preferences.length === 0) return