From bb4c974b746d201f52d29c5af3ea3c59d9db2c22 Mon Sep 17 00:00:00 2001 From: sp mac bookpro 2605 Date: Sun, 2 Aug 2026 15:39:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=AE=BF=E9=97=AE=E4=BB=96?= =?UTF-8?q?=E4=BA=BA=E4=BC=9A=E8=AF=9D=E6=97=B6=E6=8F=90=E7=A4=BA=E6=97=A0?= =?UTF-8?q?=E6=9D=83=E8=AE=BF=E9=97=AE=E5=B9=B6=E5=8D=A1=E6=AD=BB=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 useChatData 中捕获加载历史消息(ChatAPI.history)时的权限和不存在错误 - 发生 500000 无权访问等错误时,触发 roomInvalidTick 状态更新 - ChatPageLogic 监听到失效状态后,自动调用 SessionAPI.create 创建新的会话房间并重定向,同时给予提示 --- src/pages/chat/ChatPageLogic.ts | 17 ++++++++++++++++- src/pages/chat/hooks/useChatData.ts | 27 ++++++++++++++++++++------- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/pages/chat/ChatPageLogic.ts b/src/pages/chat/ChatPageLogic.ts index 1506fe5..9dd2499 100644 --- a/src/pages/chat/ChatPageLogic.ts +++ b/src/pages/chat/ChatPageLogic.ts @@ -105,7 +105,7 @@ export function useChatPageLogic() { // eslint-disable-next-line react-hooks/exhaustive-deps }, [id, roomId]); - const { agent, agentList, messages, setMessages, branches, setBranches, loadMessages } = useChatData({ + const { agent, agentList, messages, setMessages, branches, setBranches, loadMessages, roomInvalidTick } = useChatData({ agentId: id, roomId, highlightId, @@ -116,6 +116,21 @@ export function useChatPageLogic() { abort: () => abortRef.current?.abort(), }); + // 监听会话失效状态,自动创建新会话 + useEffect(() => { + if (roomInvalidTick > 0 && id) { + SessionAPI.create(id).then((created) => { + setRoomId(created.id); + setHighlightId(null); + setMessages(() => []); + setBranches({}); + message.info('当前会话不可访问,已为您创建新会话'); + }).catch((e) => { + message.error('创建房间失败:' + (e?.message ?? e)); + }); + } + }, [roomInvalidTick, id]); + const sender = useChatSender({ agentId: id, agent, diff --git a/src/pages/chat/hooks/useChatData.ts b/src/pages/chat/hooks/useChatData.ts index 580588e..399976c 100644 --- a/src/pages/chat/hooks/useChatData.ts +++ b/src/pages/chat/hooks/useChatData.ts @@ -20,9 +20,10 @@ export function useChatData(args: { const [agentList, setAgentList] = useState([]); const [messages, setMessages] = useState([]); const [branches, setBranches] = useState>({}); + const [roomInvalidTick, setRoomInvalidTick] = useState(0); const loadSeqRef = useRef(0); const initialHighlightDoneRef = useRef(false); - + useEffect(() => { initialHighlightDoneRef.current = false; }, [agentId, roomId]); @@ -60,11 +61,22 @@ export function useChatData(args: { if (!roomId) return; const seq = ++loadSeqRef.current; const rid = roomId; - const his = await ChatAPI.history(rid); - if (seq !== loadSeqRef.current) return; - if (rid !== roomId) return; - setMessages(Array.isArray(his.messages) ? his.messages : []); - setBranches(his.branches || {}); + try { + const his = await ChatAPI.history(rid); + if (seq !== loadSeqRef.current) return; + if (rid !== roomId) return; + setMessages(Array.isArray(his.messages) ? his.messages : []); + setBranches(his.branches || {}); + } catch (e: any) { + // 会话不存在或无权访问时,通知上层重新创建会话 + if (seq === loadSeqRef.current && rid === roomId) { + const code = e?.response?.data?.code; + const msg = e?.response?.data?.error ?? e?.message ?? ''; + if (code === '500000' || /无权访问|不存在/.test(msg)) { + setRoomInvalidTick((t) => t + 1); + } + } + } // 历史消息加载完成后的处理 // 注意:这里不再手动触发滚动,全部交给 ChatBody 的 useLayoutEffect 和 useEffect 处理 @@ -132,6 +144,7 @@ export function useChatData(args: { setMessages, branches, setBranches, - loadMessages + loadMessages, + roomInvalidTick }; }