258 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			258 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
| import Base from "./base";
 | |
| import Vue from "vue";
 | |
| import router from "@/router";
 | |
| import vm from "@/main";
 | |
| import NewMessageNotify from "@/components/notify/NewMessageNotify";
 | |
| import { ServeClearTalkUnreadNum, ServeCreateTalkList } from "@/api/chat";
 | |
| import { formatTalkItem, findTalkIndex, toTalk } from "@/utils/talk";
 | |
| import { parseTime } from "@/utils/functions";
 | |
| 
 | |
| import mixin from '@/mixins/main-mixin'
 | |
| /**
 | |
|  * 好友状态事件
 | |
|  */
 | |
| class Talk extends Base {
 | |
|   /**
 | |
|    * @var resource 资源
 | |
|    */
 | |
|   resource;
 | |
| 
 | |
|   /**
 | |
|    * 发送者ID
 | |
|    */
 | |
|   sender_id = 0;
 | |
| 
 | |
|   /**
 | |
|    * 接收者ID
 | |
|    */
 | |
|   receiver_id = 0;
 | |
| 
 | |
|   /**
 | |
|    * 聊天类型[1:私聊;2:群聊;]
 | |
|    */
 | |
|   talk_type = 0;
 | |
| 
 | |
|   /**
 | |
|    * 初始化构造方法
 | |
|    *
 | |
|    * @param {Object} resource Socket消息
 | |
|    */
 | |
|   constructor(resource) {
 | |
|     super();
 | |
|     this.sender_id = resource.fromUser; //发送
 | |
|     this.receiver_id = resource.toUser; //接收
 | |
|     this.talk_type = resource.messageType; //类型
 | |
| 
 | |
|     this.resource = resource;
 | |
| 
 | |
|     // 判断发送者消息是否在当前用户列表中 
 | |
|     if (this.sender_id && !vm.$store.state.talks.items.find(item => {
 | |
|       return item.userId == this.sender_id
 | |
|     })) {
 | |
|       // 没有当前用户,未在当前列表 进行重新加载
 | |
|       vm.loadUserSetting('update')
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * 判断消息发送者是否来自于我
 | |
|    * @returns
 | |
|    */
 | |
|   isCurrSender () {
 | |
|     // console.log("sender_id", this.sender_id);
 | |
|     return this.sender_id == this.getAccountId();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * 获取对话索引
 | |
|    *
 | |
|    * @return String
 | |
|    */
 | |
|   getIndexName () {
 | |
|     if (this.talk_type == 2) {
 | |
|       return `${this.talk_type}_${this.receiver_id}`;
 | |
|     }
 | |
| 
 | |
|     let receiver_id = this.isCurrSender() ? this.receiver_id : this.sender_id;
 | |
| 
 | |
|     return `${this.talk_type}_${receiver_id}`;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * 消息浮动方式
 | |
|    *
 | |
|    * @returns
 | |
|    */
 | |
|   getFloatType () {
 | |
|     let userId = this.resource.userId;
 | |
| 
 | |
|     if (userId == 0) return "center";
 | |
| 
 | |
|     return userId == this.getAccountId() ? "right" : "left";
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * 获取聊天列表左侧的对话信息
 | |
|    */
 | |
|   getTalkText () {
 | |
|     let text = this.resource.content || this.resource.text;
 | |
|     switch (this.resource.msg_type) {
 | |
|       case 'GOODS':
 | |
|         text = "[商品链接]";
 | |
|         break;
 | |
|       case 'ORDERS':
 | |
|         text = "[订单链接]";
 | |
|         break;
 | |
|     }
 | |
| 
 | |
|     return text;
 | |
|   }
 | |
| 
 | |
|   handle () {
 | |
|     let store = this.getStoreInstance();
 | |
|     // console.log("触发handle");
 | |
|     // 判断当前是否在聊天页面
 | |
|     if (!this.isTalkPage()) {
 | |
|       store.commit("INCR_UNREAD_NUM");
 | |
| 
 | |
|       // 判断消息是否来自于我自己,否则会提示消息通知
 | |
|       return !this.isCurrSender() && this.showMessageNocice();
 | |
|     }
 | |
|     // console.log("this.receiver_id", this.receiver_id);
 | |
|     // console.log("this.sender_id", this.sender_id);
 | |
|     let isTrue = this.isTalk(1, this.receiver_id, this.sender_id);
 | |
|     // console.log("判断当前是否正在和好友对话", isTrue);
 | |
|     // 判断当前是否正在和好友对话
 | |
|     if (isTrue) {
 | |
|       this.insertTalkRecord();
 | |
|     } else {
 | |
|       this.updateTalkItem();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * 显示消息提示
 | |
|    * @returns
 | |
|    */
 | |
|   showMessageNocice () {
 | |
|     let avatar = this.resource.avatar;
 | |
|     let nickname = this.resource.nickname;
 | |
|     let talk_type = this.resource.talk_type;
 | |
|     let receiver_id = this.receiver_id;
 | |
| 
 | |
|     if (talk_type == 2) {
 | |
|       avatar = this.resource.group_avatar;
 | |
|       nickname += `【 ${this.resource.group_name} 】`;
 | |
|     } else {
 | |
|       receiver_id = this.sender_id;
 | |
|     }
 | |
| 
 | |
|     this.$notify({
 | |
|       message: vm.$createElement(NewMessageNotify, {
 | |
|         props: {
 | |
|           avatar,
 | |
|           talk_type,
 | |
|           nickname,
 | |
|           content: this.getTalkText(),
 | |
|           datetime: this.resource.created_at,
 | |
|         },
 | |
|       }),
 | |
|       customClass: "im-notify",
 | |
|       duration: 3000,
 | |
|       position: "top-right",
 | |
|       onClick: function () {
 | |
|         this.close();
 | |
|         toTalk(talk_type, receiver_id);
 | |
|       },
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * 加载对接节点
 | |
|    */
 | |
|   addTalkItem () {
 | |
|     let receiver_id = this.sender_id;
 | |
|     let talk_type = this.talk_type;
 | |
| 
 | |
|     if (talk_type == 1 && this.receiver_id != this.getAccountId()) {
 | |
|       receiver_id = this.receiver_id;
 | |
|     } else if (talk_type == 2) {
 | |
|       receiver_id = this.receiver_id;
 | |
|     }
 | |
|     // console.log("加载对接节点", this.resource);
 | |
| 
 | |
|     ServeCreateTalkList(receiver_id).then(({ code, data }) => {
 | |
|       if (code == 200) {
 | |
|         this.getStoreInstance().commit("PUSH_TALK_ITEM", formatTalkItem(data));
 | |
|       }
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * 插入对话记录
 | |
|    */
 | |
|   insertTalkRecord () {
 | |
|     let store = this.getStoreInstance();
 | |
|     let record = this.resource;
 | |
|     // console.log("插入谈话记录", record);
 | |
| 
 | |
|     record.float = this.getFloatType();
 | |
| 
 | |
|     store.commit("PUSH_DIALOGUE", record);
 | |
| 
 | |
|     // 获取聊天面板元素节点
 | |
|     let el = document.getElementById("lumenChatPanel");
 | |
| 
 | |
|     // 判断的滚动条是否在底部
 | |
|     let isBottom = Math.ceil(el.scrollTop) + el.clientHeight >= el.scrollHeight;
 | |
| 
 | |
|     if (
 | |
|       isBottom ||
 | |
|       record.userId == this.getAccountId() ||
 | |
|       record.fromUser == this.getAccountId()
 | |
|     ) {
 | |
|       Vue.nextTick(() => {
 | |
|         el.scrollTop = el.scrollHeight;
 | |
|       });
 | |
|     } else {
 | |
|       // console.log("%c SET_TLAK_UNREAD_MESSAGE %c", "color:red");
 | |
|       store.commit("SET_TLAK_UNREAD_MESSAGE", {
 | |
|         content: this.getTalkText(),
 | |
|         nickname: record.name,
 | |
|       });
 | |
|     }
 | |
|     // console.log("%c 准备更新...UPDATE_TALK_ITEM ", "color:red");
 | |
| 
 | |
|     store.commit("UPDATE_TALK_ITEM", {
 | |
|       index_name: this.getIndexName(),
 | |
|       msg_text: this.getTalkText() || record.text,
 | |
|       updated_at: parseTime(new Date()),
 | |
|     });
 | |
| 
 | |
|     if (this.talk_type == 1 && this.getAccountId() !== this.sender_id) {
 | |
|       // console.log("%c 清除 未读数...ServeClearTalkUnreadNum ", "color:blue");
 | |
|       ServeClearTalkUnreadNum({
 | |
|         talk_type: 1,
 | |
|         receiver_id: this.sender_id,
 | |
|       });
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * 更新对话列表记录
 | |
|    */
 | |
|   updateTalkItem () {
 | |
|     let store = this.getStoreInstance();
 | |
| 
 | |
|     store.commit("INCR_UNREAD_NUM");
 | |
| 
 | |
|     store.commit("UPDATE_TALK_MESSAGE", {
 | |
|       index_name: this.getIndexName(),
 | |
|       msg_text: this.getTalkText(),
 | |
|       updated_at: parseTime(new Date()),
 | |
|     });
 | |
|   }
 | |
| }
 | |
| 
 | |
| export default Talk;
 |