UNPKG

@tencentcloud/roomkit-web-vue3

Version:

<h1 align="center"> TUIRoomKit</h1> Conference (TUIRoomKit) is a product suitable for multi-person audio and video conversation scenarios such as business meetings, webinars, and online education. By integrating this product, you can add room management,

166 lines (153 loc) 4.64 kB
import { watch, onUnmounted, ref } from 'vue'; import { storeToRefs } from 'pinia'; import { useChatStore } from '../../../stores/chat'; import { useBasicStore } from '../../../stores/basic'; import { useI18n } from '../../../locales'; import TUIRoomEngine, { TencentCloudChat, } from '@tencentcloud/tuiroom-engine-js'; import useGetRoomEngine from '../../../hooks/useRoomEngine'; export default function useMessageList() { const { t } = useI18n(); const roomEngine = useGetRoomEngine(); const chatStore = useChatStore(); const basicStore = useBasicStore(); const { roomId } = storeToRefs(basicStore); const { messageList, isCompleted, nextReqMessageId } = storeToRefs(chatStore); watch( isCompleted, value => { isCompleted.value = value; }, { immediate: true, deep: true } ); async function handleGetHistoryMessageList() { const tim = roomEngine.instance?.getTIM(); const imResponse = await tim?.getMessageList({ conversationID: `GROUP${roomId.value}`, nextReqMessageID: nextReqMessageId.value, }); const { nextReqMessageID: middleReqMessageId, messageList: historyMessageList, isCompleted, } = imResponse.data; messageList.value.splice(0, 0, ...historyMessageList); const currentMessageList = messageList.value.filter( item => item.type === 'TIMTextElem' ); chatStore.setMessageListInfo( currentMessageList, isCompleted, middleReqMessageId ); } async function getMessageList(): Promise<{ currentMessageList: any[]; isCompleted: boolean; nextReqMessageId: string; }> { let count = 0; const result: { currentMessageList: any[]; isCompleted: boolean; nextReqMessageId: string; } = { currentMessageList: [], isCompleted: false, nextReqMessageId: '', }; const tim: any = roomEngine.instance?.getTIM(); const getIMMessageList = async () => { const conversationData: { conversationID: string; nextReqMessageID?: string | undefined; } = { conversationID: `GROUP${roomId.value}`, }; if (result.nextReqMessageId !== '') { conversationData.nextReqMessageID = result.nextReqMessageId; } const imResponse = await tim.getMessageList(conversationData); const { messageList, isCompleted, nextReqMessageID } = imResponse.data; result.currentMessageList.splice(0, 0, ...messageList); result.isCompleted = messageList.length > 0 ? isCompleted : true; result.nextReqMessageId = nextReqMessageID; if (result.isCompleted || result.currentMessageList.length >= 15) { return; } count += 1; if (count === 1) { await getIMMessageList(); } }; await getIMMessageList(); return result; } const onReceiveMessage = (options: { data: any }) => { if (!options || !options.data) { return; } const currentConversationId = `GROUP${roomId.value}`; options.data.forEach((message: any) => { if ( message.conversationID !== currentConversationId || message.type !== TencentCloudChat.TYPES.MSG_TEXT ) { return; } const { ID, payload: { text }, nick: userName, from: userId, } = message; chatStore.updateMessageList({ ID, type: 'TIMTextElem', payload: { text, }, nick: userName || userId, from: userId, flow: 'in', sequence: Math.random(), }); }); }; async function setMessageListInfo() { const { currentMessageList, isCompleted, nextReqMessageId } = await getMessageList(); const filterCurrentMessageList = currentMessageList.filter( (item: any) => item.type === 'TIMTextElem' ); chatStore.setMessageListInfo( filterCurrentMessageList, isCompleted, nextReqMessageId ); } function getDisplaySenderName(index: number) { if (index === 0) return true; return messageList.value[index].from !== messageList.value[index - 1].from; } let tim = roomEngine.instance?.getTIM(); if (!tim) { tim = TencentCloudChat.create({ SDKAppID: basicStore.sdkAppId }); } TUIRoomEngine.once('ready', () => { tim?.on(TencentCloudChat.EVENT.MESSAGE_RECEIVED, onReceiveMessage); }); onUnmounted(() => { tim?.off(TencentCloudChat.EVENT.MESSAGE_RECEIVED, onReceiveMessage); }); return { t, handleGetHistoryMessageList, messageList, getMessageList, setMessageListInfo, getDisplaySenderName, isCompleted, }; }