feat: add task confirmation when switching conversations
- Prompt user to confirm when switching/creating conversation with active task - Automatically stop running task after user confirmation - Filter out events from previous conversation to prevent cross-talk - Show toast notification after task is stopped Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
801d20591c
commit
0e4f625338
@ -169,6 +169,46 @@ export const conversationMethods = {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 检查是否有运行中的任务,如果有则提示用户
|
||||||
|
let hasActiveTask = false;
|
||||||
|
try {
|
||||||
|
const { useTaskStore } = await import('../../stores/task');
|
||||||
|
const taskStore = useTaskStore();
|
||||||
|
|
||||||
|
if (taskStore.hasActiveTask) {
|
||||||
|
hasActiveTask = true;
|
||||||
|
|
||||||
|
// 显示提示
|
||||||
|
const confirmed = await this.confirmAction({
|
||||||
|
title: '切换对话',
|
||||||
|
message: '当前有任务正在执行,切换对话后任务会停止。确定要切换吗?',
|
||||||
|
confirmText: '切换',
|
||||||
|
cancelText: '取消'
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!confirmed) {
|
||||||
|
// 用户取消切换
|
||||||
|
this.suppressTitleTyping = false;
|
||||||
|
this.titleReady = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 用户确认,停止任务
|
||||||
|
debugLog('[切换对话] 用户确认,正在停止任务...');
|
||||||
|
await taskStore.cancelTask();
|
||||||
|
taskStore.clearTask();
|
||||||
|
|
||||||
|
// 重置任务相关状态
|
||||||
|
this.streamingMessage = false;
|
||||||
|
this.taskInProgress = false;
|
||||||
|
this.stopRequested = false;
|
||||||
|
|
||||||
|
debugLog('[切换对话] 任务已停止');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('[切换对话] 检查/停止任务失败:', error);
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// 1. 调用加载API
|
// 1. 调用加载API
|
||||||
const response = await fetch(`/api/conversations/${conversationId}/load`, {
|
const response = await fetch(`/api/conversations/${conversationId}/load`, {
|
||||||
@ -205,6 +245,16 @@ export const conversationMethods = {
|
|||||||
messagesLen: Array.isArray(this.messages) ? this.messages.length : 'n/a'
|
messagesLen: Array.isArray(this.messages) ? this.messages.length : 'n/a'
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 如果停止了任务,显示提示
|
||||||
|
if (hasActiveTask) {
|
||||||
|
this.uiPushToast({
|
||||||
|
title: '任务已停止',
|
||||||
|
message: '切换对话后,之前的任务已停止',
|
||||||
|
type: 'info',
|
||||||
|
duration: 3000
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
console.error('对话加载失败:', result.message);
|
console.error('对话加载失败:', result.message);
|
||||||
this.suppressTitleTyping = false;
|
this.suppressTitleTyping = false;
|
||||||
@ -247,6 +297,44 @@ export const conversationMethods = {
|
|||||||
});
|
});
|
||||||
this.logMessageState('createNewConversation:start');
|
this.logMessageState('createNewConversation:start');
|
||||||
|
|
||||||
|
// 检查是否有运行中的任务,如果有则提示用户
|
||||||
|
let hasActiveTask = false;
|
||||||
|
try {
|
||||||
|
const { useTaskStore } = await import('../../stores/task');
|
||||||
|
const taskStore = useTaskStore();
|
||||||
|
|
||||||
|
if (taskStore.hasActiveTask) {
|
||||||
|
hasActiveTask = true;
|
||||||
|
|
||||||
|
// 显示提示
|
||||||
|
const confirmed = await this.confirmAction({
|
||||||
|
title: '创建新对话',
|
||||||
|
message: '当前有任务正在执行,创建新对话后任务会停止。确定要创建吗?',
|
||||||
|
confirmText: '创建',
|
||||||
|
cancelText: '取消'
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!confirmed) {
|
||||||
|
// 用户取消创建
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 用户确认,停止任务
|
||||||
|
debugLog('[创建新对话] 用户确认,正在停止任务...');
|
||||||
|
await taskStore.cancelTask();
|
||||||
|
taskStore.clearTask();
|
||||||
|
|
||||||
|
// 重置任务相关状态
|
||||||
|
this.streamingMessage = false;
|
||||||
|
this.taskInProgress = false;
|
||||||
|
this.stopRequested = false;
|
||||||
|
|
||||||
|
debugLog('[创建新对话] 任务已停止');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('[创建新对话] 检查/停止任务失败:', error);
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const response = await fetch('/api/conversations', {
|
const response = await fetch('/api/conversations', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
@ -294,6 +382,16 @@ export const conversationMethods = {
|
|||||||
newConversationId,
|
newConversationId,
|
||||||
conversationsLen: Array.isArray(this.conversations) ? this.conversations.length : 'n/a'
|
conversationsLen: Array.isArray(this.conversations) ? this.conversations.length : 'n/a'
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 如果停止了任务,显示提示
|
||||||
|
if (hasActiveTask) {
|
||||||
|
this.uiPushToast({
|
||||||
|
title: '任务已停止',
|
||||||
|
message: '创建新对话后,之前的任务已停止',
|
||||||
|
type: 'info',
|
||||||
|
duration: 3000
|
||||||
|
});
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
console.error('创建对话失败:', result.message);
|
console.error('创建对话失败:', result.message);
|
||||||
this.uiPushToast({
|
this.uiPushToast({
|
||||||
|
|||||||
@ -18,6 +18,15 @@ export const taskPollingMethods = {
|
|||||||
const eventData = event.data || {};
|
const eventData = event.data || {};
|
||||||
const eventIdx = event.idx;
|
const eventIdx = event.idx;
|
||||||
|
|
||||||
|
// 检查事件的 conversation_id 是否匹配当前对话
|
||||||
|
// 如果不匹配,忽略该事件(避免切换对话后旧任务的事件显示到新对话中)
|
||||||
|
if (eventData.conversation_id && this.currentConversationId) {
|
||||||
|
if (eventData.conversation_id !== this.currentConversationId) {
|
||||||
|
debugLog(`[TaskPolling] 忽略不匹配的事件 #${eventIdx}: ${eventType}, 事件对话=${eventData.conversation_id}, 当前对话=${this.currentConversationId}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
debugLog(`[TaskPolling] 处理事件 #${eventIdx}: ${eventType}`, eventData);
|
debugLog(`[TaskPolling] 处理事件 #${eventIdx}: ${eventType}`, eventData);
|
||||||
|
|
||||||
// 根据事件类型调用对应的处理方法
|
// 根据事件类型调用对应的处理方法
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user