diff --git a/app/(tabs)/ask.tsx b/app/(tabs)/ask.tsx index 51c0964..ca78968 100644 --- a/app/(tabs)/ask.tsx +++ b/app/(tabs)/ask.tsx @@ -18,7 +18,8 @@ import { TouchableOpacity, View } from 'react-native'; -import { useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated'; +import { Gesture, GestureDetector } from "react-native-gesture-handler"; +import { runOnJS, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated'; import { useSafeAreaInsets } from "react-native-safe-area-context"; export default function AskScreen() { @@ -40,147 +41,147 @@ export default function AskScreen() { }>(); // 创建一个可复用的滚动函数 - // const scrollToEnd = useCallback((animated = true) => { - // if (chatListRef.current) { - // setTimeout(() => chatListRef.current?.scrollToEnd({ animated }), 100); - // } - // }, []); + const scrollToEnd = useCallback((animated = true) => { + if (chatListRef.current) { + setTimeout(() => chatListRef.current?.scrollToEnd({ animated }), 100); + } + }, []); // 右滑 - // const gesture = Gesture.Pan() - // .onEnd((event) => { - // const { translationX } = event; - // const threshold = 100; // 滑动阈值 + const gesture = Gesture.Pan() + .onEnd((event) => { + const { translationX } = event; + const threshold = 100; // 滑动阈值 - // if (translationX > threshold) { - // // 从左向右滑动,跳转页面 - // runOnJS(router.replace)("/memo-list"); - // } - // }) - // .minPointers(1) - // .activeOffsetX([-10, 10]); // 在 X 方向触发的范围 + if (translationX > threshold) { + // 从左向右滑动,跳转页面 + runOnJS(router.replace)("/memo-list"); + } + }) + .minPointers(1) + .activeOffsetX([-10, 10]); // 在 X 方向触发的范围 - // useEffect(() => { - // if (!isHello && userMessages.length > 0) { - // scrollToEnd(); - // } - // }, [userMessages, isHello, scrollToEnd]); + useEffect(() => { + if (!isHello && userMessages.length > 0) { + scrollToEnd(); + } + }, [userMessages, isHello, scrollToEnd]); - // useEffect(() => { - // const keyboardDidShowListener = Keyboard.addListener( - // 'keyboardDidShow', - // (e) => { - // setTimeout(() => { - // if (!isHello) { - // scrollToEnd(); - // } - // }, 100); - // } - // ); + useEffect(() => { + const keyboardDidShowListener = Keyboard.addListener( + 'keyboardDidShow', + (e) => { + setTimeout(() => { + if (!isHello) { + scrollToEnd(); + } + }, 100); + } + ); - // const keyboardDidHideListener = Keyboard.addListener( - // 'keyboardDidHide', - // () => { - // setTimeout(() => { - // if (!isHello) { - // scrollToEnd(false); - // } - // }, 100); - // } - // ); + const keyboardDidHideListener = Keyboard.addListener( + 'keyboardDidHide', + () => { + setTimeout(() => { + if (!isHello) { + scrollToEnd(false); + } + }, 100); + } + ); - // return () => { - // keyboardDidShowListener.remove(); - // keyboardDidHideListener.remove(); - // }; - // }, [isHello]); + return () => { + keyboardDidShowListener.remove(); + keyboardDidHideListener.remove(); + }; + }, [isHello]); - // useFocusEffect( - // useCallback(() => { - // webSocketManager.connect(); + useFocusEffect( + useCallback(() => { + webSocketManager.connect(); - // const handleChatStream = (message: WsMessage) => { - // if (message.type === 'ChatStream') { - // setUserMessages(prevMessages => { - // const newMessages = [...prevMessages]; - // const lastMessage = newMessages[newMessages.length - 1]; + const handleChatStream = (message: WsMessage) => { + if (message.type === 'ChatStream') { + setUserMessages(prevMessages => { + const newMessages = [...prevMessages]; + const lastMessage = newMessages[newMessages.length - 1]; - // if (lastMessage && lastMessage.role === Assistant) { - // if (typeof lastMessage.content === 'string') { - // if (lastMessage.content === 'keepSearchIng') { - // // 第一次收到流式消息,替换占位符 - // lastMessage.content = message.chunk; - // } else { - // // 持续追加流式消息 - // lastMessage.content += message.chunk; - // } - // } else { - // // 如果 content 是数组,则更新第一个 text 部分 - // const textPart = lastMessage.content.find(p => p.type === 'text'); - // if (textPart) { - // textPart.text = (textPart.text || '') + message.chunk; - // } - // } - // } - // return newMessages; - // }); - // } - // }; + if (lastMessage && lastMessage.role === Assistant) { + if (typeof lastMessage.content === 'string') { + if (lastMessage.content === 'keepSearchIng') { + // 第一次收到流式消息,替换占位符 + lastMessage.content = message.chunk; + } else { + // 持续追加流式消息 + lastMessage.content += message.chunk; + } + } else { + // 如果 content 是数组,则更新第一个 text 部分 + const textPart = lastMessage.content.find(p => p.type === 'text'); + if (textPart) { + textPart.text = (textPart.text || '') + message.chunk; + } + } + } + return newMessages; + }); + } + }; - // const handleChatStreamEnd = (message: WsMessage) => { - // if (message.type === 'ChatStreamEnd') { - // setUserMessages(prevMessages => { - // const newMessages = [...prevMessages]; - // const lastMessage = newMessages[newMessages.length - 1]; - // if (lastMessage && lastMessage.role === Assistant) { - // // 使用最终消息替换流式消息,确保 message.message 存在 - // if (message.message) { - // newMessages[newMessages.length - 1] = message.message as Message; - // } else { - // // 如果最终消息为空,则移除 'keepSearchIng' 占位符 - // return prevMessages.filter(m => !(typeof m.content === 'string' && m.content === 'keepSearchIng')); - // } - // } - // return newMessages; - // }); - // } - // }; + const handleChatStreamEnd = (message: WsMessage) => { + if (message.type === 'ChatStreamEnd') { + setUserMessages(prevMessages => { + const newMessages = [...prevMessages]; + const lastMessage = newMessages[newMessages.length - 1]; + if (lastMessage && lastMessage.role === Assistant) { + // 使用最终消息替换流式消息,确保 message.message 存在 + if (message.message) { + 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) => { - // if (message.type === 'Error') { - // console.log(`WebSocket Error: ${message.code} - ${message.message}`); - // // 可以在这里添加错误提示,例如替换最后一条消息为错误信息 - // setUserMessages(prev => { - // // 创建新的数组和新的消息对象 - // return prev.map((msg, index) => { - // if (index === prev.length - 1 && - // typeof msg.content === 'string' && - // msg.content === 'keepSearchIng') { - // // 返回新的消息对象 - // return { - // ...msg, - // content: getWebSocketErrorMessage(message.code, t) - // }; - // } - // return msg; - // }); - // }); - // } - // }; + const handleError = (message: WsMessage) => { + if (message.type === 'Error') { + console.log(`WebSocket Error: ${message.code} - ${message.message}`); + // 可以在这里添加错误提示,例如替换最后一条消息为错误信息 + setUserMessages(prev => { + // 创建新的数组和新的消息对象 + return prev.map((msg, index) => { + if (index === prev.length - 1 && + typeof msg.content === 'string' && + msg.content === 'keepSearchIng') { + // 返回新的消息对象 + return { + ...msg, + content: getWebSocketErrorMessage(message.code, t) + }; + } + return msg; + }); + }); + } + }; - // webSocketManager.subscribe('ChatStream', handleChatStream); - // webSocketManager.subscribe('ChatStreamEnd', handleChatStreamEnd); - // webSocketManager.subscribe('Error', handleError); + 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(); - // }; - // }, []) - // ); + return () => { + webSocketManager.unsubscribe('ChatStream', handleChatStream); + webSocketManager.unsubscribe('ChatStreamEnd', handleChatStreamEnd); + webSocketManager.unsubscribe('Error', handleError); + // 可以在这里选择断开连接,或者保持连接以加快下次进入页面的速度 + // webSocketManager.disconnect(); + }; + }, []) + ); // 创建动画样式 const welcomeStyle = useAnimatedStyle(() => { @@ -217,13 +218,13 @@ export default function AskScreen() { } }, [sessionId, newSession]); - // useEffect(() => { - // if (!isHello) { - // // 不再自动关闭键盘,让用户手动控制 - // // 这里可以添加其他需要在隐藏hello界面时执行的逻辑 - // scrollToEnd(false); - // } - // }, [isHello]); + useEffect(() => { + if (!isHello) { + // 不再自动关闭键盘,让用户手动控制 + // 这里可以添加其他需要在隐藏hello界面时执行的逻辑 + scrollToEnd(false); + } + }, [isHello]); useFocusEffect( useCallback(() => { @@ -235,41 +236,41 @@ export default function AskScreen() { ); return ( - // - - {/* 导航栏 */} - - { - try { - if (TextInput.State?.currentlyFocusedInput) { - const input = TextInput.State.currentlyFocusedInput(); - if (input) input.blur(); + + + {/* 导航栏 */} + + { + try { + if (TextInput.State?.currentlyFocusedInput) { + const input = TextInput.State.currentlyFocusedInput(); + if (input) input.blur(); + } + } catch (error) { + console.log('失去焦点失败:', error); } - } catch (error) { - console.log('失去焦点失败:', error); - } - Keyboard.dismiss(); - router.push('/memo-list'); - }} - > - - - { router.push('/owner') }}>MemoWake - - + Keyboard.dismiss(); + router.push('/memo-list'); + }} + > + + + { router.push('/owner') }}>MemoWake + + - - {/* 欢迎页面 */} - - - + + {/* 欢迎页面 */} + + + - {/* 聊天页面 */} - {/* scrollToEnd()} /> */} - - - {/* 输入框区域 */} - - - - - - // + + {/* 输入框区域 */} + + + + + + + ); }