stream-chat-react-native-core 6.7.0 → 6.7.1-beta.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.
@@ -75,8 +75,27 @@ var keyExtractor = function keyExtractor(item) {
75
75
  var flatListViewabilityConfig = {
76
76
  viewAreaCoveragePercentThreshold: 1
77
77
  };
78
+ var hasReadLastMessage = function hasReadLastMessage(channel, userId) {
79
+ var _channel$state$latest, _channel$state$read$u;
80
+ var latestMessageIdInChannel = (_channel$state$latest = channel.state.latestMessages.slice(-1)[0]) == null ? void 0 : _channel$state$latest.id;
81
+ var lastReadMessageIdServer = (_channel$state$read$u = channel.state.read[userId]) == null ? void 0 : _channel$state$read$u.last_read_message_id;
82
+ return latestMessageIdInChannel === lastReadMessageIdServer;
83
+ };
84
+ var getPreviousLastMessage = function getPreviousLastMessage(messages, newMessage) {
85
+ if (!newMessage) return;
86
+ var previousLastMessage;
87
+ for (var i = messages.length - 1; i >= 0; i--) {
88
+ var msg = messages[i];
89
+ if (!(msg != null && msg.id)) break;
90
+ if (msg.id !== newMessage.id) {
91
+ previousLastMessage = msg;
92
+ break;
93
+ }
94
+ }
95
+ return previousLastMessage;
96
+ };
78
97
  var MessageListWithContext = function MessageListWithContext(props) {
79
- var _getLastReceivedMessa;
98
+ var _getLastReceivedMessa, _client$user3;
80
99
  var LoadingMoreRecentIndicator = props.threadList ? _InlineLoadingMoreRecentThreadIndicator.InlineLoadingMoreRecentThreadIndicator : _InlineLoadingMoreRecentIndicator.InlineLoadingMoreRecentIndicator;
81
100
  var additionalFlatListProps = props.additionalFlatListProps,
82
101
  channel = props.channel,
@@ -120,6 +139,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
120
139
  reloadChannel = props.reloadChannel,
121
140
  ScrollToBottomButton = props.ScrollToBottomButton,
122
141
  selectedPicker = props.selectedPicker,
142
+ setChannelUnreadState = props.setChannelUnreadState,
123
143
  setFlatListRef = props.setFlatListRef,
124
144
  setMessages = props.setMessages,
125
145
  setSelectedPicker = props.setSelectedPicker,
@@ -229,10 +249,15 @@ var MessageListWithContext = function MessageListWithContext(props) {
229
249
  }
230
250
  var lastItem = viewableItems[viewableItems.length - 1];
231
251
  if (lastItem) {
232
- var lastItemCreatedAt = lastItem.item.created_at;
252
+ var lastItemMessage = lastItem.item;
253
+ var lastItemCreatedAt = lastItemMessage.created_at;
233
254
  var unreadIndicatorDate = channelUnreadState == null ? void 0 : channelUnreadState.last_read.getTime();
234
255
  var lastItemDate = lastItemCreatedAt.getTime();
235
- if (!channel.state.messagePagination.hasPrev && processedMessageList[processedMessageList.length - 1].id === lastItem.item.id) {
256
+ if (!channel.state.messagePagination.hasPrev && processedMessageList[processedMessageList.length - 1].id === lastItemMessage.id) {
257
+ setIsUnreadNotificationOpen(false);
258
+ return;
259
+ }
260
+ if (viewableItems.length === 1 && channel.countUnread() === 0 && lastItemMessage.user.id === client.userID) {
236
261
  setIsUnreadNotificationOpen(false);
237
262
  return;
238
263
  }
@@ -271,18 +296,55 @@ var MessageListWithContext = function MessageListWithContext(props) {
271
296
  }
272
297
  }, [disabled]);
273
298
  (0, _react.useEffect)(function () {
274
- var listener = channel.on('message.new', function (event) {
275
- var _event$message, _event$message2;
276
- var newMessageToCurrentChannel = event.cid === channel.cid;
277
- var mainChannelUpdated = !((_event$message = event.message) != null && _event$message.parent_id) || ((_event$message2 = event.message) == null ? void 0 : _event$message2.show_in_channel);
278
- if (newMessageToCurrentChannel && mainChannelUpdated && !scrollToBottomButtonVisible) {
279
- markRead();
280
- }
281
- });
299
+ var shouldMarkRead = function shouldMarkRead() {
300
+ var _client$user, _client$user2;
301
+ return !(channelUnreadState != null && channelUnreadState.first_unread_message_id) && !scrollToBottomButtonVisible && ((_client$user = client.user) == null ? void 0 : _client$user.id) && !hasReadLastMessage(channel, (_client$user2 = client.user) == null ? void 0 : _client$user2.id);
302
+ };
303
+ var handleEvent = function () {
304
+ var _ref3 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee(event) {
305
+ var _event$message, _event$message2;
306
+ var mainChannelUpdated;
307
+ return _regenerator["default"].wrap(function _callee$(_context) {
308
+ while (1) switch (_context.prev = _context.next) {
309
+ case 0:
310
+ mainChannelUpdated = !((_event$message = event.message) != null && _event$message.parent_id) || ((_event$message2 = event.message) == null ? void 0 : _event$message2.show_in_channel);
311
+ if (!(scrollToBottomButtonVisible || channelUnreadState != null && channelUnreadState.first_unread_message_id)) {
312
+ _context.next = 5;
313
+ break;
314
+ }
315
+ setChannelUnreadState(function (prev) {
316
+ var _prev$unread_messages, _prev$last_read;
317
+ var previousUnreadCount = (_prev$unread_messages = prev == null ? void 0 : prev.unread_messages) != null ? _prev$unread_messages : 0;
318
+ var previousLastMessage = getPreviousLastMessage(channel.state.messages, event.message);
319
+ return Object.assign({}, prev || {}, {
320
+ last_read: (_prev$last_read = prev == null ? void 0 : prev.last_read) != null ? _prev$last_read : previousUnreadCount === 0 && previousLastMessage != null && previousLastMessage.created_at ? new Date(previousLastMessage.created_at) : new Date(0),
321
+ unread_messages: previousUnreadCount + 1
322
+ });
323
+ });
324
+ _context.next = 8;
325
+ break;
326
+ case 5:
327
+ if (!(mainChannelUpdated && shouldMarkRead())) {
328
+ _context.next = 8;
329
+ break;
330
+ }
331
+ _context.next = 8;
332
+ return markRead();
333
+ case 8:
334
+ case "end":
335
+ return _context.stop();
336
+ }
337
+ }, _callee);
338
+ }));
339
+ return function handleEvent(_x) {
340
+ return _ref3.apply(this, arguments);
341
+ };
342
+ }();
343
+ var listener = channel.on('message.new', handleEvent);
282
344
  return function () {
283
345
  listener == null || listener.unsubscribe();
284
346
  };
285
- }, [channel, markRead, scrollToBottomButtonVisible]);
347
+ }, [channel, channelUnreadState == null ? void 0 : channelUnreadState.first_unread_message_id, (_client$user3 = client.user) == null ? void 0 : _client$user3.id, markRead, scrollToBottomButtonVisible, setChannelUnreadState, threadList]);
286
348
  (0, _react.useEffect)(function () {
287
349
  var lastReceivedMessage = (0, _getLastReceivedMessage.getLastReceivedMessage)(processedMessageList);
288
350
  setLastReceivedId(lastReceivedMessage == null ? void 0 : lastReceivedMessage.id);
@@ -305,6 +367,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
305
367
  setTimeout(function () {
306
368
  channelResyncScrollSet.current = true;
307
369
  if (channel.countUnread() > 0) {
370
+ console.log('marking read');
308
371
  markRead();
309
372
  }
310
373
  }, 500);
@@ -354,31 +417,31 @@ var MessageListWithContext = function MessageListWithContext(props) {
354
417
  }
355
418
  }, [channel, rawMessageList, threadList]);
