fix(chat): guard null history messages

main
sp mac bookpro 2605 2026-05-29 15:50:41 +08:00
parent 72dc484f80
commit f0271c9027
1 changed files with 10 additions and 10 deletions

View File

@ -116,8 +116,8 @@ export default function ChatPage() {
const loadMessages = async () => { const loadMessages = async () => {
if (!id || !sessionId) return; if (!id || !sessionId) return;
const his = await ChatAPI.history(id, sessionId); const his = await ChatAPI.history(id, sessionId);
setMessages(his.messages); setMessages(Array.isArray(his.messages) ? his.messages : []);
setBranches(his.branches); setBranches(his.branches || {});
requestAnimationFrame(() => { requestAnimationFrame(() => {
if (highlightId) { if (highlightId) {
const el = document.getElementById('msg-' + highlightId); const el = document.getElementById('msg-' + highlightId);
@ -185,7 +185,7 @@ export default function ChatPage() {
content: text, content: text,
createdAt: Date.now() createdAt: Date.now()
}; };
setMessages((m) => [...m, tempUser]); setMessages((m) => [...(m || []), tempUser]);
setStreaming({ active: true, text: '', retrieved: [], toolCalls: [] }); setStreaming({ active: true, text: '', retrieved: [], toolCalls: [] });
scrollBottom(); scrollBottom();
@ -226,7 +226,7 @@ export default function ChatPage() {
return { ...s, toolCalls: list }; return { ...s, toolCalls: list };
}), }),
onDone: (data) => { onDone: (data) => {
setMessages((m) => [...m.filter((x) => x.id !== tempUser.id), data.user, data.assistant]); setMessages((m) => [...(m || []).filter((x) => x.id !== tempUser.id), data.user, data.assistant]);
setStreaming({ active: false, text: '', retrieved: [], toolCalls: [] }); setStreaming({ active: false, text: '', retrieved: [], toolCalls: [] });
setSessionRefresh((t) => t + 1); setSessionRefresh((t) => t + 1);
setAttachments([]); // 用完即清 setAttachments([]); // 用完即清
@ -236,7 +236,7 @@ export default function ChatPage() {
onAborted: (data) => { onAborted: (data) => {
// 已停止保留已生成内容user 消息也留下(用 tempUser 占位) // 已停止保留已生成内容user 消息也留下(用 tempUser 占位)
setMessages((m) => [ setMessages((m) => [
...m.filter((x) => x.id !== tempUser.id), ...(m || []).filter((x) => x.id !== tempUser.id),
{ ...tempUser, id: 'u-' + data.assistant.id }, // 占位 { ...tempUser, id: 'u-' + data.assistant.id }, // 占位
data.assistant data.assistant
]); ]);
@ -247,7 +247,7 @@ export default function ChatPage() {
}, },
onError: (errMsg) => { onError: (errMsg) => {
msg.error('流式失败:' + errMsg); msg.error('流式失败:' + errMsg);
setMessages((m) => m.filter((x) => x.id !== tempUser.id)); setMessages((m) => (m || []).filter((x) => x.id !== tempUser.id));
setStreaming({ active: false, text: '', retrieved: [], toolCalls: [] }); setStreaming({ active: false, text: '', retrieved: [], toolCalls: [] });
} }
}, },
@ -260,7 +260,7 @@ export default function ChatPage() {
if (e?.name !== 'AbortError') { if (e?.name !== 'AbortError') {
msg.error('请求失败:' + (e?.message ?? e)); msg.error('请求失败:' + (e?.message ?? e));
} }
setMessages((m) => m.filter((x) => x.id !== tempUser.id)); setMessages((m) => (m || []).filter((x) => x.id !== tempUser.id));
setStreaming({ active: false, text: '', retrieved: [], toolCalls: [] }); setStreaming({ active: false, text: '', retrieved: [], toolCalls: [] });
} }
}; };
@ -273,7 +273,7 @@ export default function ChatPage() {
content: text, content: text,
createdAt: Date.now() createdAt: Date.now()
}; };
setMessages((m) => [...m, tempUser]); setMessages((m) => [...(m || []), tempUser]);
scrollBottom(); scrollBottom();
const attText = buildAttachmentsText(); const attText = buildAttachmentsText();
const content = attText ? `${text}\n\n${attText}` : text; const content = attText ? `${text}\n\n${attText}` : text;
@ -286,14 +286,14 @@ export default function ChatPage() {
model, model,
imageUrls imageUrls
); );
setMessages((m) => [...m.filter((x) => x.id !== tempUser.id), res.user, res.assistant]); setMessages((m) => [...(m || []).filter((x) => x.id !== tempUser.id), res.user, res.assistant]);
setSessionRefresh((t) => t + 1); setSessionRefresh((t) => t + 1);
setAttachments([]); setAttachments([]);
setImageUrls([]); setImageUrls([]);
scrollBottom(); scrollBottom();
} catch (e: any) { } catch (e: any) {
msg.error('发送失败:' + (e?.message ?? e)); msg.error('发送失败:' + (e?.message ?? e));
setMessages((m) => m.filter((x) => x.id !== tempUser.id)); setMessages((m) => (m || []).filter((x) => x.id !== tempUser.id));
} }
}; };