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,

128 lines (113 loc) 3.98 kB
import { TUIConstants, TUICore } from '@tencentcloud/tui-core'; import { EventType, IRoomService } from '../types'; import TUIRoomEngine, { TUIRoomEvents } from '@tencentcloud/tuiroom-engine-js'; import { UserInfo } from '../../stores/room'; import defaultAvatar from '../../assets/imgs/avatar.png'; export class ChatManager { static instance?: ChatManager; private service: IRoomService; constructor(service: IRoomService) { this.service = service; this.bindEventContext(); this.bindEvent(); TUICore.registerEvent( TUIConstants.TUIChat.EVENT.CHAT_STATE_CHANGED, TUIConstants.TUIChat.EVENT_SUB_KEY.CHAT_OPENED, this ); } static getInstance(ctx: IRoomService): ChatManager { if (!ChatManager.instance) { ChatManager.instance = new ChatManager(ctx); } return ChatManager.instance; } static destroyInstance(): void { if (!ChatManager.instance) return; ChatManager.instance = undefined; } public dispose() { this.unbindEvent(); } public reset() { TUICore.unregisterExtension( TUIConstants.TUIChat.EVENT.CHAT_STATE_CHANGED, this ); } public async onNotifyEvent(eventName: string, subKey: string, options?: any) { if (options.groupID !== this.service.basicStore.roomId) return; if (eventName === TUIConstants.TUIChat.EVENT.CHAT_STATE_CHANGED) { if (subKey === TUIConstants.TUIChat.EVENT_SUB_KEY.CHAT_OPENED) { TUICore.notifyEvent( TUIConstants.TUIChat.EVENT.CHAT_TYPE_CHANGED, TUIConstants.TUIChat.EVENT_SUB_KEY.CHANGE_SUCCESS, { chatType: TUIConstants.TUIChat.TYPE.ROOM } ); const result = Object.fromEntries( this.service.roomStore.userList.map(item => [ item.userId, { nick: item.userName, nameCard: item.nameCard, avatar: item.avatarUrl || defaultAvatar, }, ]) ); TUICore.callService({ serviceName: TUIConstants.TUIChat.SERVICE.NAME, method: TUIConstants.TUIChat.SERVICE.METHOD.UPDATE_MESSAGE_INFO, params: { userInfo: result }, }); } } } private onLanguageChanged(language: string) { TUICore.notifyEvent( TUIConstants.TUITranslate.EVENT.LANGUAGE_CHANGED, TUIConstants.TUITranslate.EVENT_SUB_KEY.CHANGE_SUCCESS, { language } ); } private onThemeChanged(theme: string) { TUICore.notifyEvent( TUIConstants.TUITheme.EVENT.THEME_CHANGED, TUIConstants.TUITheme.EVENT_SUB_KEY.CHANGE_SUCCESS, { theme } ); } private onUserNameCardChanged(eventInfo: { userInfo: UserInfo }) { const { userId, nameCard } = eventInfo.userInfo; const oldNameCard = this.service.roomStore.userInfoObj[userId]?.nameCard; if (oldNameCard === nameCard) return; const result = { [userId]: { nameCard } }; TUICore.callService({ serviceName: TUIConstants.TUIChat.SERVICE.NAME, method: TUIConstants.TUIChat.SERVICE.METHOD.UPDATE_MESSAGE_INFO, params: { userInfo: result }, }); } private bindEventContext() { this.onLanguageChanged = this.onLanguageChanged.bind(this); this.onThemeChanged = this.onThemeChanged.bind(this); this.onUserNameCardChanged = this.onUserNameCardChanged.bind(this); } private bindEvent() { this.service.on(EventType.LANGUAGE_CHANGED, this.onLanguageChanged); this.service.on(EventType.THEME_CHANGED, this.onThemeChanged); TUIRoomEngine.once('ready', () => { this.service.roomEngine.instance?.on( TUIRoomEvents.onUserInfoChanged, this.onUserNameCardChanged ); }); } private unbindEvent() { this.service.off(EventType.LANGUAGE_CHANGED, this.onLanguageChanged); this.service.off(EventType.THEME_CHANGED, this.onThemeChanged); this.service.roomEngine.instance?.off( TUIRoomEvents.onUserInfoChanged, this.onUserNameCardChanged ); } }