stream-chat-react-native-core 6.7.0 → 6.7.1-beta.1

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,57 @@ 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
+ console.log(mainChannelUpdated, shouldMarkRead());
312
+ if (!(scrollToBottomButtonVisible || channelUnreadState != null && channelUnreadState.first_unread_message_id)) {
313
+ _context.next = 6;
314
+ break;
315
+ }
316
+ setChannelUnreadState(function (prev) {
317
+ var _prev$unread_messages, _prev$last_read;
318
+ var previousUnreadCount = (_prev$unread_messages = prev == null ? void 0 : prev.unread_messages) != null ? _prev$unread_messages : 0;
319
+ var previousLastMessage = getPreviousLastMessage(channel.state.messages, event.message);
320
+ return Object.assign({}, prev || {}, {
321
+ 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),
322
+ unread_messages: previousUnreadCount + 1
323
+ });
324
+ });
325
+ _context.next = 10;
326
+ break;
327
+ case 6:
328
+ if (!(mainChannelUpdated && shouldMarkRead())) {
329
+ _context.next = 10;
330
+ break;
331
+ }
332
+ console.log('marking read');
333
+ _context.next = 10;
334
+ return markRead();
335
+ case 10:
336
+ case "end":
337
+ return _context.stop();
338
+ }
339
+ }, _callee);
340
+ }));
341
+ return function handleEvent(_x) {
342
+ return _ref3.apply(this, arguments);
343
+ };
344
+ }();
345
+ var listener = channel.on('message.new', handleEvent);
282
346
  return function () {
283
347
  listener == null || listener.unsubscribe();
284
348
  };
285
- }, [channel, markRead, scrollToBottomButtonVisible]);
349
+ }, [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
350
  (0, _react.useEffect)(function () {
287
351
  var lastReceivedMessage = (0, _getLastReceivedMessage.getLastReceivedMessage)(processedMessageList);
288
352
  setLastReceivedId(lastReceivedMessage == null ? void 0 : lastReceivedMessage.id);
@@ -305,6 +369,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
305
369
  setTimeout(function () {
306
370
  channelResyncScrollSet.current = true;
307
371
  if (channel.countUnread() > 0) {
372
+ console.log('marking read');
308
373
  markRead();
309
374
  }
310
375
  }, 500);
@@ -354,31 +419,31 @@ var MessageListWithContext = function MessageListWithContext(props) {
354
419
  }
355
420
  }, [channel, rawMessageList, threadList]);
356
421
  var goToMessage = function () {
357
- var _ref3 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee(messageId) {
422
+ var _ref4 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee2(messageId) {
358
423
  var indexOfParentInMessageList;
359
- return _regenerator["default"].wrap(function _callee$(_context) {
360
- while (1) switch (_context.prev = _context.next) {
424
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
425
+ while (1) switch (_context2.prev = _context2.next) {
361
426
  case 0:
362
427
  indexOfParentInMessageList = processedMessageList.findIndex(function (message) {
363
428
  return (message == null ? void 0 : message.id) === messageId;
364
429
  });
365
- _context.prev = 1;
430
+ _context2.prev = 1;
366
431
  if (!(indexOfParentInMessageList === -1)) {
367
- _context.next = 8;
432
+ _context2.next = 8;
368
433
  break;
369
434
  }
370
- _context.next = 5;
435
+ _context2.next = 5;
371
436
  return loadChannelAroundMessage({
372
437
  messageId: messageId
373
438
  });
374
439
  case 5:
375
- return _context.abrupt("return");
440
+ return _context2.abrupt("return");
376
441
  case 8:
377
442
  if (flatListRef.current) {
378
- _context.next = 10;
443
+ _context2.next = 10;
379
444
  break;
380
445
  }
381
- return _context.abrupt("return");
446
+ return _context2.abrupt("return");
382
447
  case 10:
383
448
  clearTimeout(failScrollTimeoutId.current);
384
449
  scrollToIndexFailedRetryCountRef.current = 0;
@@ -389,54 +454,54 @@ var MessageListWithContext = function MessageListWithContext(props) {
389
454
  index: indexOfParentInMessageList,
390
455
  viewPosition: 0.5
391
456
  });
392
- return _context.abrupt("return");
457
+ return _context2.abrupt("return");
393
458
  case 16:
394
- _context.next = 21;
459
+ _context2.next = 21;
395
460
  break;
396
461
  case 18:
397
- _context.prev = 18;
398
- _context.t0 = _context["catch"](1);
399
- console.warn('Error while scrolling to message', _context.t0);
462
+ _context2.prev = 18;
463
+ _context2.t0 = _context2["catch"](1);
464
+ console.warn('Error while scrolling to message', _context2.t0);
400
465
  case 21:
401
466
  case "end":
402
- return _context.stop();
467
+ return _context2.stop();
403
468
  }
404
- }, _callee, null, [[1, 18]]);
469
+ }, _callee2, null, [[1, 18]]);
405
470
  }));
