From d7e07b327aaba5adac12f8e5eb7d992ce8e344d5 Mon Sep 17 00:00:00 2001 From: jinyaqiu Date: Fri, 8 Aug 2025 17:19:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20ask=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(tabs)/ask.tsx | 4 +- app/(tabs)/memo-list.tsx | 12 ++-- components/ThemedText.tsx | 8 +-- components/ask/chat.tsx | 9 +++ components/ask/hello.tsx | 18 +++--- components/ask/send.tsx | 57 +++++++++---------- .../chat/message-item/MessageBubble.tsx | 2 +- components/chat/message-item/message-item.tsx | 13 ++--- constants/Fonts.ts | 3 +- 9 files changed, 69 insertions(+), 57 deletions(-) diff --git a/app/(tabs)/ask.tsx b/app/(tabs)/ask.tsx index 0c6279e..95e078d 100644 --- a/app/(tabs)/ask.tsx +++ b/app/(tabs)/ask.tsx @@ -57,6 +57,7 @@ export default function AskScreen() { if (translationX > threshold) { // 从左向右滑动,跳转页面 runOnJS(router.replace)("/memo-list"); + runOnJS(setConversationId)("") } }) .minPointers(1) @@ -244,11 +245,12 @@ export default function AskScreen() { useFocusEffect( useCallback(() => { + Keyboard.dismiss(); if (!sessionId) { setIsHello(true); setUserMessages([]) } - }, [sessionId]) + }, [sessionId, Keyboard]) ); return ( diff --git a/app/(tabs)/memo-list.tsx b/app/(tabs)/memo-list.tsx index d2e26db..4b1282c 100644 --- a/app/(tabs)/memo-list.tsx +++ b/app/(tabs)/memo-list.tsx @@ -13,6 +13,7 @@ import UploaderProgress from '@/components/file-upload/upload-progress/uploader- import SkeletonItem from '@/components/memo/SkeletonItem'; // 类型定义 +import { Fonts } from '@/constants/Fonts'; import { useUploadManager } from '@/hooks/useUploadManager'; import { getCachedData, prefetchChatDetail, prefetchChats } from '@/lib/prefetch'; import { fetchApi } from '@/lib/server-api-util'; @@ -227,7 +228,7 @@ const MemoList = () => { return ( - + { + Keyboard.dismiss(); + }, [Keyboard, sessionId]) + ); + + const renderMessageItem = useCallback(({ item, index }: { item: Message, index: number }) => { const itemStyle = index === 0 ? { marginTop: 16, marginHorizontal: 16 } : { marginHorizontal: 16 }; return ( diff --git a/components/ask/hello.tsx b/components/ask/hello.tsx index 8f7acba..639548d 100644 --- a/components/ask/hello.tsx +++ b/components/ask/hello.tsx @@ -1,4 +1,5 @@ import { ThemedText } from "@/components/ThemedText"; +import { Fonts } from "@/constants/Fonts"; import { webSocketManager } from "@/lib/websocket-util"; import { Message } from "@/types/ask"; import { Dispatch, SetStateAction } from "react"; @@ -58,15 +59,13 @@ export default function AskHello({ setUserMessages, setConversationId, setIsHell keyboardShouldPersistTaps="handled" > - + {t('ask.hi', { ns: 'ask' })} {"\n"} {t('ask.iAmMemo', { ns: 'ask' })} - - - - + + {t('ask.ready', { ns: 'ask' })} {"\n"} {t('ask.justAsk', { ns: 'ask' })} @@ -112,11 +111,14 @@ const styles = StyleSheet.create({ }, case: { borderWidth: 1, - borderColor: "#AC7E35", + borderColor: Fonts["textPrimary"], borderRadius: 10, paddingHorizontal: 8, + paddingVertical: 2, width: 'auto', - fontSize: 14, - color: "#4C320C" + fontSize: Fonts["sm"], + color: Fonts["textSecondary"], + fontFamily: Fonts["sfPro"] + } }) \ No newline at end of file diff --git a/components/ask/send.tsx b/components/ask/send.tsx index 679d4fa..a2f8c5f 100644 --- a/components/ask/send.tsx +++ b/components/ask/send.tsx @@ -12,6 +12,7 @@ import { View } from 'react-native'; +import { Fonts } from '@/constants/Fonts'; import { webSocketManager, WsMessage } from '@/lib/websocket-util'; import { Message } from '@/types/ask'; import { useTranslation } from 'react-i18next'; @@ -190,37 +191,33 @@ export default function SendMessage(props: Props) { } ])); let currentSessionId = conversationId; + console.log("currentSessionIdcurrentSessionId", currentSessionId); + // 如果没有对话ID,先创建一个新对话 if (!currentSessionId) { const newCurrentSessionId = await createNewConversation(text); if (newCurrentSessionId) { setConversationId(newCurrentSessionId); - webSocketManager.send({ - type: 'Chat', - session_id: newCurrentSessionId, - message: text, - image_material_ids: selectedImages.length > 0 ? selectedImages : undefined, - }); - setSelectedImages([]); } else { - console.error("无法获取 session_id,消息发送失败。"); + console.error("无法获取 session_id,消息发送失败1。"); setUserMessages(prev => prev.filter(item => item.content !== 'keepSearchIng')); } } // 通过 WebSocket 发送消息 if (currentSessionId) { - webSocketManager.send({ - type: 'Chat', - session_id: currentSessionId, - message: text, - image_material_ids: selectedImages.length > 0 ? selectedImages : undefined, - }); - setSelectedImages([]); - } else { - console.error("无法获取 session_id,消息发送失败。"); - // 可以在这里处理错误,例如显示一个提示 - setUserMessages(prev => prev.filter(item => item.content !== 'keepSearchIng')); + try { + webSocketManager.send({ + type: 'Chat', + session_id: currentSessionId, + message: text, + image_material_ids: selectedImages.length > 0 ? selectedImages : undefined, + }); + setSelectedImages([]); + } catch (error) { + console.error("无法获取 session_id,消息发送失败2。", error); + setUserMessages(prev => prev.filter(item => item.content !== 'keepSearchIng')); + } } // 将输入框清空 setInputValue(''); @@ -252,16 +249,17 @@ export default function SendMessage(props: Props) { handleQuitly('search')}> - {t("ask:ask.search")} - handleQuitly('video')}> + {t("ask:ask.search")} + + handleQuitly('video')}> - {t("ask:ask.video")} + {t("ask:ask.video")} { setInputValue(text); @@ -296,25 +294,23 @@ const styles = StyleSheet.create({ display: 'flex', flexDirection: 'row', gap: 5, - // backgroundColor: '#F8F8F8' }, container: { justifyContent: 'center', backgroundColor: '#transparent', }, input: { - // borderColor: '#d9d9d9', + color: Fonts["textPrimary"], borderColor: '#AC7E35', borderWidth: 1, - // borderRadius: 18, - borderRadius: 25, + borderRadius: 28, paddingHorizontal: 20, - paddingVertical: 13, + paddingVertical: 16, lineHeight: 20, fontSize: 16, - width: '100%', // 确保输入框宽度撑满 + width: '100%', paddingRight: 50, - backgroundColor: '#fff', // Required for shadow to show on iOS + backgroundColor: '#fff', shadowColor: '#000', shadowOffset: { width: 0, @@ -322,7 +318,6 @@ const styles = StyleSheet.create({ }, shadowOpacity: 0.15, shadowRadius: 3.84, - // Shadow for Android elevation: 5, }, voiceButton: { diff --git a/components/chat/message-item/MessageBubble.tsx b/components/chat/message-item/MessageBubble.tsx index d808c4e..0b62cad 100644 --- a/components/chat/message-item/MessageBubble.tsx +++ b/components/chat/message-item/MessageBubble.tsx @@ -26,7 +26,7 @@ const MessageBubble = ({ }: MessageBubbleProps) => { return ( >; cancel: boolean; - setUserMessages: React.Dispatch>; } -const MessageItem = ({ setCancel, cancel = true, t, insets, item, sessionId, setModalVisible, modalVisible, setModalDetailsVisible, modalDetailsVisible, setSelectedImages, selectedImages, setUserMessages }: RenderMessageProps) => { +const MessageItem = ({ setCancel, cancel = true, t, insets, item, sessionId, setModalVisible, modalVisible, setModalDetailsVisible, modalDetailsVisible, setSelectedImages, selectedImages }: RenderMessageProps) => { const isUser = item.role === User; return ( @@ -44,7 +42,7 @@ const MessageItem = ({ setCancel, cancel = true, t, insets, item, sessionId, set setSelectedImages={setSelectedImages} setModalDetailsVisible={setModalDetailsVisible} /> - {item.content instanceof Array && item.content.filter((media: ContentPart) => media.type !== 'text').length > 0 && ( + {/* {item.content instanceof Array && item.content.filter((media: ContentPart) => media.type !== 'text').length > 0 && ( { @@ -55,7 +53,7 @@ const MessageItem = ({ setCancel, cancel = true, t, insets, item, sessionId, set Help me find materials for subsequent operations. - )} + )} */} ); @@ -74,7 +72,8 @@ const styles = StyleSheet.create({ }, tipText: { color: '#4C320C', - fontSize: 14 + fontSize: 14, + fontFamily: Fonts['inter'] } }); diff --git a/constants/Fonts.ts b/constants/Fonts.ts index 9e21d3e..59f0d2c 100644 --- a/constants/Fonts.ts +++ b/constants/Fonts.ts @@ -22,6 +22,7 @@ export const Fonts = { '3xl': 30, '4xl': 36, '5xl': 48, + "title": 32, // color bgPrimary: '#FFB645', @@ -37,6 +38,6 @@ export const Fonts = { } as const; export type FontWeight = keyof Omit; -export type FontSize = 'xs' | 'sm' | 'base' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl'; +export type FontSize = 'xs' | 'sm' | 'base' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl' | 'title'; export type FontColor = 'bgPrimary' | 'bgSecondary' | 'textPrimary' | 'textSecondary' | 'textThird' | 'textWhite';