chore
This commit is contained in:
parent
003235d732
commit
01bc0588b8
3
.qwen/settings.json
Normal file
3
.qwen/settings.json
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"theme": "Qwen Light"
|
||||||
|
}
|
||||||
@ -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}
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 退出刷新会重新填充数据
|
// 退出刷新会重新填充数据
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user