stream-chat 6.2.0 → 6.3.0

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.
@@ -102,6 +102,13 @@ var ChannelState = /*#__PURE__*/function () {
102
102
  * When false, any new message (received by websocket event - message.new) will not
103
103
  * be pushed on to message list.
104
104
  */
105
+
106
+ /**
107
+ * Disjoint lists of messages
108
+ * Users can jump in the message list (with searching) and this can result in disjoint lists of messages
109
+ * The state manages these lists and merges them when lists overlap
110
+ * The messages array contains the currently active set
111
+ */
105
112
  function ChannelState(channel) {
106
113
  var _this = this,
107
114
  _channel$state;
@@ -116,8 +123,6 @@ var ChannelState = /*#__PURE__*/function () {
116
123
 
117
124
  _defineProperty(this, "read", void 0);
118
125
 
119
- _defineProperty(this, "messages", void 0);
120
-
121
126
  _defineProperty(this, "pinnedMessages", void 0);
122
127
 
123
128
  _defineProperty(this, "threads", void 0);
@@ -136,6 +141,8 @@ var ChannelState = /*#__PURE__*/function () {
136
141
 
137
142
  _defineProperty(this, "isUpToDate", void 0);
138
143
 
144
+ _defineProperty(this, "messageSets", []);
145
+
139
146
  _defineProperty(this, "setIsUpToDate", function (isUpToDate) {
140
147
  _this.isUpToDate = isUpToDate;
141
148
  });
@@ -165,7 +172,9 @@ var ChannelState = /*#__PURE__*/function () {
165
172
  }
166
173
  };
167
174
 
168
- _updateUserMessages(_this.messages, user);
175
+ _this.messageSets.forEach(function (set) {
176
+ return _updateUserMessages(set.messages, user);
177
+ });
169
178
 
170
179
  for (var parentId in _this.threads) {
171
180
  _updateUserMessages(_this.threads[parentId], user);
@@ -219,7 +228,9 @@ var ChannelState = /*#__PURE__*/function () {
219
228
  }
220
229
  };
221
230
 
222
- _deleteUserMessages(_this.messages, user, hardDelete);
231
+ _this.messageSets.forEach(function (set) {
232
+ return _deleteUserMessages(set.messages, user, hardDelete);
233
+ });
223
234
 
224
235
  for (var parentId in _this.threads) {
225
236
  _deleteUserMessages(_this.threads[parentId], user, hardDelete);
@@ -232,7 +243,7 @@ var ChannelState = /*#__PURE__*/function () {
232
243
  this.watcher_count = 0;
233
244
  this.typing = {};
234
245
  this.read = {};
235
- this.messages = [];
246
+ this.initMessages();
236
247
  this.pinnedMessages = [];
237
248
  this.threads = {}; // a list of users to hide messages from
238
249
 
@@ -251,22 +262,58 @@ var ChannelState = /*#__PURE__*/function () {
251
262
  this.isUpToDate = true;
252
263
  this.last_message_at = (channel === null || channel === void 0 ? void 0 : (_channel$state = channel.state) === null || _channel$state === void 0 ? void 0 : _channel$state.last_message_at) != null ? new Date(channel.state.last_message_at) : null;
253
264
  }
254
- /**
255
- * addMessageSorted - Add a message to the state
256
- *
257
- * @param {MessageResponse<StreamChatGenerics>} newMessage A new message
258
- * @param {boolean} timestampChanged Whether updating a message with changed created_at value.
259
- * @param {boolean} addIfDoesNotExist Add message if it is not in the list, used to prevent out of order updated messages from being added.
260
- *
261
- */
262
-
263
265
 
264
266
  _createClass(ChannelState, [{
267
+ key: "messages",
268
+ get: function get() {
269
+ var _this$messageSets$fin;
270
+
271
+ return ((_this$messageSets$fin = this.messageSets.find(function (s) {
272
+ return s.isCurrent;
273
+ })) === null || _this$messageSets$fin === void 0 ? void 0 : _this$messageSets$fin.messages) || [];
274
+ },
275
+ set: function set(messages) {
276
+ var index = this.messageSets.findIndex(function (s) {
277
+ return s.isCurrent;
278
+ });
279
+ this.messageSets[index].messages = messages;
280
+ }
281
+ /**
282
+ * The list of latest messages
283
+ * The messages array not always contains the latest messages (for example if a user searched for an earlier message, that is in a different message set)
284
+ */
285
+
286
+ }, {
287
+ key: "latestMessages",
288
+ get: function get() {
289
+ var _this$messageSets$fin2;
290
+
291
+ return ((_this$messageSets$fin2 = this.messageSets.find(function (s) {
292
+ return s.isLatest;
293
+ })) === null || _this$messageSets$fin2 === void 0 ? void 0 : _this$messageSets$fin2.messages) || [];
294
+ },
295
+ set: function set(messages) {
296
+ var index = this.messageSets.findIndex(function (s) {
297
+ return s.isLatest;
298
+ });
299
+ this.messageSets[index].messages = messages;
300
+ }
301
+ /**
302
+ * addMessageSorted - Add a message to the state
303
+ *
304
+ * @param {MessageResponse<StreamChatGenerics>} newMessage A new message
305
+ * @param {boolean} timestampChanged Whether updating a message with changed created_at value.
306
+ * @param {boolean} addIfDoesNotExist Add message if it is not in the list, used to prevent out of order updated messages from being added.
307
+ * @param {MessageSetType} messageSetToAddToIfDoesNotExist Which message set to add to if message is not in the list (only used if addIfDoesNotExist is true)
308
+ */
309
+
310
+ }, {
265
311
  key: "addMessageSorted",
266
312
  value: function addMessageSorted(newMessage) {
267
313
  var timestampChanged = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
268
314
  var addIfDoesNotExist = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
269
- return this.addMessagesSorted([newMessage], timestampChanged, false, addIfDoesNotExist);
315
+ var messageSetToAddToIfDoesNotExist = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'latest';
316
+ return this.addMessagesSorted([newMessage], timestampChanged, false, addIfDoesNotExist, messageSetToAddToIfDoesNotExist);
270
317
  }
271
318
  /**
272
319
  * formatMessage - Takes the message object. Parses the dates, sets __html
@@ -298,6 +345,7 @@ var ChannelState = /*#__PURE__*/function () {
298
345
  * @param {boolean} timestampChanged Whether updating messages with changed created_at value.
299
346
  * @param {boolean} initializing Whether channel is being initialized.
300
347
  * @param {boolean} addIfDoesNotExist Add message if it is not in the list, used to prevent out of order updated messages from being added.
348
+ * @param {MessageSetType} messageSetToAddToIfDoesNotExist Which message set to add to if messages are not in the list (only used if addIfDoesNotExist is true)
301
349
  *
302
350
  */
303
351
 
@@ -307,48 +355,60 @@ var ChannelState = /*#__PURE__*/function () {
307
355
  var timestampChanged = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
308
356
  var initializing = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
309
357
  var addIfDoesNotExist = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
358
+ var messageSetToAddToIfDoesNotExist = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'current';
310
359
 
311
- for (var i = 0; i < newMessages.length; i += 1) {
312
- var _this$_channel;
360
+ var _this$findTargetMessa = this.findTargetMessageSet(newMessages, addIfDoesNotExist, messageSetToAddToIfDoesNotExist),
361
+ messagesToAdd = _this$findTargetMessa.messagesToAdd,
362
+ targetMessageSetIndex = _this$findTargetMessa.targetMessageSetIndex;
313
363
 
314
- var isFromShadowBannedUser = newMessages[i].shadowed;
364
+ for (var i = 0; i < messagesToAdd.length; i += 1) {
365
+ var isFromShadowBannedUser = messagesToAdd[i].shadowed;
315
366
 
316
367
  if (isFromShadowBannedUser) {
317
368
  continue;
318
369
  }
319
370
 
320
- var message = this.formatMessage(newMessages[i]);
371
+ var isMerging = messagesToAdd[i].created_at instanceof Date;
372
+ var message = void 0;
321
373
 
322
- if (message.user && (_this$_channel = this._channel) !== null && _this$_channel !== void 0 && _this$_channel.cid) {
323
- /**
324
- * Store the reference to user for this channel, so that when we have to
325
- * handle updates to user, we can use the reference map, to determine which
326
- * channels need to be updated with updated user object.
327
- */
328
- this._channel.getClient().state.updateUserReference(message.user, this._channel.cid);
329
- }
374
+ if (isMerging) {
375
+ message = messagesToAdd[i];
376
+ } else {
377
+ var _this$_channel;
330
378
 
331
- if (initializing && message.id && this.threads[message.id]) {
332
- // If we are initializing the state of channel (e.g., in case of connection recovery),
333
- // then in that case we remove thread related to this message from threads object.
334
- // This way we can ensure that we don't have any stale data in thread object
335
- // and consumer can refetch the replies.
336
- delete this.threads[message.id];
337
- }
379
+ message = this.formatMessage(messagesToAdd[i]);
338
380
 
339
- if (!this.last_message_at) {
340
- this.last_message_at = new Date(message.created_at.getTime());
341
- }
381
+ if (message.user && (_this$_channel = this._channel) !== null && _this$_channel !== void 0 && _this$_channel.cid) {
382
+ /**
383
+ * Store the reference to user for this channel, so that when we have to
384
+ * handle updates to user, we can use the reference map, to determine which
385
+ * channels need to be updated with updated user object.
386
+ */
387
+ this._channel.getClient().state.updateUserReference(message.user, this._channel.cid);
388
+ }
389
+
390
+ if (initializing && message.id && this.threads[message.id]) {
391
+ // If we are initializing the state of channel (e.g., in case of connection recovery),
392
+ // then in that case we remove thread related to this message from threads object.
393
+ // This way we can ensure that we don't have any stale data in thread object
394
+ // and consumer can refetch the replies.
395
+ delete this.threads[message.id];
396
+ }
342
397
 
343
- if (message.created_at.getTime() > this.last_message_at.getTime()) {
344
- this.last_message_at = new Date(message.created_at.getTime());
398
+ if (!this.last_message_at) {
399
+ this.last_message_at = new Date(message.created_at.getTime());
400
+ }
401
+
402
+ if (message.created_at.getTime() > this.last_message_at.getTime()) {
403
+ this.last_message_at = new Date(message.created_at.getTime());
404
+ }
345
405
  } // update or append the messages...
346
406
 
347
407
 
348
- var parentID = message.parent_id; // add to the main message list
408
+ var parentID = message.parent_id; // add to the given message set
349
409
 
350
- if (!parentID || message.show_in_channel) {
351
- this.messages = this._addToMessageList(this.messages, message, timestampChanged, 'created_at', addIfDoesNotExist);
410
+ if ((!parentID || message.show_in_channel) && targetMessageSetIndex !== -1) {
411
+ this.messageSets[targetMessageSetIndex].messages = this._addToMessageList(this.messageSets[targetMessageSetIndex].messages, message, timestampChanged, 'created_at', addIfDoesNotExist);
352
412
  }
353
413
  /**
354
414
  * Add message to thread if applicable and the message
@@ -361,7 +421,7 @@ var ChannelState = /*#__PURE__*/function () {
361
421
  */
362
422
 
363
423
 
364
- if (parentID && !initializing) {
424
+ if (parentID && !initializing && !isMerging) {
365
425
  var thread = this.threads[parentID] || [];
366
426
 
367
427
  var threadMessages = this._addToMessageList(thread, message, timestampChanged, 'created_at', addIfDoesNotExist);
@@ -472,6 +532,8 @@ var ChannelState = /*#__PURE__*/function () {
472
532
  }, {
473
533
  key: "removeQuotedMessageReferences",
474
534
  value: function removeQuotedMessageReferences(message) {
535
+ var _this4 = this;
536
+
475
537
  var parseMessage = function parseMessage(m) {
476
538
  var _m$pinned_at, _m$updated_at;
477
539
 
@@ -482,16 +544,19 @@ var ChannelState = /*#__PURE__*/function () {
482
544
  });
483
545
  };
484
546
 
485
- var updatedMessages = this.messages.filter(function (msg) {
486
- return msg.quoted_message_id === message.id;
487
- }).map(parseMessage).map(function (msg) {
488
- return _objectSpread$7(_objectSpread$7({}, msg), {}, {
489
- quoted_message: _objectSpread$7(_objectSpread$7({}, message), {}, {
490
- attachments: []
491
- })
547
+ this.messageSets.forEach(function (set) {
548
+ var updatedMessages = set.messages.filter(function (msg) {
549
+ return msg.quoted_message_id === message.id;
550
+ }).map(parseMessage).map(function (msg) {
551
+ return _objectSpread$7(_objectSpread$7({}, msg), {}, {
552
+ quoted_message: _objectSpread$7(_objectSpread$7({}, message), {}, {
553
+ attachments: []
554
+ })
555
+ });
492
556
  });
557
+
558
+ _this4.addMessagesSorted(updatedMessages, true);
493
559
  });
494
- this.addMessagesSorted(updatedMessages, true);
495
560
  }
496
561
  /**
497
562
  * Updates all instances of given message in channel state
@@ -519,12 +584,16 @@ var ChannelState = /*#__PURE__*/function () {
519
584
  }
520
585
 
521
586
  if (!show_in_channel && !parent_id || show_in_channel) {
522
- var _msgIndex = this.messages.findIndex(function (msg) {
523
- return msg.id === message.id;
524
- });
587
+ var messageSetIndex = this.findMessageSetIndex(message);
588
+
589
+ if (messageSetIndex !== -1) {
590
+ var _msgIndex = this.messageSets[messageSetIndex].messages.findIndex(function (msg) {
591
+ return msg.id === message.id;
592
+ });
525
593
 
526
- if (_msgIndex !== -1) {
527
- this.messages[_msgIndex] = updateFunc(this.messages[_msgIndex]);
594
+ if (_msgIndex !== -1) {
595
+ this.messageSets[messageSetIndex].messages[_msgIndex] = updateFunc(this.messageSets[messageSetIndex].messages[_msgIndex]);
596
+ }
528
597
  }
529
598
  }
530
599
 
@@ -643,12 +712,16 @@ var ChannelState = /*#__PURE__*/function () {
643
712
  this.threads[messageToRemove.parent_id] = threadMessages;
644
713
  isRemoved = removed;
645
714
  } else {
646
- var _this$removeMessageFr3 = this.removeMessageFromArray(this.messages, messageToRemove),
647
- _removed = _this$removeMessageFr3.removed,
648
- messages = _this$removeMessageFr3.result;
715
+ var messageSetIndex = this.findMessageSetIndex(messageToRemove);
649
716
 
650
- this.messages = messages;
651
- isRemoved = _removed;
717
+ if (messageSetIndex !== -1) {
718
+ var _this$removeMessageFr3 = this.removeMessageFromArray(this.messageSets[messageSetIndex].messages, messageToRemove),
719
+ _removed = _this$removeMessageFr3.removed,
720
+ messages = _this$removeMessageFr3.result;
721
+
722
+ this.messageSets[messageSetIndex].messages = messages;
723
+ isRemoved = _removed;
724
+ }
652
725
  }
653
726
 
654
727
  return isRemoved;
@@ -661,10 +734,10 @@ var ChannelState = /*#__PURE__*/function () {
661
734
  *
662
735
  */
663
736
  function filterErrorMessages() {
664
- var filteredMessages = this.messages.filter(function (message) {
737
+ var filteredMessages = this.latestMessages.filter(function (message) {
665
738
  return message.type !== 'error';
666
739
  });
667
- this.messages = filteredMessages;
740
+ this.latestMessages = filteredMessages;
668
741
  }
669
742
  /**
670
743
  * clean - Remove stale data such as users that stayed in typing state for more than 5 seconds
@@ -698,9 +771,250 @@ var ChannelState = /*#__PURE__*/function () {
698
771
  }, {
699
772
  key: "clearMessages",
700
773
  value: function clearMessages() {
701
- this.messages = [];
774
+ this.initMessages();
702
775
  this.pinnedMessages = [];
703
776
  }
777
+ }, {
778
+ key: "initMessages",
779
+ value: function initMessages() {
780
+ this.messageSets = [{
781
+ messages: [],
782
+ isLatest: true,
783
+ isCurrent: true
784
+ }];
785
+ }
786
+ /**
787
+ * loadMessageIntoState - Loads a given message (and messages around it) into the state
788
+ *
789
+ * @param {string} messageId The id of the message, or 'latest' to indicate switching to the latest messages
790
+ * @param {string} parentMessageId The id of the parent message, if we want load a thread reply
791
+ */
792
+
793
+ }, {
794
+ key: "loadMessageIntoState",
795
+ value: function () {
796
+ var _loadMessageIntoState = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(messageId, parentMessageId) {
797
+ var _this$threads$parentM;
798
+
799
+ var messageSetIndex, switchedToMessageSet, loadedMessageThread, messageIdToFind;
800
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
801
+ while (1) {
802
+ switch (_context.prev = _context.next) {
803
+ case 0:
804
+ switchedToMessageSet = false;
805
+ loadedMessageThread = false;
806
+ messageIdToFind = parentMessageId || messageId;
807
+
808
+ if (!(messageId === 'latest')) {
809
+ _context.next = 9;
810
+ break;
811
+ }
812
+
813
+ if (!(this.messages === this.latestMessages)) {
814
+ _context.next = 6;
815
+ break;
816
+ }
817
+
818
+ return _context.abrupt("return");
819
+
820
+ case 6:
821
+ messageSetIndex = this.messageSets.findIndex(function (s) {
822
+ return s.isLatest;
823
+ });
824
+ _context.next = 10;
825
+ break;
826
+
827
+ case 9:
828
+ messageSetIndex = this.findMessageSetIndex({
829
+ id: messageIdToFind
830
+ });
831
+
832
+ case 10:
833
+ if (messageSetIndex !== -1) {
834
+ this.switchToMessageSet(messageSetIndex);
835
+ switchedToMessageSet = true;
836
+ }
837
+
838
+ loadedMessageThread = !parentMessageId || !!((_this$threads$parentM = this.threads[parentMessageId]) !== null && _this$threads$parentM !== void 0 && _this$threads$parentM.find(function (m) {
839
+ return m.id === messageId;
840
+ }));
841
+
842
+ if (!(switchedToMessageSet && loadedMessageThread)) {
843
+ _context.next = 14;
844
+ break;
845
+ }
846
+
847
+ return _context.abrupt("return");
848
+
849
+ case 14:
850
+ if (switchedToMessageSet) {
851
+ _context.next = 17;
852
+ break;
853
+ }
854
+
855
+ _context.next = 17;
856
+ return this._channel.query({
857
+ messages: {
858
+ id_around: messageIdToFind,
859
+ limit: 25
860
+ }
861
+ }, 'new');
862
+
863
+ case 17:
864
+ if (!(!loadedMessageThread && parentMessageId)) {
865
+ _context.next = 20;
866
+ break;
867
+ }
868
+
869
+ _context.next = 20;
870
+ return this._channel.getReplies(parentMessageId, {
871
+ id_around: messageId,
872
+ limit: 25
873
+ });
874
+
875
+ case 20:
876
+ messageSetIndex = this.findMessageSetIndex({
877
+ id: messageIdToFind
878
+ });
879
+
880
+ if (messageSetIndex !== -1) {
881
+ this.switchToMessageSet(messageSetIndex);
882
+ }
883
+
884
+ case 22:
885
+ case "end":
886
+ return _context.stop();
887
+ }
888
+ }
889
+ }, _callee, this);
890
+ }));
891
+
892
+ function loadMessageIntoState(_x, _x2) {
893
+ return _loadMessageIntoState.apply(this, arguments);
894
+ }
895
+
896
+ return loadMessageIntoState;
897
+ }()
898
+ }, {
899
+ key: "switchToMessageSet",
900
+ value: function switchToMessageSet(index) {
901
+ var currentMessages = this.messageSets.find(function (s) {
902
+ return s.isCurrent;
903
+ });
904
+
905
+ if (!currentMessages) {
906
+ return;
907
+ }
908
+
909
+ currentMessages.isCurrent = false;
910
+ this.messageSets[index].isCurrent = true;
911
+ }
912
+ }, {
913
+ key: "areMessageSetsOverlap",
914
+ value: function areMessageSetsOverlap(messages1, messages2) {
915
+ return messages1.some(function (m1) {
916
+ return messages2.find(function (m2) {
917
+ return m1.id === m2.id;
918
+ });
919
+ });
920
+ }
921
+ }, {
922
+ key: "findMessageSetIndex",
923
+ value: function findMessageSetIndex(message) {
924
+ return this.messageSets.findIndex(function (set) {
925
+ return !!set.messages.find(function (m) {
926
+ return m.id === message.id;
927
+ });
928
+ });
929
+ }
930
+ }, {
931
+ key: "findTargetMessageSet",
932
+ value: function findTargetMessageSet(newMessages) {
933
+ var _this5 = this;
934
+
935
+ var addIfDoesNotExist = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
936
+ var messageSetToAddToIfDoesNotExist = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'current';
937
+ var messagesToAdd = newMessages;
938
+ var targetMessageSetIndex;
939
+
940
+ if (addIfDoesNotExist) {
941
+ var overlappingMessageSetIndices = this.messageSets.map(function (_, i) {
942
+ return i;
943
+ }).filter(function (i) {
944
+ return _this5.areMessageSetsOverlap(_this5.messageSets[i].messages, newMessages);
945
+ });
946
+
947
+ switch (messageSetToAddToIfDoesNotExist) {
948
+ case 'new':
949
+ if (overlappingMessageSetIndices.length > 0) {
950
+ targetMessageSetIndex = overlappingMessageSetIndices[0]; // No new message set is created if newMessages only contains thread replies
951
+ } else if (newMessages.some(function (m) {
952
+ return !m.parent_id;
953
+ })) {
954
+ this.messageSets.push({
955
+ messages: [],
956
+ isCurrent: false,
957
+ isLatest: false
958
+ });
959
+ targetMessageSetIndex = this.messageSets.length - 1;
960
+ }
961
+
962
+ break;
963
+
964
+ case 'current':
965
+ targetMessageSetIndex = this.messageSets.findIndex(function (s) {
966
+ return s.isCurrent;
967
+ });
968
+ break;
969
+
970
+ case 'latest':
971
+ targetMessageSetIndex = this.messageSets.findIndex(function (s) {
972
+ return s.isLatest;
973
+ });
974
+ break;
975
+
976
+ default:
977
+ targetMessageSetIndex = -1;
978
+ } // when merging the target set will be the first one from the overlapping message sets
979
+
980
+
981
+ var mergeTargetMessageSetIndex = overlappingMessageSetIndices.splice(0, 1)[0];
982
+
983
+ var mergeSourceMessageSetIndices = _toConsumableArray(overlappingMessageSetIndices);
984
+
985
+ if (mergeTargetMessageSetIndex !== undefined && mergeTargetMessageSetIndex !== targetMessageSetIndex) {
986
+ mergeSourceMessageSetIndices.push(targetMessageSetIndex);
987
+ } // merge message sets
988
+
989
+
990
+ if (mergeSourceMessageSetIndices.length > 0) {
991
+ var target = this.messageSets[mergeTargetMessageSetIndex];
992
+ var sources = this.messageSets.filter(function (_, i) {
993
+ return mergeSourceMessageSetIndices.indexOf(i) !== -1;
994
+ });
995
+ sources.forEach(function (messageSet) {
996
+ target.isLatest = target.isLatest || messageSet.isLatest;
997
+ target.isCurrent = target.isCurrent || messageSet.isCurrent;
998
+ messagesToAdd = [].concat(_toConsumableArray(messagesToAdd), _toConsumableArray(messageSet.messages));
999
+ });
1000
+ sources.forEach(function (s) {
1001
+ return _this5.messageSets.splice(_this5.messageSets.indexOf(s), 1);
1002
+ });
1003
+ var overlappingMessageSetIndex = this.messageSets.findIndex(function (s) {
1004
+ return _this5.areMessageSetsOverlap(s.messages, newMessages);
1005
+ });
1006
+ targetMessageSetIndex = overlappingMessageSetIndex;
1007
+ }
1008
+ } else {
1009
+ // assumes that all new messages belong to the same set
1010
+ targetMessageSetIndex = this.findMessageSetIndex(newMessages[0]);
1011
+ }
1012
+
1013
+ return {
1014
+ targetMessageSetIndex: targetMessageSetIndex,
1015
+ messagesToAdd: messagesToAdd
1016
+ };
1017
+ }
704
1018
  }]);
705
1019
 
706
1020
  return ChannelState;
@@ -1063,7 +1377,7 @@ var Channel = /*#__PURE__*/function () {
1063
1377
  presence: false
1064
1378
  };
1065
1379
  _context.next = 3;
1066
- return _this.query(options);
1380
+ return _this.query(options, 'latest');
1067
1381
 
1068
1382
  case 3:
1069
1383
  return _context.abrupt("return", _context.sent);
@@ -2361,14 +2675,14 @@ var Channel = /*#__PURE__*/function () {
2361
2675
  value: function lastMessage() {
2362
2676
  // get last 5 messages, sort, return the latest
2363
2677
  // get a slice of the last 5
2364
- var min = this.state.messages.length - 5;
2678
+ var min = this.state.latestMessages.length - 5;
2365
2679
 
2366
2680
  if (min < 0) {
2367
2681
  min = 0;
2368
2682
  }
2369
2683
 
2370
- var max = this.state.messages.length + 1;
2371
- var messageSlice = this.state.messages.slice(min, max); // sort by pk desc
2684
+ var max = this.state.latestMessages.length + 1;
2685
+ var messageSlice = this.state.latestMessages.slice(min, max); // sort by pk desc
2372
2686
 
2373
2687
  messageSlice.sort(function (a, b) {
2374
2688
  return b.created_at.getTime() - a.created_at.getTime();
@@ -2477,7 +2791,7 @@ var Channel = /*#__PURE__*/function () {
2477
2791
 
2478
2792
  combined = _objectSpread$5(_objectSpread$5({}, defaultOptions), options);
2479
2793
  _context27.next = 7;
2480
- return this.query(combined);
2794
+ return this.query(combined, 'latest');
2481
2795
 
2482
2796
  case 7:
2483
2797
  state = _context27.sent;
@@ -2551,7 +2865,7 @@ var Channel = /*#__PURE__*/function () {
2551
2865
  * getReplies - List the message replies for a parent message
2552
2866
  *
2553
2867
  * @param {string} parent_id The message parent id, ie the top of the thread
2554
- * @param {PaginationOptions & { user?: UserResponse<StreamChatGenerics>; user_id?: string }} options Pagination params, ie {limit:10, id_lte: 10}
2868
+ * @param {MessagePaginationOptions & { user?: UserResponse<StreamChatGenerics>; user_id?: string }} options Pagination params, ie {limit:10, id_lte: 10}
2555
2869
  *
2556
2870
  * @return {Promise<GetRepliesAPIResponse<StreamChatGenerics>>} A response with a list of messages
2557
2871
  */
@@ -2712,8 +3026,8 @@ var Channel = /*#__PURE__*/function () {
2712
3026
  if (!lastRead) return this.state.unreadCount;
2713
3027
  var count = 0;
2714
3028
 
2715
- for (var i = 0; i < this.state.messages.length; i += 1) {
2716
- var message = this.state.messages[i];
3029
+ for (var i = 0; i < this.state.latestMessages.length; i += 1) {
3030
+ var message = this.state.latestMessages[i];
2717
3031
 
2718
3032
  if (message.created_at > lastRead && this._countMessageAsUnread(message)) {
2719
3033
  count++;
@@ -2723,7 +3037,7 @@ var Channel = /*#__PURE__*/function () {
2723
3037
  return count;
2724
3038
  }
2725
3039
  /**
2726
- * countUnread - Count the number of unread messages mentioning the current user
3040
+ * countUnreadMentions - Count the number of unread messages mentioning the current user
2727
3041
  *
2728
3042
  * @return {number} Unread mentions count
2729
3043
  */
@@ -2735,10 +3049,10 @@ var Channel = /*#__PURE__*/function () {
2735
3049
  var userID = this.getClient().userID;
2736
3050
  var count = 0;
2737
3051
 
2738
- for (var i = 0; i < this.state.messages.length; i += 1) {
3052
+ for (var i = 0; i < this.state.latestMessages.length; i += 1) {
2739
3053
  var _message$mentioned_us;
2740
3054
 
2741
- var message = this.state.messages[i];
3055
+ var message = this.state.latestMessages[i];
2742
3056
 
2743
3057
  if (this._countMessageAsUnread(message) && (!lastRead || message.created_at > lastRead) && (_message$mentioned_us = message.mentioned_users) !== null && _message$mentioned_us !== void 0 && _message$mentioned_us.some(function (user) {
2744
3058
  return user.id === userID;
@@ -2762,33 +3076,40 @@ var Channel = /*#__PURE__*/function () {
2762
3076
  * query - Query the API, get messages, members or other channel fields
2763
3077
  *
2764
3078
  * @param {ChannelQueryOptions<StreamChatGenerics>} options The query options
3079
+ * @param {MessageSetType} messageSetToAddToIfDoesNotExist It's possible to load disjunct sets of a channel's messages into state, use `current` to load the initial channel state or if you want to extend the currently displayed messages, use `latest` if you want to load/extend the latest messages, `new` is used for loading a specific message and it's surroundings
2765
3080
  *
2766
3081
  * @return {Promise<ChannelAPIResponse<StreamChatGenerics>>} Returns a query response
2767
3082
  */
2768
3083
  function () {
2769
3084
  var _query = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee31(options) {
2770
- var queryURL, state, membersStr, tempChannelCid;
3085
+ var messageSetToAddToIfDoesNotExist,
3086
+ queryURL,
3087
+ state,
3088
+ membersStr,
3089
+ tempChannelCid,
3090
+ _args31 = arguments;
2771
3091
  return _regeneratorRuntime.wrap(function _callee31$(_context31) {
2772
3092
  while (1) {
2773
3093
  switch (_context31.prev = _context31.next) {
2774
3094
  case 0:
2775
- _context31.next = 2;
3095
+ messageSetToAddToIfDoesNotExist = _args31.length > 1 && _args31[1] !== undefined ? _args31[1] : 'current';
3096
+ _context31.next = 3;
2776
3097
  return this.getClient().wsPromise;
2777
3098
 
2778
- case 2:
3099
+ case 3:
2779
3100
  queryURL = "".concat(this.getClient().baseURL, "/channels/").concat(this.type);
2780
3101
 
2781
3102
  if (this.id) {
2782
3103
  queryURL += "/".concat(this.id);
2783
3104
  }
2784
3105
 
2785
- _context31.next = 6;
3106
+ _context31.next = 7;
2786
3107
  return this.getClient().post(queryURL + '/query', _objectSpread$5({
2787
3108
  data: this._data,
2788
3109
  state: true
2789
3110
  }, options));
2790
3111
 
2791
- case 6:
3112
+ case 7:
2792
3113
  state = _context31.sent;
2793
3114
 
2794
3115
  // update the channel id if it was missing
@@ -2817,11 +3138,11 @@ var Channel = /*#__PURE__*/function () {
2817
3138
  this.getClient()._addChannelConfig(state); // add any messages to our channel state
2818
3139
 
2819
3140
 
2820
- this._initializeState(state);
3141
+ this._initializeState(state, messageSetToAddToIfDoesNotExist);
2821
3142
 
2822
3143
  return _context31.abrupt("return", state);
2823
3144
 
2824
- case 11:
3145
+ case 12:
2825
3146
  case "end":
2826
3147
  return _context31.stop();
2827
3148
  }
@@ -3371,6 +3692,8 @@ var Channel = /*#__PURE__*/function () {
3371
3692
  }, {
3372
3693
  key: "_initializeState",
3373
3694
  value: function _initializeState(state) {
3695
+ var messageSetToAddToIfDoesNotExist = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'latest';
3696
+
3374
3697
  var _this$getClient2 = this.getClient(),
3375
3698
  clientState = _this$getClient2.state,
3376
3699
  user = _this$getClient2.user,
@@ -3400,10 +3723,10 @@ var Channel = /*#__PURE__*/function () {
3400
3723
  var messages = state.messages || [];
3401
3724
 
3402
3725
  if (!this.state.messages) {
3403
- this.state.messages = [];
3726
+ this.state.initMessages();
3404
3727
  }
3405
3728
 
3406
- this.state.addMessagesSorted(messages, false, true);
3729
+ this.state.addMessagesSorted(messages, false, true, true, messageSetToAddToIfDoesNotExist);
3407
3730
 
3408
3731
  if (!this.state.pinnedMessages) {
3409
3732
  this.state.pinnedMessages = [];
@@ -7441,11 +7764,11 @@ var StreamChat = /*#__PURE__*/function () {
7441
7764
  c.initialized = true;
7442
7765
 
7443
7766
  if (skipInitialization === undefined) {
7444
- c._initializeState(_channelState);
7767
+ c._initializeState(_channelState, 'latest');
7445
7768
  } else if (!skipInitialization.includes(_channelState.channel.id)) {
7446
7769
  c.state.clearMessages();
7447
7770
 
7448
- c._initializeState(_channelState);
7771
+ c._initializeState(_channelState, 'latest');
7449
7772
  }
7450
7773
 
7451
7774
  channels.push(c);
@@ -9180,7 +9503,7 @@ var StreamChat = /*#__PURE__*/function () {
9180
9503
  }, {
9181
9504
  key: "getUserAgent",
9182
9505
  value: function getUserAgent() {
9183
- return this.userAgent || "stream-chat-javascript-client-".concat(this.node ? 'node' : 'browser', "-", "6.2.0");
9506
+ return this.userAgent || "stream-chat-javascript-client-".concat(this.node ? 'node' : 'browser', "-", "6.3.0");
9184
9507
  }
9185
9508
  }, {
9186
9509
  key: "setUserAgent",
@@ -10350,6 +10673,122 @@ var StreamChat = /*#__PURE__*/function () {
10350
10673
 
10351
10674
  return _listImports;
10352
10675
  }()
10676
+ /**
10677
+ * upsertPushProvider - Create or Update a push provider
10678
+ *
10679
+ * Note: Works only for v2 push version is enabled on app settings.
10680
+ *
10681
+ * @param {PushProviderConfig} configuration of the provider you want to create or update
10682
+ *
10683
+ * @return {APIResponse & PushProviderUpsertResponse} A push provider
10684
+ */
10685
+
10686
+ }, {
10687
+ key: "upsertPushProvider",
10688
+ value: function () {
10689
+ var _upsertPushProvider = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee75(pushProvider) {
10690
+ return _regeneratorRuntime.wrap(function _callee75$(_context75) {
10691
+ while (1) {
10692
+ switch (_context75.prev = _context75.next) {
10693
+ case 0:
10694
+ _context75.next = 2;
10695
+ return this.post(this.baseURL + "/push_providers", {
10696
+ push_provider: pushProvider
10697
+ });
10698
+
10699
+ case 2:
10700
+ return _context75.abrupt("return", _context75.sent);
10701
+
10702
+ case 3:
10703
+ case "end":
10704
+ return _context75.stop();
10705
+ }
10706
+ }
10707
+ }, _callee75, this);
10708
+ }));
10709
+
10710
+ function upsertPushProvider(_x98) {
10711
+ return _upsertPushProvider.apply(this, arguments);
10712
+ }
10713
+
10714
+ return upsertPushProvider;
10715
+ }()
10716
+ /**
10717
+ * deletePushProvider - Delete a push provider
10718
+ *
10719
+ * Note: Works only for v2 push version is enabled on app settings.
10720
+ *
10721
+ * @param {PushProviderID} type and foreign id of the push provider to be deleted
10722
+ *
10723
+ * @return {APIResponse} An API response
10724
+ */
10725
+
10726
+ }, {
10727
+ key: "deletePushProvider",
10728
+ value: function () {
10729
+ var _deletePushProvider = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee76(_ref8) {
10730
+ var type, name;
10731
+ return _regeneratorRuntime.wrap(function _callee76$(_context76) {
10732
+ while (1) {
10733
+ switch (_context76.prev = _context76.next) {
10734
+ case 0:
10735
+ type = _ref8.type, name = _ref8.name;
10736
+ _context76.next = 3;
10737
+ return this.delete(this.baseURL + "/push_providers/".concat(type, "/").concat(name));
10738
+
10739
+ case 3:
10740
+ return _context76.abrupt("return", _context76.sent);
10741
+
10742
+ case 4:
10743
+ case "end":
10744
+ return _context76.stop();
10745
+ }
10746
+ }
10747
+ }, _callee76, this);
10748
+ }));
10749
+
10750
+ function deletePushProvider(_x99) {
10751
+ return _deletePushProvider.apply(this, arguments);
10752
+ }
10753
+
10754
+ return deletePushProvider;
10755
+ }()
10756
+ /**
10757
+ * listPushProviders - Get all push providers in the app
10758
+ *
10759
+ * Note: Works only for v2 push version is enabled on app settings.
10760
+ *
10761
+ * @return {APIResponse & PushProviderListResponse} A push provider
10762
+ */
10763
+
10764
+ }, {
10765
+ key: "listPushProviders",
10766
+ value: function () {
10767
+ var _listPushProviders = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee77() {
10768
+ return _regeneratorRuntime.wrap(function _callee77$(_context77) {
10769
+ while (1) {
10770
+ switch (_context77.prev = _context77.next) {
10771
+ case 0:
10772
+ _context77.next = 2;
10773
+ return this.get(this.baseURL + "/push_providers");
10774
+
10775
+ case 2:
10776
+ return _context77.abrupt("return", _context77.sent);
10777
+
10778
+ case 3:
10779
+ case "end":
10780
+ return _context77.stop();
10781
+ }
10782
+ }
10783
+ }, _callee77, this);
10784
+ }));
10785
+
10786
+ function listPushProviders() {
10787
+ return _listPushProviders.apply(this, arguments);
10788
+ }
10789
+
10790
+ return listPushProviders;
10791
+ }()
10353
10792
  }], [{
10354
10793
  key: "getInstance",
10355
10794
  value: function getInstance(key, secretOrOptions, options) {