This commit is contained in:
Junhui Chen 2025-08-06 10:47:05 +08:00
parent 003235d732
commit 01bc0588b8
4 changed files with 29 additions and 10 deletions

3
.qwen/settings.json Normal file
View File

@ -0,0 +1,3 @@
{
"theme": "Qwen Light"
}

View File

@ -1,8 +1,6 @@
import ReturnArrow from "@/assets/icons/svg/returnArrow.svg";
import Chat from "@/components/ask/chat"; 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 { fetchApi } from "@/lib/server-api-util"; import { fetchApi } from "@/lib/server-api-util";
import { getWebSocketErrorMessage, webSocketManager, WsMessage } from "@/lib/websocket-util"; import { getWebSocketErrorMessage, webSocketManager, WsMessage } from "@/lib/websocket-util";
import { Assistant, Message } from "@/types/ask"; import { Assistant, Message } from "@/types/ask";
@ -16,8 +14,6 @@ import {
KeyboardAvoidingView, KeyboardAvoidingView,
Platform, Platform,
StyleSheet, StyleSheet,
TextInput,
TouchableOpacity,
View View
} from 'react-native'; } from 'react-native';
import { Gesture, GestureDetector } from "react-native-gesture-handler"; import { Gesture, GestureDetector } from "react-native-gesture-handler";
@ -62,7 +58,8 @@ export default function AskScreen() {
} }
}) })
.minPointers(1) .minPointers(1)
.activeOffsetX([-10, 10]); // 在 X 方向触发的范围 .activeOffsetX([-20, 20]) // 扩大触发范围避免与ScrollView冲突
.failOffsetY([-10, 10]); // 限制Y轴的偏移避免垂直滚动时触发
useEffect(() => { useEffect(() => {
if (!isHello && userMessages.length > 0) { if (!isHello && userMessages.length > 0) {
@ -257,7 +254,7 @@ export default function AskScreen() {
useCallback(() => { useCallback(() => {
if (!sessionId) { if (!sessionId) {
setIsHello(true); setIsHello(true);
setUserMessages([]) setUserMessages([]);
} }
}, [sessionId]) }, [sessionId])
); );
@ -309,7 +306,7 @@ export default function AskScreen() {
{/* 输入框区域 */} {/* 输入框区域 */}
<KeyboardAvoidingView <KeyboardAvoidingView
behavior={Platform.OS === "ios" ? "padding" : "height"} behavior={Platform.OS === "ios" ? "padding" : "height"}
keyboardVerticalOffset={0} > keyboardVerticalOffset={Platform.OS === "ios" ? 90 : 0}>
<View style={styles.inputContainer} key={conversationId}> <View style={styles.inputContainer} key={conversationId}>
<SendMessage <SendMessage
setIsHello={setIsHello} setIsHello={setIsHello}

View File

@ -1,11 +1,13 @@
import { PermissionProvider } from '@/context/PermissionContext'; import { PermissionProvider } from '@/context/PermissionContext';
import { useColorScheme } from '@/hooks/useColorScheme'; import { useColorScheme } from '@/hooks/useColorScheme';
import { registerBackgroundUploadTask } from '@/lib/background-uploader/automatic'; import { registerBackgroundUploadTask } from '@/lib/background-uploader/automatic';
import { webSocketManager } from '@/lib/websocket-util';
import { DarkTheme, DefaultTheme, ThemeProvider } from '@react-navigation/native'; import { DarkTheme, DefaultTheme, ThemeProvider } from '@react-navigation/native';
import * as MediaLibrary from 'expo-media-library'; import * as MediaLibrary from 'expo-media-library';
import { Stack } from 'expo-router'; import { Stack } from 'expo-router';
import { StatusBar } from 'expo-status-bar'; import { StatusBar } from 'expo-status-bar';
import { useEffect } from 'react'; import { useEffect } from 'react';
import { AppState } from 'react-native';
import 'react-native-reanimated'; import 'react-native-reanimated';
import '../global.css'; import '../global.css';
import { Provider } from "../provider"; import { Provider } from "../provider";
@ -29,6 +31,24 @@ export default function RootLayout() {
setupBackgroundUpload(); setupBackgroundUpload();
}, []); }, []);
useEffect(() => {
const handleAppStateChange = (nextAppState: string) => {
if (nextAppState === 'background') {
// 应用进入后台时断开WebSocket连接
webSocketManager.disconnect();
} else if (nextAppState === 'active') {
// 应用回到前台时重新连接WebSocket
webSocketManager.connect();
}
};
const subscription = AppState.addEventListener('change', handleAppStateChange);
return () => {
subscription?.remove();
};
}, []);
return ( return (
<ThemeProvider value={colorScheme === 'dark' ? DarkTheme : DefaultTheme}> <ThemeProvider value={colorScheme === 'dark' ? DarkTheme : DefaultTheme}>
<PermissionProvider> <PermissionProvider>

View File

@ -3,7 +3,6 @@ import Constants from 'expo-constants';
import * as SecureStore from 'expo-secure-store'; import * as SecureStore from 'expo-secure-store';
import { Platform } from 'react-native'; import { Platform } from 'react-native';
import Toast from 'react-native-toast-message'; import Toast from 'react-native-toast-message';
import { useAuth } from '../contexts/auth-context';
import { store } from '../store'; import { store } from '../store';
import { User } from '../types/user'; import { User } from '../types/user';
@ -56,7 +55,7 @@ export const useAuthToken = async<T>(message: string | null, login: (user: User,
} }
// 使用Redux存储token的刷新token函数 // 使用Redux存储token的刷新token函数
export const refreshAuthToken = async<T>(message: string | null): Promise<User> => { export const refreshAuthToken = async<T>(message: string | null): Promise<User | null> => {
try { try {
let cookie = ""; let cookie = "";
let userId = ""; let userId = "";
@ -86,7 +85,7 @@ export const refreshAuthToken = async<T>(message: string | null): Promise<User>
// 如果没有必要的数据,抛出错误 // 如果没有必要的数据,抛出错误
if (!cookie || !userId) { if (!cookie || !userId) {
throw new Error("Missing refresh token or user ID"); return null;
} }
// 退出刷新会重新填充数据 // 退出刷新会重新填充数据