406
- return function goToMessage(_x) {
407
- return _ref3.apply(this, arguments);
471
+ return function goToMessage(_x2) {
472
+ return _ref4.apply(this, arguments);
408
473
  };
409
474
  }();
410
475
  (0, _react.useEffect)(function () {
411
476
  if (!targetedMessage) {
412
477
  return;
413
478
  }
414
- scrollToDebounceTimeoutRef.current = setTimeout((0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee2() {
479
+ scrollToDebounceTimeoutRef.current = setTimeout((0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee3() {
415
480
  var indexOfParentInMessageList;
416
- return _regenerator["default"].wrap(function _callee2$(_context2) {
417
- while (1) switch (_context2.prev = _context2.next) {
481
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
482
+ while (1) switch (_context3.prev = _context3.next) {
418
483
  case 0:
419
484
  indexOfParentInMessageList = processedMessageList.findIndex(function (message) {
420
485
  return (message == null ? void 0 : message.id) === targetedMessage;
421
486
  });
422
487
  if (!(indexOfParentInMessageList === -1)) {
423
- _context2.next = 6;
488
+ _context3.next = 6;
424
489
  break;
425
490
  }
426
- _context2.next = 4;
491
+ _context3.next = 4;
427
492
  return loadChannelAroundMessage({
428
493
  messageId: targetedMessage,
429
494
  setTargetedMessage: setTargetedMessage
430
495
  });
431
496
  case 4:
432
- _context2.next = 13;
497
+ _context3.next = 13;
433
498
  break;
434
499
  case 6:
435
500
  if (flatListRef.current) {
436
- _context2.next = 8;
501
+ _context3.next = 8;
437
502
  break;
438
503
  }
439
- return _context2.abrupt("return");
504
+ return _context3.abrupt("return");
440
505
  case 8:
441
506
  clearTimeout(scrollToDebounceTimeoutRef.current);
442
507
  clearTimeout(failScrollTimeoutId.current);
@@ -449,16 +514,16 @@ var MessageListWithContext = function MessageListWithContext(props) {
449
514
  setTargetedMessage(undefined);
450
515
  case 13:
451
516
  case "end":
452
- return _context2.stop();
517
+ return _context3.stop();
453
518
  }
454
- }, _callee2);
519
+ }, _callee3);
455
520
  })), WAIT_FOR_SCROLL_TIMEOUT);
456
521
  }, [targetedMessage]);
457
522
  var shouldApplyAndroidWorkaround = inverted && _reactNative.Platform.OS === 'android';
458
- var renderItem = function renderItem(_ref5) {
523
+ var renderItem = function renderItem(_ref6) {
459
524
  var _message$user;
460
- var index = _ref5.index,
461
- message = _ref5.item;
525
+ var index = _ref6.index,
526
+ message = _ref6.item;
462
527
  if (!channel || channel.disconnected || !channel.initialized && !channel.offlineMode) {
463
528
  return null;
464
529
  }
@@ -504,16 +569,16 @@ var MessageListWithContext = function MessageListWithContext(props) {
504
569
  });
505
570
  };
506
571
  var maybeCallOnStartReached = function () {
507
- var _ref6 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee3() {
572
+ var _ref7 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee4() {
508
573
  var callback, onError;
509
- return _regenerator["default"].wrap(function _callee3$(_context3) {
510
- while (1) switch (_context3.prev = _context3.next) {
574
+ return _regenerator["default"].wrap(function _callee4$(_context4) {
575
+ while (1) switch (_context4.prev = _context4.next) {
511
576
  case 0:
512
577
  if (!(processedMessageList != null && processedMessageList.length && onStartReachedTracker.current[processedMessageList.length])) {
513
- _context3.next = 2;
578
+ _context4.next = 2;
514
579
  break;
515
580
  }
516
- return _context3.abrupt("return");
581
+ return _context4.abrupt("return");
517
582
  case 2:
518
583
  if (processedMessageList != null && processedMessageList.length) {
519
584
  onStartReachedTracker.current[processedMessageList.length] = true;
@@ -528,34 +593,34 @@ var MessageListWithContext = function MessageListWithContext(props) {
528
593
  }, 2000);
529
594
  };
530
595
  if (!onEndReachedInPromise.current) {
531
- _context3.next = 8;
596
+ _context4.next = 8;
532
597
  break;
533
598
  }
534
- _context3.next = 8;
599
+ _context4.next = 8;
535
600
  return onEndReachedInPromise.current;
536
601
  case 8:
537
602
  onStartReachedInPromise.current = (threadList && !!threadInstance && loadMoreRecentThread ? loadMoreRecentThread({}) : loadMoreRecent()).then(callback)["catch"](onError);
538
603
  case 9:
539
604
  case "end":
540
- return _context3.stop();
605
+ return _context4.stop();
541
606
  }
542
- }, _callee3);
607
+ }, _callee4);
543
608
  }));
544
609
  return function maybeCallOnStartReached() {
545
- return _ref6.apply(this, arguments);
610
+ return _ref7.apply(this, arguments);
546
611
  };
547
612
  }();
548
613
  var maybeCallOnEndReached = function () {
549
- var _ref7 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee4() {
614
+ var _ref8 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee5() {
550
615
  var callback, onError;
551
- return _regenerator["default"].wrap(function _callee4$(_context4) {
552
- while (1) switch (_context4.prev = _context4.next) {
616
+ return _regenerator["default"].wrap(function _callee5$(_context5) {
617
+ while (1) switch (_context5.prev = _context5.next) {
553
618
  case 0:
554
619
  if (!(processedMessageList != null && processedMessageList.length && onEndReachedTracker.current[processedMessageList.length])) {
555
- _context4.next = 2;
620
+ _context5.next = 2;
556
621
  break;
557
622
  }
558
- return _context4.abrupt("return");
623
+ return _context5.abrupt("return");
559
624
  case 2:
560
625
  if (processedMessageList != null && processedMessageList.length) {
561
626
  onEndReachedTracker.current[processedMessageList.length] = true;
@@ -570,21 +635,21 @@ var MessageListWithContext = function MessageListWithContext(props) {
570
635
  }, 2000);
571
636
  };
572
637
  if (!onStartReachedInPromise.current) {
573
- _context4.next = 8;
638
+ _context5.next = 8;
574
639
  break;
575
640
  }
576
- _context4.next = 8;
641
+ _context5.next = 8;
577
642
  return onStartReachedInPromise.current;
578
643
  case 8:
579
644
  onEndReachedInPromise.current = (threadList ? loadMoreThread() : loadMore()).then(callback)["catch"](onError);
580
645
  case 9:
581
646
  case "end":
582
- return _context4.stop();
647
+ return _context5.stop();
583
648
  }
584
- }, _callee4);
649
+ }, _callee5);
585
650
  }));
586
651
  return function maybeCallOnEndReached() {
587
- return _ref7.apply(this, arguments);
652
+ return _ref8.apply(this, arguments);
588
653
  };
589
654
  }();
