@onyx-p/imlib-web 2.1.0 → 2.1.2

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/index.esm.js CHANGED
@@ -9516,7 +9516,7 @@ var CmdIds;
9516
9516
  CmdIds[CmdIds["GetRemoteMessages"] = 1610682419] = "GetRemoteMessages";
9517
9517
  CmdIds[CmdIds["GetSuperGroupRemoteMessages"] = 1610776956] = "GetSuperGroupRemoteMessages";
9518
9518
  CmdIds[CmdIds["DeleteChatMessages"] = 1610682381] = "DeleteChatMessages";
9519
- CmdIds[CmdIds["ClearChatHistoryMessage"] = 1610777164] = "ClearChatHistoryMessage";
9519
+ CmdIds[CmdIds["ClearChatHistoryMessage"] = 1610682421] = "ClearChatHistoryMessage";
9520
9520
  CmdIds[CmdIds["GetDialogList"] = 1610711096] = "GetDialogList";
9521
9521
  CmdIds[CmdIds["GetBriefDialogList"] = 1610682399] = "GetBriefDialogList";
9522
9522
  CmdIds[CmdIds["UpdatePrivateChatMuteConfig"] = 1610682379] = "UpdatePrivateChatMuteConfig";
@@ -15446,9 +15446,10 @@ const CleanHistoryMessageReq = $root$2.CleanHistoryMessageReq = (() => {
15446
15446
  * Properties of a CleanHistoryMessageReq.
15447
15447
  * @exports ICleanHistoryMessageReq
15448
15448
  * @interface ICleanHistoryMessageReq
15449
- * @property {Long|null} [destId] CleanHistoryMessageReq destId
15450
- * @property {number|null} [type] CleanHistoryMessageReq type
15451
- * @property {Long|null} [msgTime] CleanHistoryMessageReq msgTime
15449
+ * @property {string|null} [destId] CleanHistoryMessageReq destId
15450
+ * @property {Long|null} [msgId] CleanHistoryMessageReq msgId
15451
+ * @property {Array.<Long>|null} [msgIdList] CleanHistoryMessageReq msgIdList
15452
+ * @property {Array.<string>|null} [destIdList] CleanHistoryMessageReq destIdList
15452
15453
  */
15453
15454
 
15454
15455
  /**
@@ -15460,32 +15461,42 @@ const CleanHistoryMessageReq = $root$2.CleanHistoryMessageReq = (() => {
15460
15461
  * @param {ICleanHistoryMessageReq=} [properties] Properties to set
15461
15462
  */
15462
15463
  function CleanHistoryMessageReq(properties) {
15464
+ this.msgIdList = [];
15465
+ this.destIdList = [];
15463
15466
  if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];
15464
15467
  }
15465
15468
 
15466
15469
  /**
15467
15470
  * CleanHistoryMessageReq destId.
15468
- * @member {Long} destId
15471
+ * @member {string} destId
15469
15472
  * @memberof CleanHistoryMessageReq
15470
15473
  * @instance
15471
15474
  */
15472
- CleanHistoryMessageReq.prototype.destId = $util$2.Long ? $util$2.Long.fromBits(0, 0, false) : 0;
15475
+ CleanHistoryMessageReq.prototype.destId = "";
15473
15476
 
15474
15477
  /**
15475
- * CleanHistoryMessageReq type.
15476
- * @member {number} type
15478
+ * CleanHistoryMessageReq msgId.
15479
+ * @member {Long} msgId
15480
+ * @memberof CleanHistoryMessageReq
15481
+ * @instance
15482
+ */
15483
+ CleanHistoryMessageReq.prototype.msgId = $util$2.Long ? $util$2.Long.fromBits(0, 0, false) : 0;
15484
+
15485
+ /**
15486
+ * CleanHistoryMessageReq msgIdList.
15487
+ * @member {Array.<Long>} msgIdList
15477
15488
  * @memberof CleanHistoryMessageReq
15478
15489
  * @instance
15479
15490
  */
15480
- CleanHistoryMessageReq.prototype.type = 0;
15491
+ CleanHistoryMessageReq.prototype.msgIdList = $util$2.emptyArray;
15481
15492
 
15482
15493
  /**
15483
- * CleanHistoryMessageReq msgTime.
15484
- * @member {Long} msgTime
15494
+ * CleanHistoryMessageReq destIdList.
15495
+ * @member {Array.<string>} destIdList
15485
15496
  * @memberof CleanHistoryMessageReq
15486
15497
  * @instance
15487
15498
  */
15488
- CleanHistoryMessageReq.prototype.msgTime = $util$2.Long ? $util$2.Long.fromBits(0, 0, false) : 0;
15499
+ CleanHistoryMessageReq.prototype.destIdList = $util$2.emptyArray;
15489
15500
 
15490
15501
  /**
15491
15502
  * Encodes the specified CleanHistoryMessageReq message. Does not implicitly {@link CleanHistoryMessageReq.verify|verify} messages.
@@ -15498,9 +15509,14 @@ const CleanHistoryMessageReq = $root$2.CleanHistoryMessageReq = (() => {
15498
15509
  */
15499
15510
  CleanHistoryMessageReq.encode = function encode(message, writer) {
15500
15511
  if (!writer) writer = $Writer$2.create();
15501
- if (message.destId != null && Object.hasOwnProperty.call(message, "destId")) writer.uint32(/* id 1, wireType 0 =*/8).int64(message.destId);
15502
- if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.type);
15503
- if (message.msgTime != null && Object.hasOwnProperty.call(message, "msgTime")) writer.uint32(/* id 3, wireType 0 =*/24).int64(message.msgTime);
15512
+ if (message.destId != null && Object.hasOwnProperty.call(message, "destId")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.destId);
15513
+ if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId")) writer.uint32(/* id 2, wireType 0 =*/16).int64(message.msgId);
15514
+ if (message.msgIdList != null && message.msgIdList.length) {
15515
+ writer.uint32(/* id 3, wireType 2 =*/26).fork();
15516
+ for (let i = 0; i < message.msgIdList.length; ++i) writer.int64(message.msgIdList[i]);
15517
+ writer.ldelim();
15518
+ }
15519
+ if (message.destIdList != null && message.destIdList.length) for (let i = 0; i < message.destIdList.length; ++i) writer.uint32(/* id 4, wireType 2 =*/34).string(message.destIdList[i]);
15504
15520
  return writer;
15505
15521
  };
15506
15522
 
