@aochuang/client-sdk 1.0.325 → 1.0.327

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aochuang/client-sdk",
3
- "version": "1.0.325",
3
+ "version": "1.0.327",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1"
@@ -30,6 +30,8 @@ export default class ClientChatMessage {
30
30
 
31
31
  messageMap = {}
32
32
 
33
+ lastMessageTimeMap = {}
34
+
33
35
  // 记录一下临时更新的消息,主要是客服端发送消息后,如果失败的时候后端会返回两条消息,一条完整的接口一条失败的状态结果,两个消息顺序没发保证完整结构-》状态结果,所以要先把状态结果临时存一下,后面新增消息的时候从这里找一下,同步一下sendStatus和errMsg
34
36
  tempMessageMap = {}
35
37
 
@@ -118,6 +120,8 @@ export default class ClientChatMessage {
118
120
  delete this.tempMessageMap[data.id]
119
121
  }
120
122
  const groupField = data[this.groupField]
123
+ const lastMessageTime = this.getLastMessageTime(groupField)
124
+ const isBeforeLastMessage = !data.isSend && lastMessageTime && data[this.sortField] < lastMessageTime
121
125
  if (!this.data.messageData[groupField]) {
122
126
  Vue.set(this.data.messageData, groupField, {})
123
127
  }
@@ -133,6 +137,7 @@ export default class ClientChatMessage {
133
137
  }
134
138
  this.data.messageData[groupField][sortFields.day][sortFields.milliseconds].push(data)
135
139
  this.messageMap[data.id] = data
140
+ this.setLastMessageTime(groupField, data[this.sortField], data)
136
141
  // 发送中的消息并且不是临时占位消息,需要增加轮询结果逻辑
137
142
  if (data.isSend && data.sendStatus === 1 && !data._temp) {
138
143
  // 排除一下系统消息,因为后端系统消息的sendStatus永远为1,这会导致前端总是轮训去调用接口检查消息状态
@@ -143,13 +148,15 @@ export default class ClientChatMessage {
143
148
  if (fireEvent !== false) {
144
149
  // 如果消息包含这种情况,就不能往外发送add-message事件
145
150
  // 因为例如群发的消息,他没有会话,导致前端在处理来了新消息通知铃声提醒,获取会话一直获取不到,然后会总是发送请求
146
- if (!isAutoReadMessage(data) && !shouldIgnoreSessionByMessage(data) && !isDeletedMsg(data) && !isBlockedMsg(data)) {
151
+ if (!isBeforeLastMessage && !isAutoReadMessage(data) && !shouldIgnoreSessionByMessage(data) && !isDeletedMsg(data) && !isBlockedMsg(data)) {
147
152
  this.event && this.event.emit('add-message', {
148
153
  data
149
154
  })
150
155
  }
151
156
  this.onAddMessageSuccess && this.onAddMessageSuccess({
152
- data
157
+ data,
158
+ lastMessageTime,
159
+ isBeforeLastMessage
153
160
  })
154
161
  }
155
162
  }
@@ -562,6 +569,7 @@ export default class ClientChatMessage {
562
569
  task.cancel()
563
570
  })
564
571
  this.tempMessageMap = {}
572
+ this.lastMessageTimeMap = {}
565
573
  this.data.messageData = {}
566
574
  }
567
575
 
@@ -588,6 +596,23 @@ export default class ClientChatMessage {
588
596
  * 最后接收的一条好友消息时间
589
597
  */
590
598
  setLastReceiveMessageTime (messageTime) {
599
+ if (!messageTime || (this.data.lastReceiveMessageTime && messageTime <= this.data.lastReceiveMessageTime)) {
600
+ return
601
+ }
591
602
  this.data.lastReceiveMessageTime = messageTime
592
603
  }
593
- }
604
+
605
+ getLastMessageTime (groupField) {
606
+ return this.lastMessageTimeMap[groupField]
607
+ }
608
+
609
+ setLastMessageTime (groupField, messageTime, message) {
610
+ if (!groupField || !messageTime || (message && message.msgType === '_EMPTY_')) {
611
+ return
612
+ }
613
+ const lastMessageTime = this.getLastMessageTime(groupField)
614
+ if (!lastMessageTime || messageTime > lastMessageTime) {
615
+ this.lastMessageTimeMap[groupField] = messageTime
616
+ }
617
+ }
618
+ }
@@ -379,13 +379,16 @@ class ClientChat {
379
379
  clientChat: this,
380
380
  checkMessageSendResultMethod: options.checkMessageSendResultMethod,
381
381
  loadLossMessageDataMethod: options.loadLossFriendMessageDataMethod,
382
- onAddMessageSuccess: ({ data }) => {
382
+ onAddMessageSuccess: ({ data, isBeforeLastMessage }) => {
383
383
  const accountId = options.getLoginAccountIdMethod ? options.getLoginAccountIdMethod() : data.accountId
384
384
  let sessionId = createSessionId(accountId, data.wechatFriendId)
385
385
  // 更新会话
386
386
  if (!sessionId) {
387
387
  return
388
388
  }
389
+ if (isBeforeLastMessage) {
390
+ return
391
+ }
389
392
  if (isAutoReadMessage(data)) {
390
393
  return this.handleAutoReadMessageSession(sessionId)
391
394
  }
@@ -513,7 +516,7 @@ class ClientChat {
513
516
  clientChat: this,
514
517
  checkMessageSendResultMethod: options.checkMessageSendResultMethod,
515
518
  loadLossMessageDataMethod: options.loadLossRoomMessageDataMethod,
516
- onAddMessageSuccess: ({ data }) => {
519
+ onAddMessageSuccess: ({ data, isBeforeLastMessage }) => {
517
520
  const accountId = options.getLoginAccountIdMethod ? options.getLoginAccountIdMethod() : data.accountId
518
521
  let sessionId = createSessionId(accountId, data.wechatChatroomId)
519
522
  const atMessage = getAtMessageContent(data)
@@ -521,6 +524,9 @@ class ClientChat {
521
524
  if (!sessionId) {
522
525
  return
523
526
  }
527
+ if (isBeforeLastMessage) {
528
+ return
529
+ }
524
530
  if (isAutoReadMessage(data)) {
525
531
  return this.handleAutoReadMessageSession(sessionId)
526
532
  }
@@ -33,21 +33,20 @@ export default class ClietChatSocket {
33
33
  // 执行消息前回调
34
34
  this.beforeFireCallback = options.beforeFireCallback
35
35
  }
36
- /**
37
- * 发送聊天消息
38
- */
39
- sendChatMessage (options) {
40
- const message = Object.assign({
41
- content: null,
42
- msgType: null,
43
- msgSubType: null,
44
- qwAccountId: null
45
- // contactId: null,
46
- // roomId: null
47
- }, options, {
48
- cmdType: 'CmdQwSendMessage'
36
+
37
+ sendMessage (message, beforeCallback) {
38
+ return this.socket.sendMessage(message, (data) => {
39
+ let ps = Promise.resolve()
40
+ // 如果发送消息的时候,连接是断开或者失败的,重新连接一次,主要是防止用户发送消息的时候网络断开了,提示socket已关闭,体验不好,程序静默来处理
41
+ if (this.socket.connectStatus === Socket.CONNECT_STATUS_ENUM.Close || this.socket.connectStatus === Socket.CONNECT_STATUS_ENUM.Error) {
42
+ ps = this.socket.reconnect()
43
+ }
44
+ return ps.finally(() => {
45
+ if (beforeCallback) {
46
+ return beforeCallback(data)
47
+ }
48
+ })
49
49
  })
50
- return this.socket.sendMessage(message)
51
50
  }
52
51
 
53
52
  connect () {
@@ -25,6 +25,7 @@ class ClientChat {
25
25
  _sessionPollRequestMap = {}
26
26
 
27
27
  constructor (options) {
28
+
28
29
  options = Object.assign({
29
30
  client: null,
30
31
  socket: null, // socket实例