590
655
  var onUserScrollEvent = function onUserScrollEvent(event) {
@@ -617,21 +682,21 @@ var MessageListWithContext = function MessageListWithContext(props) {
617
682
  }
618
683
  };
619
684
  var goToNewMessages = function () {
620
- var _ref8 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee5() {
685
+ var _ref9 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee6() {
621
686
  var isNotLatestSet;
622
- return _regenerator["default"].wrap(function _callee5$(_context5) {
623
- while (1) switch (_context5.prev = _context5.next) {
687
+ return _regenerator["default"].wrap(function _callee6$(_context6) {
688
+ while (1) switch (_context6.prev = _context6.next) {
624
689
  case 0:
625
690
  isNotLatestSet = channel.state.messages !== channel.state.latestMessages;
626
691
  if (!isNotLatestSet) {
627
- _context5.next = 7;
692
+ _context6.next = 7;
628
693
  break;
629
694
  }
630
695
  resetPaginationTrackersRef.current();
631
- _context5.next = 5;
696
+ _context6.next = 5;
632
697
  return reloadChannel();
633
698
  case 5:
634
- _context5.next = 8;
699
+ _context6.next = 8;
635
700
  break;
636
701
  case 7:
637
702
  if (flatListRef.current) {
@@ -642,14 +707,18 @@ var MessageListWithContext = function MessageListWithContext(props) {
642
707
  }
643
708
  case 8:
644
709
  setScrollToBottomButtonVisible(false);
645
- case 9:
710
+ _context6.next = 11;
711
+ return markRead({
712
+ updateChannelUnreadState: false
713
+ });
714
+ case 11:
646
715
  case "end":
647
- return _context5.stop();
716
+ return _context6.stop();
648
717
  }
649
- }, _callee5);
718
+ }, _callee6);
650
719
  }));
651
720
  return function goToNewMessages() {
652
- return _ref8.apply(this, arguments);
721
+ return _ref9.apply(this, arguments);
653
722
  };
654
723
  }();
655
724
  var scrollToIndexFailedRetryCountRef = (0, _react.useRef)(0);
@@ -723,22 +792,22 @@ var MessageListWithContext = function MessageListWithContext(props) {
723
792
  }
724
793
  };