356
419
  var goToMessage = function () {
357
- var _ref3 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee(messageId) {
420
+ var _ref4 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee2(messageId) {
358
421
  var indexOfParentInMessageList;
359
- return _regenerator["default"].wrap(function _callee$(_context) {
360
- while (1) switch (_context.prev = _context.next) {
422
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
423
+ while (1) switch (_context2.prev = _context2.next) {
361
424
  case 0:
362
425
  indexOfParentInMessageList = processedMessageList.findIndex(function (message) {
363
426
  return (message == null ? void 0 : message.id) === messageId;
364
427
  });
365
- _context.prev = 1;
428
+ _context2.prev = 1;
366
429
  if (!(indexOfParentInMessageList === -1)) {
367
- _context.next = 8;
430
+ _context2.next = 8;
368
431
  break;
369
432
  }
370
- _context.next = 5;
433
+ _context2.next = 5;
371
434
  return loadChannelAroundMessage({
372
435
  messageId: messageId
373
436
  });
374
437
  case 5:
375
- return _context.abrupt("return");
438
+ return _context2.abrupt("return");
376
439
  case 8:
377
440
  if (flatListRef.current) {
378
- _context.next = 10;
441
+ _context2.next = 10;
379
442
  break;
380
443
  }
381
- return _context.abrupt("return");
444
+ return _context2.abrupt("return");
382
445
  case 10:
383
446
  clearTimeout(failScrollTimeoutId.current);
384
447
  scrollToIndexFailedRetryCountRef.current = 0;
@@ -389,54 +452,54 @@ var MessageListWithContext = function MessageListWithContext(props) {
389
452
  index: indexOfParentInMessageList,
390
453
  viewPosition: 0.5
391
454
  });
392
- return _context.abrupt("return");
455
+ return _context2.abrupt("return");
393
456
  case 16:
394
- _context.next = 21;
457
+ _context2.next = 21;
395
458
  break;
396
459
  case 18:
397
- _context.prev = 18;
398
- _context.t0 = _context["catch"](1);
399
- console.warn('Error while scrolling to message', _context.t0);
460
+ _context2.prev = 18;
461
+ _context2.t0 = _context2["catch"](1);
462
+ console.warn('Error while scrolling to message', _context2.t0);
400
463
  case 21:
401
464
  case "end":
402
- return _context.stop();
465
+ return _context2.stop();
403
466
  }
404
- }, _callee, null, [[1, 18]]);
467
+ }, _callee2, null, [[1, 18]]);
405
468
  }));
