/* eslint-disable prefer-promise-reject-errors */ // @ts-nocheck import type { Conversation, Message } from '@tencentcloud/chat'; import type TencentCloudChat from '@tencentcloud/chat'; import { ERROR_CODE_ENGINE, ERROR_MSG_ENGINE } from '../const'; import type { IConversationModel, IMessageModel } from '../interface/model'; import { isPrivateKey, isUndefined } from '../utils/common-utils'; import TUIBase from '../tui-base'; import type { ModifyMessageParams, ReactionInfo } from '../type'; export default class MessageModel extends TUIBase implements IMessageModel { public ID!: string; public type!: TencentCloudChat.TYPES; payload: any; conversationID!: string; conversationType!: TencentCloudChat.TYPES; to!: string; from!: string; flow!: string; time!: number; status!: string; isRevoked!: boolean; priority!: TencentCloudChat.TYPES; nick!: string; avatar!: string; isPeerRead!: boolean; nameCard!: string; atUserList!: string[]; cloudCustomData!: string; isDeleted!: boolean; isModified!: boolean; needReadReceipt!: boolean; readReceiptInfo!: { readCount?: number; unreadCount?: number; isPeerRead?: boolean; }; isBroadcastMessage!: boolean; isSupportExtension!: boolean; receiverList!: string[]; revoker!: string; sequence!: number; progress!: number; revokerInfo!: { userID: string; nick: string; avatar: string }; revokeReason!: string; hasRiskContent!: boolean; reactionList!: ReactionInfo[]; private _message: Message; private _signalingInfo!: any; // 默认值 undefined,_signalingInfo 的类型是 undefined|null|object,因为 getSignalingInfo 返回值是 null|object,枚举会引起编译报错,所以此处用 any 代替。 // 维护映射关系,方便使用 private messageHandlers = { [this.getEngine().TYPES.MSG_TEXT]: (message: Message) => this.getEngine().TUIChat.messageHandler.handleTextMessage(message), [this.getEngine().TYPES.MSG_FACE]: (message: Message) => this.getEngine().TUIChat.messageHandler.handleFaceMessage(message), [this.getEngine().TYPES.MSG_LOCATION]: (message: Message) => this.getEngine().TUIChat.messageHandler.handleLocationMessage(message), [this.getEngine().TYPES.MSG_IMAGE]: (message: Message) => this.getEngine().TUIChat.messageHandler.handleImageMessage(message), [this.getEngine().TYPES.MSG_AUDIO]: (message: Message) => this.getEngine().TUIChat.messageHandler.handleAudioMessage(message), [this.getEngine().TYPES.MSG_VIDEO]: (message: Message) => this.getEngine().TUIChat.messageHandler.handleVideoMessage(message), [this.getEngine().TYPES.MSG_FILE]: (message: Message) => this.getEngine().TUIChat.messageHandler.handleFileMessage(message), [this.getEngine().TYPES.MSG_CUSTOM]: (message: Message) => this.getEngine().TUIChat.messageHandler.handleCustomMessage(message), [this.getEngine().TYPES.MSG_MERGER]: (message: Message) => this.getEngine().TUIChat.messageHandler.handleMergeMessage(message), [this.getEngine().TYPES.MSG_GRP_TIP]: (message: Message) => this.getEngine().TUIChat.messageHandler.handleGroupTipsMessage(message), }; constructor(options: Message) { super(); this._message = options; this._signalingInfo = undefined; this.progress = 0; this.reactionList = []; this.initProperties(options); } /** * 初始化 messageModel 属性 */ private initProperties(options: Message): void { Object.keys(options).forEach((key) => { if (!isPrivateKey(key)) { (this as any)[key] = options[key as keyof Message]; } }); } updateProperties(options: Message): void { this._message = options; Object.keys(options).forEach((key) => { if (!isPrivateKey(key)) { (this as any)[key] = options[key as keyof Message]; } }); } getMessage() { return this._message; } modifyMessage(options: ModifyMessageParams) { if (options.type && this._message.type !== options.type && !options.payload) { return Promise.reject({ code: ERROR_CODE_ENGINE.MISMATCH_TYPE_AND_PAYLOAD, message: ERROR_MSG_ENGINE.MISMATCH_TYPE_AND_PAYLOAD, }); } this._message.type = options.type || this._message.type; this._message.payload = options.payload || this._message.payload; this._message.cloudCustomData = options.cloudCustomData || this._message.cloudCustomData; return this.getEngine().TUIChat.modifyMessage(this._message); } revokeMessage() { return this.getEngine().TUIChat.revokeMessage(this._message); } resendMessage() { return this.getEngine().TUIChat.resendMessage(this._message); } deleteMessage() { return this.getEngine().TUIChat.deleteMessage([this._message]); } quoteMessage() { return this.getEngine().TUIChat.quoteMessage(this._message); } replyMessage() { return this.getEngine().TUIChat.replyMessage(this._message); } setMessageExtensions(extensions: Record[]) { return this.getEngine().TUIChat.setMessageExtensions(this._message, extensions); } getMessageExtensions() { return this.getEngine().TUIChat.getMessageExtensions(this._message); } deleteMessageExtensions(keyList?: string[]) { return this.getEngine().TUIChat.deleteMessageExtensions(this._message, keyList); } getSignalingInfo() { if (this.type !== this.getEngine().TYPES.MSG_CUSTOM) { return null; } if (isUndefined(this._signalingInfo)) { this._signalingInfo = this.getEngine().chat.getSignalingInfo(this._message); return this._signalingInfo; } return this._signalingInfo; } getMessageContent() { const handler = this.messageHandlers[this.type as any]; if (isUndefined(handler)) { return {}; } // 群提示消息不支持 showName if (this.type === this.getEngine().TYPES.MSG_GRP_TIP) { return handler(this._message); } // 普通消息发送方名称显示优先级(对齐微信体验) // C2C 会话:remark > nick > userID // 群会话:remark > nameCard > nick > userID // const friendRemark: any = this.getEngine().TUIFriend.getFriendRemark([this.from]); return { ...handler(this._message), showName: this.nick || this.from, }; } sendForwardMessage(conversationList: Conversation[] | IConversationModel[]) { return this.getEngine().TUIChat.sendForwardMessage(conversationList, [this._message]); } }