From 9089a59a073fd252cec25b45c735dc726f3ac3cf Mon Sep 17 00:00:00 2001
From: wujingjing <gersonwu@qq.com>
Date: 星期四, 24 十月 2024 11:35:33 +0800
Subject: [PATCH] isDayTime

---
 src/components/chat/Chat.vue |  125 ++++++++++++++++-------------------------
 1 files changed, 48 insertions(+), 77 deletions(-)

diff --git a/src/components/chat/Chat.vue b/src/components/chat/Chat.vue
index 2143389..d853f77 100644
--- a/src/components/chat/Chat.vue
+++ b/src/components/chat/Chat.vue
@@ -1,13 +1,17 @@
 <template>
 	<div class="flex h-full">
 		<div class="flex flex-col h-full flex-auto">
-			<div class="h-full flex flex-col items-center overflow-y-auto">
-				<div ref="chatListDom" class="h-full" v-loading="chatListLoading" :style="{ width: chatWidth }">
+			<div ref="chatListDom" class="relative h-full flex flex-col items-center overflow-y-auto">
+				<span
+					class="more-loading absolute text-blue-400 left-[50%] translate-x-[-50%] cursor-pointer w-10"
+					v-loading="moreIsLoading"
+				></span>
+				<div class="h-full" v-loading="chatListLoading" :style="{ width: chatWidth }">
 					<div
 						class="group flex px-4 py-6 hover:bg-slate-100 rounded-lg relative"
 						:class="{ 'flex-row-reverse': item.role === RoleEnum.user }"
 						v-for="(item, index) of computedMessageList"
-						:key="index"
+						:key="`${item.historyId}_${item.role}`"
 					>
 						<img
 							class="rounded-full size-12 flex-0"
@@ -163,10 +167,11 @@
 import Loding from './components/Loding.vue';
 import { useAssistantContentOpt } from './hooks/useAssistantContentOpt';
 import { useQueryProcess } from './hooks/useQueryProcess';
+import { useScrollLoad } from './hooks/useScrollLoad';
 import { useScrollToBottom } from './hooks/useScrollToBottom';
 import type { ChatContent } from './model/types';
 import { AnswerState, AnswerType, RoleEnum, answerTypeMapCom, roleImageMap, type ChatMessage } from './model/types';
-import { GetHistoryAnswer, QueryHistoryDetail, QuestionAi, extCallQuery } from '/@/api/ai/chat';
+import { GetHistoryAnswer, QuestionAi, extCallQuery } from '/@/api/ai/chat';
 import PlayBar from '/@/components/chat/components/playBar/PlayBar.vue';
 import CustomDrawer from '/@/components/drawer/CustomDrawer.vue';
 import router from '/@/router';
@@ -323,14 +328,9 @@
 
 let currentLLMId = null;
 
