|
@@ -1,5 +1,5 @@
|
|
|
// dashboard-v4/dashboard/src/hooks/useChatData.ts
|
|
// dashboard-v4/dashboard/src/hooks/useChatData.ts
|
|
|
-import { useState, useCallback, useMemo } from "react";
|
|
|
|
|
|
|
+import { useState, useCallback, useMemo, useEffect } from "react";
|
|
|
import {
|
|
import {
|
|
|
MessageNode,
|
|
MessageNode,
|
|
|
ChatState,
|
|
ChatState,
|
|
@@ -23,8 +23,8 @@ export function useChatData(chatId: string): {
|
|
|
// Mock模式:直接使用mock数据
|
|
// Mock模式:直接使用mock数据
|
|
|
const [rawMessages, setRawMessages] = useState<MessageNode[]>([]);
|
|
const [rawMessages, setRawMessages] = useState<MessageNode[]>([]);
|
|
|
const [pendingMessages, setPendingMessages] = useState<PendingMessage[]>([]);
|
|
const [pendingMessages, setPendingMessages] = useState<PendingMessage[]>([]);
|
|
|
-
|
|
|
|
|
const [isLoading, setIsLoading] = useState(false);
|
|
const [isLoading, setIsLoading] = useState(false);
|
|
|
|
|
+ const [isInitialized, setIsInitialized] = useState(false); // 新增:标记是否已初始化
|
|
|
const [streamingMessage, setStreamingMessage] = useState<string>();
|
|
const [streamingMessage, setStreamingMessage] = useState<string>();
|
|
|
const [streamingSessionId, setStreamingSessionId] = useState<string>();
|
|
const [streamingSessionId, setStreamingSessionId] = useState<string>();
|
|
|
const [error, setError] = useState<string>();
|
|
const [error, setError] = useState<string>();
|
|
@@ -42,17 +42,46 @@ export function useChatData(chatId: string): {
|
|
|
|
|
|
|
|
// 加载消息列表
|
|
// 加载消息列表
|
|
|
const loadMessages = useCallback(async () => {
|
|
const loadMessages = useCallback(async () => {
|
|
|
|
|
+ // 如果 chatId 为空或无效,不执行加载
|
|
|
|
|
+ if (!chatId || chatId.trim() === "") {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
try {
|
|
try {
|
|
|
setIsLoading(true);
|
|
setIsLoading(true);
|
|
|
|
|
+ setError(undefined); // 清除之前的错误
|
|
|
|
|
+
|
|
|
const response = await messageApi.getMessages(chatId);
|
|
const response = await messageApi.getMessages(chatId);
|
|
|
setRawMessages(response.data.rows);
|
|
setRawMessages(response.data.rows);
|
|
|
|
|
+ setIsInitialized(true);
|
|
|
} catch (err) {
|
|
} catch (err) {
|
|
|
- setError(err instanceof Error ? err.message : "加载消息失败");
|
|
|
|
|
|
|
+ const errorMessage = err instanceof Error ? err.message : "加载消息失败";
|
|
|
|
|
+ setError(errorMessage);
|
|
|
|
|
+ console.error("加载消息失败:", err);
|
|
|
} finally {
|
|
} finally {
|
|
|
setIsLoading(false);
|
|
setIsLoading(false);
|
|
|
}
|
|
}
|
|
|
}, [chatId]);
|
|
}, [chatId]);
|
|
|
|
|
|
|
|
|
|
+ // 当 chatId 变化时自动加载消息
|
|
|
|
|
+ useEffect(() => {
|
|
|
|
|
+ // 重置状态
|
|
|
|
|
+ setIsInitialized(false);
|
|
|
|
|
+ setRawMessages([]);
|
|
|
|
|
+ setPendingMessages([]);
|
|
|
|
|
+ setError(undefined);
|
|
|
|
|
+ setActivePoint(undefined);
|
|
|
|
|
+
|
|
|
|
|
+ // 加载新的消息
|
|
|
|
|
+ loadMessages();
|
|
|
|
|
+ }, [chatId, loadMessages]);
|
|
|
|
|
+
|
|
|
|
|
+ // 手动刷新方法(供外部调用)
|
|
|
|
|
+ const refreshMessages = useCallback(async () => {
|
|
|
|
|
+ setIsInitialized(false);
|
|
|
|
|
+ await loadMessages();
|
|
|
|
|
+ }, [loadMessages]);
|
|
|
|
|
+
|
|
|
// 构建对话历史(用于AI API调用)
|
|
// 构建对话历史(用于AI API调用)
|
|
|
const buildConversationHistory = useCallback(
|
|
const buildConversationHistory = useCallback(
|
|
|
(baseMessages: MessageNode[], newUserMessage?: MessageNode) => {
|
|
(baseMessages: MessageNode[], newUserMessage?: MessageNode) => {
|
|
@@ -76,6 +105,7 @@ export function useChatData(chatId: string): {
|
|
|
},
|
|
},
|
|
|
[activePath]
|
|
[activePath]
|
|
|
);
|
|
);
|
|
|
|
|
+
|
|
|
// 保存消息组到数据库
|
|
// 保存消息组到数据库
|
|
|
const saveMessageGroup = useCallback(
|
|
const saveMessageGroup = useCallback(
|
|
|
async (tempId: string, messages: MessageNode[]) => {
|
|
async (tempId: string, messages: MessageNode[]) => {
|
|
@@ -116,6 +146,7 @@ export function useChatData(chatId: string): {
|
|
|
},
|
|
},
|
|
|
[chatId]
|
|
[chatId]
|
|
|
);
|
|
);
|
|
|
|
|
+
|
|
|
// 发送消息给AI并处理响应
|
|
// 发送消息给AI并处理响应
|
|
|
const sendMessageToAI = useCallback(
|
|
const sendMessageToAI = useCallback(
|
|
|
async (userMessage: MessageNode, pendingGroup: PendingMessage) => {
|
|
async (userMessage: MessageNode, pendingGroup: PendingMessage) => {
|
|
@@ -331,6 +362,7 @@ export function useChatData(chatId: string): {
|
|
|
|
|
|
|
|
setPendingMessages((prev) => [...prev, pendingGroup]);
|
|
setPendingMessages((prev) => [...prev, pendingGroup]);
|
|
|
console.debug("ai chat", pendingGroup);
|
|
console.debug("ai chat", pendingGroup);
|
|
|
|
|
+
|
|
|
// 如果是用户消息,发送给AI
|
|
// 如果是用户消息,发送给AI
|
|
|
if (role === "user") {
|
|
if (role === "user") {
|
|
|
await sendMessageToAI(newUserMessage, pendingGroup);
|
|
await sendMessageToAI(newUserMessage, pendingGroup);
|
|
@@ -478,13 +510,13 @@ export function useChatData(chatId: string): {
|
|
|
async (messageId: string) => {
|
|
async (messageId: string) => {
|
|
|
try {
|
|
try {
|
|
|
await messageApi.deleteMessage(messageId);
|
|
await messageApi.deleteMessage(messageId);
|
|
|
- await loadMessages(); // 重新加载数据
|
|
|
|
|
|
|
+ await refreshMessages(); // 使用 refreshMessages 而不是 loadMessages
|
|
|
} catch (err) {
|
|
} catch (err) {
|
|
|
console.error("删除失败:", err);
|
|
console.error("删除失败:", err);
|
|
|
setError(err instanceof Error ? err.message : "删除失败");
|
|
setError(err instanceof Error ? err.message : "删除失败");
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
- [loadMessages]
|
|
|
|
|
|
|
+ [refreshMessages]
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
const setModel = useCallback((model: IAiModel | undefined) => {
|
|
const setModel = useCallback((model: IAiModel | undefined) => {
|
|
@@ -497,7 +529,7 @@ export function useChatData(chatId: string): {
|
|
|
editMessage,
|
|
editMessage,
|
|
|
retryMessage,
|
|
retryMessage,
|
|
|
refreshResponse,
|
|
refreshResponse,
|
|
|
- loadMessages,
|
|
|
|
|
|
|
+ loadMessages: refreshMessages, // 对外暴露的是 refreshMessages
|
|
|
likeMessage,
|
|
likeMessage,
|
|
|
dislikeMessage,
|
|
dislikeMessage,
|
|
|
copyMessage,
|
|
copyMessage,
|
|
@@ -510,7 +542,7 @@ export function useChatData(chatId: string): {
|
|
|
editMessage,
|
|
editMessage,
|
|
|
retryMessage,
|
|
retryMessage,
|
|
|
refreshResponse,
|
|
refreshResponse,
|
|
|
- loadMessages,
|
|
|
|
|
|
|
+ refreshMessages,
|
|
|
likeMessage,
|
|
likeMessage,
|
|
|
dislikeMessage,
|
|
dislikeMessage,
|
|
|
copyMessage,
|
|
copyMessage,
|
|
@@ -529,6 +561,7 @@ export function useChatData(chatId: string): {
|
|
|
session_groups: sessionGroups,
|
|
session_groups: sessionGroups,
|
|
|
pending_messages: pendingMessages,
|
|
pending_messages: pendingMessages,
|
|
|
is_loading: isLoading,
|
|
is_loading: isLoading,
|
|
|
|
|
+ is_initialized: isInitialized, // 新增:初始化状态
|
|
|
streaming_message: streamingMessage,
|
|
streaming_message: streamingMessage,
|
|
|
streaming_session_id: streamingSessionId,
|
|
streaming_session_id: streamingSessionId,
|
|
|
current_model: currModel,
|
|
current_model: currModel,
|