Commit 410bdbde by weiyudumei

refactor: 统一使用流结束设置 endAnswerFlag,移除对服务端字段的依赖

parent 317afc2b
......@@ -286,6 +286,26 @@ export const Chat: React.FC = () => {
if (msg.content?.name === 'AbortError') {
return
}
// 设置最后一条 AI 回答的 endAnswerFlag,用于停止打字效果
setAllItems((prevItems) => {
const newItems = [...prevItems]
// 从后往前找到最后一个 AI 项
for (let i = newItems.length - 1; i >= 0; i--) {
if (newItems[i].role === 'ai' && newItems[i].answerList?.[0]) {
newItems[i] = {
...newItems[i],
answerList: [
{
...newItems[i].answerList[0],
endAnswerFlag: true,
},
],
}
break
}
}
return newItems
})
return
}
......@@ -304,6 +324,26 @@ export const Chat: React.FC = () => {
)
.then(() => {
// 流结束时执行(通过 Promise resolve 判断)
// 设置最后一条 AI 回答的 endAnswerFlag,用于控制打字效果结束
setAllItems((prevItems) => {
const newItems = [...prevItems]
// 从后往前找到最后一个 AI 项
for (let i = newItems.length - 1; i >= 0; i--) {
if (newItems[i].role === 'ai' && newItems[i].answerList?.[0]) {
newItems[i] = {
...newItems[i],
answerList: [
{
...newItems[i].answerList[0],
endAnswerFlag: true,
},
],
}
break
}
}
return newItems
})
dispatch(setIsAsking(false))
if (isNew) {
setTimeout(() => {
......@@ -314,6 +354,26 @@ export const Chat: React.FC = () => {
.catch((error) => {
// 流式请求出错时的处理
console.error('[Chat] 流式请求失败:', error)
// 设置最后一条 AI 回答的 endAnswerFlag,用于停止打字效果
setAllItems((prevItems) => {
const newItems = [...prevItems]
// 从后往前找到最后一个 AI 项
for (let i = newItems.length - 1; i >= 0; i--) {
if (newItems[i].role === 'ai' && newItems[i].answerList?.[0]) {
newItems[i] = {
...newItems[i],
answerList: [
{
...newItems[i].answerList[0],
endAnswerFlag: true,
},
],
}
break
}
}
return newItems
})
dispatch(setIsAsking(false))
})
}
......
......@@ -511,6 +511,26 @@ export const TacticsChat: React.FC = () => {
if (msg.content?.name === 'AbortError') {
return
}
// 设置最后一条 AI 回答的 endAnswerFlag,用于停止打字效果
setAllItems((prevItems) => {
const newItems = [...prevItems]
// 从后往前找到最后一个 AI 项
for (let i = newItems.length - 1; i >= 0; i--) {
if (newItems[i].role === 'ai' && newItems[i].answerList?.[0]) {
newItems[i] = {
...newItems[i],
answerList: [
{
...newItems[i].answerList[0],
endAnswerFlag: true,
},
],
}
break
}
}
return newItems
})
// 其他错误也可以在这里显示错误消息
return
}
......@@ -531,6 +551,26 @@ export const TacticsChat: React.FC = () => {
.then(() => {
// 流结束时执行(通过 Promise resolve 判断,而不是 END 消息)
console.log('[TacticsChat] 流式响应已完成')
// 设置最后一条 AI 回答的 endAnswerFlag,用于控制打字效果结束
setAllItems((prevItems) => {
const newItems = [...prevItems]
// 从后往前找到最后一个 AI 项
for (let i = newItems.length - 1; i >= 0; i--) {
if (newItems[i].role === 'ai' && newItems[i].answerList?.[0]) {
newItems[i] = {
...newItems[i],
answerList: [
{
...newItems[i].answerList[0],
endAnswerFlag: true,
},
],
}
break
}
}
return newItems
})
dispatch(setIsAsking(false))
if (isNew) {
setTimeout(() => {
......@@ -541,6 +581,26 @@ export const TacticsChat: React.FC = () => {
.catch((error) => {
// 流式请求出错时的处理
console.error('[TacticsChat] 流式请求失败:', error)
// 设置最后一条 AI 回答的 endAnswerFlag,用于停止打字效果
setAllItems((prevItems) => {
const newItems = [...prevItems]
// 从后往前找到最后一个 AI 项
for (let i = newItems.length - 1; i >= 0; i--) {
if (newItems[i].role === 'ai' && newItems[i].answerList?.[0]) {
newItems[i] = {
...newItems[i],
answerList: [
{
...newItems[i].answerList[0],
endAnswerFlag: true,
},
],
}
break
}
}
return newItems
})
dispatch(setIsAsking(false))
})
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment