修复:AI问答模块
This commit is contained in:
@@ -2,7 +2,7 @@ import {useEffect, useState, useRef} from "react";
|
||||
import {View, Textarea} from '@tarojs/components';
|
||||
import Taro from '@tarojs/taro';
|
||||
import {Button} from '@nutui/nutui-react-taro';
|
||||
import {User, ArrowUp} from '@nutui/icons-react-taro';
|
||||
import {User, ArrowUp, Home} from '@nutui/icons-react-taro';
|
||||
import {sendAiMessage, stopAiMessage} from '@/api/ai';
|
||||
import {createWebSocket} from '@/utils/websocket';
|
||||
import {getAiToken} from '@/utils/aiToken';
|
||||
@@ -29,6 +29,7 @@ const AiChat = () => {
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
const [currentTaskId, setCurrentTaskId] = useState<string>('');
|
||||
const [wsConnected, setWsConnected] = useState(false);
|
||||
const [isInitialized, setIsInitialized] = useState(false);
|
||||
const messagesEndRef = useRef<HTMLDivElement>(null);
|
||||
const wsRef = useRef<any>(null);
|
||||
|
||||
@@ -45,6 +46,18 @@ const AiChat = () => {
|
||||
return getAiToken();
|
||||
};
|
||||
|
||||
// 调试函数:检查输入框状态
|
||||
const debugInputStatus = () => {
|
||||
console.log('输入框状态调试:', {
|
||||
isInitialized,
|
||||
isLoading,
|
||||
wsConnected,
|
||||
inputValue,
|
||||
inputDisabled: !isInitialized || isLoading,
|
||||
sendButtonDisabled: !isInitialized || !inputValue.trim()
|
||||
});
|
||||
};
|
||||
|
||||
// 滚动到底部
|
||||
const scrollToBottom = () => {
|
||||
// 检查并确保AI_TOKEN存在
|
||||
@@ -57,7 +70,9 @@ const AiChat = () => {
|
||||
|
||||
// 初始化WebSocket连接
|
||||
const initWebSocket = () => {
|
||||
wsRef.current = createWebSocket(WSS_API_URL + "/chat/" + Taro.getStorageSync('AI_TOKEN'));
|
||||
const userToken = Taro.getStorageSync('AI_TOKEN') || 'anonymous';
|
||||
console.log(WSS_API_URL + "/chat/" + userToken, 'wsUrl');
|
||||
wsRef.current = createWebSocket(WSS_API_URL + "/chat/" + userToken);
|
||||
|
||||
wsRef.current.onMessage((data: any) => {
|
||||
console.log('收到WebSocket消息:', data);
|
||||
@@ -145,10 +160,25 @@ const AiChat = () => {
|
||||
|
||||
useEffect(() => {
|
||||
// 初始化时检查并生成AI Token
|
||||
checkAiToken();
|
||||
const token = checkAiToken();
|
||||
console.log('AI Token初始化完成:', token);
|
||||
|
||||
// 检查userToken
|
||||
const userToken = Taro.getStorageSync('AI_TOKEN');
|
||||
console.log('当前UserToken:', userToken || 'anonymous');
|
||||
|
||||
// 初始化WebSocket
|
||||
initWebSocket();
|
||||
Taro.hideTabBar();
|
||||
|
||||
// 标记初始化完成
|
||||
setIsInitialized(true);
|
||||
|
||||
// 延迟调试,确保状态更新完成
|
||||
setTimeout(() => {
|
||||
debugInputStatus();
|
||||
}, 100);
|
||||
|
||||
return () => {
|
||||
if (wsRef.current) {
|
||||
wsRef.current.close();
|
||||
@@ -190,7 +220,7 @@ const AiChat = () => {
|
||||
type: 'user',
|
||||
query: content.trim(),
|
||||
timestamp: Date.now(),
|
||||
user: `${Taro.getStorageSync('AI_TOKEN')}`
|
||||
user: `${Taro.getStorageSync('AI_TOKEN') || 'anonymous'}`
|
||||
};
|
||||
|
||||
// 立即添加用户消息
|
||||
@@ -211,7 +241,7 @@ const AiChat = () => {
|
||||
try {
|
||||
await sendAiMessage({
|
||||
query: content.trim(),
|
||||
user: `${Taro.getStorageSync('AI_TOKEN')}`,
|
||||
user: `${Taro.getStorageSync('AI_TOKEN') || 'anonymous'}`,
|
||||
responseMode: 'streaming',
|
||||
aiToken: aiToken, // 包含AI Token
|
||||
});
|
||||
@@ -257,6 +287,14 @@ const AiChat = () => {
|
||||
|
||||
// 处理快捷问题点击
|
||||
const handleQuickQuestion = (question: string) => {
|
||||
if (!isInitialized) {
|
||||
Taro.showToast({
|
||||
title: '正在初始化,请稍候...',
|
||||
icon: 'none',
|
||||
duration: 2000
|
||||
});
|
||||
return;
|
||||
}
|
||||
handleSendMessage(question);
|
||||
};
|
||||
|
||||
@@ -339,10 +377,13 @@ const AiChat = () => {
|
||||
<Textarea
|
||||
className="message-input"
|
||||
value={inputValue}
|
||||
placeholder={isLoading ? "AI正在回复中..." : "请输入您的问题..."}
|
||||
placeholder={
|
||||
!isInitialized ? "正在初始化..." :
|
||||
isLoading ? "AI正在回复中..." :
|
||||
"请输入您的问题..."
|
||||
}
|
||||
onInput={(e) => setInputValue(e.detail.value)}
|
||||
onConfirm={() => handleSendMessage(inputValue)}
|
||||
disabled={isLoading}
|
||||
autoHeight
|
||||
maxlength={500}
|
||||
/>
|
||||
@@ -360,7 +401,7 @@ const AiChat = () => {
|
||||
<Button
|
||||
type="primary"
|
||||
onClick={() => handleSendMessage(inputValue)}
|
||||
disabled={!inputValue.trim()}
|
||||
disabled={!isInitialized || !inputValue.trim()}
|
||||
icon={<ArrowUp/>}
|
||||
className="send-button"
|
||||
>
|
||||
@@ -368,6 +409,9 @@ const AiChat = () => {
|
||||
)}
|
||||
</View>
|
||||
</View>
|
||||
<View className="fixed top-2 left-3" onClick={() => Taro.reLaunch({'url': '/pages/index/index'})}>
|
||||
<Home/>
|
||||
</View>
|
||||
</View>
|
||||
);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user