This commit is contained in:
Junhui Chen 2025-08-06 20:11:40 +08:00
parent 0e86fe5659
commit b1ba4edffc

View File

@ -4,7 +4,8 @@ import AskHello from "@/components/ask/hello";
import SendMessage from "@/components/ask/send"; import SendMessage from "@/components/ask/send";
import { ThemedText } from "@/components/ThemedText"; import { ThemedText } from "@/components/ThemedText";
import { fetchApi } from "@/lib/server-api-util"; import { fetchApi } from "@/lib/server-api-util";
import { Message } from "@/types/ask"; import { getWebSocketErrorMessage, webSocketManager, WsMessage } from "@/lib/websocket-util";
import { Assistant, Message } from "@/types/ask";
import { useFocusEffect, useLocalSearchParams, useRouter } from "expo-router"; import { useFocusEffect, useLocalSearchParams, useRouter } from "expo-router";
import { useCallback, useEffect, useRef, useState } from 'react'; import { useCallback, useEffect, useRef, useState } from 'react';
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
@ -97,92 +98,124 @@ export default function AskScreen() {
}; };
}, [isHello]); }, [isHello]);
// useFocusEffect( useFocusEffect(
// useCallback(() => { useCallback(() => {
// webSocketManager.connect(); webSocketManager.connect();
// const handleChatStream = (message: WsMessage) => { const handleChatStream = (message: WsMessage) => {
// if (message.type === 'ChatStream') { if (message.type === 'ChatStream') {
// setUserMessages(prevMessages => { setUserMessages(prevMessages => {
// const newMessages = [...prevMessages]; const lastMessage = prevMessages[prevMessages.length - 1];
// const lastMessage = newMessages[newMessages.length - 1];
// 检查是否是有效的助手消息
if (!lastMessage || lastMessage.role !== Assistant) {
return prevMessages;
}
// if (lastMessage && lastMessage.role === Assistant) { // 创建新的消息数组
// if (typeof lastMessage.content === 'string') { const newMessages = [...prevMessages];
// if (lastMessage.content === 'keepSearchIng') {
// // 第一次收到流式消息,替换占位符 if (typeof lastMessage.content === 'string') {
// lastMessage.content = message.chunk; if (lastMessage.content === 'keepSearchIng') {
// } else { // 第一次收到流式消息,替换占位符
// // 持续追加流式消息 newMessages[newMessages.length - 1] = {
// lastMessage.content += message.chunk; ...lastMessage,
// } content: message.chunk
// } else { };
// // 如果 content 是数组,则更新第一个 text 部分 } else {
// const textPart = lastMessage.content.find(p => p.type === 'text'); // 持续追加流式消息
// if (textPart) { newMessages[newMessages.length - 1] = {
// textPart.text = (textPart.text || '') + message.chunk; ...lastMessage,
// } content: lastMessage.content + message.chunk
// } };
// } }
// return newMessages; } else {
// }); // 如果 content 是数组,则更新第一个 text 部分
// } const textPartIndex = lastMessage.content.findIndex(p => p.type === 'text');
// }; if (textPartIndex !== -1) {
const updatedContent = [...lastMessage.content];
updatedContent[textPartIndex] = {
...updatedContent[textPartIndex],
text: (updatedContent[textPartIndex].text || '') + message.chunk
};
newMessages[newMessages.length - 1] = {
...lastMessage,
content: updatedContent
};
}
}
return newMessages;
});
}
};
// const handleChatStreamEnd = (message: WsMessage) => { const handleChatStreamEnd = (message: WsMessage) => {
// if (message.type === 'ChatStreamEnd') { if (message.type === 'ChatStreamEnd') {
// setUserMessages(prevMessages => { setUserMessages(prevMessages => {
// const newMessages = [...prevMessages]; const lastMessage = prevMessages[prevMessages.length - 1];
// const lastMessage = newMessages[newMessages.length - 1];
// if (lastMessage && lastMessage.role === Assistant) { // 检查是否是有效的助手消息
// // 使用最终消息替换流式消息,确保 message.message 存在 if (!lastMessage || lastMessage.role !== Assistant) {
// if (message.message) { return prevMessages;
// newMessages[newMessages.length - 1] = message.message as Message; }
// } else {
// // 如果最终消息为空,则移除 'keepSearchIng' 占位符
// return prevMessages.filter(m => !(typeof m.content === 'string' && m.content === 'keepSearchIng'));
// }
// }
// return newMessages;
// });
// }
// };
// const handleError = (message: WsMessage) => { // 使用最终消息替换流式消息,确保 message.message 存在
// if (message.type === 'Error') { if (message.message) {
// console.log(`WebSocket Error: ${message.code} - ${message.message}`); const newMessages = [...prevMessages];
// // 可以在这里添加错误提示,例如替换最后一条消息为错误信息 newMessages[newMessages.length - 1] = message.message as Message;
// setUserMessages(prev => { return newMessages;
// // 创建新的数组和新的消息对象 } else {
// return prev.map((msg, index) => { // 如果最终消息为空,则移除 'keepSearchIng' 占位符
// if (index === prev.length - 1 && return prevMessages.filter(m =>
// typeof msg.content === 'string' && !(typeof m.content === 'string' && m.content === 'keepSearchIng')
// msg.content === 'keepSearchIng') { );
// // 返回新的消息对象 }
// return { });
// ...msg, }
// content: getWebSocketErrorMessage(message.code, t) };
// };
// }
// return msg;
// });
// });
// }
// };
// webSocketManager.subscribe('ChatStream', handleChatStream); const handleError = (message: WsMessage) => {
// webSocketManager.subscribe('ChatStreamEnd', handleChatStreamEnd); if (message.type === 'Error') {
// webSocketManager.subscribe('Error', handleError); console.log(`WebSocket Error: ${message.code} - ${message.message}`);
setUserMessages(prevMessages => {
const lastMessage = prevMessages[prevMessages.length - 1];
// 检查是否是有效的助手消息且包含占位符
if (!lastMessage ||
lastMessage.role !== Assistant ||
typeof lastMessage.content !== 'string' ||
lastMessage.content !== 'keepSearchIng') {
return prevMessages;
}
// return () => { // 替换占位符为错误消息
// webSocketManager.unsubscribe('ChatStream', handleChatStream); const newMessages = [...prevMessages];
// webSocketManager.unsubscribe('ChatStreamEnd', handleChatStreamEnd); newMessages[newMessages.length - 1] = {
// webSocketManager.unsubscribe('Error', handleError); ...lastMessage,
// // 可以在这里选择断开连接,或者保持连接以加快下次进入页面的速度 content: getWebSocketErrorMessage(message.code, t)
// // webSocketManager.disconnect(); };
// };
// }, []) return newMessages;
// ); });
}
};
webSocketManager.subscribe('ChatStream', handleChatStream);
webSocketManager.subscribe('ChatStreamEnd', handleChatStreamEnd);
webSocketManager.subscribe('Error', handleError);
return () => {
webSocketManager.unsubscribe('ChatStream', handleChatStream);
webSocketManager.unsubscribe('ChatStreamEnd', handleChatStreamEnd);
webSocketManager.unsubscribe('Error', handleError);
// 可以在这里选择断开连接,或者保持连接以加快下次进入页面的速度
// webSocketManager.disconnect();
};
}, [t])
);
// 创建动画样式 // 创建动画样式
const welcomeStyle = useAnimatedStyle(() => { const welcomeStyle = useAnimatedStyle(() => {