fix(roundtable): 修复管理员连续编辑第二条他人业务链保存 404「已删除」
编辑器 chainId 闸门由「整组件生命周期只加载一次」改为「按已应用的 chainId 追踪、变化即重载」。 此编辑器实例在多次导航间可能不卸载(从业务链弹窗进来时尤甚),旧闸门导致第二次打开另一条链条 时根本不加载,currentChainId 停在上一条 → 保存打到错误 id → 后端 404,必须重新登录才恢复。 同一 chainId 不重复加载、也不覆盖编辑器内的手动切换;getChain 取不到时给出明确提示。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
f13a1bb7fe
commit
6b963fd918
1 file changed
+11
-6
@@ -327,17 +327,21 @@ export default function BusinessChainEditorPage() {
|
||||
setStep(1);
|
||||
}, []);
|
||||
|
||||
// ─── URL 参数 chainId:从「业务链条」弹窗点「设置」进来时自动切到该链条 ──────
|
||||
// 只在链条列表加载完后应用一次(用 ref 闸门避免覆盖用户后续的手动切换)。
|
||||
const appliedChainParamRef = useRef(false);
|
||||
// ─── URL 参数 chainId:从「业务链条」弹窗 / 列表点「设置」进来时自动切到该链条 ──────
|
||||
// 按「已应用的 chainId」做闸门(而非「只应用一次」):当 URL 的 chainId 变化时重新加载。
|
||||
// 关键修复:此编辑器实例在多次导航间可能不卸载(从弹窗进来时尤甚),用「只应用一次」的
|
||||
// 旧闸门会导致第二次打开另一条链条时根本不加载,currentChainId 停在上一条 → 保存打到错误
|
||||
// 的 id → 后端 404「已删除」,必须重新登录(整页刷新重建组件)才恢复。改为追踪已应用的 id
|
||||
// 后,chainId 变了就重载;同一 chainId 不重复加载,也不覆盖用户在编辑器内的手动切换。
|
||||
const appliedChainIdRef = useRef<string | null>(null);
|
||||
useEffect(() => {
|
||||
if (appliedChainParamRef.current) return;
|
||||
const chainId = searchParams.get("chainId");
|
||||
if (!chainId) return;
|
||||
appliedChainParamRef.current = true; // 只应用一次,之后不覆盖用户手动切换
|
||||
if (appliedChainIdRef.current === chainId) return; // 这条已加载过,别覆盖用户后续操作
|
||||
appliedChainIdRef.current = chainId;
|
||||
// 优先用「我的链条」列表里已拉到的对象(省一次请求);不在列表里(管理员从「全部链条」
|
||||
// 点设置 / 公共链条 / 自己没有任何链条)则直接按 id 拉取。后端对管理员放开任意链条、
|
||||
// 对所有人放开已发布公共链条;拉不到则静默保持空白新建态。
|
||||
// 对所有人放开已发布公共链条;拉不到给出提示并保持空白新建态。
|
||||
const local = chains.find((c) => c.id === chainId);
|
||||
if (local) {
|
||||
loadChain(local);
|
||||
@@ -347,6 +351,7 @@ export default function BusinessChainEditorPage() {
|
||||
try {
|
||||
const chain = await getChain(chainId);
|
||||
if (chain) loadChain(chain);
|
||||
else toast.error("该业务链条不存在或无权访问");
|
||||
} catch {
|
||||
// 静默:取不到就保持当前(空白)状态。
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user