123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- import {dealChatTime} from "../../utils/time";
- import ImApi from '../../apis/im'
- import { fotmatDate } from '../../utils/date'
- export default class IMOperator {
- static VoiceType = 'voice';
- static TextType = 'text';
- static ImageType = 'image';
- static CustomType = 'custom';
- static VrCardType = 'vr'
- constructor(page, opts = {}) {
- this._opts = opts;
- this._latestTImestamp = 0;//最新消息的时间戳
- this._myHeadUrl = this._opts.myHeadUrl;
- this._otherHeadUrl = this._opts.friendHeadUrl;
- }
- getFriendId() {
- return this._opts.friendId;
- }
- onSimulateReceiveMsg(cbOk, toId) {
- this.listener = (msg) => {
- if (!msg) {
- return;
- }
- msg.isMy = msg.fromId === getApp().globalData.userinfo.viewerId;
- const item = this.createNormalChatItem(msg);
- this._latestTImestamp = item.timestamp;
- //这里是收到好友消息的回调函数,建议传入的item是 由 createNormalChatItem 方法生成的。
- cbOk && cbOk(item);
- }
- getApp().getIMHandler().setOnReceiveMessageListener({
- listener: this.listener
- });
- }
- removeSimulateReceiveMsg () {
- getApp().getIMHandler().removeOnReceiveMessageListener({
- listener: this.listener
- });
- }
- async onSimulateSendMsg({content}) {
- //这里content即为要发送的数据
- //这里的content是一个对象了,不再是一个JSON格式的字符串。这样可以在发送消息的底层统一处理。
- try {
- content = {
- fromId: content.fromId,
- fromName: getApp().globalData.userinfo.name || getApp().globalData.userinfo.phone,
- toId: content.toId,
- toName: 'xu',
- type: content.type,
- msgType: content.msgType,
- content: content.content
- }
- const {content: contentSendSuccess} = await getApp().getIMHandler().sendMsg({content});
- //这个contentSendSuccess格式一样,也是一个对象
- const msg = this.createNormalChatItem(contentSendSuccess);
- this._latestTImestamp = msg.timestamp;
- return Promise.resolve({msg});
- } catch (e) {
- return Promise.reject(e);
- }
- }
- createChatItemContent({msgType = IMOperator.TextType, content = '', duration, toId, type="TYPE_ONE"} = {}) {
- return {
- content,
- msgType,
- type,
- toId,
- conversationId: 0,//会话id,目前未用到
- fromId: getApp().globalData.userinfo.viewerId,
- duration
- };
- }
- createNormalChatItem({type = IMOperator.TextType, content = '', isMy = true, duration, msgType, sendTime=fotmatDate(new Date(), 'yyyy-MM-dd hh:mm:ss')} = {}) {
- if (!content) return;
- const currentTimestamp = Date.now();
- const time = dealChatTime(sendTime, this._latestTImestamp);
- let obj = {
- friendId: this.getFriendId(),//好友id
- isMy,//我发送的消息?
- showTime: time.ifShowTime,//是否显示该次发送时间
- time: time.timeStr,//发送时间 如 09:15,
- timestamp: currentTimestamp,//该条数据的时间戳,一般用于排序
- type,//内容的类型,目前有这几种类型: text/voice/image/custom | 文本/语音/图片/自定义
- content,// 显示的内容,根据不同的类型,在这里填充不同的信息。
- headUrl: isMy ? this._myHeadUrl : this._otherHeadUrl,//显示的头像,自己或好友的。
- sendStatus: 'success',//发送状态,目前有这几种状态:sending/success/failed | 发送中/发送成功/发送失败
- duration: duration || content.duration,//语音时长 单位秒
- isPlaying: false,//语音是否正在播放,
- msgType,
- toId: arguments[0].toId,
- fromId: arguments[0].fromId
- };
- if (type !== IMOperator.TextType) {
- obj.saveKey = content;//saveKey是存储文件时的key
- }
- return obj;
- }
- static createCustomChatItem() {
- return {
- timestamp: Date.now(),
- type: IMOperator.CustomType,
- content: '会话已关闭'
- }
- }
- }
|