chore: 注释websocket

This commit is contained in:
Junhui Chen 2025-08-07 01:16:58 +08:00
parent 3047215ada
commit b3b31baab2

View File

@ -3,10 +3,9 @@ import Chat from "@/components/ask/chat";
import AskHello from "@/components/ask/hello"; 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 { getWebSocketErrorMessage, getWebSocketManager, WsMessage } from "@/lib/websocket-util";
import { Assistant, Message } from "@/types/ask";
import { useWebSocketStreamHandler } from "@/hooks/useWebSocketStreamHandler"; import { useWebSocketStreamHandler } from "@/hooks/useWebSocketStreamHandler";
import { fetchApi } from "@/lib/server-api-util";
import { 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";
@ -33,7 +32,7 @@ export default function AskScreen() {
const scrollTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null); const scrollTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
const keyboardTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null); const keyboardTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
const abortControllerRef = useRef<AbortController | null>(null); const abortControllerRef = useRef<AbortController | null>(null);
const [isHello, setIsHello] = useState(true); const [isHello, setIsHello] = useState(true);
const [conversationId, setConversationId] = useState<string | null>(null); const [conversationId, setConversationId] = useState<string | null>(null);
const [userMessages, setUserMessages] = useState<Message[]>([]); const [userMessages, setUserMessages] = useState<Message[]>([]);
@ -50,12 +49,12 @@ export default function AskScreen() {
// 创建一个安全的滚动函数 // 创建一个安全的滚动函数
const scrollToEnd = useCallback((animated = true) => { const scrollToEnd = useCallback((animated = true) => {
if (!isMountedRef.current || !chatListRef.current) return; if (!isMountedRef.current || !chatListRef.current) return;
// 清理之前的定时器 // 清理之前的定时器
if (scrollTimeoutRef.current) { if (scrollTimeoutRef.current) {
clearTimeout(scrollTimeoutRef.current); clearTimeout(scrollTimeoutRef.current);
} }
scrollTimeoutRef.current = setTimeout(() => { scrollTimeoutRef.current = setTimeout(() => {
if (isMountedRef.current && chatListRef.current) { if (isMountedRef.current && chatListRef.current) {
try { try {
@ -70,7 +69,7 @@ export default function AskScreen() {
// 清理函数 // 清理函数
const cleanup = useCallback(() => { const cleanup = useCallback(() => {
isMountedRef.current = false; isMountedRef.current = false;
// 清理定时器 // 清理定时器
if (scrollTimeoutRef.current) { if (scrollTimeoutRef.current) {
clearTimeout(scrollTimeoutRef.current); clearTimeout(scrollTimeoutRef.current);
@ -80,7 +79,7 @@ export default function AskScreen() {
clearTimeout(keyboardTimeoutRef.current); clearTimeout(keyboardTimeoutRef.current);
keyboardTimeoutRef.current = null; keyboardTimeoutRef.current = null;
} }
// 取消API请求 // 取消API请求
if (abortControllerRef.current) { if (abortControllerRef.current) {
abortControllerRef.current.abort(); abortControllerRef.current.abort();
@ -101,7 +100,7 @@ export default function AskScreen() {
if (keyboardTimeoutRef.current) { if (keyboardTimeoutRef.current) {
clearTimeout(keyboardTimeoutRef.current); clearTimeout(keyboardTimeoutRef.current);
} }
keyboardTimeoutRef.current = setTimeout(() => { keyboardTimeoutRef.current = setTimeout(() => {
if (isMountedRef.current && !isHello) { if (isMountedRef.current && !isHello) {
scrollToEnd(); scrollToEnd();
@ -116,7 +115,7 @@ export default function AskScreen() {
if (keyboardTimeoutRef.current) { if (keyboardTimeoutRef.current) {
clearTimeout(keyboardTimeoutRef.current); clearTimeout(keyboardTimeoutRef.current);
} }
keyboardTimeoutRef.current = setTimeout(() => { keyboardTimeoutRef.current = setTimeout(() => {
if (isMountedRef.current && !isHello) { if (isMountedRef.current && !isHello) {
scrollToEnd(false); scrollToEnd(false);
@ -141,20 +140,20 @@ export default function AskScreen() {
enableBatching: false // AskScreen使用实时模式 enableBatching: false // AskScreen使用实时模式
}); });
useFocusEffect( // useFocusEffect(
useCallback(() => { // useCallback(() => {
isMountedRef.current = true; // isMountedRef.current = true;
// 订阅WebSocket消息
const unsubscribe = subscribeToWebSocket();
return () => { // // 订阅WebSocket消息
// 取消订阅和执行清理 // const unsubscribe = subscribeToWebSocket();
unsubscribe();
cleanup(); // return () => {
}; // // 取消订阅和执行清理
}, [subscribeToWebSocket, cleanup]) // unsubscribe();
); // cleanup();
// };
// }, [subscribeToWebSocket, cleanup])
// );
// 创建动画样式 // 创建动画样式
const welcomeStyle = useAnimatedStyle(() => { const welcomeStyle = useAnimatedStyle(() => {
@ -181,10 +180,10 @@ export default function AskScreen() {
if (sessionId && isMountedRef.current) { if (sessionId && isMountedRef.current) {
setConversationId(sessionId); setConversationId(sessionId);
setIsHello(false); setIsHello(false);
// 创建新的AbortController // 创建新的AbortController
abortControllerRef.current = new AbortController(); abortControllerRef.current = new AbortController();
fetchApi<Message[]>(`/chats/${sessionId}/message-history`, { fetchApi<Message[]>(`/chats/${sessionId}/message-history`, {
signal: abortControllerRef.current.signal signal: abortControllerRef.current.signal
}).then((res) => { }).then((res) => {
@ -222,70 +221,70 @@ export default function AskScreen() {
return ( return (
<View style={[styles.container, { paddingTop: insets.top, paddingBottom: insets.bottom }]}> <View style={[styles.container, { paddingTop: insets.top, paddingBottom: insets.bottom }]}>
{/* 导航栏 */} {/* 导航栏 */}
<View style={[styles.navbar, isHello && styles.hiddenNavbar]}> <View style={[styles.navbar, isHello && styles.hiddenNavbar]}>
<TouchableOpacity <TouchableOpacity
style={styles.backButton} style={styles.backButton}
onPress={() => { onPress={() => {
try { try {
if (TextInput.State?.currentlyFocusedInput) { if (TextInput.State?.currentlyFocusedInput) {
const input = TextInput.State.currentlyFocusedInput(); const input = TextInput.State.currentlyFocusedInput();
if (input) input.blur(); if (input) input.blur();
}
} catch (error) {
console.log('失去焦点失败:', error);
} }
Keyboard.dismiss(); } catch (error) {
router.push('/memo-list'); console.log('失去焦点失败:', error);
}} }
> Keyboard.dismiss();
<ReturnArrow /> router.push('/memo-list');
</TouchableOpacity> }}
<ThemedText style={styles.title} onPress={() => { router.push('/owner') }}>MemoWake</ThemedText> >
<View style={styles.placeholder} /> <ReturnArrow />
</TouchableOpacity>
<ThemedText style={styles.title} onPress={() => { router.push('/owner') }}>MemoWake</ThemedText>
<View style={styles.placeholder} />
</View>
<View style={styles.contentContainer}>
{/* 欢迎页面 */}
<Animated.View
style={[styles.absoluteView, welcomeStyle, { zIndex: 1 }]}
>
<AskHello setUserMessages={setUserMessages} setConversationId={setConversationId} setIsHello={setIsHello} />
</Animated.View>
{/* 聊天页面 */}
<Animated.View
style={[styles.absoluteView, chatStyle, { zIndex: 0 }]}
>
<Chat
ref={chatListRef}
userMessages={userMessages}
sessionId={sessionId}
setSelectedImages={setSelectedImages}
selectedImages={selectedImages}
style={styles.chatContainer}
contentContainerStyle={styles.chatContentContainer}
showsVerticalScrollIndicator={false}
// onContentSizeChange={() => scrollToEnd()}
/>
</Animated.View>
</View>
{/* 输入框区域 */}
<KeyboardAvoidingView
behavior={Platform.OS === "ios" ? "padding" : "height"}
keyboardVerticalOffset={0} >
<View style={styles.inputContainer} key={conversationId}>
<SendMessage
setIsHello={setIsHello}
conversationId={conversationId}
setConversationId={setConversationId}
setUserMessages={setUserMessages}
selectedImages={selectedImages}
setSelectedImages={setSelectedImages}
/>
</View> </View>
</KeyboardAvoidingView>
<View style={styles.contentContainer}>
{/* 欢迎页面 */}
<Animated.View
style={[styles.absoluteView, welcomeStyle, { zIndex: 1 }]}
>
<AskHello setUserMessages={setUserMessages} setConversationId={setConversationId} setIsHello={setIsHello} />
</Animated.View>
{/* 聊天页面 */}
<Animated.View
style={[styles.absoluteView, chatStyle, { zIndex: 0 }]}
>
<Chat
ref={chatListRef}
userMessages={userMessages}
sessionId={sessionId}
setSelectedImages={setSelectedImages}
selectedImages={selectedImages}
style={styles.chatContainer}
contentContainerStyle={styles.chatContentContainer}
showsVerticalScrollIndicator={false}
// onContentSizeChange={() => scrollToEnd()}
/>
</Animated.View>
</View>
{/* 输入框区域 */}
<KeyboardAvoidingView
behavior={Platform.OS === "ios" ? "padding" : "height"}
keyboardVerticalOffset={0} >
<View style={styles.inputContainer} key={conversationId}>
<SendMessage
setIsHello={setIsHello}
conversationId={conversationId}
setConversationId={setConversationId}
setUserMessages={setUserMessages}
selectedImages={selectedImages}
setSelectedImages={setSelectedImages}
/>
</View>
</KeyboardAvoidingView>
</View> </View>
); );
} }