@aochuang/client-sdk 1.0.377 → 1.0.378-wework
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/common/.DS_Store +0 -0
- package/components/.DS_Store +0 -0
- package/components/index.js +6 -1
- package/components/session-select/session-select-item.vue +8 -9
- package/components/wechat-chat-control/.DS_Store +0 -0
- package/components/wechat-chat-control/location/location.vue +3 -3
- package/components/wechat-chat-control/transfer/.DS_Store +0 -0
- package/components/wechat-chat-control/url/.DS_Store +0 -0
- package/components/wechat-chat-control/voice/.DS_Store +0 -0
- package/components/wework-chat-control/channel-card/channel-card.vue +144 -0
- package/components/wework-chat-control/channel-live/channel-live.vue +7 -2
- package/components/wework-chat-control/company-card/company-card.vue +1 -1
- package/components/wework-chat-control/custom-expression/custom-expression.vue +2 -1
- package/components/wework-chat-control/file-url/file-url.vue +34 -16
- package/components/wework-chat-control/image/image.vue +137 -2
- package/components/wework-chat-control/index.js +15 -7
- package/components/wework-chat-control/link/.DS_Store +0 -0
- package/components/wework-chat-control/location/location.vue +3 -3
- package/components/wework-chat-control/merge-message/merge-message-panel.vue +63 -0
- package/components/wework-chat-control/merge-message/merge-message.vue +84 -0
- package/components/wework-chat-control/merge-message/util.js +59 -0
- package/components/wework-chat-control/metting/enterprise-wechat.png +0 -0
- package/components/wework-chat-control/metting/meeting-video.svg +4 -0
- package/components/wework-chat-control/metting/metting.vue +181 -0
- package/components/wework-chat-control/red-envelopes/red-envelopes.vue +3 -2
- package/components/wework-chat-control/text/text-default.vue +99 -0
- package/components/wework-chat-control/text/text-quote.vue +138 -0
- package/components/wework-chat-control/text/text.vue +27 -143
- package/components/wework-chat-control/url/url-channel-live.vue +53 -0
- package/components/wework-chat-control/url/url-miniprogram.vue +6 -7
- package/components/wework-chat-control/url/url.vue +26 -2
- package/components/wework-chat-control/util.js +26 -17
- package/components/wework-chat-control/video/.DS_Store +0 -0
- package/components/wework-chat-control/video/video.vue +10 -2
- package/components/wework-chat-control/voice/voice.vue +9 -2
- package/components/wework-chat-control/wework-chat-control-config-item.vue +24 -0
- package/components/wework-chat-control/wework-chat-control-config-msg.vue +25 -0
- package/{uni-components/chat-control/chat-control-config.vue → components/wework-chat-control/wework-chat-control-config.vue} +16 -13
- package/components/wework-chat-panel/chat-panel-chat-status/chat-panel-chat-status.vue +73 -0
- package/components/wework-chat-panel/chat-panel-item.vue +56 -25
- package/components/wework-chat-panel/chat-panel.vue +96 -13
- package/package.json +10 -3
- package/services/.DS_Store +0 -0
- package/services/client-chat/client-chat-wechat/client-chat-message.js +15 -5
- package/services/client-chat/client-chat-wechat/client-chat-session.js +13 -50
- package/services/client-chat/client-chat-wechat/client-chat.js +4 -48
- package/services/client-chat/client-chat-wechat/docs//350/264/246/345/217/267/346/234/252/350/257/273/346/225/260/351/207/217/344/270/216/344/274/232/350/257/235/346/234/252/350/257/273/346/225/260/351/207/217/344/270/215/344/270/200/350/207/264/351/227/256/351/242/230/344/277/256/345/244/215.md +4 -2
- package/services/client-chat/client-chat-wework/client-chat-account.js +84 -1
- package/services/client-chat/client-chat-wework/client-chat-concats.js +81 -17
- package/services/client-chat/client-chat-wework/client-chat-message.js +121 -11
- package/services/client-chat/client-chat-wework/client-chat-session.js +271 -191
- package/services/client-chat/client-chat-wework/client-chat-socket.js +13 -1
- package/services/client-chat/client-chat-wework/client-chat.js +403 -84
- package/services/client-chat/client-chat-wework/utils.js +5 -5
- package/services/socket/socket.js +14 -4
- package/components/wework-chat-panel/chat-panel-controls/company-card/company-card.vue +0 -35
- package/components/wework-chat-panel/chat-panel-controls/expression/expression.vue +0 -36
- package/components/wework-chat-panel/chat-panel-controls/file-url/file-url.vue +0 -35
- package/components/wework-chat-panel/chat-panel-controls/image/image.vue +0 -36
- package/components/wework-chat-panel/chat-panel-controls/index.js +0 -35
- package/components/wework-chat-panel/chat-panel-controls/jx-sys-text/jx-sys-text.vue +0 -28
- package/components/wework-chat-panel/chat-panel-controls/link/link.vue +0 -35
- package/components/wework-chat-panel/chat-panel-controls/location/location.vue +0 -35
- package/components/wework-chat-panel/chat-panel-controls/text/text.vue +0 -43
- package/components/wework-chat-panel/chat-panel-controls/unkonw/unkonw.vue +0 -39
- package/components/wework-chat-panel/chat-panel-controls/video/video.vue +0 -37
- package/components/wework-chat-panel/chat-panel-controls/voice/voice.vue +0 -35
- package/uni-common/account-portray/account-portray.vue +0 -51
- package/uni-common/account-select/account-select-item.vue +0 -172
- package/uni-common/account-select/account-select.vue +0 -252
- package/uni-common/all-friend-avatar/all-friend-avatar.vue +0 -49
- package/uni-common/friend-avatar/default.svg +0 -1
- package/uni-common/friend-avatar/friend-avatar.vue +0 -27
- package/uni-common/friend-avatar/index.js +0 -3
- package/uni-common/friend-loader/friend-loader.vue +0 -53
- package/uni-common/friend-portray/friend-portray.vue +0 -56
- package/uni-common/group-avatar/default.svg +0 -1
- package/uni-common/group-avatar/group-avatar.vue +0 -18
- package/uni-common/group-avatar/index.js +0 -3
- package/uni-common/room-avatar/default.svg +0 -6
- package/uni-common/room-avatar/index.js +0 -3
- package/uni-common/room-avatar/room-avatar.vue +0 -27
- package/uni-common/room-loader/room-loader.vue +0 -53
- package/uni-common/room-portray/room-portray.vue +0 -56
- package/uni-components/chat-control/calling/calling.vue +0 -91
- package/uni-components/chat-control/calling/phone-fill.svg +0 -1
- package/uni-components/chat-control/calling/vidicon-fill.svg +0 -1
- package/uni-components/chat-control/channel-video/channel-video.vue +0 -89
- package/uni-components/chat-control/channel-video-card/channel-video-card.vue +0 -105
- package/uni-components/chat-control/channel-video-live/channel-video-live.vue +0 -92
- package/uni-components/chat-control/chat-control-config-item/chat-control-config-item.vue +0 -20
- package/uni-components/chat-control/chat-control-config-item/index.js +0 -3
- package/uni-components/chat-control/chat-control-config-msg/chat-control-config-msg-app.vue +0 -25
- package/uni-components/chat-control/chat-control-config-msg/chat-control-config-msg-h5.vue +0 -21
- package/uni-components/chat-control/chat-control.vue +0 -218
- package/uni-components/chat-control/company-card/company-card.vue +0 -123
- package/uni-components/chat-control/const.js +0 -28
- package/uni-components/chat-control/expression/expression.vue +0 -41
- package/uni-components/chat-control/image/image.vue +0 -68
- package/uni-components/chat-control/index.js +0 -89
- package/uni-components/chat-control/location/location.vue +0 -110
- package/uni-components/chat-control/member-change/member-change.vue +0 -32
- package/uni-components/chat-control/quote-message/quote-message.vue +0 -216
- package/uni-components/chat-control/real-time-position/real-time-position.vue +0 -62
- package/uni-components/chat-control/redpacket/red-envelope.svg +0 -1
- package/uni-components/chat-control/redpacket/redpacket.vue +0 -75
- package/uni-components/chat-control/share-card/share-card.vue +0 -101
- package/uni-components/chat-control/system/system.vue +0 -69
- package/uni-components/chat-control/system-batch-message/system-batch-message.vue +0 -30
- package/uni-components/chat-control/system-text/system-text.vue +0 -32
- package/uni-components/chat-control/text/text.vue +0 -67
- package/uni-components/chat-control/text-with-at/text-with-at.vue +0 -51
- package/uni-components/chat-control/transfer/red-transfer.svg +0 -1
- package/uni-components/chat-control/transfer/transfer.vue +0 -80
- package/uni-components/chat-control/unkonw/unkonw.vue +0 -37
- package/uni-components/chat-control/url/icons/file-excel-line.svg +0 -1
- package/uni-components/chat-control/url/icons/file-info-line.svg +0 -1
- package/uni-components/chat-control/url/icons/file-music-line.svg +0 -1
- package/uni-components/chat-control/url/icons/file-pdf-line.svg +0 -1
- package/uni-components/chat-control/url/icons/file-ppt-line.svg +0 -1
- package/uni-components/chat-control/url/icons/file-settings-line.svg +0 -1
- package/uni-components/chat-control/url/icons/file-text-line.svg +0 -1
- package/uni-components/chat-control/url/icons/file-unknow-line.svg +0 -1
- package/uni-components/chat-control/url/icons/file-word-line.svg +0 -1
- package/uni-components/chat-control/url/icons/file-zip-line.svg +0 -1
- package/uni-components/chat-control/url/icons/index.js +0 -24
- package/uni-components/chat-control/url/miniprogram.svg +0 -1
- package/uni-components/chat-control/url/url-miniprogram.vue +0 -116
- package/uni-components/chat-control/url/url.vue +0 -306
- package/uni-components/chat-control/url-new/icons/file-excel-line.svg +0 -1
- package/uni-components/chat-control/url-new/icons/file-info-line.svg +0 -1
- package/uni-components/chat-control/url-new/icons/file-music-line.svg +0 -1
- package/uni-components/chat-control/url-new/icons/file-pdf-line.svg +0 -1
- package/uni-components/chat-control/url-new/icons/file-ppt-line.svg +0 -1
- package/uni-components/chat-control/url-new/icons/file-settings-line.svg +0 -1
- package/uni-components/chat-control/url-new/icons/file-text-line.svg +0 -1
- package/uni-components/chat-control/url-new/icons/file-unknow-line.svg +0 -1
- package/uni-components/chat-control/url-new/icons/file-word-line.svg +0 -1
- package/uni-components/chat-control/url-new/icons/file-zip-line.svg +0 -1
- package/uni-components/chat-control/url-new/icons/index.js +0 -24
- package/uni-components/chat-control/url-new/url-new.vue +0 -110
- package/uni-components/chat-control/utils.js +0 -12
- package/uni-components/chat-control/video/video.vue +0 -156
- package/uni-components/chat-control/voice/voice.vue +0 -166
- package/uni-components/chat-editor/chat-editor-chartlet/chat-editor-chartlet-collect.vue +0 -84
- package/uni-components/chat-editor/chat-editor-chartlet/chat-editor-chartlet-system.vue +0 -28
- package/uni-components/chat-editor/chat-editor-chartlet/chat-editor-chartlet.vue +0 -85
- package/uni-components/chat-editor/chat-editor-func/chat-editor-func.vue +0 -157
- package/uni-components/chat-editor/chat-editor-func-at/chat-editor-func-at-panel.vue +0 -158
- package/uni-components/chat-editor/chat-editor-func-at/chat-editor-func-at.vue +0 -61
- package/uni-components/chat-editor/chat-editor-func-button/chat-editor-func-button.vue +0 -58
- package/uni-components/chat-editor/chat-editor-func-file/chat-editor-func-file.vue +0 -54
- package/uni-components/chat-editor/chat-editor-func-image/chat-editor-func-image.vue +0 -42
- package/uni-components/chat-editor/chat-editor-func-video/chat-editor-func-video.vue +0 -42
- package/uni-components/chat-editor/chat-editor-func-voice/chat-editor-func-voice.vue +0 -25
- package/uni-components/chat-editor/chat-editor-message-send/chat-editor-message-send.vue +0 -158
- package/uni-components/chat-editor/chat-editor-quote/chat-editor-quote.vue +0 -75
- package/uni-components/chat-editor/chat-editor.vue +0 -257
- package/uni-components/chat-editor/index.js +0 -10
- package/uni-components/chat-editor/util.js +0 -65
- package/uni-components/chat-panel/chat-panel-chats-box.vue +0 -238
- package/uni-components/chat-panel/chat-panel-chats-forward/chat-panel-chats-forward.vue +0 -273
- package/uni-components/chat-panel/chat-panel-chats-item.vue +0 -578
- package/uni-components/chat-panel/chat-panel-chats-status/chat-panel-chats-status.vue +0 -71
- package/uni-components/chat-panel/chat-panel-chats.vue +0 -368
- package/uni-components/chat-panel/chat-panel.vue +0 -227
- package/uni-components/contacts-group-select/contacts-group-select-item.vue +0 -85
- package/uni-components/contacts-group-select/contacts-group-select-panel.vue +0 -119
- package/uni-components/contacts-group-select/contacts-group-select.vue +0 -150
|
@@ -242,37 +242,19 @@ export default class ClientChatSession {
|
|
|
242
242
|
}
|
|
243
243
|
}
|
|
244
244
|
|
|
245
|
-
|
|
246
|
-
if (!serializeMethod) {
|
|
247
|
-
return false
|
|
248
|
-
}
|
|
249
|
-
const messageId = taskOptions.messageId
|
|
250
|
-
if (messageId && pollRequest.serializeTaskMap[messageId]) {
|
|
251
|
-
return false
|
|
252
|
-
}
|
|
253
|
-
const task = {
|
|
254
|
-
messageId,
|
|
255
|
-
wechatTime: taskOptions.wechatTime || 0,
|
|
256
|
-
index: pollRequest.serializeTasks.length,
|
|
257
|
-
serializeMethod
|
|
258
|
-
}
|
|
259
|
-
pollRequest.serializeTasks.push(task)
|
|
260
|
-
if (messageId) {
|
|
261
|
-
pollRequest.serializeTaskMap[messageId] = task
|
|
262
|
-
}
|
|
263
|
-
return true
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
getSession (sessionId, serializeMethod, taskOptions = {}) {
|
|
245
|
+
getSession (sessionId, serializeMethod) {
|
|
267
246
|
if (this.sessionMap[sessionId]) {
|
|
268
247
|
return Promise.resolve({
|
|
269
248
|
data: this.sessionMap[sessionId]
|
|
270
249
|
})
|
|
271
250
|
}
|
|
272
251
|
// 这里需要轮询从后端获取会话,后端会话更新和创建是异步的,所以要多轮训请求几次
|
|
252
|
+
// 同一个会话只会有一个轮询,轮询期间再次调用只把serializeMethod挂到这个轮询上,等结果回来后依次执行
|
|
273
253
|
let pollRequest = this.pollRequestMap[sessionId]
|
|
274
254
|
if (pollRequest && pollRequest.ps) {
|
|
275
|
-
|
|
255
|
+
if (serializeMethod) {
|
|
256
|
+
pollRequest.serializeMethods.push(serializeMethod)
|
|
257
|
+
}
|
|
276
258
|
return pollRequest.ps
|
|
277
259
|
}
|
|
278
260
|
|
|
@@ -292,50 +274,33 @@ export default class ClientChatSession {
|
|
|
292
274
|
return Promise.reject(error)
|
|
293
275
|
})
|
|
294
276
|
})
|
|
295
|
-
pollRequest.
|
|
296
|
-
pollRequest.serializeTaskMap = {}
|
|
277
|
+
pollRequest.serializeMethods = serializeMethod ? [serializeMethod] : []
|
|
297
278
|
pollRequest.requestCount = 0
|
|
298
279
|
pollRequest.emptyResponseCount = 0
|
|
299
280
|
pollRequest.requestErrorCount = 0
|
|
300
281
|
pollRequest.lastRequestError = null
|
|
301
282
|
pollRequest.startedAt = Date.now()
|
|
302
|
-
this._addGetSessionSerializeTask(pollRequest, serializeMethod, taskOptions)
|
|
303
283
|
this.pollRequestMap[sessionId] = pollRequest
|
|
304
284
|
this._addGetSessionLog('创建会话轮询', {
|
|
305
|
-
sessionId
|
|
306
|
-
messageId: taskOptions.messageId,
|
|
307
|
-
wechatTime: taskOptions.wechatTime,
|
|
308
|
-
taskCount: pollRequest.serializeTasks.length
|
|
285
|
+
sessionId
|
|
309
286
|
})
|
|
310
287
|
pollRequest.ps = pollRequest.start().then(rs => {
|
|
311
288
|
if (!rs.data) {
|
|
312
289
|
return Promise.reject('未找到会话' + sessionId)
|
|
313
290
|
}
|
|
314
291
|
/**
|
|
315
|
-
* 轮询合并上下文,会依次传给每个 serializeMethod(见 client-chat.js
|
|
292
|
+
* 轮询合并上下文,会依次传给每个 serializeMethod(见 client-chat.js onAddMessageSuccess 里 getSession 的回调)
|
|
316
293
|
* baseLastMsgTime 服务端返回的会话 lastMsgTime,用来判断某条消息服务端是否已经算进 unreadMsgCount
|
|
317
|
-
* processedMessageIds 本次轮询期间处理过的所有消息 id
|
|
318
|
-
* skippedMessageIds 服务端返回的会话已经包含(wechatTime <= baseLastMsgTime)、本地不再给会话未读 +1 的消息 id
|
|
319
|
-
* unreadMessageIds 本地给会话未读 +1 的消息 id
|
|
320
294
|
* accountUnreadDelta 本次轮询期间需要累加到工作微信号(账号)未读数量上的条数。
|
|
321
|
-
*
|
|
322
|
-
*
|
|
295
|
+
* 账号未读初始值是登录时取的,不包含本次收到的任何消息,所以服务端已经算进会话 unreadMsgCount 的消息也要算进来;
|
|
296
|
+
* 只有"正在看当前会话被直接标记已读"的消息不算
|
|
323
297
|
*/
|
|
324
298
|
const context = {
|
|
325
299
|
baseLastMsgTime: rs.data.lastMsgTime || 0,
|
|
326
|
-
processedMessageIds: [],
|
|
327
|
-
skippedMessageIds: [],
|
|
328
|
-
unreadMessageIds: [],
|
|
329
300
|
accountUnreadDelta: 0
|
|
330
301
|
}
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
})
|
|
334
|
-
serializeTasks.forEach(task => {
|
|
335
|
-
rs = task.serializeMethod(rs, context) || rs
|
|
336
|
-
if (task.messageId) {
|
|
337
|
-
context.processedMessageIds.push(task.messageId)
|
|
338
|
-
}
|
|
302
|
+
pollRequest.serializeMethods.forEach(method => {
|
|
303
|
+
rs = method(rs, context) || rs
|
|
339
304
|
})
|
|
340
305
|
// wechatAccountId 传 null 表示非分页来源,onAddSession 会把未读同步到账号;
|
|
341
306
|
// 同时带上 unreadDelta,让账号只累加本次新增的条数,而不是服务端返回的整个 unreadMsgCount(那里面的存量部分账号初始值已经包含了)
|
|
@@ -353,9 +318,7 @@ export default class ClientChatSession {
|
|
|
353
318
|
lastMsgTime: rs.data.lastMsgTime,
|
|
354
319
|
lastMsgId: rs.data.lastMsgId,
|
|
355
320
|
unreadMsgCount: rs.data.unreadMsgCount,
|
|
356
|
-
|
|
357
|
-
skippedMessageCount: context.skippedMessageIds.length,
|
|
358
|
-
unreadMessageCount: context.unreadMessageIds.length,
|
|
321
|
+
mergedCount: pollRequest.serializeMethods.length,
|
|
359
322
|
accountUnreadDelta: context.accountUnreadDelta,
|
|
360
323
|
hasSessionMap: !!this.sessionMap[sessionId],
|
|
361
324
|
hasAllSessionGroup: !!this._getSessionBySessionGroup(sessionId, ALL_WECHAT_ACCOUNT_ID),
|
|
@@ -437,22 +437,6 @@ class ClientChat {
|
|
|
437
437
|
}
|
|
438
438
|
const localSession = this.session.findSession(({ session }) => session.conversationId === sessionId)
|
|
439
439
|
if (!localSession) {
|
|
440
|
-
if (!this.session.pollRequestMap[sessionId]) {
|
|
441
|
-
this.socket.addLog({
|
|
442
|
-
group: 'client-chat-message:onAddMessageSuccess',
|
|
443
|
-
content: {
|
|
444
|
-
title: '未获取到会话,开始从服务端获取',
|
|
445
|
-
data: {
|
|
446
|
-
sessionId,
|
|
447
|
-
accountId,
|
|
448
|
-
wechatFriendId: data.wechatFriendId,
|
|
449
|
-
wechatAccountId: data.wechatAccountId,
|
|
450
|
-
messageId: data.id,
|
|
451
|
-
wechatTime: data.wechatTime
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
})
|
|
455
|
-
}
|
|
456
440
|
return this.session.getSession(sessionId, (rs, context) => {
|
|
457
441
|
if (rs && rs.data) {
|
|
458
442
|
const isAfterServerMessage = data.wechatTime > context.baseLastMsgTime
|
|
@@ -467,19 +451,16 @@ class ClientChat {
|
|
|
467
451
|
// 正在看这个会话并且允许自动标记已读
|
|
468
452
|
const isCurrentSessionRead = this.sessionManage.currentSession && this.sessionManage.currentSession.conversationId === sessionId && this.shouldMarkCurrentSessionRead(sessionId, data)
|
|
469
453
|
// 会话未读数量:isAfterServerMessage 为 true 表示这条消息比服务端返回的会话 lastMsgTime 新,
|
|
470
|
-
// 服务端返回的 unreadMsgCount 还没算它,需要本地 +1
|
|
454
|
+
// 服务端返回的 unreadMsgCount 还没算它,需要本地 +1;否则服务端已经算进去了,不再重复 +1
|
|
471
455
|
if (!data.isSend && isAfterServerMessage) {
|
|
472
456
|
if (isCurrentSessionRead) {
|
|
473
457
|
rs.data.unreadMsgCount = 0
|
|
474
458
|
} else {
|
|
475
459
|
rs.data.unreadMsgCount = (rs.data.unreadMsgCount || 0) + 1
|
|
476
|
-
context.unreadMessageIds.push(data.id)
|
|
477
460
|
}
|
|
478
|
-
} else {
|
|
479
|
-
context.skippedMessageIds.push(data.id)
|
|
480
461
|
}
|
|
481
462
|
// 账号未读数量:和会话未读数量的判断口径不一样。
|
|
482
|
-
// 账号未读初始值是登录时从服务端取的,不包含这条新消息,所以不管这条消息有没有被服务端算进会话的 unreadMsgCount
|
|
463
|
+
// 账号未读初始值是登录时从服务端取的,不包含这条新消息,所以不管这条消息有没有被服务端算进会话的 unreadMsgCount,
|
|
483
464
|
// 账号都要 +1。唯一不加的情况是"正在看当前会话并被直接标记已读"(此时会话未读被置 0,不会再通过 onSessionReadChange 扣减账号)。
|
|
484
465
|
// 这个累计值会通过 addSession(rs.data, null, { unreadDelta }) 传给 onAddSession,账号只累加这个增量而不是整个 unreadMsgCount
|
|
485
466
|
if (!data.isSend && !(isAfterServerMessage && isCurrentSessionRead)) {
|
|
@@ -487,9 +468,6 @@ class ClientChat {
|
|
|
487
468
|
}
|
|
488
469
|
}
|
|
489
470
|
return rs
|
|
490
|
-
}, {
|
|
491
|
-
messageId: data.id,
|
|
492
|
-
wechatTime: data.wechatTime
|
|
493
471
|
}).catch(() => {})
|
|
494
472
|
} else {
|
|
495
473
|
this.session.updateSession(sessionId, ({ session }) => {
|
|
@@ -584,22 +562,6 @@ class ClientChat {
|
|
|
584
562
|
// 更新会话未读消息数量
|
|
585
563
|
const localSession = this.session.findSession(({ session }) => session.conversationId === sessionId)
|
|
586
564
|
if (!localSession) {
|
|
587
|
-
if (!this.session.pollRequestMap[sessionId]) {
|
|
588
|
-
this.socket.addLog({
|
|
589
|
-
group: 'client-chat-message:onAddMessageSuccess',
|
|
590
|
-
content: {
|
|
591
|
-
title: '未获取到会话,开始从服务端获取',
|
|
592
|
-
data: {
|
|
593
|
-
sessionId,
|
|
594
|
-
accountId,
|
|
595
|
-
wechatChatroomId: data.wechatChatroomId,
|
|
596
|
-
wechatAccountId: data.wechatAccountId,
|
|
597
|
-
messageId: data.id,
|
|
598
|
-
wechatTime: data.wechatTime
|
|
599
|
-
}
|
|
600
|
-
}
|
|
601
|
-
})
|
|
602
|
-
}
|
|
603
565
|
return this.session.getSession(sessionId, (rs, context) => {
|
|
604
566
|
if (rs && rs.data) {
|
|
605
567
|
const isAfterServerMessage = data.wechatTime > context.baseLastMsgTime
|
|
@@ -614,22 +576,19 @@ class ClientChat {
|
|
|
614
576
|
// 正在看这个会话并且允许自动标记已读
|
|
615
577
|
const isCurrentSessionRead = this.sessionManage.currentSession && this.sessionManage.currentSession.conversationId === sessionId && this.shouldMarkCurrentSessionRead(sessionId, data)
|
|
616
578
|
// 会话未读数量:isAfterServerMessage 为 true 表示这条消息比服务端返回的会话 lastMsgTime 新,
|
|
617
|
-
// 服务端返回的 unreadMsgCount 还没算它,需要本地 +1
|
|
579
|
+
// 服务端返回的 unreadMsgCount 还没算它,需要本地 +1;否则服务端已经算进去了,不再重复 +1
|
|
618
580
|
if (!data.isSend && isAfterServerMessage) {
|
|
619
581
|
if (isCurrentSessionRead) {
|
|
620
582
|
rs.data.unreadMsgCount = 0
|
|
621
583
|
} else {
|
|
622
584
|
rs.data.unreadMsgCount = (rs.data.unreadMsgCount || 0) + 1
|
|
623
|
-
context.unreadMessageIds.push(data.id)
|
|
624
585
|
if (atMessage) {
|
|
625
586
|
rs.data.lastAtMsgContent = appendLastAtMsgContent(rs.data.lastAtMsgContent, atMessage)
|
|
626
587
|
}
|
|
627
588
|
}
|
|
628
|
-
} else {
|
|
629
|
-
context.skippedMessageIds.push(data.id)
|
|
630
589
|
}
|
|
631
590
|
// 账号未读数量:和会话未读数量的判断口径不一样。
|
|
632
|
-
// 账号未读初始值是登录时从服务端取的,不包含这条新消息,所以不管这条消息有没有被服务端算进会话的 unreadMsgCount
|
|
591
|
+
// 账号未读初始值是登录时从服务端取的,不包含这条新消息,所以不管这条消息有没有被服务端算进会话的 unreadMsgCount,
|
|
633
592
|
// 账号都要 +1。唯一不加的情况是"正在看当前会话并被直接标记已读"(此时会话未读被置 0,不会再通过 onSessionReadChange 扣减账号)。
|
|
634
593
|
// 这个累计值会通过 addSession(rs.data, null, { unreadDelta }) 传给 onAddSession,账号只累加这个增量而不是整个 unreadMsgCount
|
|
635
594
|
if (!data.isSend && !(isAfterServerMessage && isCurrentSessionRead)) {
|
|
@@ -637,9 +596,6 @@ class ClientChat {
|
|
|
637
596
|
}
|
|
638
597
|
}
|
|
639
598
|
return rs
|
|
640
|
-
}, {
|
|
641
|
-
messageId: data.id,
|
|
642
|
-
wechatTime: data.wechatTime
|
|
643
599
|
}).catch(() => {})
|
|
644
600
|
} else {
|
|
645
601
|
this.session.updateSession(sessionId, ({ session }) => {
|
|
@@ -84,13 +84,15 @@ SDK 里维护着两套彼此独立的本地"账本":
|
|
|
84
84
|
```js
|
|
85
85
|
// 会话未读:只在服务端没算过这条消息时 +1(原逻辑不变)
|
|
86
86
|
if (!data.isSend && isAfterServerMessage) { ... }
|
|
87
|
-
//
|
|
87
|
+
// 账号未读:不管服务端是否已经算进会话 unreadMsgCount 都 +1,只有"正在看当前会话被直接标记已读"不加
|
|
88
88
|
if (!data.isSend && !(isAfterServerMessage && isCurrentSessionRead)) {
|
|
89
89
|
context.accountUnreadDelta += 1
|
|
90
90
|
}
|
|
91
91
|
```
|
|
92
92
|
|
|
93
|
-
注意 `accountUnreadDelta` **不等于** `
|
|
93
|
+
注意 `accountUnreadDelta` **不等于** 本次给会话 `unreadMsgCount` +1 的条数:`isAfterServerMessage` 为 false 的消息表示服务端返回的会话已经把它算进 `unreadMsgCount`,但账号初始值是登录时取的,仍然不含这条,所以账号还是要 +1。
|
|
94
|
+
|
|
95
|
+
`getSession(sessionId, serializeMethod)` 只按 `sessionId` 聚合:同一个会话轮询期间的所有回调按调用顺序依次执行,不再依赖消息 id / 时间做去重或排序(消息层 `addMessage` 已按 id 去重)。
|
|
94
96
|
|
|
95
97
|
- `onAddSession`(第 132 行附近):
|
|
96
98
|
|
|
@@ -5,14 +5,20 @@ export default class ClientChatAccount {
|
|
|
5
5
|
data = Vue.observable({
|
|
6
6
|
accountData: [],
|
|
7
7
|
accountUnreadMessageNumData: [],
|
|
8
|
+
accountGreetingUnreadMsgCountData: {},
|
|
8
9
|
currentAccount: null
|
|
9
10
|
})
|
|
10
11
|
|
|
11
12
|
loadAccountDataMethod = null
|
|
12
13
|
|
|
13
14
|
getAccountUnreadMessageNumMethod = null
|
|
15
|
+
|
|
16
|
+
getAccountGreetingUnreadMsgCountMethod = null
|
|
14
17
|
|
|
15
18
|
accountMap = {}
|
|
19
|
+
|
|
20
|
+
// 好友请求数量请求合并,key为账号id列表
|
|
21
|
+
greetingUnreadRequestMap = {}
|
|
16
22
|
|
|
17
23
|
constructor (options) {
|
|
18
24
|
options = Object.assign({
|
|
@@ -21,11 +27,13 @@ export default class ClientChatAccount {
|
|
|
21
27
|
getAccountUnreadMessageNumMethod: null,
|
|
22
28
|
updateAccountMessageReadMethod: null,
|
|
23
29
|
deleteAccountSessionMethod: null,
|
|
30
|
+
getAccountGreetingUnreadMsgCountMethod: null,
|
|
24
31
|
onCurrentAccountChange: null,
|
|
25
32
|
onAccountAdded: null,
|
|
26
33
|
onAccountRemoved: null,
|
|
27
34
|
onUnreadMessageNumChange: null,
|
|
28
|
-
onDeleteAccountSession: null
|
|
35
|
+
onDeleteAccountSession: null,
|
|
36
|
+
onAccountLoaded: null
|
|
29
37
|
}, options)
|
|
30
38
|
if (!options.loadAccountDataMethod) {
|
|
31
39
|
throw new Error('缺少loadAccountDataMethod配置')
|
|
@@ -38,10 +46,12 @@ export default class ClientChatAccount {
|
|
|
38
46
|
this.getAccountUnreadMessageNumMethod = options.getAccountUnreadMessageNumMethod
|
|
39
47
|
this.updateAccountMessageReadMethod = options.updateAccountMessageReadMethod
|
|
40
48
|
this.deleteAccountSessionMethod = options.deleteAccountSessionMethod
|
|
49
|
+
this.getAccountGreetingUnreadMsgCountMethod = options.getAccountGreetingUnreadMsgCountMethod
|
|
41
50
|
this.onAccountAdded = options.onAccountAdded
|
|
42
51
|
this.onAccountRemoved = options.onAccountRemoved,
|
|
43
52
|
this.onUnreadMessageNumChange = options.onUnreadMessageNumChange
|
|
44
53
|
this.onDeleteAccountSession = options.onDeleteAccountSession
|
|
54
|
+
this.onAccountLoaded = options.onAccountLoaded
|
|
45
55
|
}
|
|
46
56
|
|
|
47
57
|
get accountData () {
|
|
@@ -55,6 +65,10 @@ export default class ClientChatAccount {
|
|
|
55
65
|
get currentAccount () {
|
|
56
66
|
return this.data.currentAccount
|
|
57
67
|
}
|
|
68
|
+
|
|
69
|
+
get accountGreetingUnreadMsgCountData () {
|
|
70
|
+
return this.data.accountGreetingUnreadMsgCountData
|
|
71
|
+
}
|
|
58
72
|
|
|
59
73
|
setCurrentAccount (accountId) {
|
|
60
74
|
let account = null
|
|
@@ -282,6 +296,9 @@ export default class ClientChatAccount {
|
|
|
282
296
|
this._cacheLoadPromise = this.loadAccountDataMethod()
|
|
283
297
|
this._cacheLoadPromise.then(rs => {
|
|
284
298
|
this.setAccountData(rs.data)
|
|
299
|
+
this.onAccountLoaded && this.onAccountLoaded({
|
|
300
|
+
data: rs.data
|
|
301
|
+
})
|
|
285
302
|
})
|
|
286
303
|
this.cancelConnectRequest = () => {
|
|
287
304
|
this._cacheLoadPromise.abort()
|
|
@@ -298,9 +315,75 @@ export default class ClientChatAccount {
|
|
|
298
315
|
return this.loadData()
|
|
299
316
|
}
|
|
300
317
|
|
|
318
|
+
/**
|
|
319
|
+
* 设置指定企微账号的待处理好友请求数量,并重算all
|
|
320
|
+
*/
|
|
321
|
+
setAccountGreetingUnreadMsgCount (params) {
|
|
322
|
+
if (!params || !params.qwAccountId) {
|
|
323
|
+
throw new Error('缺少必须参数')
|
|
324
|
+
}
|
|
325
|
+
Vue.set(this.data.accountGreetingUnreadMsgCountData, params.qwAccountId, params.count || 0)
|
|
326
|
+
this.updateAllAccountGreetingUnreadMsgCount()
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
updateAllAccountGreetingUnreadMsgCount () {
|
|
330
|
+
const allCount = Object.keys(this.data.accountGreetingUnreadMsgCountData).reduce((rs, key) => {
|
|
331
|
+
return key === 'all' ? rs : rs + (this.data.accountGreetingUnreadMsgCountData[key] || 0)
|
|
332
|
+
}, 0)
|
|
333
|
+
Vue.set(this.data.accountGreetingUnreadMsgCountData, 'all', allCount)
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* 获取待处理好友请求数量
|
|
338
|
+
* qwAccountIds不传则刷新所有账号;后端数量为0的账号不返回,所以先置0再覆盖
|
|
339
|
+
*/
|
|
340
|
+
getAccountGreetingUnreadMsgCount (params) {
|
|
341
|
+
if (!this.getAccountGreetingUnreadMsgCountMethod) {
|
|
342
|
+
return Promise.reject(new Error('getAccountGreetingUnreadMsgCountMethod未定义'))
|
|
343
|
+
}
|
|
344
|
+
let qwAccountIds = (params || {}).qwAccountIds
|
|
345
|
+
if (qwAccountIds && !Array.isArray(qwAccountIds)) {
|
|
346
|
+
qwAccountIds = [qwAccountIds]
|
|
347
|
+
}
|
|
348
|
+
qwAccountIds = (qwAccountIds || []).filter((id, index, data) => id && data.indexOf(id) === index).map(String)
|
|
349
|
+
const isAll = !qwAccountIds.length
|
|
350
|
+
const requestKey = isAll ? 'all' : qwAccountIds.slice().sort().join(',')
|
|
351
|
+
if (this.greetingUnreadRequestMap[requestKey]) {
|
|
352
|
+
return this.greetingUnreadRequestMap[requestKey]
|
|
353
|
+
}
|
|
354
|
+
const request = this.getAccountGreetingUnreadMsgCountMethod({
|
|
355
|
+
qwAccountIds: isAll ? undefined : qwAccountIds
|
|
356
|
+
}).then(rs => {
|
|
357
|
+
const targetIds = isAll ? Object.keys(this.accountMap) : qwAccountIds
|
|
358
|
+
targetIds.forEach(id => {
|
|
359
|
+
Vue.set(this.data.accountGreetingUnreadMsgCountData, id, 0)
|
|
360
|
+
})
|
|
361
|
+
;((rs && rs.data) || []).forEach(item => {
|
|
362
|
+
if (item && item.qwAccountId) {
|
|
363
|
+
Vue.set(this.data.accountGreetingUnreadMsgCountData, String(item.qwAccountId), item.count || 0)
|
|
364
|
+
}
|
|
365
|
+
})
|
|
366
|
+
this.updateAllAccountGreetingUnreadMsgCount()
|
|
367
|
+
return this.data.accountGreetingUnreadMsgCountData
|
|
368
|
+
}).finally(() => {
|
|
369
|
+
delete this.greetingUnreadRequestMap[requestKey]
|
|
370
|
+
})
|
|
371
|
+
this.greetingUnreadRequestMap[requestKey] = request
|
|
372
|
+
return request
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* 刷新所有账号的待处理好友请求数量
|
|
377
|
+
*/
|
|
378
|
+
refreshAllAccountGreetingUnreadMsgCount () {
|
|
379
|
+
return this.getAccountGreetingUnreadMsgCount()
|
|
380
|
+
}
|
|
381
|
+
|
|
301
382
|
reset () {
|
|
302
383
|
this.data.accountData = []
|
|
303
384
|
this.data.accountUnreadMessageNumData = []
|
|
385
|
+
this.data.accountGreetingUnreadMsgCountData = {}
|
|
386
|
+
this.greetingUnreadRequestMap = {}
|
|
304
387
|
if (this.cancelConnectRequest) {
|
|
305
388
|
this.cancelConnectRequest()
|
|
306
389
|
}
|
|
@@ -126,11 +126,7 @@ export default class ClientChatContacts {
|
|
|
126
126
|
*/
|
|
127
127
|
roomBindMemberMap: {},
|
|
128
128
|
|
|
129
|
-
|
|
130
|
-
* 标记通讯录是否修改了
|
|
131
|
-
* 如果修改了,比如接收到了分配好友的会话时,一定通讯录变了,变了的时候界面需要根据这个状态刷新通讯录
|
|
132
|
-
*/
|
|
133
|
-
isModify: false
|
|
129
|
+
modifiedAccountMap: {}
|
|
134
130
|
})
|
|
135
131
|
|
|
136
132
|
friendMap = {}
|
|
@@ -237,10 +233,6 @@ export default class ClientChatContacts {
|
|
|
237
233
|
return this.data.roomGroupData
|
|
238
234
|
}
|
|
239
235
|
|
|
240
|
-
get isModify () {
|
|
241
|
-
return this.data.isModify
|
|
242
|
-
}
|
|
243
|
-
|
|
244
236
|
setRoomGroup (data) {
|
|
245
237
|
this.data.roomGroupData = []
|
|
246
238
|
if (data && data.length) {
|
|
@@ -491,10 +483,10 @@ export default class ClientChatContacts {
|
|
|
491
483
|
}
|
|
492
484
|
}
|
|
493
485
|
const qwAccountId = this.roomMap[id].qwAccountId
|
|
494
|
-
if (qwAccountId && this.data.
|
|
495
|
-
const bindIndex = this.data.
|
|
486
|
+
if (qwAccountId && this.data.accountBindRoomMap[qwAccountId] && this.data.accountBindRoomMap[qwAccountId][groupId]) {
|
|
487
|
+
const bindIndex = this.data.accountBindRoomMap[qwAccountId][groupId].indexOf(this.roomMap[id])
|
|
496
488
|
if (bindIndex >= 0) {
|
|
497
|
-
this.data.
|
|
489
|
+
this.data.accountBindRoomMap[qwAccountId][groupId].splice(bindIndex, 1)
|
|
498
490
|
}
|
|
499
491
|
}
|
|
500
492
|
})
|
|
@@ -628,6 +620,37 @@ export default class ClientChatContacts {
|
|
|
628
620
|
return rs
|
|
629
621
|
})
|
|
630
622
|
}
|
|
623
|
+
|
|
624
|
+
/**
|
|
625
|
+
* 强制从服务端刷新好友资料,绕过本地缓存。
|
|
626
|
+
*/
|
|
627
|
+
refreshFriend (friendId) {
|
|
628
|
+
if (!friendId) {
|
|
629
|
+
return Promise.reject('缺少好友id')
|
|
630
|
+
}
|
|
631
|
+
if (!this.getContactsFriendMethod) {
|
|
632
|
+
return Promise.reject(new Error('getContactsFriendMethod未定义'))
|
|
633
|
+
}
|
|
634
|
+
return this.getContactsFriendMethod({
|
|
635
|
+
id: friendId
|
|
636
|
+
}).then(rs => {
|
|
637
|
+
if (!rs || !rs.data) {
|
|
638
|
+
return Promise.reject('未找到好友' + friendId)
|
|
639
|
+
}
|
|
640
|
+
if (this.friendMap[friendId]) {
|
|
641
|
+
const nextKeys = Object.keys(rs.data)
|
|
642
|
+
Object.keys(this.friendMap[friendId]).forEach(key => {
|
|
643
|
+
if (!nextKeys.includes(key)) {
|
|
644
|
+
Vue.delete(this.friendMap[friendId], key)
|
|
645
|
+
}
|
|
646
|
+
})
|
|
647
|
+
this.updateFriend(friendId, rs.data)
|
|
648
|
+
} else {
|
|
649
|
+
this.addFriend(rs.data)
|
|
650
|
+
}
|
|
651
|
+
return rs
|
|
652
|
+
})
|
|
653
|
+
}
|
|
631
654
|
|
|
632
655
|
setRoomMemberData (roomId, data) {
|
|
633
656
|
if (!roomId) {
|
|
@@ -738,12 +761,52 @@ export default class ClientChatContacts {
|
|
|
738
761
|
})
|
|
739
762
|
}
|
|
740
763
|
|
|
741
|
-
|
|
742
|
-
|
|
764
|
+
refreshRoom (id) {
|
|
765
|
+
if (!id) {
|
|
766
|
+
return Promise.reject('缺少群id')
|
|
767
|
+
}
|
|
768
|
+
if (!this.getContactsRoomMethod) {
|
|
769
|
+
return Promise.reject(new Error('getContactsRoomMethod未定义'))
|
|
770
|
+
}
|
|
771
|
+
return this.getContactsRoomMethod({
|
|
772
|
+
id
|
|
773
|
+
}).then(rs => {
|
|
774
|
+
if (!rs || !rs.data) {
|
|
775
|
+
return Promise.reject('未找到群' + id)
|
|
776
|
+
}
|
|
777
|
+
const localRoom = this.roomMap[id]
|
|
778
|
+
if (localRoom) {
|
|
779
|
+
this.removeRoom(id)
|
|
780
|
+
const nextKeys = Object.keys(rs.data)
|
|
781
|
+
Object.keys(localRoom).forEach(key => {
|
|
782
|
+
if (!nextKeys.includes(key)) {
|
|
783
|
+
Vue.delete(localRoom, key)
|
|
784
|
+
}
|
|
785
|
+
})
|
|
786
|
+
Object.keys(rs.data).forEach(key => {
|
|
787
|
+
Vue.set(localRoom, key, rs.data[key])
|
|
788
|
+
})
|
|
789
|
+
}
|
|
790
|
+
this.addRoom(localRoom || rs.data)
|
|
791
|
+
return rs
|
|
792
|
+
})
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
isModify (qwAccountId) {
|
|
796
|
+
return !!(qwAccountId && this.data.modifiedAccountMap[qwAccountId])
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
markModify (qwAccountIds) {
|
|
800
|
+
const ids = Array.isArray(qwAccountIds) ? qwAccountIds : [qwAccountIds]
|
|
801
|
+
ids.filter(Boolean).forEach(id => {
|
|
802
|
+
Vue.set(this.data.modifiedAccountMap, id, true)
|
|
803
|
+
})
|
|
743
804
|
}
|
|
744
805
|
|
|
745
|
-
unmarkModify () {
|
|
746
|
-
|
|
806
|
+
unmarkModify (qwAccountId) {
|
|
807
|
+
if (qwAccountId) {
|
|
808
|
+
Vue.delete(this.data.modifiedAccountMap, qwAccountId)
|
|
809
|
+
}
|
|
747
810
|
}
|
|
748
811
|
|
|
749
812
|
reset () {
|
|
@@ -758,6 +821,7 @@ export default class ClientChatContacts {
|
|
|
758
821
|
this.data.groupBindRoomMap = {}
|
|
759
822
|
this.data.accountBindFriendMap = {}
|
|
760
823
|
this.data.accountBindRoomMap = {}
|
|
824
|
+
this.data.modifiedAccountMap = {}
|
|
761
825
|
this._cacheFriendGroupCountMap = null
|
|
762
826
|
this._cacheRoomGroupCountMap = null
|
|
763
827
|
if (this.cancelConnectRequest) {
|
|
@@ -769,4 +833,4 @@ export default class ClientChatContacts {
|
|
|
769
833
|
this.cancelRefreshRequest = null
|
|
770
834
|
}
|
|
771
835
|
}
|
|
772
|
-
}
|
|
836
|
+
}
|