725
794
  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) {
795
+ var _ref10 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee7() {
796
+ return _regenerator["default"].wrap(function _callee7$(_context7) {
797
+ while (1) switch (_context7.prev = _context7.next) {
729
798
  case 0:
730
- _context6.next = 2;
799
+ _context7.next = 2;
731
800
  return markRead();
732
801
  case 2:
733
802
  setIsUnreadNotificationOpen(false);
734
803
  case 3:
735
804
  case "end":
736
- return _context6.stop();
805
+ return _context7.stop();
737
806
  }
738
- }, _callee6);
807
+ }, _callee7);
739
808
  }));
740
809
  return function onUnreadNotificationClose() {
741
- return _ref9.apply(this, arguments);
810
+ return _ref10.apply(this, arguments);
742
811
  };
743
812
  }();
744
813
  var debugRef = (0, _DebugContext.useDebugContext)();
@@ -875,6 +944,7 @@ var MessageList = exports.MessageList = function MessageList(props) {
875
944
  NetworkDownIndicator = _useChannelContext.NetworkDownIndicator,
876
945
  reloadChannel = _useChannelContext.reloadChannel,
877
946
  scrollToFirstUnreadThreshold = _useChannelContext.scrollToFirstUnreadThreshold,
947
+ setChannelUnreadState = _useChannelContext.setChannelUnreadState,
878
948
  setTargetedMessage = _useChannelContext.setTargetedMessage,
879
949
  StickyHeader = _useChannelContext.StickyHeader,
880
950
  targetedMessage = _useChannelContext.targetedMessage,
@@ -943,6 +1013,7 @@ var MessageList = exports.MessageList = function MessageList(props) {
943
1013
  ScrollToBottomButton: ScrollToBottomButton,
944
1014
  scrollToFirstUnreadThreshold: scrollToFirstUnreadThreshold,
945
1015
  selectedPicker: selectedPicker,
1016
+ setChannelUnreadState: setChannelUnreadState,
946
1017
  setMessages: setMessages,
947
1018
  setSelectedPicker: setSelectedPicker,
948
1019
  setTargetedMessage: setTargetedMessage,