|
@@ -5,8 +5,8 @@
|
|
import { create } from "zustand";
|
|
import { create } from "zustand";
|
|
import { generateUUID } from '@/utils/index'
|
|
import { generateUUID } from '@/utils/index'
|
|
|
|
|
|
-import { getMessageHistories as _getMessageHistories, appendMessages, type TGetMessageHistoriesParams, } from '@/service/bot'
|
|
|
|
-import { EChatRole, EContentType, TChatRole } from "@/types/bot";
|
|
|
|
|
|
+import { getMessageHistories, type TGetMessageHistoriesParams, } from '@/service/bot'
|
|
|
|
+import { EChatRole, TAnyMessage, TRobotMessage, TMessage } from "@/types/bot";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -21,10 +21,12 @@ const INIT_CURRENT_ROBOT_MSG_UK = ''
|
|
export interface TextChat {
|
|
export interface TextChat {
|
|
currentRobotMsgUk: string; // 当前正在说话的 AI 机器人 id, 可用于控制是否继续输出文本至当前 message 框内
|
|
currentRobotMsgUk: string; // 当前正在说话的 AI 机器人 id, 可用于控制是否继续输出文本至当前 message 框内
|
|
scrollTop: number; // 控制聊天内容变化后滚动至最底部
|
|
scrollTop: number; // 控制聊天内容变化后滚动至最底部
|
|
- list: (TMessage | TRobotMessage)[];
|
|
|
|
|
|
+ autoScroll: boolean
|
|
|
|
+ list: TAnyMessage[];
|
|
questions: string[]; //推荐问题
|
|
questions: string[]; //推荐问题
|
|
sessionId: string|null
|
|
sessionId: string|null
|
|
// 显示聊天历史
|
|
// 显示聊天历史
|
|
|
|
+ setAutoScroll: (b: boolean) => void // 是否自动滚动
|
|
genSessionId: () => void // 进入聊天界面后,本次的 sessionId
|
|
genSessionId: () => void // 进入聊天界面后,本次的 sessionId
|
|
setQuestions: (q:string[]) => void // 设置推荐问题
|
|
setQuestions: (q:string[]) => void // 设置推荐问题
|
|
setScrollTop: () => void
|
|
setScrollTop: () => void
|
|
@@ -35,13 +37,13 @@ export interface TextChat {
|
|
// 更新自己发出的气泡框
|
|
// 更新自己发出的气泡框
|
|
updateMessage: (content: string, msgUk: string) => string;
|
|
updateMessage: (content: string, msgUk: string) => string;
|
|
// 更新机器人汽泡框内的内容实现 gpt 的效果
|
|
// 更新机器人汽泡框内的内容实现 gpt 的效果
|
|
- updateRobotMessage: (content: string, body?: Record<string,any>) => void;
|
|
|
|
|
|
+ updateRobotMessage: (content: string, body?: Record<string,any>, saveStatus?: number) => void;
|
|
updateRobotReasoningMessage: (msgUk: string, reasoningContent: string, body?:Record<string,any>) => void;
|
|
updateRobotReasoningMessage: (msgUk: string, reasoningContent: string, body?:Record<string,any>) => void;
|
|
getCurrentRobotMessage:() => TRobotMessage|undefined
|
|
getCurrentRobotMessage:() => TRobotMessage|undefined
|
|
deleteMessage: (msgUk: string) => void;
|
|
deleteMessage: (msgUk: string) => void;
|
|
// 清空
|
|
// 清空
|
|
destroy: () => void;
|
|
destroy: () => void;
|
|
- getMessageHistories: (data: TGetMessageHistoriesParams) => void
|
|
|
|
|
|
+ fetchMessageHistories: (data: TGetMessageHistoriesParams) => void
|
|
}
|
|
}
|
|
|
|
|
|
// 新messageId 为 index 加 1
|
|
// 新messageId 为 index 加 1
|
|
@@ -51,10 +53,14 @@ const generateUk = () => {
|
|
|
|
|
|
export const useTextChat = create<TextChat>((set, get) => ({
|
|
export const useTextChat = create<TextChat>((set, get) => ({
|
|
currentRobotMsgUk: INIT_CURRENT_ROBOT_MSG_UK,
|
|
currentRobotMsgUk: INIT_CURRENT_ROBOT_MSG_UK,
|
|
- scrollTop: 9999,
|
|
|
|
|
|
+ scrollTop: 999999,
|
|
|
|
+ autoScroll: true,
|
|
list: [],
|
|
list: [],
|
|
sessionId: null,
|
|
sessionId: null,
|
|
questions: [],
|
|
questions: [],
|
|
|
|
+ setAutoScroll: (b)=> {
|
|
|
|
+ set({autoScroll: b})
|
|
|
|
+ },
|
|
setQuestions: (q:string[])=> {
|
|
setQuestions: (q:string[])=> {
|
|
set({questions: q})
|
|
set({questions: q})
|
|
},
|
|
},
|
|
@@ -77,8 +83,9 @@ export const useTextChat = create<TextChat>((set, get) => ({
|
|
pushRobotMessage: (message) => {
|
|
pushRobotMessage: (message) => {
|
|
const msgUk = generateUk()
|
|
const msgUk = generateUk()
|
|
set((state) => {
|
|
set((state) => {
|
|
|
|
+ const newRobotMessage = { ...message, msgUk, role: EChatRole.Assistant } as TRobotMessage
|
|
return {
|
|
return {
|
|
- list: [...state.list, { ...message, msgUk, role: EChatRole.Assistant }],
|
|
|
|
|
|
+ list: [...state.list, newRobotMessage],
|
|
currentRobotMsgUk: msgUk,
|
|
currentRobotMsgUk: msgUk,
|
|
scrollTop: state.scrollTop + 1,
|
|
scrollTop: state.scrollTop + 1,
|
|
};
|
|
};
|
|
@@ -122,7 +129,7 @@ export const useTextChat = create<TextChat>((set, get) => ({
|
|
set((state) => {
|
|
set((state) => {
|
|
const updatedList = state.list.map((message) => {
|
|
const updatedList = state.list.map((message) => {
|
|
if (message.msgUk === msgUk) {
|
|
if (message.msgUk === msgUk) {
|
|
- return { ...message, content: message.content + content }; // 更新 content
|
|
|
|
|
|
+ return { ...message, content: message.content + content, saveStatus: 0 }; // 更新 content
|
|
}
|
|
}
|
|
return message; // 返回未修改的 message
|
|
return message; // 返回未修改的 message
|
|
});
|
|
});
|
|
@@ -130,15 +137,17 @@ export const useTextChat = create<TextChat>((set, get) => ({
|
|
});
|
|
});
|
|
return msgUk
|
|
return msgUk
|
|
},
|
|
},
|
|
- updateRobotMessage: (content, body={}) => {
|
|
|
|
|
|
+ updateRobotMessage: (content, body={}, saveStatus: number = 0) => {
|
|
set((state) => {
|
|
set((state) => {
|
|
const updatedList = state.list.map((message) => {
|
|
const updatedList = state.list.map((message) => {
|
|
if (message.msgUk === state.currentRobotMsgUk) {
|
|
if (message.msgUk === state.currentRobotMsgUk) {
|
|
- return { ...message, content: message.content + content, body }; // 更新 content
|
|
|
|
|
|
+ // 更新消息后, saveStatus 变为 0,说明又需要上报此消息
|
|
|
|
+ return { ...message, content: message.content + content, body, saveStatus: saveStatus } as TRobotMessage // 更新 content
|
|
}
|
|
}
|
|
return message; // 返回未修改的 message
|
|
return message; // 返回未修改的 message
|
|
});
|
|
});
|
|
- return { list: updatedList, scrollTop: state.scrollTop + 1 }; // 返回新的状态
|
|
|
|
|
|
+
|
|
|
|
+ return { list: updatedList, scrollTop: state.autoScroll ? state.scrollTop + 1 : state.scrollTop}; // 返回新的状态
|
|
});
|
|
});
|
|
},
|
|
},
|
|
getCurrentRobotMessage: ()=> {
|
|
getCurrentRobotMessage: ()=> {
|
|
@@ -153,11 +162,11 @@ export const useTextChat = create<TextChat>((set, get) => ({
|
|
const updatedList = state.list.map((message) => {
|
|
const updatedList = state.list.map((message) => {
|
|
if (message.msgUk === msgUk) {
|
|
if (message.msgUk === msgUk) {
|
|
//@ts-ignore
|
|
//@ts-ignore
|
|
- return { ...message, body, reasoningContent: message.reasoningContent + reasoningContent }; // 更新 reasoningContent
|
|
|
|
|
|
+ return { ...message, body, reasoningContent: message.reasoningContent + reasoningContent } as TRobotMessage // 更新 reasoningContent
|
|
}
|
|
}
|
|
return message; // 返回未修改的 message
|
|
return message; // 返回未修改的 message
|
|
});
|
|
});
|
|
- return { list: updatedList, scrollTop: state.scrollTop + 1 }; // 返回新的状态
|
|
|
|
|
|
+ return { list: updatedList, scrollTop: state.autoScroll ? state.scrollTop + 1 : state.scrollTop}; // 返回新的状态
|
|
});
|
|
});
|
|
},
|
|
},
|
|
deleteMessage: (msgUk)=> {
|
|
deleteMessage: (msgUk)=> {
|
|
@@ -174,8 +183,8 @@ export const useTextChat = create<TextChat>((set, get) => ({
|
|
stopCurrentRobotMessaging: ()=> {
|
|
stopCurrentRobotMessaging: ()=> {
|
|
set({currentRobotMsgUk: INIT_CURRENT_ROBOT_MSG_UK})
|
|
set({currentRobotMsgUk: INIT_CURRENT_ROBOT_MSG_UK})
|
|
},
|
|
},
|
|
- getMessageHistories: async (data: TGetMessageHistoriesParams) => {
|
|
|
|
- const response = await _getMessageHistories(data)
|
|
|
|
|
|
+ fetchMessageHistories: async (data: TGetMessageHistoriesParams) => {
|
|
|
|
+ const response = await getMessageHistories(data)
|
|
console.log(response)
|
|
console.log(response)
|
|
if(response.status){
|
|
if(response.status){
|
|
|
|
|