406
- return function goToMessage(_x) {
407
- return _ref3.apply(this, arguments);
469
+ return function goToMessage(_x2) {
470
+ return _ref4.apply(this, arguments);
408
471
  };
409
472
  }();
410
473
  (0, _react.useEffect)(function () {
411
474
  if (!targetedMessage) {
412
475
  return;
413
476
  }
414
- scrollToDebounceTimeoutRef.current = setTimeout((0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee2() {
477
+ scrollToDebounceTimeoutRef.current = setTimeout((0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee3() {
415
478
  var indexOfParentInMessageList;
416
- return _regenerator["default"].wrap(function _callee2$(_context2) {
417
- while (1) switch (_context2.prev = _context2.next) {
479
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
480
+ while (1) switch (_context3.prev = _context3.next) {
418
481
  case 0:
419
482
  indexOfParentInMessageList = processedMessageList.findIndex(function (message) {
420
483
  return (message == null ? void 0 : message.id) === targetedMessage;
421
484
  });
422
485
  if (!(indexOfParentInMessageList === -1)) {
423
- _context2.next = 6;
486
+ _context3.next = 6;
424
487
  break;
425
488
  }
426
- _context2.next = 4;
489
+ _context3.next = 4;
427
490
  return loadChannelAroundMessage({
428
491
  messageId: targetedMessage,
429
492
  setTargetedMessage: setTargetedMessage
430
493
  });
431
494
  case 4:
432
- _context2.next = 13;
495
+ _context3.next = 13;
433
496
  break;
434
497
  case 6:
435
498
  if (flatListRef.current) {
436
- _context2.next = 8;
499
+ _context3.next = 8;
437
500
  break;
438
501
  }
439
- return _context2.abrupt("return");
502
+ return _context3.abrupt("return");
440
503
  case 8:
441
504
  clearTimeout(scrollToDebounceTimeoutRef.current);
442
505
  clearTimeout(failScrollTimeoutId.current);
@@ -449,16 +512,16 @@ var MessageListWithContext = function MessageListWithContext(props) {
449
512
  setTargetedMessage(undefined);
450
513
  case 13:
451
514
  case "end":
452
- return _context2.stop();
515
+ return _context3.stop();
453
516
  }
454
- }, _callee2);
517
+ }, _callee3);
455
518
  })), WAIT_FOR_SCROLL_TIMEOUT);
456
519
  }, [targetedMessage]);
457
520
  var shouldApplyAndroidWorkaround = inverted && _reactNative.Platform.OS === 'android';
458
- var renderItem = function renderItem(_ref5) {
521
+ var renderItem = function renderItem(_ref6) {
459
522
  var _message$user;
460
- var index = _ref5.index,
461
- message = _ref5.item;
523
+ var index = _ref6.index,
524
+ message = _ref6.item;
462
525
  if (!channel || channel.disconnected || !channel.initialized && !channel.offlineMode) {
463
526
  return null;
464
527
  }
@@ -504,16 +567,16 @@ var MessageListWithContext = function MessageListWithContext(props) {
504
567
  });
505
568
  };
506
569
  var maybeCallOnStartReached = function () {
507
- var _ref6 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee3() {
570
+ var _ref7 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee4() {
508
571
  var callback, onError;
509
- return _regenerator["default"].wrap(function _callee3$(_context3) {
510
- while (1) switch (_context3.prev = _context3.next) {
572
+ return _regenerator["default"].wrap(function _callee4$(_context4) {
573
+ while (1) switch (_context4.prev = _context4.next) {
511
574
  case 0:
512
575
  if (!(processedMessageList != null && processedMessageList.length && onStartReachedTracker.current[processedMessageList.length])) {
513
- _context3.next = 2;
576
+ _context4.next = 2;
514
577
  break;
515
578
  }
516
- return _context3.abrupt("return");
579
+ return _context4.abrupt("return");
517
580
  case 2:
518
581
  if (processedMessageList != null && processedMessageList.length) {
519
582
  onStartReachedTracker.current[processedMessageList.length] = true;
@@ -528,34 +591,34 @@ var MessageListWithContext = function MessageListWithContext(props) {
528
591
  }, 2000);
529
592
  };
530
593
  if (!onEndReachedInPromise.current) {
531
- _context3.next = 8;
594
+ _context4.next = 8;
532
595
  break;
533
596
  }
534
- _context3.next = 8;
597
+ _context4.next = 8;
535
598
  return onEndReachedInPromise.current;
536
599
  case 8:
537
600
  onStartReachedInPromise.current = (threadList && !!threadInstance && loadMoreRecentThread ? loadMoreRecentThread({}) : loadMoreRecent()).then(callback)["catch"](onError);
538
601
  case 9:
539
602
  case "end":
540
- return _context3.stop();
603
+ return _context4.stop();
541
604
  }
542
- }, _callee3);
605
+ }, _callee4);
543
606
  }));
544
607
  return function maybeCallOnStartReached() {
545
- return _ref6.apply(this, arguments);
608
+ return _ref7.apply(this, arguments);
546
609
  };
547
610
  }();
548
611
  var maybeCallOnEndReached = function () {
549
- var _ref7 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee4() {
612
+ var _ref8 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee5() {
550
613
  var callback, onError;
551
- return _regenerator["default"].wrap(function _callee4$(_context4) {
552
- while (1) switch (_context4.prev = _context4.next) {
614
+ return _regenerator["default"].wrap(function _callee5$(_context5) {
615
+ while (1) switch (_context5.prev = _context5.next) {
553
616
  case 0:
554
617
  if (!(processedMessageList != null && processedMessageList.length && onEndReachedTracker.current[processedMessageList.length])) {
555
- _context4.next = 2;
618
+ _context5.next = 2;
556
619
  break;
557
620
  }
558
- return _context4.abrupt("return");
621
+ return _context5.abrupt("return");
559
622
  case 2:
560
623
  if (processedMessageList != null && processedMessageList.length) {
561
624
  onEndReachedTracker.current[processedMessageList.length] = true;
@@ -570,21 +633,21 @@ var MessageListWithContext = function MessageListWithContext(props) {
570
633
  }, 2000);
571
634
  };
572
635
  if (!onStartReachedInPromise.current) {
573
- _context4.next = 8;
636
+ _context5.next = 8;
574
637
  break;
575
638
  }
576
- _context4.next = 8;
639
+ _context5.next = 8;
577
640
  return onStartReachedInPromise.current;
578
641
  case 8:
579
642
  onEndReachedInPromise.current = (threadList ? loadMoreThread() : loadMore()).then(callback)["catch"](onError);
580
643
  case 9:
581
644
  case "end":
582
- return _context4.stop();
645
+ return _context5.stop();
583
646
  }
584
- }, _callee4);
647
+ }, _callee5);
585
648
  }));
586
649
  return function maybeCallOnEndReached() {
587
- return _ref7.apply(this, arguments);
650
+ return _ref8.apply(this, arguments);
588
651
  };
589
652
  }();