@@ -15524,17 +15540,27 @@ const CleanHistoryMessageReq = $root$2.CleanHistoryMessageReq = (() => {
15524
15540
  switch (tag >>> 3) {
15525
15541
  case 1:
15526
15542
  {
15527
- message.destId = reader.int64();
15543
+ message.destId = reader.string();
15528
15544
  break;
15529
15545
  }
15530
15546
  case 2:
15531
15547
  {
15532
- message.type = reader.int32();
15548
+ message.msgId = reader.int64();
15533
15549
  break;
15534
15550
  }
15535
15551
  case 3:
15536
15552
  {
15537
- message.msgTime = reader.int64();
15553
+ if (!(message.msgIdList && message.msgIdList.length)) message.msgIdList = [];
15554
+ if ((tag & 7) === 2) {
15555
+ let end2 = reader.uint32() + reader.pos;
15556
+ while (reader.pos < end2) message.msgIdList.push(reader.int64());
15557
+ } else message.msgIdList.push(reader.int64());
15558
+ break;
15559
+ }
15560
+ case 4:
15561
+ {
15562
+ if (!(message.destIdList && message.destIdList.length)) message.destIdList = [];
15563
+ message.destIdList.push(reader.string());
15538
15564
  break;
15539
15565
  }
15540
15566
  default:
@@ -19247,11 +19273,9 @@ const deleteMessages$1 = (dialogId, messageUIds) => {
19247
19273
  });
19248
19274
  return reqPromise;
19249
19275
  };
19250
- const clearHistoryMessage = (dialogId, timestamp) => {
19276
+ const clearHistoryMessage = dialogId => {
19251
19277
  return webSocketServer.send(CmdIds$1.ClearChatHistoryMessage, {
19252
- destId: Long.fromString(dialogId),
19253
- type: extractConversationType(dialogId) == ConversationType.GROUP ? 1 : 0,
19254
- msgTime: Long.fromNumber(timestamp)
19278
+ destId: dialogId
19255
19279
  }, {
19256
19280
  encoder: CleanHistoryMessageReq,
19257
19281
  decoder: BaseResp
@@ -19641,6 +19665,10 @@ const ConversationKey2StorageKey = {
19641
19665
  burnAfterReadingTime: {
19642
19666
  keyName: 'brt',
19643
19667
  defaultVal: 0
19668
+ },
19669
+ updateTime: {
19670
+ keyName: 'ut',
19671
+ defaultVal: 0
19644
19672
  }
19645
19673
  };
19646
19674
  class ConversationStore {
@@ -19747,6 +19775,12 @@ class ConversationStore {
19747
19775
  this.localStore.remove(key);
19748
19776
  }
19749
19777
  }
19778
+ updateUpdateTime(conOpt, updateTime) {
19779
+ const key = this.getStoreKey(conOpt);
19780
+ const local = this.localStore.get(key) || {};
19781
+ local[ConversationKey2StorageKey.updateTime.keyName] = updateTime;
19782
+ this.localStore.set(key, local);
19783
+ }
19750
19784
  set(conOpt, conversation) {
19751
19785
  const key = this.getStoreKey(conOpt);
19752
19786
  const local = this.localStore.get(key) || {};
@@ -19968,7 +20002,8 @@ class ConversationManager {
19968
20002
  dialogTitle,
19969
20003
  smallAvatarUrl,
19970
20004
  burnAfterReadingFlag,
19971
- burnAfterReadingTime
20005
+ burnAfterReadingTime,
20006
+ updateTime
19972
20007
  } = conversation;
19973
20008
  this.localConversationSet.add(this.getConversationKey(conversation));
19974
20009
  this.addStatus({
@@ -19980,7 +20015,8 @@ class ConversationManager {
19980
20015
  dialogTitle,
19981
20016
  smallAvatarUrl,
19982
20017
  burnAfterReadingFlag,
19983
- burnAfterReadingTime
20018
+ burnAfterReadingTime,
20019
+ updateTime
19984
20020
  }, false);
19985
20021
  }
19986
20022
  addStatus(statusItem, shouldNotify = false) {
@@ -19993,13 +20029,14 @@ class ConversationManager {
19993
20029
  dialogTitle,
19994
20030
  smallAvatarUrl,
19995
20031
  burnAfterReadingFlag,
19996
- burnAfterReadingTime
20032
+ burnAfterReadingTime,
20033
+ updateTime
19997
20034
  } = statusItem;
19998
20035
  const conOpt = {
19999
20036
  conversationType,
20000
20037
  targetId
20001
20038
  };
20002
- const updatedTime = getServerTime$1().toString();
20039
+ const updatedTime = getServerTime$1();
20003
20040
  const storageConversation = this.store.get(conOpt);
20004
20041
  const updatedItems = {};
20005
20042
  if (isDef(notificationLevel) && storageConversation.notificationLevel !== notificationLevel) {
@@ -20051,7 +20088,8 @@ class ConversationManager {
20051
20088
  dialogTitle,
20052
20089
  smallAvatarUrl,
20053
20090
  burnAfterReadingFlag,
20054
- burnAfterReadingTime
20091
+ burnAfterReadingTime,
20092
+ updateTime
20055
20093
  });
20056
20094
  if (Object.keys(updatedItems).length && shouldNotify) {
20057
20095
  this.setUpdatedConversation({
@@ -20077,22 +20115,23 @@ class ConversationManager {
20077
20115
  const oldLocalConversation = deepClone(this.get(conOpt));
20078
20116
  this.store.updateUnreadCount(message);
20079
20117
  this.store.updateMentionedData(message);
20118
+ this.store.updateUpdateTime(conOpt, parseInt(message.sentTime));
20080
20119
  const newLocalConversation = this.get(conOpt);
20081
20120
  if (oldLocalConversation.unreadMessageCount !== newLocalConversation.unreadMessageCount) {
20082
20121
  updateConOptions.updatedItems.unreadMessageCount = {
20083
- time: message.sentTime,
20122
+ time: parseInt(message.sentTime),
20084
20123
  val: newLocalConversation.unreadMessageCount
20085
20124
  };
20086
20125
  }
20087
20126
  if (oldLocalConversation.hasMentioned !== newLocalConversation.hasMentioned) {
20088
20127
  updateConOptions.updatedItems.hasMentioned = {
20089
- time: message.sentTime,
20128
+ time: parseInt(message.sentTime),
20090
20129
  val: newLocalConversation.hasMentioned
20091
20130
  };
20092
20131
  }
20093
20132
  if (oldLocalConversation.unreadMentionedCount !== newLocalConversation.unreadMentionedCount) {
20094
20133
  updateConOptions.updatedItems.unreadMentionedCount = {
20095
- time: message.sentTime,
20134
+ time: parseInt(message.sentTime),
20096
20135
  val: newLocalConversation.unreadMentionedCount
20097
20136
  };
20098
20137
  }
@@ -20100,7 +20139,7 @@ class ConversationManager {
20100
20139
  updateConOptions.conversation.updateTime = parseInt(message.sentTime);
20101
20140
  updateConOptions.conversation.latestMessage = message;
20102
20141
  updateConOptions.updatedItems.latestMessage = {
20103
- time: message.sentTime,
20142
+ time: parseInt(message.sentTime),
20104
20143
  val: message
20105
20144
  };
20106
20145
  }
@@ -20237,7 +20276,8 @@ class ConversationManager {
20237
20276
  notificationStatus,
20238
20277
  isTop,
20239
20278
  dialogTitle,
20240
- smallAvatarUrl
20279
+ smallAvatarUrl,
20280
+ updateTime
20241
20281
  } = val;
20242
20282
  return {
20243
20283
  ...conOpt,
@@ -20247,7 +20287,8 @@ class ConversationManager {
20247
20287
  notificationStatus,
20248
20288
  isTop,
20249
20289
  dialogTitle,
20250
- smallAvatarUrl
20290
+ smallAvatarUrl,
20291
+ updateTime: updateTime
20251
20292
  };
20252
20293
  }
20253
20294
  return null;
@@ -20263,7 +20304,8 @@ class ConversationManager {
20263
20304
  notificationStatus,
20264
20305
  isTop,
20265
20306
  dialogTitle,
20266
- smallAvatarUrl
20307
+ smallAvatarUrl,
20308
+ updateTime
20267
20309
  }) => ({
20268
20310
  conversationType,
20269
20311
  targetId,
@@ -20273,7 +20315,8 @@ class ConversationManager {
20273
20315
  notificationStatus,
20274
20316
  isTop,
20275
20317
  dialogTitle,
20276
- smallAvatarUrl
20318
+ smallAvatarUrl,
20319
+ updateTime: updateTime
20277
20320
  }));
20278
20321
  }
20279
20322
  remove(conOpt) {
@@ -20289,19 +20332,27 @@ class ConversationManager {
20289
20332
  updateConOptions.conversation.latestMessage = undefined;
20290
20333
  updateConOptions.updatedItems.latestMessage = {
20291
20334
  val: null,
20292
- time: getServerTime$1().toString()
20335
+ time: getServerTime$1()
20293
20336
  };
20294
20337
  this.setUpdatedConversation(updateConOptions);
20295
20338
  }
20296
- refreshLatestMessage(conOpt, message) {
20339
+ updateLatestMessage(conOpt, message) {
20340
+ if (isDef(message)) {
20341
+ this.store.set(conOpt, {
20342
+ updateTime: parseInt(message.sentTime)
20343
+ });
20344
+ }
20297
20345
  const updateConOptions = {
20298
20346
  conversation: conOpt,
20299
20347
  updatedItems: {}
20300
20348
  };
20349
+ if (isDef(message)) {
20350
+ updateConOptions.conversation.updateTime = parseInt(message.sentTime);
20351
+ }
20301
20352
  updateConOptions.conversation.latestMessage = message;
20302
20353
  updateConOptions.updatedItems.latestMessage = {
20303
20354
  val: message,
20304
- time: message?.sentTime ?? getServerTime$1().toString()
20355
+ time: getServerTime$1()
20305
20356
  };
20306
20357
  this.setUpdatedConversation(updateConOptions);
20307
20358
  }
@@ -20312,6 +20363,7 @@ class ConversationManager {
20312
20363
  const nullConversationManager = {
20313
20364
  addStatus: function (statusItem, shouldNotify) {},
20314
20365
  setConversationCacheByMessage: function (message) {},
20366
+ updateLatestMessage: function (conOpt, message) {},
20315
20367
  get: function (conOpt) {
20316
20368
  return null;
20317
20369
  },
@@ -20359,8 +20411,7 @@ const nullConversationManager = {
20359
20411
  destroyed() {},
20360
20412
  syncConversationStatus: function () {},
20361
20413
  remove: function (conOpt) {},
20362
- clearHistoryMessages: function (conOpt) {},
20363
- refreshLatestMessage: function (conOpt, message) {}
20414
+ clearHistoryMessages: function (conOpt) {}
20364
20415
  };
20365
20416
  let manager$1;
20366
20417
  var ConversationManager$1 = {
@@ -21520,6 +21571,43 @@ class MessageCache {
21520
21571
  await this.checkAndResetDatabase();
21521
21572
  await this.initDatabase();
21522
21573
  }
21574
+ async getLatestMessage(conversation) {
21575
+ const dialogId = getFullDialogId(conversation);
21576
+ if (!this.db) {
21577
+ return null;
21578
+ }
21579
+ return new Promise((resolve, reject) => {
21580
+ const transaction = this.db.transaction(this.STORE_NAME, 'readonly');
21581
+ const store = transaction.objectStore(this.STORE_NAME);
21582
+ const index = store.index('dialogId_sentTime');
21583
+ const range = IDBKeyRange.bound([dialogId, ''], [dialogId, '\uffff']);
21584
+ const direction = 'prev';
21585
+ const cursorRequest = index.openCursor(range, direction);
21586
+ cursorRequest.onsuccess = event => {
21587
+ const cursor = event.target.result;
21588
+ if (cursor) {
21589
+ const message = {
21590
+ ...cursor.value
21591
+ };
21592
+ if (typeof message.content === 'string' && message.content) {
21593
+ try {
21594
+ message.content = this.decryptContent(message.content);
21595
+ } catch (error) {
21596
+ console.error('解密消息内容失败', error);
21597
+ message.content = null;
21598
+ }
21599
+ }
21600
+ resolve(message);
21601
+ } else {
21602
+ resolve(null);
21603
+ }
21604
+ };
21605
+ cursorRequest.onerror = event => {
21606
+ console.error('获取最新消息失败', event);
21607
+ reject(new Error('获取最新消息失败'));
21608
+ };
21609
+ });
21610
+ }
21523
21611
  }
21524
21612
  let cache;
21525
21613
  var MessageCache$1 = {
@@ -29131,10 +29219,9 @@ class IMClient extends EventEmitter {
29131
29219
  });
29132
29220
  }
29133
29221
  async getPreviousHistoryMessages(conversation, timestamp, count = 20) {
29134
- debugger;
29135
29222
  const cachedResult = await MessageCache$1.get().getPreviousMessages(conversation, timestamp ?? '0', count);
29136
29223
  if (!timestamp && cachedResult.messages.length) {
29137
- ConversationManager$1.get().refreshLatestMessage(conversation, cachedResult.messages[cachedResult.messages.length - 1]);
29224
+ ConversationManager$1.get().updateLatestMessage(conversation, cachedResult.messages[cachedResult.messages.length - 1]);
29138
29225
  }
29139
29226
  if (cachedResult.messages.length >= count || !cachedResult.hasMore) {
29140
29227
  return {
@@ -29156,7 +29243,7 @@ class IMClient extends EventEmitter {
29156
29243
  }
29157
29244
  const remotesMessages = remotesResult.data.list;
29158
29245
  if (!remotesTimestamp) {
29159
- ConversationManager$1.get().refreshLatestMessage(conversation, remotesMessages[remotesMessages.length - 1]);
29246
+ ConversationManager$1.get().updateLatestMessage(conversation, remotesMessages[remotesMessages.length - 1]);
29160
29247
  }
29161
29248
  MessageCache$1.get().addMessages(remotesMessages, conversation, !remotesResult.data.hasMore);
29162
29249
  return {
@@ -29168,13 +29255,23 @@ class IMClient extends EventEmitter {
29168
29255
  };
29169
29256
  }
29170
29257
  async deleteRemoteMessage(conversation, list) {
29171
- MessageCache$1.get()?.removeMessagesByUId(list.map(e => e.messageUId));
29172
- return deleteMessages$1(getFullDialogId(conversation), list.map(e => e.messageUId)).then(result => result.code);
29258
+ const result = await deleteMessages$1(getFullDialogId(conversation), list.map(e => e.messageUId)).then(result => result.code);
29259
+ if (result === ErrorCode.SUCCESS) {
29260
+ const latestMessage = await MessageCache$1.get()?.getLatestMessage(conversation);
29261
+ await MessageCache$1.get()?.removeMessagesByUId(list.map(e => e.messageUId));
29262
+ if (latestMessage && list.some(e => {
29263
+ e.messageUId === latestMessage.messageUId;
29264
+ })) {
29265
+ const latestMessage2 = await MessageCache$1.get()?.getLatestMessage(conversation);
29266
+ ConversationManager$1.get().updateLatestMessage(conversation, latestMessage2);
29267
+ }
29268
+ }
29269
+ return result;
29173
29270
  }
29174
- async deleteRemoteMessageByTimestamp(conversation, timestamp) {
29271
+ async deleteHistoryMessages(conversation) {
29175
29272
  MessageCache$1.get()?.clearConversationCache(conversation);
29176
29273
  ConversationManager$1.get().clearHistoryMessages(conversation);
29177
- return clearHistoryMessage(getFullDialogId(conversation), timestamp === 0 ? Number.MAX_VALUE : timestamp).then(result => result.code);
29274
+ return clearHistoryMessage(getFullDialogId(conversation)).then(result => result.code);
29178
29275
  }
29179
29276
  async getConversationList(count, conversationType, startTime, order) {
29180
29277
  const params = {
@@ -29197,22 +29294,30 @@ class IMClient extends EventEmitter {
29197
29294
  const contentList = [];
29198
29295
  for (const dialogInfo of data.fullDialog) {
29199
29296
  const conversationObj = this.formatConversation(dialogInfo);
29200
- if (conversationObj) {
29201
- const conOpt = {
29202
- conversationType: conversationObj.conversationType,
29203
- targetId: conversationObj.targetId
29204
- };
29205
- if (isDef(conversationObj.latestMessage)) {
29206
- conversationObj.updateTime = parseInt(conversationObj.latestMessage.sentTime);
29207
- } else {
29208
- conversationObj.updateTime = (contentList[contentList.length - 1]?.updateTime ?? 0) + 1;
29209
- }
29210
- ConversationManager$1.get().addLocalConversation(conversationObj);
29211
- const localConversation = ConversationManager$1.get().get(conOpt);
29212
- Object.assign(conversationObj, localConversation);
29213
- contentList.push(conversationObj);
29297
+ if (!conversationObj) {
29298
+ continue;
29299
+ }
29300
+ const conOpt = {
29301
+ conversationType: conversationObj.conversationType,
29302
+ targetId: conversationObj.targetId
29303
+ };
29304
+ if (!conversationObj.latestMessage) {
29305
+ conversationObj.latestMessage = await MessageCache$1.get()?.getLatestMessage(conOpt);
29306
+ }
29307
+ ConversationManager$1.get().addLocalConversation(conversationObj);
29308
+ const localConversation = ConversationManager$1.get().get(conOpt);
29309
+ Object.assign(conversationObj, localConversation);
29310
+ if (isDef(conversationObj.latestMessage) && !conversationObj.updateTime) {
29311
+ conversationObj.updateTime = parseInt(conversationObj.latestMessage.sentTime);
29312
+ }
29313
+ if (!conversationObj.updateTime) {
29314
+ conversationObj.updateTime = 10000;
29214
29315
  }
29316
+ contentList.push(conversationObj);
29215
29317
  }
29318
+ contentList.sort((a, b) => {
29319
+ return (a.updateTime ?? 0) - (b.updateTime ?? 0);
29320
+ });
29216
29321
  return {
29217
29322
  code: ErrorCode.SUCCESS,
29218
29323
  data: contentList
@@ -29239,19 +29344,7 @@ class IMClient extends EventEmitter {
29239
29344
  code: ErrorCode.CONVER_GET_ERROR
29240
29345
  };
29241
29346
  }
29242
- const {
29243
- code,
29244
- data
29245
- } = await this.getRemoteHistoryMessages(conOpt, {
29246
- count: 1,
29247
- order: 0
29248
- });
29249
- if (code !== ErrorCode.SUCCESS) {
29250
- return {
29251
- code: ErrorCode.CONVER_GET_ERROR
29252
- };
29253
- }
29254
- const latestMessage = data?.list[0];
29347
+ const latestMessage = await MessageCache$1.get()?.getLatestMessage(conOpt);
29255
29348
  const conversation = {
29256
29349
  ...conOpt,
29257
29350
  ...localConversation,
@@ -29357,8 +29450,18 @@ class IMClient extends EventEmitter {
29357
29450
  }
29358
29451
  return conversationObj;
29359
29452
  }
29360
- clearBurnAfterReadingExpiredMessages(conversation) {
29361
- return MessageCache$1.get()?.clearBurnAfterReadingExpiredMessages(conversation) ?? Promise.resolve([]);
29453
+ async clearBurnAfterReadingExpiredMessages(conversation) {
29454
+ const cache = MessageCache$1.get();
29455
+ if (!cache) {
29456
+ return Promise.resolve([]);
29457
+ }
29458
+ const latestMessage = await cache.getLatestMessage(conversation);
29459
+ const removedMsgUids = await cache.clearBurnAfterReadingExpiredMessages(conversation);
29460
+ if (latestMessage && removedMsgUids.includes(latestMessage.messageUId)) {
29461
+ const latestMessage2 = await cache.getLatestMessage(conversation);
29462
+ ConversationManager$1.get().updateLatestMessage(conversation, latestMessage2);
29463
+ }
29464
+ return removedMsgUids;
29362
29465
  }
29363
29466
  }
29364
29467
 
@@ -30574,12 +30677,11 @@ const deleteMessages = async (conversation, messages) => {
30574
30677
  code: ErrorCode.SUCCESS
30575
30678
  };
30576
30679
  };
30577
- const clearHistoryMessages = async (conversation, timestamp) => {
30578
- assert('timestamp', timestamp, val => AssertRules.NUMBER(val) && val >= 0, true);
30680
+ const clearHistoryMessages = async conversation => {
30579
30681
  assert('conversation', conversation, AssertRules.CONVERSATION);
30580
30682
  const paramsStr = 'conversationType:' + conversation.conversationType + ',targetId:' + conversation.targetId;
30581
30683
  logger.debug('clear message ->' + paramsStr);
30582
- const code = await imClient.deleteRemoteMessageByTimestamp(conversation, timestamp);
30684
+ const code = await imClient.deleteHistoryMessages(conversation);
30583
30685
  if (code !== ErrorCode.SUCCESS) {
30584
30686
  logger.warn('clear message ->' + code + ':' + ErrorDesc(code) + ',' + paramsStr);
30585
30687
  return {
package/index.umd.js CHANGED
@@ -9522,7 +9522,7 @@
9522
9522
  CmdIds[CmdIds["GetRemoteMessages"] = 1610682419] = "GetRemoteMessages";
9523
9523
  CmdIds[CmdIds["GetSuperGroupRemoteMessages"] = 1610776956] = "GetSuperGroupRemoteMessages";
9524
9524
  CmdIds[CmdIds["DeleteChatMessages"] = 1610682381] = "DeleteChatMessages";
9525
- CmdIds[CmdIds["ClearChatHistoryMessage"] = 1610777164] = "ClearChatHistoryMessage";
9525
+ CmdIds[CmdIds["ClearChatHistoryMessage"] = 1610682421] = "ClearChatHistoryMessage";
9526
9526
  CmdIds[CmdIds["GetDialogList"] = 1610711096] = "GetDialogList";
9527
9527
  CmdIds[CmdIds["GetBriefDialogList"] = 1610682399] = "GetBriefDialogList";
9528
9528
  CmdIds[CmdIds["UpdatePrivateChatMuteConfig"] = 1610682379] = "UpdatePrivateChatMuteConfig";
@@ -15452,9 +15452,10 @@
15452
15452
  * Properties of a CleanHistoryMessageReq.
15453
15453
  * @exports ICleanHistoryMessageReq
15454
15454
  * @interface ICleanHistoryMessageReq
15455
- * @property {Long|null} [destId] CleanHistoryMessageReq destId
15456
- * @property {number|null} [type] CleanHistoryMessageReq type
15457
- * @property {Long|null} [msgTime] CleanHistoryMessageReq msgTime
15455
+ * @property {string|null} [destId] CleanHistoryMessageReq destId
15456
+ * @property {Long|null} [msgId] CleanHistoryMessageReq msgId
15457
+ * @property {Array.<Long>|null} [msgIdList] CleanHistoryMessageReq msgIdList
15458
+ * @property {Array.<string>|null} [destIdList] CleanHistoryMessageReq destIdList
15458
15459
  */
15459
15460
 
15460
15461
  /**
@@ -15466,32 +15467,42 @@
15466
15467
  * @param {ICleanHistoryMessageReq=} [properties] Properties to set
15467
15468
  */
15468
15469
  function CleanHistoryMessageReq(properties) {
15470
+ this.msgIdList = [];
15471
+ this.destIdList = [];
15469
15472
  if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];
15470
15473
  }
15471
15474
 
15472
15475
  /**
15473
15476
  * CleanHistoryMessageReq destId.
15474
- * @member {Long} destId
15477
+ * @member {string} destId
15475
15478
  * @memberof CleanHistoryMessageReq
15476
15479
  * @instance
15477
15480
  */
15478
- CleanHistoryMessageReq.prototype.destId = $util$2.Long ? $util$2.Long.fromBits(0, 0, false) : 0;
15481
+ CleanHistoryMessageReq.prototype.destId = "";
15479
15482
 
15480
15483
  /**
15481
- * CleanHistoryMessageReq type.
15482
- * @member {number} type
15484
+ * CleanHistoryMessageReq msgId.
15485
+ * @member {Long} msgId
15486
+ * @memberof CleanHistoryMessageReq
15487
+ * @instance
15488
+ */
15489
+ CleanHistoryMessageReq.prototype.msgId = $util$2.Long ? $util$2.Long.fromBits(0, 0, false) : 0;
15490
+
15491
+ /**
15492
+ * CleanHistoryMessageReq msgIdList.
15493
+ * @member {Array.<Long>} msgIdList
15483
15494
  * @memberof CleanHistoryMessageReq
15484
15495
  * @instance
15485
15496
  */
15486
- CleanHistoryMessageReq.prototype.type = 0;
15497
+ CleanHistoryMessageReq.prototype.msgIdList = $util$2.emptyArray;
15487
15498
 
15488
15499
  /**
15489
- * CleanHistoryMessageReq msgTime.
15490
- * @member {Long} msgTime
15500
+ * CleanHistoryMessageReq destIdList.
15501
+ * @member {Array.<string>} destIdList
15491
15502
  * @memberof CleanHistoryMessageReq
15492
15503
  * @instance
15493
15504
  */
15494
- CleanHistoryMessageReq.prototype.msgTime = $util$2.Long ? $util$2.Long.fromBits(0, 0, false) : 0;
15505
+ CleanHistoryMessageReq.prototype.destIdList = $util$2.emptyArray;
15495
15506
 
15496
15507
  /**
15497
15508
  * Encodes the specified CleanHistoryMessageReq message. Does not implicitly {@link CleanHistoryMessageReq.verify|verify} messages.
@@ -15504,9 +15515,14 @@
15504
15515
  */
15505
15516
  CleanHistoryMessageReq.encode = function encode(message, writer) {
15506
15517
  if (!writer) writer = $Writer$2.create();
15507
- if (message.destId != null && Object.hasOwnProperty.call(message, "destId")) writer.uint32(/* id 1, wireType 0 =*/8).int64(message.destId);
15508
- if (message.type != null && Object.hasOwnProperty.call(message, "type")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.type);
15509
- if (message.msgTime != null && Object.hasOwnProperty.call(message, "msgTime")) writer.uint32(/* id 3, wireType 0 =*/24).int64(message.msgTime);
15518
+ if (message.destId != null && Object.hasOwnProperty.call(message, "destId")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.destId);
15519
+ if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId")) writer.uint32(/* id 2, wireType 0 =*/16).int64(message.msgId);
15520
+ if (message.msgIdList != null && message.msgIdList.length) {
15521
+ writer.uint32(/* id 3, wireType 2 =*/26).fork();
15522
+ for (let i = 0; i < message.msgIdList.length; ++i) writer.int64(message.msgIdList[i]);
15523
+ writer.ldelim();
15524
+ }
15525
+ if (message.destIdList != null && message.destIdList.length) for (let i = 0; i < message.destIdList.length; ++i) writer.uint32(/* id 4, wireType 2 =*/34).string(message.destIdList[i]);
15510
15526
  return writer;
15511
15527
  };
15512
15528
 
@@ -15530,17 +15546,27 @@
15530
15546
  switch (tag >>> 3) {
15531
15547
  case 1:
15532
15548
  {
15533
- message.destId = reader.int64();
15549
+ message.destId = reader.string();
15534
15550
  break;
15535
15551
  }
15536
15552
  case 2:
15537
15553
  {
15538
- message.type = reader.int32();
15554
+ message.msgId = reader.int64();
15539
15555
  break;
15540
15556
  }
15541
15557
  case 3:
15542
15558
  {
15543
- message.msgTime = reader.int64();
15559
+ if (!(message.msgIdList && message.msgIdList.length)) message.msgIdList = [];
15560
+ if ((tag & 7) === 2) {
15561
+ let end2 = reader.uint32() + reader.pos;
15562
+ while (reader.pos < end2) message.msgIdList.push(reader.int64());
15563
+ } else message.msgIdList.push(reader.int64());
15564
+ break;
15565
+ }
15566
+ case 4:
15567
+ {
15568
+ if (!(message.destIdList && message.destIdList.length)) message.destIdList = [];
15569
+ message.destIdList.push(reader.string());
15544
15570
  break;
15545
15571
  }
15546
15572
  default:
@@ -19253,11 +19279,9 @@
19253
19279
  });
19254
19280
  return reqPromise;
19255
19281
  };
19256
- const clearHistoryMessage = (dialogId, timestamp) => {
19282
+ const clearHistoryMessage = dialogId => {
19257
19283
  return webSocketServer.send(CmdIds$1.ClearChatHistoryMessage, {
19258
- destId: Long.fromString(dialogId),
19259
- type: extractConversationType(dialogId) == exports.ConversationType.GROUP ? 1 : 0,
19260
- msgTime: Long.fromNumber(timestamp)
19284
+ destId: dialogId
19261
19285
  }, {
19262
19286
  encoder: CleanHistoryMessageReq,
19263
19287
  decoder: BaseResp
@@ -19647,6 +19671,10 @@
19647
19671
  burnAfterReadingTime: {
19648
19672
  keyName: 'brt',
19649
19673
  defaultVal: 0
19674
+ },
19675
+ updateTime: {
19676
+ keyName: 'ut',
19677
+ defaultVal: 0
19650
19678
  }
19651
19679
  };
19652
19680
  class ConversationStore {
@@ -19753,6 +19781,12 @@
19753
19781
  this.localStore.remove(key);
19754
19782
  }
19755
19783
  }
19784
+ updateUpdateTime(conOpt, updateTime) {
19785
+ const key = this.getStoreKey(conOpt);
19786
+ const local = this.localStore.get(key) || {};
19787
+ local[ConversationKey2StorageKey.updateTime.keyName] = updateTime;
19788
+ this.localStore.set(key, local);
19789
+ }
19756
19790
  set(conOpt, conversation) {
19757
19791
  const key = this.getStoreKey(conOpt);
19758
19792
  const local = this.localStore.get(key) || {};
@@ -19974,7 +20008,8 @@
19974
20008
  dialogTitle,
19975
20009
  smallAvatarUrl,
19976
20010
  burnAfterReadingFlag,
19977
- burnAfterReadingTime
20011
+ burnAfterReadingTime,
20012
+ updateTime
19978
20013
  } = conversation;
19979
20014
  this.localConversationSet.add(this.getConversationKey(conversation));
19980
20015
  this.addStatus({
@@ -19986,7 +20021,8 @@
19986
20021
  dialogTitle,
19987
20022
  smallAvatarUrl,
19988
20023
  burnAfterReadingFlag,
19989
- burnAfterReadingTime
20024
+ burnAfterReadingTime,
20025
+ updateTime
19990
20026
  }, false);
19991
20027
  }
19992
20028
  addStatus(statusItem, shouldNotify = false) {
@@ -19999,13 +20035,14 @@
19999
20035
  dialogTitle,
20000
20036
  smallAvatarUrl,
20001
20037
  burnAfterReadingFlag,
20002
- burnAfterReadingTime
20038
+ burnAfterReadingTime,
20039
+ updateTime
20003
20040
  } = statusItem;
20004
20041
  const conOpt = {
20005
20042
  conversationType,
20006
20043
  targetId
20007
20044
  };
20008
- const updatedTime = getServerTime$1().toString();
20045
+ const updatedTime = getServerTime$1();
20009
20046
  const storageConversation = this.store.get(conOpt);
20010
20047
  const updatedItems = {};
20011
20048
  if (isDef(notificationLevel) && storageConversation.notificationLevel !== notificationLevel) {
@@ -20057,7 +20094,8 @@
20057
20094
  dialogTitle,
20058
20095
  smallAvatarUrl,
20059
20096
  burnAfterReadingFlag,
20060
- burnAfterReadingTime
20097
+ burnAfterReadingTime,
20098
+ updateTime
20061
20099
  });
20062
20100
  if (Object.keys(updatedItems).length && shouldNotify) {
20063
20101
  this.setUpdatedConversation({
@@ -20083,22 +20121,23 @@
20083
20121
  const oldLocalConversation = deepClone(this.get(conOpt));
20084
20122
  this.store.updateUnreadCount(message);
20085
20123
  this.store.updateMentionedData(message);
20124
+ this.store.updateUpdateTime(conOpt, parseInt(message.sentTime));
20086
20125
  const newLocalConversation = this.get(conOpt);
20087
20126
  if (oldLocalConversation.unreadMessageCount !== newLocalConversation.unreadMessageCount) {
20088
20127
  updateConOptions.updatedItems.unreadMessageCount = {
20089
- time: message.sentTime,
20128
+ time: parseInt(message.sentTime),
20090
20129
  val: newLocalConversation.unreadMessageCount
20091
20130
  };
20092
20131
  }
20093
20132
  if (oldLocalConversation.hasMentioned !== newLocalConversation.hasMentioned) {
20094
20133
  updateConOptions.updatedItems.hasMentioned = {
20095
- time: message.sentTime,
20134
+ time: parseInt(message.sentTime),
20096
20135
  val: newLocalConversation.hasMentioned
20097
20136
  };
20098
20137
  }
20099
20138
  if (oldLocalConversation.unreadMentionedCount !== newLocalConversation.unreadMentionedCount) {
20100
20139
  updateConOptions.updatedItems.unreadMentionedCount = {
20101
- time: message.sentTime,
20140
+ time: parseInt(message.sentTime),
20102
20141
  val: newLocalConversation.unreadMentionedCount
20103
20142
  };
20104
20143
  }
@@ -20106,7 +20145,7 @@
20106
20145
  updateConOptions.conversation.updateTime = parseInt(message.sentTime);
20107
20146
  updateConOptions.conversation.latestMessage = message;
20108
20147
  updateConOptions.updatedItems.latestMessage = {
20109
- time: message.sentTime,
20148
+ time: parseInt(message.sentTime),
20110
20149
  val: message
20111
20150
  };
20112
20151
  }
@@ -20243,7 +20282,8 @@
20243
20282
  notificationStatus,
20244
20283
  isTop,
20245
20284
  dialogTitle,
20246
- smallAvatarUrl
20285
+ smallAvatarUrl,
20286
+ updateTime
20247
20287
  } = val;
20248
20288
  return {
20249
20289
  ...conOpt,
@@ -20253,7 +20293,8 @@
20253
20293
  notificationStatus,
20254
20294
  isTop,
20255
20295
  dialogTitle,
20256
- smallAvatarUrl
20296
+ smallAvatarUrl,
20297
+ updateTime: updateTime
20257
20298
  };
20258
20299
  }
20259
20300
  return null;
@@ -20269,7 +20310,8 @@
20269
20310
  notificationStatus,
20270
20311
  isTop,
20271
20312
  dialogTitle,
20272
- smallAvatarUrl
20313
+ smallAvatarUrl,
20314
+ updateTime
20273
20315
  }) => ({
20274
20316
  conversationType,
20275
20317
  targetId,
@@ -20279,7 +20321,8 @@
20279
20321
  notificationStatus,
20280
20322
  isTop,
20281
20323
  dialogTitle,
20282
- smallAvatarUrl
20324
+ smallAvatarUrl,
20325
+ updateTime: updateTime
20283
20326
  }));
20284
20327
  }
20285
20328
  remove(conOpt) {
@@ -20295,19 +20338,27 @@
20295
20338
  updateConOptions.conversation.latestMessage = undefined;
20296
20339
  updateConOptions.updatedItems.latestMessage = {
20297
20340
  val: null,
20298
- time: getServerTime$1().toString()
20341
+ time: getServerTime$1()
20299
20342
  };
20300
20343
  this.setUpdatedConversation(updateConOptions);
20301
20344
  }
20302
- refreshLatestMessage(conOpt, message) {
20345
+ updateLatestMessage(conOpt, message) {
20346
+ if (isDef(message)) {
20347
+ this.store.set(conOpt, {
20348
+ updateTime: parseInt(message.sentTime)
20349
+ });
20350
+ }
20303
20351
  const updateConOptions = {
20304
20352
  conversation: conOpt,
20305
20353
  updatedItems: {}
20306
20354
  };
20355
+ if (isDef(message)) {
20356
+ updateConOptions.conversation.updateTime = parseInt(message.sentTime);
20357
+ }
20307
20358
  updateConOptions.conversation.latestMessage = message;
20308
20359
  updateConOptions.updatedItems.latestMessage = {
20309
20360
  val: message,
20310
- time: message?.sentTime ?? getServerTime$1().toString()
20361
+ time: getServerTime$1()
20311
20362
  };
20312
20363
  this.setUpdatedConversation(updateConOptions);
20313
20364
  }
@@ -20318,6 +20369,7 @@
20318
20369
  const nullConversationManager = {
20319
20370
  addStatus: function (statusItem, shouldNotify) {},
20320
20371
  setConversationCacheByMessage: function (message) {},
20372
+ updateLatestMessage: function (conOpt, message) {},
20321
20373
  get: function (conOpt) {
20322
20374
  return null;
20323
20375
  },
@@ -20365,8 +20417,7 @@
20365
20417
  destroyed() {},
20366
20418
  syncConversationStatus: function () {},
20367
20419
  remove: function (conOpt) {},
20368
- clearHistoryMessages: function (conOpt) {},
20369
- refreshLatestMessage: function (conOpt, message) {}
20420
+ clearHistoryMessages: function (conOpt) {}
20370
20421
  };
20371
20422
  let manager$1;
20372
20423
  var ConversationManager$1 = {
@@ -21526,6 +21577,43 @@
21526
21577
  await this.checkAndResetDatabase();
21527
21578
  await this.initDatabase();
21528
21579
  }
21580
+ async getLatestMessage(conversation) {
21581
+ const dialogId = getFullDialogId(conversation);
21582
+ if (!this.db) {
21583
+ return null;
21584
+ }
21585
+ return new Promise((resolve, reject) => {
21586
+ const transaction = this.db.transaction(this.STORE_NAME, 'readonly');
21587
+ const store = transaction.objectStore(this.STORE_NAME);
21588
+ const index = store.index('dialogId_sentTime');
21589
+ const range = IDBKeyRange.bound([dialogId, ''], [dialogId, '\uffff']);
21590
+ const direction = 'prev';
21591
+ const cursorRequest = index.openCursor(range, direction);
21592
+ cursorRequest.onsuccess = event => {
21593
+ const cursor = event.target.result;
21594
+ if (cursor) {
21595
+ const message = {
21596
+ ...cursor.value
21597
+ };
21598
+ if (typeof message.content === 'string' && message.content) {
21599
+ try {
21600
+ message.content = this.decryptContent(message.content);
21601
+ } catch (error) {
21602
+ console.error('解密消息内容失败', error);
21603
+ message.content = null;
21604
+ }
21605
+ }
21606
+ resolve(message);
21607
+ } else {
21608
+ resolve(null);
21609
+ }
21610
+ };
21611
+ cursorRequest.onerror = event => {
21612
+ console.error('获取最新消息失败', event);
21613
+ reject(new Error('获取最新消息失败'));
21614
+ };
21615
+ });
21616
+ }
21529
21617
  }
21530
21618
  let cache;
21531
21619
  var MessageCache$1 = {
@@ -29137,10 +29225,9 @@
29137
29225
  });
29138
29226
  }
29139
29227
  async getPreviousHistoryMessages(conversation, timestamp, count = 20) {
29140
- debugger;
29141
29228
  const cachedResult = await MessageCache$1.get().getPreviousMessages(conversation, timestamp ?? '0', count);
29142
29229
  if (!timestamp && cachedResult.messages.length) {
29143
- ConversationManager$1.get().refreshLatestMessage(conversation, cachedResult.messages[cachedResult.messages.length - 1]);
29230
+ ConversationManager$1.get().updateLatestMessage(conversation, cachedResult.messages[cachedResult.messages.length - 1]);
29144
29231
  }
29145
29232
  if (cachedResult.messages.length >= count || !cachedResult.hasMore) {
29146
29233
  return {
@@ -29162,7 +29249,7 @@
29162
29249
  }
29163
29250
  const remotesMessages = remotesResult.data.list;
29164
29251
  if (!remotesTimestamp) {
29165
- ConversationManager$1.get().refreshLatestMessage(conversation, remotesMessages[remotesMessages.length - 1]);
29252
+ ConversationManager$1.get().updateLatestMessage(conversation, remotesMessages[remotesMessages.length - 1]);
29166
29253
  }
29167
29254
  MessageCache$1.get().addMessages(remotesMessages, conversation, !remotesResult.data.hasMore);
29168
29255
  return {
@@ -29174,13 +29261,23 @@
29174
29261
  };
29175
29262
  }
29176
29263
  async deleteRemoteMessage(conversation, list) {
29177
- MessageCache$1.get()?.removeMessagesByUId(list.map(e => e.messageUId));
29178
- return deleteMessages$1(getFullDialogId(conversation), list.map(e => e.messageUId)).then(result => result.code);
29264
+ const result = await deleteMessages$1(getFullDialogId(conversation), list.map(e => e.messageUId)).then(result => result.code);
29265
+ if (result === exports.ErrorCode.SUCCESS) {
29266
+ const latestMessage = await MessageCache$1.get()?.getLatestMessage(conversation);
29267
+ await MessageCache$1.get()?.removeMessagesByUId(list.map(e => e.messageUId));
29268
+ if (latestMessage && list.some(e => {
29269
+ e.messageUId === latestMessage.messageUId;
29270
+ })) {
29271
+ const latestMessage2 = await MessageCache$1.get()?.getLatestMessage(conversation);
29272
+ ConversationManager$1.get().updateLatestMessage(conversation, latestMessage2);
29273
+ }
29274
+ }
29275
+ return result;
29179
29276
  }
29180
- async deleteRemoteMessageByTimestamp(conversation, timestamp) {
29277
+ async deleteHistoryMessages(conversation) {
29181
29278
  MessageCache$1.get()?.clearConversationCache(conversation);
29182
29279
  ConversationManager$1.get().clearHistoryMessages(conversation);
29183
- return clearHistoryMessage(getFullDialogId(conversation), timestamp === 0 ? Number.MAX_VALUE : timestamp).then(result => result.code);
29280
+ return clearHistoryMessage(getFullDialogId(conversation)).then(result => result.code);
29184
29281
  }
29185
29282
  async getConversationList(count, conversationType, startTime, order) {
29186
29283
  const params = {
@@ -29203,22 +29300,30 @@
29203
29300
  const contentList = [];
29204
29301
  for (const dialogInfo of data.fullDialog) {
29205
29302
  const conversationObj = this.formatConversation(dialogInfo);
29206
- if (conversationObj) {
29207
- const conOpt = {
29208
- conversationType: conversationObj.conversationType,
29209
- targetId: conversationObj.targetId
29210
- };
29211
- if (isDef(conversationObj.latestMessage)) {
29212
- conversationObj.updateTime = parseInt(conversationObj.latestMessage.sentTime);
29213
- } else {
29214
- conversationObj.updateTime = (contentList[contentList.length - 1]?.updateTime ?? 0) + 1;
29215
- }
29216
- ConversationManager$1.get().addLocalConversation(conversationObj);
29217
- const localConversation = ConversationManager$1.get().get(conOpt);
29218
- Object.assign(conversationObj, localConversation);
29219
- contentList.push(conversationObj);
29303
+ if (!conversationObj) {
29304
+ continue;
29305
+ }
29306
+ const conOpt = {
29307
+ conversationType: conversationObj.conversationType,
29308
+ targetId: conversationObj.targetId
29309
+ };
29310
+ if (!conversationObj.latestMessage) {
29311
+ conversationObj.latestMessage = await MessageCache$1.get()?.getLatestMessage(conOpt);
29312
+ }
29313
+ ConversationManager$1.get().addLocalConversation(conversationObj);
29314
+ const localConversation = ConversationManager$1.get().get(conOpt);
29315
+ Object.assign(conversationObj, localConversation);
29316
+ if (isDef(conversationObj.latestMessage) && !conversationObj.updateTime) {
29317
+ conversationObj.updateTime = parseInt(conversationObj.latestMessage.sentTime);
29318
+ }
29319
+ if (!conversationObj.updateTime) {
29320
+ conversationObj.updateTime = 10000;
29220
29321
  }
29322
+ contentList.push(conversationObj);
29221
29323
  }
29324
+ contentList.sort((a, b) => {
29325
+ return (a.updateTime ?? 0) - (b.updateTime ?? 0);
29326
+ });
29222
29327
  return {
29223
29328
  code: exports.ErrorCode.SUCCESS,
29224
29329
  data: contentList
@@ -29245,19 +29350,7 @@
29245
29350
  code: exports.ErrorCode.CONVER_GET_ERROR
29246
29351
  };
29247
29352
  }
29248
- const {
29249
- code,
29250
- data
29251
- } = await this.getRemoteHistoryMessages(conOpt, {
29252
- count: 1,
29253
- order: 0
29254
- });
29255
- if (code !== exports.ErrorCode.SUCCESS) {
29256
- return {
29257
- code: exports.ErrorCode.CONVER_GET_ERROR
29258
- };
29259
- }
29260
- const latestMessage = data?.list[0];
29353
+ const latestMessage = await MessageCache$1.get()?.getLatestMessage(conOpt);
29261
29354
  const conversation = {
29262
29355
  ...conOpt,
29263
29356
  ...localConversation,
@@ -29363,8 +29456,18 @@
29363
29456
  }
29364
29457
  return conversationObj;
29365
29458
  }
29366
- clearBurnAfterReadingExpiredMessages(conversation) {
29367
- return MessageCache$1.get()?.clearBurnAfterReadingExpiredMessages(conversation) ?? Promise.resolve([]);
29459
+ async clearBurnAfterReadingExpiredMessages(conversation) {
29460
+ const cache = MessageCache$1.get();
29461
+ if (!cache) {
29462
+ return Promise.resolve([]);
29463
+ }
29464
+ const latestMessage = await cache.getLatestMessage(conversation);
29465
+ const removedMsgUids = await cache.clearBurnAfterReadingExpiredMessages(conversation);
29466
+ if (latestMessage && removedMsgUids.includes(latestMessage.messageUId)) {
29467
+ const latestMessage2 = await cache.getLatestMessage(conversation);
29468
+ ConversationManager$1.get().updateLatestMessage(conversation, latestMessage2);
29469
+ }
29470
+ return removedMsgUids;
29368
29471
  }
29369
29472
  }
29370
29473
 
@@ -30580,12 +30683,11 @@
30580
30683
  code: exports.ErrorCode.SUCCESS
30581
30684
  };
30582
30685
  };
30583
- const clearHistoryMessages = async (conversation, timestamp) => {
30584
- assert('timestamp', timestamp, val => AssertRules.NUMBER(val) && val >= 0, true);
30686
+ const clearHistoryMessages = async conversation => {
30585
30687
  assert('conversation', conversation, AssertRules.CONVERSATION);
30586
30688
  const paramsStr = 'conversationType:' + conversation.conversationType + ',targetId:' + conversation.targetId;
30587
30689
  logger.debug('clear message ->' + paramsStr);
30588
- const code = await imClient.deleteRemoteMessageByTimestamp(conversation, timestamp);
30690
+ const code = await imClient.deleteHistoryMessages(conversation);
30589
30691
  if (code !== exports.ErrorCode.SUCCESS) {
30590
30692
  logger.warn('clear message ->' + code + ':' + ErrorDesc(code) + ',' + paramsStr);
30591
30693
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onyx-p/imlib-web",
3
- "version": "2.1.0",
3
+ "version": "2.1.2",
4
4
  "main": "index.umd.js",
5
5
  "module": "index.esm.js",
6
6
  "types": "types/index.d.ts",
package/types/index.d.ts CHANGED
@@ -222,7 +222,7 @@ export declare const deleteMessages: (conversation: IConversationOption, message
222
222
  * @param conversation 会话
223
223
  * @param timestamp 清除时间点, 该时间之前的消息将被清除
224
224
  */
225
- export declare const clearHistoryMessages: (conversation: IConversationOption, timestamp: number) => IPromiseResult<void>;
225
+ export declare const clearHistoryMessages: (conversation: IConversationOption) => IPromiseResult<void>;
226
226
  export declare const parseChatRecordMsgDetails: (conversation: IConversationOption, detailItems: IChatRecordMsgDetail[]) => IReceivedMessage[];
227
227
  /**
228
228
  * 发送已读回执
@@ -22,7 +22,7 @@ export default interface IReceivedConversation {
22
22
  /**
23
23
  * 会话中的最后一条消息
24
24
  */
25
- latestMessage?: IReceivedMessage;
25
+ latestMessage?: IReceivedMessage | null;
26
26
  /**
27
27
  * 是否包含 @ 自己的消息,此数据仅在 `conversationType` 为 `ConversationType.GROUP` 时有效
28
28
  */
package/types/types.d.ts CHANGED
@@ -89,6 +89,7 @@ export interface IConversationState extends IBaseConversationInfo {
89
89
  isTop: boolean;
90
90
  dialogTitle: string | null | undefined;
91
91
  smallAvatarUrl: string | null | undefined;
92
+ updateTime: number | null | undefined;
92
93
  }
93
94
  /**
94
95
  * 会话信息
@@ -96,7 +97,7 @@ export interface IConversationState extends IBaseConversationInfo {
96
97
  export type IConversationOption = IBaseConversationInfo;
97
98
  export type IUpdatedConversationItemKeys = Extract<keyof IReceivedConversation, 'isTop' | 'notificationStatus' | 'notificationLevel' | 'unreadMessageCount' | 'hasMentioned' | 'unreadMentionedCount' | 'dialogTitle' | 'smallAvatarUrl' | 'latestMessage' | 'burnAfterReadingFlag' | 'burnAfterReadingTime'>;
98
99
  export type IUpdatedConversationItem = Partial<Record<IUpdatedConversationItemKeys, {
99
- time: string;
100
+ time: number;
100
101
  val: any;
101
102
  }>>;
102
103
  /**