fix: preserve chat context after image generation by updating URL to /chat/id

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Your Name 2026-01-31 22:11:29 +08:00
parent 9fcb170483
commit 2e62d17317
2 changed files with 32 additions and 12 deletions

View File

@ -79,10 +79,18 @@ export function Chat({
// 最后一条已经是 AI 回复,说明生成已完成,清除 pending 状态
console.log("[Chat] 🎉 检测到生成已完成(最后消息是 AI 回复),清除 pending 状态");
completeGeneration();
} else if (lastMessage?.role === "user") {
// 最后一条是用户消息,可能还在生成中,或者已经完成但页面数据过期
} else if (lastMessage?.role === "user" || initialMessages.length === 0) {
// 最后一条是用户消息,或者消息列表为空(可能是从首页刷新)
// 标记已尝试刷新,然后刷新页面获取最新数据
hasTriedRefreshRef.current = true;
// 🆕 如果当前在首页但有 pending generation,先尝试跳转到 /chat/${id}
if (window.location.pathname === "/" || window.location.pathname === "") {
console.log("[Chat] 🔄 检测到首页有 pending 状态,跳转到 /chat/" + id);
window.location.href = `/chat/${id}`;
return;
}
console.log("[Chat] 🔄 检测到恢复的 pending 状态,刷新页面获取最新消息...");
// 延迟一小段时间再刷新,避免立即刷新
@ -91,7 +99,7 @@ export function Chat({
}, 500);
}
}
}, [pendingGeneration, initialMessages, completeGeneration, router]);
}, [pendingGeneration, initialMessages, completeGeneration, router, id]);
const { mutate } = useSWRConfig();
@ -293,6 +301,12 @@ export function Chat({
// 🆕 收到消息,清除持久化状态
completeGeneration();
// 🆕 如果当前在首页,更新 URL 为 /chat/${id},确保刷新后不会丢失消息
if (window.location.pathname === "/" || window.location.pathname === "") {
console.log("[Chat] 更新 URL 到 /chat/" + id);
window.history.replaceState({}, "", `/chat/${id}`);
}
setMessages((prevMessages) => {
if (prevMessages.some(m => m.id === messageData.id)) {
return prevMessages;
@ -320,6 +334,12 @@ export function Chat({
mutate(unstable_serialize(getChatHistoryPaginationKey));
// 🆕 生成完成,清除持久化状态
completeGeneration();
// 🆕 如果当前在首页,更新 URL 为 /chat/${id},确保刷新后不会丢失消息
if (window.location.pathname === "/" || window.location.pathname === "") {
console.log("[Chat] onFinish: 更新 URL 到 /chat/" + id);
window.history.replaceState({}, "", `/chat/${id}`);
}
},
onError: (error) => {
if (error instanceof ChatSDKError) {