-const getAnswerById = async (historyId: string) => {
-	return await GetHistoryAnswer({
-		history_id: historyId,
-	});
-};
 
 const sendChatMessage = async (content: ChatContent = messageContent.value, cb?: any, isCallExtParams?: any) => {
-	if (!content?.values || isTalking.value ||chatListLoading.value) return;
+	if (!content?.values || isTalking.value || chatListLoading.value) return;
 	const isNewChat = messageList.value.length === 0;
 	if (isNewChat) {
 		if (activeSampleId.value) {
@@ -364,7 +364,7 @@
 		} else {
 			resMsgContent = await questionAi(content.values);
 		}
-
+		nextUserMsgEndIndex.value++;
 		if (isNewChat) {
 			const firstResCb = getRoomConfig(currentRouteId, 'firstResCb');
 			firstResCb?.(resMsgContent);
@@ -376,8 +376,10 @@
 		assistantItem.historyId = questionRes.history_id;
 		assistantItem.sectionAId = finalCalcSectionAId;
 		appendLastMessageContent(resMsgContent);
-		// 鏀跺埌鎭㈠锛岀户缁粴
-		scrollToBottom();
+		setTimeout(() => {
+			// 鏀跺埌鍥炲锛岀户缁粴
+			scrollToBottom();
+		}, 300);
 	} catch (error: any) {
 		// appendLastMessageContent({
 		// 	type: AnswerType.Text,
@@ -396,69 +398,28 @@
 		messageList.value.at(-1).content = content;
 	}
 };
+const { loadRangeData, onChatListScroll, moreIsLoading, nextUserMsgEndIndex } = useScrollLoad({
+	container: chatListDom,
+	historyGroupId: currentRouteId,
+	messageList,
+	parseAnswerContent: parseContent,
+});
 
-// 涓�娆℃�у姞杞芥渶杩戞潯鏁伴檺鍒�
-const LOAD_CHAT_LIMIT = 10;
-
-// 鎵�鏈夌敤鎴锋彁闂巻鍙茶褰�
-let userMsgHistory = [];
-// 涓嬫鍔犺浇鐢ㄦ埛鎻愰棶绱㈠紩浣嶇疆
-let nextUserMsgEndIndex = 0;
 const chatListLoading = ref(false);
+
+const { scrollToBottom } = useScrollToBottom({
+	chatListDom: chatListDom,
+});
+
 onMounted(async () => {
-	const res = await QueryHistoryDetail({
-		history_group_id: currentRouteId,
-	});
-	userMsgHistory = res.details ?? [];
-	nextUserMsgEndIndex = userMsgHistory.length;
-	// 鎴彇鍊掓暟 LOAD_CHAT_LIMIT 鏉$敤鎴锋秷鎭�
-	const currentUserMsgList = userMsgHistory.slice(nextUserMsgEndIndex - LOAD_CHAT_LIMIT, nextUserMsgEndIndex);
+	messageList.value = [];
+	// 鍔犺浇鍒濆鏁版嵁
+	chatListLoading.value = true;
 
-	const tmpMessageList = currentUserMsgList.map((item) => {
-		return {
-			historyId: item.history_id,
-			role: RoleEnum.user,
-			content: {
-				type: AnswerType.Text,
-				values: item.question,
-			},
-		} as ChatMessage;
-	});
-	const sectionAIdMap = new Map();
-
-	try {
-		chatListLoading.value = true;
-		const resList = await Promise.all(
-			(currentUserMsgList ?? []).map((item) => {
-				sectionAIdMap.set(item.history_id, item.section_a_id);
-				return getAnswerById(item.history_id);
-			})
-		);
-		let i = 0;
-		resList.map((item, index) => {
-			const insertIndex = index + 1 + i;
-			const userMsg = tmpMessageList[insertIndex - 1];
-			userMsg.content.values = item?.answer?.question ?? userMsg.content.values;
-			tmpMessageList.splice(
-				insertIndex,
-				0,
-				item.answer === null
-					? null
-					: {
-							historyId: item.answer?.history_id,
-							role: RoleEnum.assistant,
-							content: parseContent(item.answer),
-							state: item.answer_state,
-							sectionAId: sectionAIdMap.get(item.answer.history_id),
-					  }
-			);
-			i++;
-		});
-	} finally {
+	await loadRangeData().finally(() => {
 		chatListLoading.value = false;
-	}
-	messageList.value = tmpMessageList;
-	if (tmpMessageList.length === 0) {
+	});
+	if (messageList.value.length === 0) {
 		messageContent.value = {
 			type: AnswerType.Text,
 			values: activeChatRoom.value.title,
@@ -469,14 +430,13 @@
 		setTimeout(() => {
 			// 鍒濆鐘舵�佹粴涓�涓�
 			scrollToBottom();
+
+			setTimeout(() => {
+				chatListDom.value.addEventListener('scroll', onChatListScroll);
+			}, 300);
 		}, 300);
 	}
 });
-
-const { scrollToBottom } = useScrollToBottom({
-	chatListDom: chatListDom,
-});
-
 //#region ====================== 鍏宠仈鏌ヨ ======================
 const relativeQueryClick = async (val) => {
 	sendChatMessage(
@@ -524,10 +484,21 @@
 //#endregion
 </script>
 
-<style scoped>
+<style scoped lang="scss">
 pre {
 	font-family: -apple-system, 'Noto Sans', 'Helvetica Neue', Helvetica, 'Nimbus Sans L', Arial, 'Liberation Sans', 'PingFang SC',
 		'Hiragino Sans GB', 'Noto Sans CJK SC', 'Source Han Sans SC', 'Source Han Sans CN', 'Microsoft YaHei', 'Wenquanyi Micro Hei',
 		'WenQuanYi Zen Hei', 'ST Heiti', SimHei, 'WenQuanYi Zen Hei Sharp', sans-serif;
 }
+
+.more-loading {
+	:deep(.el-loading-spinner) {
+		--loading-size: 35px;
+		margin-top: 0;
+		.circular {
+			width: var(--loading-size);
+			height: var(--loading-size);
+		}
+	}
+}
 </style>

--
Gitblit v1.9.3