tccc-vue-uikit
Version:
TCCC Vue3 UIKit
285 lines (260 loc) • 8.23 kB
text/typescript
import IComponentServer from '../IComponentServer';
/**
* class TUIConversationServer
*
* TUIConversation 逻辑主体
*/
export default class TUIConversationServer extends IComponentServer {
public TUICore: any;
public store: any;
public currentStore: any = {};
public storeCallback: any;
constructor(TUICore: any) {
super();
this.TUICore = TUICore;
this.bindTIMEvent();
this.store = TUICore.setComponentStore('TUIConversation', {}, this.updateStore.bind(this));
}
/**
* 组件销毁
*
*/
public destroyed() {
this.unbindTIMEvent();
}
/**
* 数据监听回调
*
* @param {any} newValue 新数据
* @param {any} oldValue 旧数据
*/
updateStore(newValue: any, oldValue: any) {
if (!this?.currentStore?.conversationData) {
return;
}
this.currentStore.conversationData.list = newValue.conversationList;
newValue?.conversationList?.filter((item: any) => {
if (item?.userProfile?.userID) {
this.currentStore.userIDList.add(item?.userProfile?.userID);
}
});
this.currentStore.userStatusList = this.TUICore.TUIServer.TUIContact.currentStore?.userStatusList;
}
/**
* 处理异步函数
*
* @param {callback} callback 回调函数
* @returns {Promise} 返回异步函数
*/
private handlePromiseCallback(callback: any) {
return new Promise<void>((resolve, reject) => {
const config = {
TUIName: 'TUIConversation',
callback: () => {
callback && callback(resolve, reject);
},
};
this.TUICore.setAwaitFunc(config.TUIName, config.callback);
});
}
/**
* /////////////////////////////////////////////////////////////////////////////////
* //
* // TIM 事件监听注册接口
* //
* /////////////////////////////////////////////////////////////////////////////////
*/
private bindTIMEvent() {
this.TUICore.tim.on(this.TUICore.TIM.EVENT.CONVERSATION_LIST_UPDATED, this.handleConversationListUpdate, this);
this.TUICore.tim.on(this.TUICore.TIM.EVENT.NET_STATE_CHANGE, this.handleNetStateChange, this);
}
private unbindTIMEvent() {
this.TUICore.tim.off(this.TUICore.TIM.EVENT.CONVERSATION_LIST_UPDATED, this.handleConversationListUpdate);
this.TUICore.tim.off(this.TUICore.TIM.EVENT.NET_STATE_CHANGE, this.handleNetStateChange);
}
private handleConversationListUpdate(res: any) {
// this.handleFilterSystem(res.data);
}
private handleNetStateChange(res: any) {
this.currentStore.netWork = res?.data?.state || '';
}
/**
* 处理conversationList
*
* @param {Array} list conversationList
* @returns {Object}
*/
private handleFilterSystem(list: any) {
console.log('handleFilterSystem');
const options = {
allConversationList: list,
conversationList: [],
};
const currentList = list.filter((item: any) => item?.conversationID === this?.currentStore?.currentConversationID);
if (currentList.length === 0) {
this.handleCurrentConversation({});
}
options.conversationList = list.filter((item: any) => item.type !== this.TUICore.TIM.TYPES.CONV_SYSTEM);
this.store.allConversationList = options.allConversationList;
this.store.conversationList = options.conversationList;
return options;
}
/**
* /////////////////////////////////////////////////////////////////////////////////
* //
* // TIM 方法
* //
* /////////////////////////////////////////////////////////////////////////////////
*/
/**
* 设置会话内消息为已读状态
* Set the message within the conversation to read
*
* @param {string} conversationID 会话ID
* @returns {Promise}
*/
public async setMessageRead(conversationID: string) {
return this.handlePromiseCallback(async (resolve: any, reject: any) => {
try {
const imResponse: any = await this.TUICore.tim.setMessageRead({ conversationID });
resolve(imResponse);
} catch (error) {
reject(error);
}
});
}
/**
* 删除会话
*
* @param {string} conversationID 会话ID
* @returns {Promise}
*/
public async deleteConversation(conversationID: string) {
return this.handlePromiseCallback(async (resolve: any, reject: any) => {
try {
const imResponse: any = await this.TUICore.tim.deleteConversation(conversationID);
resolve(imResponse);
} catch (error) {
reject(error);
}
});
}
/**
* 置顶会话
*
* @param {Object} options 置顶参数
* @returns {Promise}
*/
public async pinConversation(options: any) {
return this.handlePromiseCallback(async (resolve: any, reject: any) => {
try {
const imResponse: any = await this.TUICore.tim.pinConversation(options);
resolve(imResponse);
} catch (error) {
reject(error);
}
});
}
/**
* C2C消息免打扰
*
* @param {Object} options 消息免打扰参数
* @returns {Promise}
*/
public async muteConversation(options: any) {
return this.handlePromiseCallback(async (resolve: any, reject: any) => {
try {
const imResponse: any = await this.TUICore.tim.setMessageRemindType(options);
resolve(imResponse);
} catch (error) {
reject(error);
}
});
}
/**
* 获取 conversationList
*
* @param {string} conversationID 会话ID
* @returns {Promise}
*/
public async getConversationProfile(conversationID: string) {
return this.handlePromiseCallback(async (resolve: any, reject: any) => {
try {
const imResponse = await this.TUICore.tim.getConversationProfile(conversationID);
resolve(imResponse);
} catch (error) {
reject(error);
}
});
}
/*
* 获取 conversationList
*
* @returns {Promise}
*/
public async getConversationList() {
return this.handlePromiseCallback(async (resolve: any, reject: any) => {
try {
const imResponse = await this.TUICore.tim.getConversationList();
this.handleFilterSystem(imResponse.data.conversationList);
resolve(imResponse);
} catch (error) {
reject(error);
}
});
}
/**
* 获取其他用户资料
*
* @param {Array<string>} userIDList 用户的账号列表
* @returns {Promise}
*/
public async getUserProfile(userIDList: Array<string>) {
return this.handlePromiseCallback(async (resolve: any, reject: any) => {
try {
const imResponse = await this.TUICore.tim.getUserProfile({ userIDList });
resolve(imResponse);
} catch (error) {
reject(error);
}
});
}
/**
* /////////////////////////////////////////////////////////////////////////////////
* //
* // UI 数据绑定server数据同步
* //
* /////////////////////////////////////////////////////////////////////////////////
*/
/**
* 赋值
*
* @param {Object} params 使用的数据
* @returns {Object} 数据
*/
public async bind(params: any) {
this.currentStore = params;
await this.getConversationList();
this.currentStore.userStatusList = this.TUICore.TUIServer.TUIContact.currentStore?.userStatusList;
return this.currentStore;
}
// 切换当前会话
public handleCurrentConversation(value: any) {
console.log(value, 'handleCurrentConversation');
// 通知 TUIChat 切换会话或关闭会话
this.TUICore.getStore().TUIChat.conversation = value || {};
if (!value?.conversationID) {
this.currentStore.currentConversationID = '';
return;
}
// Prevent group chat that is currently open from entering from the address book, resulting in no jump.
if (this.currentStore.currentConversationID === value?.conversationID) {
this.currentStore.currentConversationID = '';
}
if (this.currentStore.currentConversationID) {
this.setMessageRead(this.currentStore.currentConversationID);
}
this.currentStore.currentConversationID = value?.conversationID;
this.setMessageRead(value.conversationID);
}
}