590
653
  var onUserScrollEvent = function onUserScrollEvent(event) {
@@ -617,21 +680,21 @@ var MessageListWithContext = function MessageListWithContext(props) {
617
680
  }
618
681
  };
619
682
  var goToNewMessages = function () {
620
- var _ref8 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee5() {
683
+ var _ref9 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee6() {
621
684
  var isNotLatestSet;
622
- return _regenerator["default"].wrap(function _callee5$(_context5) {
623
- while (1) switch (_context5.prev = _context5.next) {
685
+ return _regenerator["default"].wrap(function _callee6$(_context6) {
686
+ while (1) switch (_context6.prev = _context6.next) {
624
687
  case 0:
625
688
  isNotLatestSet = channel.state.messages !== channel.state.latestMessages;
626
689
  if (!isNotLatestSet) {
627
- _context5.next = 7;
690
+ _context6.next = 7;
628
691
  break;
629
692
  }
630
693
  resetPaginationTrackersRef.current();
631
- _context5.next = 5;
694
+ _context6.next = 5;
632
695
  return reloadChannel();
633
696
  case 5:
634
- _context5.next = 8;
697
+ _context6.next = 8;
635
698
  break;
636
699
  case 7:
637
700
  if (flatListRef.current) {
@@ -642,14 +705,18 @@ var MessageListWithContext = function MessageListWithContext(props) {
642
705
  }
643
706
  case 8:
644
707
  setScrollToBottomButtonVisible(false);
645
- case 9:
708
+ _context6.next = 11;
709
+ return markRead({
710
+ updateChannelUnreadState: false
711
+ });
712
+ case 11:
646
713
  case "end":
647
- return _context5.stop();
714
+ return _context6.stop();
648
715
  }
649
- }, _callee5);
716
+ }, _callee6);
650
717
  }));
651
718
  return function goToNewMessages() {
652
- return _ref8.apply(this, arguments);
719
+ return _ref9.apply(this, arguments);
653
720
  };
654
721
  }();
655
722
  var scrollToIndexFailedRetryCountRef = (0, _react.useRef)(0);
@@ -723,22 +790,22 @@ var MessageListWithContext = function MessageListWithContext(props) {
723
790
  }
724
791
  };
725
792
  var onUnreadNotificationClose = function () {
726
- var _ref9 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee6() {
727
- return _regenerator["default"].wrap(function _callee6$(_context6) {
728
- while (1) switch (_context6.prev = _context6.next) {
793
+ var _ref10 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee7() {
794
+ return _regenerator["default"].wrap(function _callee7$(_context7) {
795
+ while (1) switch (_context7.prev = _context7.next) {
729
796
  case 0:
730
- _context6.next = 2;
797
+ _context7.next = 2;
731
798
  return markRead();
732
799
  case 2:
733
800
  setIsUnreadNotificationOpen(false);
734
801
  case 3:
735
802
  case "end":
736
- return _context6.stop();
803
+ return _context7.stop();
737
804
  }
738
- }, _callee6);
805
+ }, _callee7);
739
806
  }));
740
807
  return function onUnreadNotificationClose() {
741
- return _ref9.apply(this, arguments);
808
+ return _ref10.apply(this, arguments);
742
809
  };
743
810
  }();
744
811
  var debugRef = (0, _DebugContext.useDebugContext)();
@@ -875,6 +942,7 @@ var MessageList = exports.MessageList = function MessageList(props) {
875
942
  NetworkDownIndicator = _useChannelContext.NetworkDownIndicator,
876
943
  reloadChannel = _useChannelContext.reloadChannel,
877
944
  scrollToFirstUnreadThreshold = _useChannelContext.scrollToFirstUnreadThreshold,
945
+ setChannelUnreadState = _useChannelContext.setChannelUnreadState,
878
946
  setTargetedMessage = _useChannelContext.setTargetedMessage,
879
947
  StickyHeader = _useChannelContext.StickyHeader,
880
948
  targetedMessage = _useChannelContext.targetedMessage,
@@ -943,6 +1011,7 @@ var MessageList = exports.MessageList = function MessageList(props) {
943
1011
  ScrollToBottomButton: ScrollToBottomButton,
944
1012
  scrollToFirstUnreadThreshold: scrollToFirstUnreadThreshold,
945
1013
  selectedPicker: selectedPicker,
1014
+ setChannelUnreadState: setChannelUnreadState,
946
1015
  setMessages: setMessages,
947
1016
  setSelectedPicker: setSelectedPicker,
948
1017
  setTargetedMessage: setTargetedMessage,