stream-chat-react-native-core 3.8.3-next.1 → 3.9.0-next.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.
Files changed (80) hide show
  1. package/lib/commonjs/components/Attachment/Gallery.js +21 -9
  2. package/lib/commonjs/components/Attachment/Gallery.js.map +1 -1
  3. package/lib/commonjs/components/Channel/Channel.js +52 -30
  4. package/lib/commonjs/components/Channel/Channel.js.map +1 -1
  5. package/lib/commonjs/components/Channel/hooks/useCreateChannelContext.js +4 -0
  6. package/lib/commonjs/components/Channel/hooks/useCreateChannelContext.js.map +1 -1
  7. package/lib/commonjs/components/Channel/hooks/useCreateMessagesContext.js +4 -0
  8. package/lib/commonjs/components/Channel/hooks/useCreateMessagesContext.js.map +1 -1
  9. package/lib/commonjs/components/Message/MessageSimple/MessageSimple.js +9 -6
  10. package/lib/commonjs/components/Message/MessageSimple/MessageSimple.js.map +1 -1
  11. package/lib/commonjs/components/MessageInput/FileUploadPreview.js +28 -23
  12. package/lib/commonjs/components/MessageInput/FileUploadPreview.js.map +1 -1
  13. package/lib/commonjs/components/MessageList/MessageList.js +40 -31
  14. package/lib/commonjs/components/MessageList/MessageList.js.map +1 -1
  15. package/lib/commonjs/components/MessageList/hooks/useMessageList.js +1 -1
  16. package/lib/commonjs/components/MessageList/hooks/useMessageList.js.map +1 -1
  17. package/lib/commonjs/components/MessageList/utils/getGroupStyles.js +1 -5
  18. package/lib/commonjs/components/MessageList/utils/getGroupStyles.js.map +1 -1
  19. package/lib/commonjs/contexts/channelContext/ChannelContext.js +2 -2
  20. package/lib/commonjs/contexts/channelContext/ChannelContext.js.map +1 -1
  21. package/lib/commonjs/contexts/messagesContext/MessagesContext.js +2 -2
  22. package/lib/commonjs/contexts/messagesContext/MessagesContext.js.map +1 -1
  23. package/lib/commonjs/version.json +1 -1
  24. package/lib/module/components/Attachment/Gallery.js +21 -9
  25. package/lib/module/components/Attachment/Gallery.js.map +1 -1
  26. package/lib/module/components/Channel/Channel.js +52 -30
  27. package/lib/module/components/Channel/Channel.js.map +1 -1
  28. package/lib/module/components/Channel/hooks/useCreateChannelContext.js +4 -0
  29. package/lib/module/components/Channel/hooks/useCreateChannelContext.js.map +1 -1
  30. package/lib/module/components/Channel/hooks/useCreateMessagesContext.js +4 -0
  31. package/lib/module/components/Channel/hooks/useCreateMessagesContext.js.map +1 -1
  32. package/lib/module/components/Message/MessageSimple/MessageSimple.js +9 -6
  33. package/lib/module/components/Message/MessageSimple/MessageSimple.js.map +1 -1
  34. package/lib/module/components/MessageInput/FileUploadPreview.js +28 -23
  35. package/lib/module/components/MessageInput/FileUploadPreview.js.map +1 -1
  36. package/lib/module/components/MessageList/MessageList.js +40 -31
  37. package/lib/module/components/MessageList/MessageList.js.map +1 -1
  38. package/lib/module/components/MessageList/hooks/useMessageList.js +1 -1
  39. package/lib/module/components/MessageList/hooks/useMessageList.js.map +1 -1
  40. package/lib/module/components/MessageList/utils/getGroupStyles.js +1 -5
  41. package/lib/module/components/MessageList/utils/getGroupStyles.js.map +1 -1
  42. package/lib/module/contexts/channelContext/ChannelContext.js +2 -2
  43. package/lib/module/contexts/channelContext/ChannelContext.js.map +1 -1
  44. package/lib/module/contexts/messagesContext/MessagesContext.js +2 -2
  45. package/lib/module/contexts/messagesContext/MessagesContext.js.map +1 -1
  46. package/lib/module/version.json +1 -1
  47. package/lib/typescript/components/Attachment/Gallery.d.ts +1 -1
  48. package/lib/typescript/components/Channel/Channel.d.ts +3 -1
  49. package/lib/typescript/components/Channel/hooks/useCreateChannelContext.d.ts +1 -1
  50. package/lib/typescript/components/Channel/hooks/useCreateMessagesContext.d.ts +4 -2
  51. package/lib/typescript/components/Message/MessageSimple/MessageSimple.d.ts +1 -1
  52. package/lib/typescript/components/MessageList/MessageList.d.ts +1 -1
  53. package/lib/typescript/contexts/channelContext/ChannelContext.d.ts +3 -1
  54. package/lib/typescript/contexts/messagesContext/MessagesContext.d.ts +3 -1
  55. package/package.json +1 -1
  56. package/src/components/Attachment/Gallery.tsx +20 -5
  57. package/src/components/Channel/Channel.tsx +124 -67
  58. package/src/components/Channel/hooks/useCreateChannelContext.ts +4 -0
  59. package/src/components/Channel/hooks/useCreateMessagesContext.ts +4 -0
  60. package/src/components/Message/MessageSimple/MessageSimple.tsx +9 -3
  61. package/src/components/MessageInput/FileUploadPreview.tsx +68 -58
  62. package/src/components/MessageInput/__tests__/__snapshots__/FileUploadPreview.test.js.snap +778 -730
  63. package/src/components/MessageList/MessageList.tsx +52 -27
  64. package/src/components/MessageList/hooks/useMessageList.ts +1 -1
  65. package/src/components/MessageList/utils/getGroupStyles.ts +3 -8
  66. package/src/contexts/channelContext/ChannelContext.tsx +2 -0
  67. package/src/contexts/messagesContext/MessagesContext.tsx +2 -0
  68. package/src/version.json +1 -1
  69. package/lib/commonjs/components/Channel/utils/debounce.js +0 -20
  70. package/lib/commonjs/components/Channel/utils/debounce.js.map +0 -1
  71. package/lib/commonjs/components/Channel/utils/throttle.js +0 -20
  72. package/lib/commonjs/components/Channel/utils/throttle.js.map +0 -1
  73. package/lib/module/components/Channel/utils/debounce.js +0 -20
  74. package/lib/module/components/Channel/utils/debounce.js.map +0 -1
  75. package/lib/module/components/Channel/utils/throttle.js +0 -20
  76. package/lib/module/components/Channel/utils/throttle.js.map +0 -1
  77. package/lib/typescript/components/Channel/utils/debounce.d.ts +0 -2
  78. package/lib/typescript/components/Channel/utils/throttle.d.ts +0 -2
  79. package/src/components/Channel/utils/debounce.ts +0 -12
  80. package/src/components/Channel/utils/throttle.ts +0 -12
@@ -112,11 +112,13 @@ var MessageListWithContext = function MessageListWithContext(props) {
112
112
  FooterComponent = _props$FooterComponen === void 0 ? LoadingMoreIndicator : _props$FooterComponen,
113
113
  _props$HeaderComponen = props.HeaderComponent,
114
114
  HeaderComponent = _props$HeaderComponen === void 0 ? _InlineLoadingMoreRecentIndicator.InlineLoadingMoreRecentIndicator : _props$HeaderComponen,
115
+ hideStickyDateHeader = props.hideStickyDateHeader,
115
116
  initialScrollToFirstUnreadMessage = props.initialScrollToFirstUnreadMessage,
116
117
  InlineDateSeparator = props.InlineDateSeparator,
117
118
  InlineUnreadIndicator = props.InlineUnreadIndicator,
118
119
  _props$inverted = props.inverted,
119
120
  inverted = _props$inverted === void 0 ? true : _props$inverted,
121
+ legacyImageViewerSwipeBehaviour = props.legacyImageViewerSwipeBehaviour,
120
122
  loadChannelAtMessage = props.loadChannelAtMessage,
121
123
  loading = props.loading,
122
124
  LoadingIndicator = props.LoadingIndicator,
@@ -254,7 +256,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
254
256
  var onViewableItemsChanged = (0, _react.useRef)(function (_ref) {
255
257
  var viewableItems = _ref.viewableItems;
256
258
 
257
- if (viewableItems) {
259
+ if (viewableItems && !hideStickyDateHeader) {
258
260
  updateStickyHeaderDateIfNeeded(viewableItems);
259
261
  }
260
262
 
@@ -353,14 +355,14 @@ var MessageListWithContext = function MessageListWithContext(props) {
353
355
  __self: _this,
354
356
  __source: {
355
357
  fileName: _jsxFileName,
356
- lineNumber: 541,
358
+ lineNumber: 545,
357
359
  columnNumber: 11
358
360
  }
359
361
  }), insertInlineUnreadIndicator && _react["default"].createElement(InlineUnreadIndicator, {
360
362
  __self: _this,
361
363
  __source: {
362
364
  fileName: _jsxFileName,
363
- lineNumber: 542,
365
+ lineNumber: 546,
364
366
  columnNumber: 43
365
367
  }
366
368
  }));
@@ -372,7 +374,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
372
374
  __self: _this,
373
375
  __source: {
374
376
  fileName: _jsxFileName,
375
- lineNumber: 550,
377
+ lineNumber: 554,
376
378
  columnNumber: 9
377
379
  }
378
380
  }, _react["default"].createElement(Message, {
@@ -388,7 +390,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
388
390
  __self: _this,
389
391
  __source: {
390
392
  fileName: _jsxFileName,
391
- lineNumber: 551,
393
+ lineNumber: 555,
392
394
  columnNumber: 11
393
395
  }
394
396
  })), (0, _useMessageList.isMessageWithStylesReadByAndDateSeparator)(message) && message.dateSeparator && _react["default"].createElement(InlineDateSeparator, {
@@ -396,14 +398,14 @@ var MessageListWithContext = function MessageListWithContext(props) {
396
398
  __self: _this,
397
399
  __source: {
398
400
  fileName: _jsxFileName,
399
- lineNumber: 566,
401
+ lineNumber: 570,
400
402
  columnNumber: 11
401
403
  }
402
404
  }), insertInlineUnreadIndicator && _react["default"].createElement(InlineUnreadIndicator, {
403
405
  __self: _this,
404
406
  __source: {
405
407
  fileName: _jsxFileName,
406
- lineNumber: 569,
408
+ lineNumber: 573,
407
409
  columnNumber: 41
408
410
  }
409
411
  })) : _react["default"].createElement(_react["default"].Fragment, null, _react["default"].createElement(Message, {
@@ -419,7 +421,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
419
421
  __self: _this,
420
422
  __source: {
421
423
  fileName: _jsxFileName,
422
- lineNumber: 573,
424
+ lineNumber: 577,
423
425
  columnNumber: 9
424
426
  }
425
427
  }), (0, _useMessageList.isMessageWithStylesReadByAndDateSeparator)(message) && message.dateSeparator && _react["default"].createElement(InlineDateSeparator, {
@@ -427,14 +429,14 @@ var MessageListWithContext = function MessageListWithContext(props) {
427
429
  __self: _this,
428
430
  __source: {
429
431
  fileName: _jsxFileName,
430
- lineNumber: 589,
432
+ lineNumber: 593,
431
433
  columnNumber: 11
432
434
  }
433
435
  }), insertInlineUnreadIndicator && _react["default"].createElement(InlineUnreadIndicator, {
434
436
  __self: _this,
435
437
  __source: {
436
438
  fileName: _jsxFileName,
437
- lineNumber: 592,
439
+ lineNumber: 596,
438
440
  columnNumber: 41
439
441
  }
440
442
  }));
@@ -605,7 +607,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
605
607
  });
606
608
  resetPaginationTrackers();
607
609
  }, [messageListLengthAfterUpdate]);
608
- var messagesWithImages = messageList.filter(function (message) {
610
+ var messagesWithImages = legacyImageViewerSwipeBehaviour && messageList.filter(function (message) {
609
611
  if (!message.deleted_at && message.attachments) {
610
612
  return message.attachments.some(function (attachment) {
611
613
  return attachment.type === 'image' && !attachment.title_link && !attachment.og_scrape_url && (attachment.image_url || attachment.thumb_url);
@@ -614,23 +616,23 @@ var MessageListWithContext = function MessageListWithContext(props) {
614
616
 
615
617
  return false;
616
618
  });
617
- var imageString = messagesWithImages.map(function (message) {
619
+ var imageString = legacyImageViewerSwipeBehaviour && messagesWithImages && messagesWithImages.map(function (message) {
618
620
  var _message$attachments;
619
621
 
620
622
  return (_message$attachments = message.attachments) == null ? void 0 : _message$attachments.map(function (attachment) {
621
623
  return attachment.image_url || attachment.thumb_url || '';
622
624
  }).join();
623
625
  }).join();
624
- var numberOfMessagesWithImages = messagesWithImages.length;
626
+ var numberOfMessagesWithImages = legacyImageViewerSwipeBehaviour && messagesWithImages && messagesWithImages.length;
625
627
  var threadExists = !!thread;
626
628
  (0, _react.useEffect)(function () {
627
- if (threadList && thread || !threadList && !thread) {
629
+ if (legacyImageViewerSwipeBehaviour && (threadList && thread || !threadList && !thread)) {
628
630
  setImages(messagesWithImages);
629
631
  }
630
- }, [imageString, numberOfMessagesWithImages, threadExists, threadList]);
632
+ }, [imageString, legacyImageViewerSwipeBehaviour, numberOfMessagesWithImages, threadExists, threadList]);
631
633
  var stickyHeaderFormatDate = (stickyHeaderDate == null ? void 0 : stickyHeaderDate.getFullYear()) === new Date().getFullYear() ? 'MMM D' : 'MMM D, YYYY';
632
- var tStickyHeaderDate = stickyHeaderDate ? tDateTimeParser(stickyHeaderDate) : null;
633
- var stickyHeaderDateToRender = tStickyHeaderDate === null ? null : (0, _TranslationContext.isDayOrMoment)(tStickyHeaderDate) ? tStickyHeaderDate.format(stickyHeaderFormatDate) : new Date(tStickyHeaderDate).toDateString();
634
+ var tStickyHeaderDate = stickyHeaderDate && !hideStickyDateHeader ? tDateTimeParser(stickyHeaderDate) : null;
635
+ var stickyHeaderDateToRender = tStickyHeaderDate === null || hideStickyDateHeader ? null : (0, _TranslationContext.isDayOrMoment)(tStickyHeaderDate) ? tStickyHeaderDate.format(stickyHeaderFormatDate) : new Date(tStickyHeaderDate).toDateString();
634
636
 
635
637
  var dismissImagePicker = function dismissImagePicker() {
636
638
  if (!hasMoved && selectedPicker) {
@@ -662,7 +664,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
662
664
  __self: _this,
663
665
  __source: {
664
666
  fileName: _jsxFileName,
665
- lineNumber: 848,
667
+ lineNumber: 866,
666
668
  columnNumber: 5
667
669
  }
668
670
  }, _react["default"].createElement(EmptyStateIndicator, {
@@ -670,7 +672,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
670
672
  __self: _this,
671
673
  __source: {
672
674
  fileName: _jsxFileName,
673
- lineNumber: 849,
675
+ lineNumber: 867,
674
676
  columnNumber: 7
675
677
  }
676
678
  }));
@@ -684,7 +686,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
684
686
  __self: _this,
685
687
  __source: {
686
688
  fileName: _jsxFileName,
687
- lineNumber: 857,
689
+ lineNumber: 875,
688
690
  columnNumber: 7
689
691
  }
690
692
  }, _react["default"].createElement(LoadingIndicator, {
@@ -692,7 +694,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
692
694
  __self: _this,
693
695
  __source: {
694
696
  fileName: _jsxFileName,
695
- lineNumber: 858,
697
+ lineNumber: 876,
696
698
  columnNumber: 9
697
699
  }
698
700
  }));
@@ -705,7 +707,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
705
707
  __self: _this,
706
708
  __source: {
707
709
  fileName: _jsxFileName,
708
- lineNumber: 864,
710
+ lineNumber: 882,
709
711
  columnNumber: 5
710
712
  }
711
713
  }, _react["default"].createElement(FlatList, (0, _extends2["default"])({
@@ -737,7 +739,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
737
739
  __self: _this,
738
740
  __source: {
739
741
  fileName: _jsxFileName,
740
- lineNumber: 865,
742
+ lineNumber: 883,
741
743
  columnNumber: 7
742
744
  }
743
745
  })), !loading && _react["default"].createElement(_react["default"].Fragment, null, _react["default"].createElement(_reactNative.View, {
@@ -745,7 +747,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
745
747
  __self: _this,
746
748
  __source: {
747
749
  fileName: _jsxFileName,
748
- lineNumber: 895,
750
+ lineNumber: 913,
749
751
  columnNumber: 11
750
752
  }
751
753
  }, stickyHeaderDateToRender && (StickyHeader ? _react["default"].createElement(StickyHeader, {
@@ -753,7 +755,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
753
755
  __self: _this,
754
756
  __source: {
755
757
  fileName: _jsxFileName,
756
- lineNumber: 898,
758
+ lineNumber: 916,
757
759
  columnNumber: 17
758
760
  }
759
761
  }) : messageListLengthAfterUpdate ? _react["default"].createElement(DateHeader, {
@@ -761,21 +763,21 @@ var MessageListWithContext = function MessageListWithContext(props) {
761
763
  __self: _this,
762
764
  __source: {
763
765
  fileName: _jsxFileName,
764
- lineNumber: 900,
766
+ lineNumber: 918,
765
767
  columnNumber: 17
766
768
  }
767
769
  }) : null)), !disableTypingIndicator && TypingIndicator && typingEventsEnabled !== false && _react["default"].createElement(TypingIndicatorContainer, {
768
770
  __self: _this,
769
771
  __source: {
770
772
  fileName: _jsxFileName,
771
- lineNumber: 904,
773
+ lineNumber: 922,
772
774
  columnNumber: 13
773
775
  }
774
776
  }, _react["default"].createElement(TypingIndicator, {
775
777
  __self: _this,
776
778
  __source: {
777
779
  fileName: _jsxFileName,
778
- lineNumber: 905,
780
+ lineNumber: 923,
779
781
  columnNumber: 15
780
782
  }
781
783
  })), _react["default"].createElement(ScrollToBottomButton, {
@@ -785,14 +787,14 @@ var MessageListWithContext = function MessageListWithContext(props) {
785
787
  __self: _this,
786
788
  __source: {
787
789
  fileName: _jsxFileName,
788
- lineNumber: 908,
790
+ lineNumber: 926,
789
791
  columnNumber: 11
790
792
  }
791
793
  })), _react["default"].createElement(NetworkDownIndicator, {
792
794
  __self: _this,
793
795
  __source: {
794
796
  fileName: _jsxFileName,
795
- lineNumber: 915,
797
+ lineNumber: 933,
796
798
  columnNumber: 7
797
799
  }
798
800
  }));
@@ -808,7 +810,9 @@ var MessageList = function MessageList(props) {
808
810
  channel = _useChannelContext.channel,
809
811
  disabled = _useChannelContext.disabled,
810
812
  EmptyStateIndicator = _useChannelContext.EmptyStateIndicator,
813
+ enableMessageGroupingByUser = _useChannelContext.enableMessageGroupingByUser,
811
814
  error = _useChannelContext.error,
815
+ hideStickyDateHeader = _useChannelContext.hideStickyDateHeader,
812
816
  loadChannelAtMessage = _useChannelContext.loadChannelAtMessage,
813
817
  loading = _useChannelContext.loading,
814
818
  LoadingIndicator = _useChannelContext.LoadingIndicator,
@@ -834,6 +838,7 @@ var MessageList = function MessageList(props) {
834
838
  initialScrollToFirstUnreadMessage = _useMessagesContext.initialScrollToFirstUnreadMessage,
835
839
  InlineDateSeparator = _useMessagesContext.InlineDateSeparator,
836
840
  InlineUnreadIndicator = _useMessagesContext.InlineUnreadIndicator,
841
+ legacyImageViewerSwipeBehaviour = _useMessagesContext.legacyImageViewerSwipeBehaviour,
837
842
  Message = _useMessagesContext.Message,
838
843
  MessageSystem = _useMessagesContext.MessageSystem,
839
844
  myMessageTheme = _useMessagesContext.myMessageTheme,
@@ -864,11 +869,14 @@ var MessageList = function MessageList(props) {
864
869
  disabled: disabled,
865
870
  disableTypingIndicator: disableTypingIndicator,
866
871
  EmptyStateIndicator: EmptyStateIndicator,
872
+ enableMessageGroupingByUser: enableMessageGroupingByUser,
867
873
  error: error,
868
874
  FlatList: FlatList,
875
+ hideStickyDateHeader: hideStickyDateHeader,
869
876
  initialScrollToFirstUnreadMessage: initialScrollToFirstUnreadMessage,
870
877
  InlineDateSeparator: InlineDateSeparator,
871
878
  InlineUnreadIndicator: InlineUnreadIndicator,
879
+ legacyImageViewerSwipeBehaviour: legacyImageViewerSwipeBehaviour,
872
880
  loadChannelAtMessage: loadChannelAtMessage,
873
881
  loading: loading,
874
882
  LoadingIndicator: LoadingIndicator,
@@ -897,10 +905,11 @@ var MessageList = function MessageList(props) {
897
905
  TypingIndicator: TypingIndicator,
898
906
  TypingIndicatorContainer: TypingIndicatorContainer
899
907
  }, props, {
908
+ noGroupByUser: !enableMessageGroupingByUser || props.noGroupByUser,
900
909
  __self: _this,
901
910
  __source: {
902
911
  fileName: _jsxFileName,
903
- lineNumber: 981,
912
+ lineNumber: 1002,
904
913
  columnNumber: 5
905
914
  }
906
915
  }));
@@ -1 +1 @@
1
- {"version":3,"sources":["MessageList.tsx"],"names":["styles","StyleSheet","create","container","alignItems","flex","width","contentContainer","flexGrow","paddingBottom","invert","transform","scaleY","listContainer","messagePadding","paddingHorizontal","stickyHeader","position","top","keyExtractor","item","id","created_at","toISOString","Date","now","toString","flatListViewabilityConfig","viewAreaCoveragePercentThreshold","MessageListWithContext","props","LoadingMoreIndicator","threadList","InlineLoadingMoreThreadIndicator","InlineLoadingMoreIndicator","additionalFlatListProps","channel","client","closePicker","DateHeader","disabled","disableTypingIndicator","EmptyStateIndicator","FlatList","FooterComponent","HeaderComponent","InlineLoadingMoreRecentIndicator","initialScrollToFirstUnreadMessage","InlineDateSeparator","InlineUnreadIndicator","inverted","loadChannelAtMessage","loading","LoadingIndicator","loadMore","loadMoreRecent","loadMoreThread","markRead","Message","MessageSystem","myMessageTheme","NetworkDownIndicator","noGroupByUser","onListScroll","onThreadSelect","overlay","reloadChannel","ScrollToBottomButton","scrollToFirstUnreadThreshold","selectedPicker","setFlatListRef","setImages","setSelectedPicker","setTargetedMessage","StickyHeader","targetedMessage","tDateTimeParser","thread","typingEventsEnabled","TypingIndicator","TypingIndicatorContainer","theme","white_snow","colors","messageList","modifiedTheme","style","messageListLengthBeforeUpdate","messageListLengthAfterUpdate","length","topMessageBeforeUpdate","topMessageAfterUpdate","autoscrollToTop","setAutoscrollToTop","onStartReachedTracker","onEndReachedTracker","onStartReachedInPromise","onEndReachedInPromise","flatListRef","initialScrollSet","channelResyncScrollSet","hasMoved","setHasMoved","lastReceivedId","setLastReceivedId","scrollToBottomButtonVisible","setScrollToBottomButtonVisible","stickyHeaderDate","setStickyHeaderDate","stickyHeaderDateRef","getLastReadSafely","initialized","lastRead","undefined","channelLastRead","isUnreadMessage","message","setInitialScrollIfNeeded","current","scrollToEnd","setTimeout","updateStickyHeaderDateIfNeeded","viewableItems","lastItem","pop","deleted_at","toDateString","onViewableItemsChanged","resetPaginationTrackers","countUnread","lastReceivedMessage","hasNewMessage","isMyMessage","user","userID","scrollToBottomIfNeeded","scrollToOffset","offset","state","isUpToDate","maybeCallOnStartReached","renderItem","index","lastMessage","showUnreadUnderlay","insertInlineUnreadIndicator","type","wrapMessageInTheme","goToMessage","groupStyles","dateSeparator","quoted_message_id","limit","callback","Promise","resolve","onError","then","maybeCallOnEndReached","handleScroll","event","nativeEvent","contentOffset","y","visibleLength","layoutMeasurement","height","contentLength","contentSize","isScrollAtStart","isScrollAtEnd","isScrollAtBottom","showScrollToBottomButton","shouldMarkRead","goToNewMessages","messageId","indexOfParentInMessageList","findIndex","scrollToIndex","viewPosition","_","messagesWithImages","filter","attachments","some","attachment","title_link","og_scrape_url","image_url","thumb_url","imageString","map","join","numberOfMessagesWithImages","threadExists","stickyHeaderFormatDate","getFullYear","tStickyHeaderDate","stickyHeaderDateToRender","format","dismissImagePicker","onScrollBeginDrag","onScrollEndDrag","refCallback","ref","renderListEmptyComponent","backgroundColor","autoscrollToTopThreshold","minIndexForVisible","MessageList","error","t"],"mappings":"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","sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n FlatListProps,\n FlatList as FlatListType,\n ScrollViewProps,\n StyleSheet,\n View,\n ViewToken,\n} from 'react-native';\n\nimport {\n isMessageWithStylesReadByAndDateSeparator,\n MessageType,\n useMessageList,\n} from './hooks/useMessageList';\nimport { InlineLoadingMoreIndicator } from './InlineLoadingMoreIndicator';\nimport { InlineLoadingMoreRecentIndicator } from './InlineLoadingMoreRecentIndicator';\nimport { InlineLoadingMoreThreadIndicator } from './InlineLoadingMoreThreadIndicator';\nimport { getLastReceivedMessage } from './utils/getLastReceivedMessage';\n\nimport {\n AttachmentPickerContextValue,\n useAttachmentPickerContext,\n} from '../../contexts/attachmentPickerContext/AttachmentPickerContext';\nimport {\n ChannelContextValue,\n useChannelContext,\n} from '../../contexts/channelContext/ChannelContext';\nimport { ChatContextValue, useChatContext } from '../../contexts/chatContext/ChatContext';\nimport {\n ImageGalleryContextValue,\n useImageGalleryContext,\n} from '../../contexts/imageGalleryContext/ImageGalleryContext';\nimport {\n MessagesContextValue,\n useMessagesContext,\n} from '../../contexts/messagesContext/MessagesContext';\nimport {\n OverlayContextValue,\n useOverlayContext,\n} from '../../contexts/overlayContext/OverlayContext';\nimport {\n PaginatedMessageListContextValue,\n usePaginatedMessageListContext,\n} from '../../contexts/paginatedMessageListContext/PaginatedMessageListContext';\nimport { ThreadContextValue, useThreadContext } from '../../contexts/threadContext/ThreadContext';\nimport { mergeThemes, ThemeProvider, useTheme } from '../../contexts/themeContext/ThemeContext';\nimport {\n isDayOrMoment,\n TranslationContextValue,\n useTranslationContext,\n} from '../../contexts/translationContext/TranslationContext';\n\nimport type { Channel as StreamChannel } from 'stream-chat';\n\nimport type {\n DefaultAttachmentType,\n DefaultChannelType,\n DefaultCommandType,\n DefaultEventType,\n DefaultMessageType,\n DefaultReactionType,\n DefaultUserType,\n UnknownType,\n} from '../../types/types';\n\nconst styles = StyleSheet.create({\n container: {\n alignItems: 'center',\n flex: 1,\n width: '100%',\n },\n contentContainer: {\n flexGrow: 1,\n /**\n * paddingBottom is set to 4 to account for the default date\n * header and inline indicator alignment. The top margin is 8\n * on the header but 4 on the inline date, this adjusts the spacing\n * to allow the \"first\" inline date to align with the date header.\n */\n paddingBottom: 4,\n },\n flex: { flex: 1 },\n invert: { transform: [{ scaleY: -1 }] },\n listContainer: {\n flex: 1,\n width: '100%',\n },\n messagePadding: {\n paddingHorizontal: 8,\n },\n stickyHeader: {\n position: 'absolute',\n top: 0,\n },\n});\n\nconst keyExtractor = <\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n>(\n item: MessageType<At, Ch, Co, Ev, Me, Re, Us>,\n) =>\n item.id ||\n (item.created_at\n ? typeof item.created_at === 'string'\n ? item.created_at\n : item.created_at.toISOString()\n : Date.now().toString());\n\nconst flatListViewabilityConfig = {\n viewAreaCoveragePercentThreshold: 1,\n};\n\ntype MessageListPropsWithContext<\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n> = Pick<AttachmentPickerContextValue, 'closePicker' | 'selectedPicker' | 'setSelectedPicker'> &\n Pick<\n ChannelContextValue<At, Ch, Co, Ev, Me, Re, Us>,\n | 'channel'\n | 'disabled'\n | 'EmptyStateIndicator'\n | 'loadChannelAtMessage'\n | 'loading'\n | 'LoadingIndicator'\n | 'markRead'\n | 'NetworkDownIndicator'\n | 'reloadChannel'\n | 'scrollToFirstUnreadThreshold'\n | 'setTargetedMessage'\n | 'StickyHeader'\n | 'targetedMessage'\n | 'typingEventsEnabled'\n > &\n Pick<ChatContextValue<At, Ch, Co, Ev, Me, Re, Us>, 'client'> &\n Pick<ImageGalleryContextValue<At, Ch, Co, Ev, Me, Re, Us>, 'setImages'> &\n Pick<\n PaginatedMessageListContextValue<At, Ch, Co, Ev, Me, Re, Us>,\n 'loadMore' | 'loadMoreRecent'\n > &\n Pick<OverlayContextValue, 'overlay'> &\n Pick<\n MessagesContextValue<At, Ch, Co, Ev, Me, Re, Us>,\n | 'DateHeader'\n | 'disableTypingIndicator'\n | 'FlatList'\n | 'initialScrollToFirstUnreadMessage'\n | 'InlineDateSeparator'\n | 'InlineUnreadIndicator'\n | 'Message'\n | 'ScrollToBottomButton'\n | 'MessageSystem'\n | 'myMessageTheme'\n | 'TypingIndicator'\n | 'TypingIndicatorContainer'\n > &\n Pick<ThreadContextValue<At, Ch, Co, Ev, Me, Re, Us>, 'loadMoreThread' | 'thread'> &\n Pick<TranslationContextValue, 't' | 'tDateTimeParser'> & {\n /**\n * Besides existing (default) UX behavior of underlying FlatList of MessageList component, if you want\n * to attach some additional props to underlying FlatList, you can add it to following prop.\n *\n * You can find list of all the available FlatList props here - https://facebook.github.io/react-native/docs/flatlist#props\n *\n * **NOTE** Don't use `additionalFlatListProps` to get access to ref of flatlist. Use `setFlatListRef` instead.\n *\n * e.g.\n * ```js\n * <MessageList\n * additionalFlatListProps={{ bounces: true, keyboardDismissMode: true }} />\n * ```\n */\n additionalFlatListProps?: Partial<FlatListProps<MessageType<At, Ch, Co, Ev, Me, Re, Us>>>;\n /**\n * UI component for footer of message list. By default message list will use `InlineLoadingMoreIndicator`\n * as FooterComponent. If you want to implement your own inline loading indicator, you can access `loadingMore`\n * from context.\n *\n * This is a [ListHeaderComponent](https://facebook.github.io/react-native/docs/flatlist#listheadercomponent) of FlatList\n * used in MessageList. Should be used for header by default if inverted is true or defaulted\n */\n FooterComponent?: React.ComponentType;\n /**\n * UI component for header of message list. By default message list will use `InlineLoadingMoreRecentIndicator`\n * as HeaderComponent. If you want to implement your own inline loading indicator, you can access `loadingMoreRecent`\n * from context.\n *\n * This is a [ListFooterComponent](https://facebook.github.io/react-native/docs/flatlist#listheadercomponent) of FlatList\n * used in MessageList. Should be used for header if inverted is false\n */\n HeaderComponent?: React.ComponentType;\n /** Whether or not the FlatList is inverted. Defaults to true */\n inverted?: boolean;\n /** Turn off grouping of messages by user */\n noGroupByUser?: boolean;\n onListScroll?: ScrollViewProps['onScroll'];\n /**\n * Handler to open the thread on message. This is callback for touch event for replies button.\n *\n * @param message A message object to open the thread upon.\n */\n onThreadSelect?: (message: ThreadContextValue<At, Ch, Co, Ev, Me, Re, Us>['thread']) => void;\n /**\n * Use `setFlatListRef` to get access to ref to inner FlatList.\n *\n * e.g.\n * ```js\n * <MessageList\n * setFlatListRef={(ref) => {\n * // Use ref for your own good\n * }}\n * ```\n */\n setFlatListRef?: (ref: FlatListType<MessageType<At, Ch, Co, Ev, Me, Re, Us>> | null) => void;\n /**\n * Boolean whether or not the Messages in the MessageList are part of a Thread\n **/\n threadList?: boolean;\n };\n\n/**\n * The message list component renders a list of messages. It consumes the following contexts:\n *\n * [ChannelContext](https://getstream.github.io/stream-chat-react-native/v3/#channelcontext)\n * [ChatContext](https://getstream.github.io/stream-chat-react-native/v3/#chatcontext)\n * [MessagesContext](https://getstream.github.io/stream-chat-react-native/v3/#messagescontext)\n * [ThreadContext](https://getstream.github.io/stream-chat-react-native/v3/#threadcontext)\n * [TranslationContext](https://getstream.github.io/stream-chat-react-native/v3/#translationcontext)\n */\nconst MessageListWithContext = <\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n>(\n props: MessageListPropsWithContext<At, Ch, Co, Ev, Me, Re, Us>,\n) => {\n const LoadingMoreIndicator = props.threadList\n ? InlineLoadingMoreThreadIndicator\n : InlineLoadingMoreIndicator;\n const {\n additionalFlatListProps,\n channel,\n client,\n closePicker,\n DateHeader,\n disabled,\n disableTypingIndicator,\n EmptyStateIndicator,\n FlatList,\n FooterComponent = LoadingMoreIndicator,\n HeaderComponent = InlineLoadingMoreRecentIndicator,\n initialScrollToFirstUnreadMessage,\n InlineDateSeparator,\n InlineUnreadIndicator,\n inverted = true,\n loadChannelAtMessage,\n loading,\n LoadingIndicator,\n loadMore,\n loadMoreRecent,\n loadMoreThread,\n markRead,\n Message,\n MessageSystem,\n myMessageTheme,\n NetworkDownIndicator,\n noGroupByUser,\n onListScroll,\n onThreadSelect,\n overlay,\n reloadChannel,\n ScrollToBottomButton,\n scrollToFirstUnreadThreshold,\n selectedPicker,\n setFlatListRef,\n setImages,\n setSelectedPicker,\n setTargetedMessage,\n StickyHeader,\n targetedMessage,\n tDateTimeParser,\n thread,\n threadList = false,\n typingEventsEnabled,\n TypingIndicator,\n TypingIndicatorContainer,\n } = props;\n\n const { theme } = useTheme();\n\n const {\n colors: { white_snow },\n messageList: { container, contentContainer, listContainer },\n } = theme;\n\n const modifiedTheme = useMemo(\n () => mergeThemes({ style: myMessageTheme, theme }),\n [myMessageTheme, theme],\n );\n\n const messageList = useMessageList<At, Ch, Co, Ev, Me, Re, Us>({\n inverted,\n noGroupByUser,\n threadList,\n });\n const messageListLengthBeforeUpdate = useRef(0);\n const messageListLengthAfterUpdate = messageList.length;\n\n /**\n * We need topMessage and channelLastRead values to set the initial scroll position.\n * So these values only get used if `initialScrollToFirstUnreadMessage` prop is true.\n */\n const topMessageBeforeUpdate = useRef<MessageType<At, Ch, Co, Ev, Me, Re, Us>>();\n const topMessageAfterUpdate = messageList[messageList.length - 1];\n\n const [autoscrollToTop, setAutoscrollToTop] = useState(false);\n\n /**\n * We want to call onEndReached and onStartReached only once, per content length.\n * We keep track of calls to these functions per content length, with following trackers.\n */\n const onStartReachedTracker = useRef<Record<number, boolean>>({});\n const onEndReachedTracker = useRef<Record<number, boolean>>({});\n\n const onStartReachedInPromise = useRef<Promise<void> | null>(null);\n const onEndReachedInPromise = useRef<Promise<void> | null>(null);\n\n const flatListRef = useRef<FlatListType<MessageType<At, Ch, Co, Ev, Me, Re, Us>> | null>(null);\n\n const initialScrollSet = useRef<boolean>(false);\n const channelResyncScrollSet = useRef<boolean>(true);\n\n const [hasMoved, setHasMoved] = useState(false);\n const [lastReceivedId, setLastReceivedId] = useState(getLastReceivedMessage(messageList)?.id);\n const [scrollToBottomButtonVisible, setScrollToBottomButtonVisible] = useState(false);\n\n const [stickyHeaderDate, setStickyHeaderDate] = useState<Date | undefined>();\n const stickyHeaderDateRef = useRef<Date | undefined>();\n /**\n * channel.lastRead throws error if the channel is not initialized.\n */\n const getLastReadSafely = () => (channel?.initialized ? channel.lastRead() : undefined);\n\n const channelLastRead = useRef(getLastReadSafely());\n\n const isUnreadMessage = (\n message: MessageType<At, Ch, Co, Ev, Me, Re, Us> | undefined,\n lastRead?: ReturnType<StreamChannel<At, Ch, Co, Ev, Me, Re, Us>['lastRead']>,\n ) => message && lastRead && message.created_at && lastRead < message.created_at;\n\n /**\n * If the top message in the list is unread, then we should scroll to top of the list.\n * This is to handle the case when entire message list is unread.\n * This scroll get set only on load, and never again.\n */\n const setInitialScrollIfNeeded = () => {\n // If the feature is disabled or initial scroll position is already set.\n if (!initialScrollToFirstUnreadMessage || initialScrollSet.current) {\n initialScrollSet.current = true;\n return;\n }\n if (isUnreadMessage(topMessageBeforeUpdate.current, channelLastRead.current)) {\n if (flatListRef.current) {\n flatListRef.current.scrollToEnd();\n }\n setTimeout(() => {\n initialScrollSet.current = true;\n }, 500);\n } else if (!initialScrollSet.current) {\n initialScrollSet.current = true;\n }\n };\n\n const updateStickyHeaderDateIfNeeded = (viewableItems: ViewToken[]) => {\n if (viewableItems.length) {\n const lastItem = viewableItems.pop() as {\n item: MessageType<At, Ch, Co, Ev, Me, Re, Us>;\n };\n\n if (\n lastItem?.item?.created_at &&\n !lastItem.item.deleted_at &&\n typeof lastItem.item.created_at !== 'string' &&\n lastItem.item.created_at.toDateString() !== stickyHeaderDateRef.current?.toDateString()\n ) {\n stickyHeaderDateRef.current = lastItem.item.created_at;\n setStickyHeaderDate(lastItem.item.created_at);\n }\n }\n };\n\n /**\n * FlatList doesn't accept changeable function for onViewableItemsChanged prop.\n * Thus useRef.\n */\n const onViewableItemsChanged = useRef(\n ({ viewableItems }: { viewableItems: ViewToken[] | undefined }) => {\n if (viewableItems) {\n updateStickyHeaderDateIfNeeded(viewableItems);\n }\n setInitialScrollIfNeeded();\n },\n );\n\n const resetPaginationTrackers = () => {\n onStartReachedTracker.current = {};\n onEndReachedTracker.current = {};\n };\n\n useEffect(() => {\n setScrollToBottomButtonVisible(false);\n }, [disabled]);\n\n useEffect(() => {\n if (!loading && channel && channel.countUnread() <= scrollToFirstUnreadThreshold) {\n markRead();\n }\n }, [loading]);\n\n useEffect(() => {\n const lastReceivedMessage = getLastReceivedMessage(messageList);\n\n const hasNewMessage = lastReceivedId !== lastReceivedMessage?.id;\n const isMyMessage = lastReceivedMessage?.user?.id === client.userID;\n\n setLastReceivedId(lastReceivedMessage?.id);\n\n /**\n * Scroll down when\n * 1. you send a new message to channel\n * 2. new message list is small than the one before update - channel has resynced\n * 3. created_at timestamp of top message before update is lesser than created_at timestamp of top message after update - channel has resynced\n */\n const scrollToBottomIfNeeded = () => {\n if (!client || !channel || messageList.length === 0) {\n return;\n }\n\n if (\n (hasNewMessage && isMyMessage) ||\n messageListLengthAfterUpdate < messageListLengthBeforeUpdate.current ||\n (topMessageBeforeUpdate.current?.created_at &&\n topMessageAfterUpdate?.created_at &&\n topMessageBeforeUpdate.current.created_at < topMessageAfterUpdate.created_at)\n ) {\n channelResyncScrollSet.current = false;\n setScrollToBottomButtonVisible(false);\n resetPaginationTrackers();\n\n setTimeout(\n () =>\n flatListRef.current?.scrollToOffset({\n offset: 0,\n }),\n 50,\n );\n setTimeout(() => {\n channelResyncScrollSet.current = true;\n if (channel.countUnread() > 0) {\n markRead();\n }\n }, 500);\n }\n };\n\n if (threadList || channel?.state.isUpToDate) {\n scrollToBottomIfNeeded();\n } else if (!scrollToBottomButtonVisible) {\n setScrollToBottomButtonVisible(true);\n }\n\n if (\n !channel?.state.isUpToDate &&\n flatListRef.current &&\n messageListLengthBeforeUpdate.current === 0 &&\n messageListLengthAfterUpdate < 10\n ) {\n /**\n * Trigger onStartReached on first load, if messages are not enough to fill the screen.\n * This is important especially for android, where you can't overscroll.\n */\n maybeCallOnStartReached(10);\n }\n\n /**\n * channelLastRead and topMessage are only used for setting initial scroll.\n * So lets not set it if `initialScrollToFirstUnreadMessage` prop is false.\n * OR if the scroll is already set.\n */\n if (initialScrollToFirstUnreadMessage && !initialScrollSet.current) {\n channelLastRead.current = getLastReadSafely();\n }\n\n messageListLengthBeforeUpdate.current = messageListLengthAfterUpdate;\n topMessageBeforeUpdate.current = topMessageAfterUpdate;\n }, [messageListLengthAfterUpdate, topMessageAfterUpdate?.id]);\n\n useEffect(() => {\n if (!channel?.state.isUpToDate && autoscrollToTop) {\n setAutoscrollToTop(false);\n } else if (channel?.state.isUpToDate && !autoscrollToTop) {\n setAutoscrollToTop(true);\n }\n }, [messageListLengthAfterUpdate]);\n\n const renderItem = ({\n index,\n item: message,\n }: {\n index: number;\n item: MessageType<At, Ch, Co, Ev, Me, Re, Us>;\n }) => {\n if (!channel || !channel.initialized) return null;\n\n const lastRead = getLastReadSafely();\n\n const lastMessage = messageList?.[index + 1];\n\n const showUnreadUnderlay = !!isUnreadMessage(message, lastRead) && scrollToBottomButtonVisible;\n const insertInlineUnreadIndicator =\n showUnreadUnderlay && !isUnreadMessage(lastMessage, lastRead);\n\n if (message.type === 'system') {\n return (\n <>\n <MessageSystem message={message} style={styles.messagePadding} />\n {insertInlineUnreadIndicator && <InlineUnreadIndicator />}\n </>\n );\n }\n\n const wrapMessageInTheme = client.userID === message.user?.id && !!myMessageTheme;\n return wrapMessageInTheme ? (\n <>\n <ThemeProvider mergedStyle={modifiedTheme}>\n <Message\n goToMessage={goToMessage}\n groupStyles={\n isMessageWithStylesReadByAndDateSeparator(message) ? message.groupStyles : []\n }\n lastReceivedId={lastReceivedId === message.id ? lastReceivedId : undefined}\n message={message}\n onThreadSelect={onThreadSelect}\n showUnreadUnderlay={showUnreadUnderlay}\n style={styles.messagePadding}\n targetedMessage={targetedMessage === message.id}\n threadList={threadList}\n />\n </ThemeProvider>\n {isMessageWithStylesReadByAndDateSeparator(message) && message.dateSeparator && (\n <InlineDateSeparator date={message.dateSeparator} />\n )}\n {/* Adding indicator below the messages, since the list is inverted */}\n {insertInlineUnreadIndicator && <InlineUnreadIndicator />}\n </>\n ) : (\n <>\n <Message\n goToMessage={goToMessage}\n groupStyles={\n isMessageWithStylesReadByAndDateSeparator(message) ? message.groupStyles : []\n }\n lastReceivedId={\n lastReceivedId === message.id || message.quoted_message_id ? lastReceivedId : undefined\n }\n message={message}\n onThreadSelect={onThreadSelect}\n showUnreadUnderlay={showUnreadUnderlay}\n style={styles.messagePadding}\n targetedMessage={targetedMessage === message.id}\n threadList={threadList}\n />\n {isMessageWithStylesReadByAndDateSeparator(message) && message.dateSeparator && (\n <InlineDateSeparator date={message.dateSeparator} />\n )}\n {/* Adding indicator below the messages, since the list is inverted */}\n {insertInlineUnreadIndicator && <InlineUnreadIndicator />}\n </>\n );\n };\n\n /**\n * We are keeping full control on message pagination, and not relying on react-native for it.\n * The reasons being,\n * 1. FlatList doesn't support onStartReached prop\n * 2. `onEndReached` function prop available on react-native, gets executed\n * once per content length (and thats actually a nice optimization strategy).\n * But it also means, we always need to prioritize onEndReached above our\n * logic for `onStartReached`.\n * 3. `onEndReachedThreshold` prop decides - at which scroll position to call `onEndReached`.\n * Its a factor of content length (which is necessary for \"real\" infinite scroll). But on\n * the other hand, it also makes calls to `onEndReached` (and this `channel.query`) way\n * too early during scroll, which we don't really need. So we are going to instead\n * keep some fixed offset distance, to decide when to call `loadMore` or `loadMoreRecent`.\n *\n * We are still gonna keep the optimization, which react-native does - only call onEndReached\n * once per content length.\n */\n\n /**\n * 1. Makes a call to `loadMoreRecent` function, which queries more recent messages.\n * 2. Ensures that we call `loadMoreRecent`, once per content length\n * 3. If the call to `loadMore` is in progress, we wait for it to finish to make sure scroll doesn't jump.\n */\n const maybeCallOnStartReached = (limit?: number) => {\n // If onStartReached has already been called for given data length, then ignore.\n if (messageList?.length && onStartReachedTracker.current[messageList.length]) {\n return;\n }\n\n if (messageList?.length) {\n onStartReachedTracker.current[messageList.length] = true;\n }\n\n const callback = () => {\n onStartReachedInPromise.current = null;\n\n return Promise.resolve();\n };\n\n const onError = () => {\n /** Release the onStartReached trigger after 2 seconds, to try again */\n setTimeout(() => {\n onStartReachedTracker.current = {};\n }, 2000);\n };\n\n // If onEndReached is in progress, better to wait for it to finish for smooth UX\n if (onEndReachedInPromise.current) {\n onEndReachedInPromise.current.finally(() => {\n onStartReachedInPromise.current = loadMoreRecent(limit).then(callback).catch(onError);\n });\n } else {\n onStartReachedInPromise.current = loadMoreRecent(limit).then(callback).catch(onError);\n }\n };\n\n /**\n * 1. Makes a call to `loadMore` function, which queries more older messages.\n * 2. Ensures that we call `loadMore`, once per content length\n * 3. If the call to `loadMoreRecent` is in progress, we wait for it to finish to make sure scroll doesn't jump.\n */\n const maybeCallOnEndReached = () => {\n // If onEndReached has already been called for given messageList length, then ignore.\n if (messageList?.length && onEndReachedTracker.current[messageList.length]) {\n return;\n }\n\n if (messageList?.length) {\n onEndReachedTracker.current[messageList.length] = true;\n }\n\n const callback = () => {\n onEndReachedInPromise.current = null;\n return Promise.resolve();\n };\n\n const onError = () => {\n /** Release the onEndReachedTracker trigger after 2 seconds, to try again */\n setTimeout(() => {\n onEndReachedTracker.current = {};\n }, 2000);\n };\n\n // If onStartReached is in progress, better to wait for it to finish for smooth UX\n if (onStartReachedInPromise.current) {\n onStartReachedInPromise.current.finally(() => {\n onEndReachedInPromise.current = (threadList ? loadMoreThread() : loadMore())\n .then(callback)\n .catch(onError);\n });\n } else {\n onEndReachedInPromise.current = (threadList ? loadMoreThread() : loadMore())\n .then(callback)\n .catch(onError);\n }\n };\n\n /**\n * Following if condition covers following cases:\n * 1. If I scroll up -> show scrollToBottom button.\n * 2. If I scroll to bottom of screen\n * |-> hide scrollToBottom button.\n * |-> if channel is unread, call markRead().\n */\n const handleScroll: ScrollViewProps['onScroll'] = (event) => {\n if (!channel || !initialScrollSet.current || !channelResyncScrollSet.current) {\n return;\n }\n\n const offset = event.nativeEvent.contentOffset.y;\n const visibleLength = event.nativeEvent.layoutMeasurement.height;\n const contentLength = event.nativeEvent.contentSize.height;\n // Check if scroll has reached either start of end of list.\n const isScrollAtStart = offset < 100;\n const isScrollAtEnd = contentLength - visibleLength - offset < 100;\n\n if (isScrollAtStart) {\n maybeCallOnStartReached();\n }\n\n if (isScrollAtEnd) {\n maybeCallOnEndReached();\n }\n\n // Show scrollToBottom button once scroll position goes beyond 300.\n const isScrollAtBottom = offset <= 300;\n const showScrollToBottomButton = !isScrollAtBottom || !channel?.state.isUpToDate;\n\n const shouldMarkRead =\n !threadList && offset <= 0 && channel?.state.isUpToDate && channel.countUnread() > 0;\n\n if (shouldMarkRead) {\n markRead();\n }\n\n if (showScrollToBottomButton && !scrollToBottomButtonVisible) {\n setScrollToBottomButtonVisible(true);\n } else if (!showScrollToBottomButton && scrollToBottomButtonVisible) {\n setScrollToBottomButtonVisible(false);\n }\n\n if (onListScroll) {\n onListScroll(event);\n }\n };\n\n const goToNewMessages = async () => {\n if (!channel?.state.isUpToDate) {\n resetPaginationTrackers();\n\n await reloadChannel();\n } else if (flatListRef.current) {\n flatListRef.current.scrollToOffset({\n offset: 0,\n });\n }\n\n setScrollToBottomButtonVisible(false);\n if (!threadList) {\n markRead();\n }\n };\n\n const goToMessage = useCallback(\n (messageId: string) => {\n const indexOfParentInMessageList = messageList.findIndex(\n (message) => message?.id === messageId,\n );\n\n if (indexOfParentInMessageList > -1) {\n try {\n if (flatListRef.current) {\n flatListRef.current.scrollToIndex({\n index: indexOfParentInMessageList,\n viewPosition: 0.5,\n });\n setTargetedMessage(messageId);\n\n return;\n }\n } catch (_) {\n // do nothing;\n }\n }\n\n loadChannelAtMessage({ messageId });\n resetPaginationTrackers();\n },\n [messageListLengthAfterUpdate],\n );\n\n const messagesWithImages = messageList.filter((message) => {\n if (!message.deleted_at && message.attachments) {\n return message.attachments.some(\n (attachment) =>\n attachment.type === 'image' &&\n !attachment.title_link &&\n !attachment.og_scrape_url &&\n (attachment.image_url || attachment.thumb_url),\n );\n }\n return false;\n });\n\n /**\n * This is for the useEffect to run again in the case that a message\n * gets edited with more or the same number of images\n */\n const imageString = messagesWithImages\n .map((message) =>\n message.attachments\n ?.map((attachment) => attachment.image_url || attachment.thumb_url || '')\n .join(),\n )\n .join();\n\n const numberOfMessagesWithImages = messagesWithImages.length;\n const threadExists = !!thread;\n useEffect(() => {\n if ((threadList && thread) || (!threadList && !thread)) {\n setImages(messagesWithImages);\n }\n }, [imageString, numberOfMessagesWithImages, threadExists, threadList]);\n\n const stickyHeaderFormatDate =\n stickyHeaderDate?.getFullYear() === new Date().getFullYear() ? 'MMM D' : 'MMM D, YYYY';\n const tStickyHeaderDate = stickyHeaderDate ? tDateTimeParser(stickyHeaderDate) : null;\n const stickyHeaderDateToRender =\n tStickyHeaderDate === null\n ? null\n : isDayOrMoment(tStickyHeaderDate)\n ? tStickyHeaderDate.format(stickyHeaderFormatDate)\n : new Date(tStickyHeaderDate).toDateString();\n\n const dismissImagePicker = () => {\n if (!hasMoved && selectedPicker) {\n setSelectedPicker(undefined);\n closePicker();\n }\n };\n const onScrollBeginDrag = () => !hasMoved && selectedPicker && setHasMoved(true);\n const onScrollEndDrag = () => hasMoved && selectedPicker && setHasMoved(false);\n\n const refCallback = (ref: FlatListType<MessageType<At, Ch, Co, Ev, Me, Re, Us>>) => {\n flatListRef.current = ref;\n\n if (setFlatListRef) {\n setFlatListRef(ref);\n }\n };\n const renderListEmptyComponent = () => (\n <View style={[styles.flex, styles.invert]} testID='empty-state'>\n <EmptyStateIndicator listType='message' />\n </View>\n );\n\n if (!FlatList) return null;\n\n if (loading) {\n return (\n <View style={styles.flex}>\n <LoadingIndicator listType='message' />\n </View>\n );\n }\n\n return (\n <View style={[styles.container, { backgroundColor: white_snow }, container]}>\n <FlatList\n contentContainerStyle={[styles.contentContainer, contentContainer]}\n data={messageList}\n /** Disables the MessageList UI. Which means, message actions, reactions won't work. */\n extraData={disabled || !channel?.state.isUpToDate}\n inverted={inverted}\n keyboardShouldPersistTaps='handled'\n keyExtractor={keyExtractor}\n ListEmptyComponent={renderListEmptyComponent}\n ListFooterComponent={FooterComponent}\n ListHeaderComponent={HeaderComponent}\n maintainVisibleContentPosition={{\n autoscrollToTopThreshold: autoscrollToTop ? 10 : undefined,\n minIndexForVisible: 1,\n }}\n onScroll={handleScroll}\n onScrollBeginDrag={onScrollBeginDrag}\n onScrollEndDrag={onScrollEndDrag}\n onTouchEnd={dismissImagePicker}\n onViewableItemsChanged={onViewableItemsChanged.current}\n ref={refCallback}\n renderItem={renderItem}\n scrollEnabled={overlay === 'none'}\n style={[styles.listContainer, listContainer]}\n testID='message-flat-list'\n viewabilityConfig={flatListViewabilityConfig}\n {...additionalFlatListProps}\n />\n {!loading && (\n <>\n <View style={styles.stickyHeader}>\n {stickyHeaderDateToRender &&\n (StickyHeader ? (\n <StickyHeader dateString={stickyHeaderDateToRender} />\n ) : messageListLengthAfterUpdate ? (\n <DateHeader dateString={stickyHeaderDateToRender} />\n ) : null)}\n </View>\n {!disableTypingIndicator && TypingIndicator && typingEventsEnabled !== false && (\n <TypingIndicatorContainer>\n <TypingIndicator />\n </TypingIndicatorContainer>\n )}\n <ScrollToBottomButton\n onPress={goToNewMessages}\n showNotification={scrollToBottomButtonVisible}\n unreadCount={threadList ? 0 : channel?.countUnread()}\n />\n </>\n )}\n <NetworkDownIndicator />\n </View>\n );\n};\n\nexport type MessageListProps<\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n> = Partial<MessageListPropsWithContext<At, Ch, Co, Ev, Me, Re, Us>>;\n\nexport const MessageList = <\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n>(\n props: MessageListProps<At, Ch, Co, Ev, Me, Re, Us>,\n) => {\n const { closePicker, selectedPicker, setSelectedPicker } = useAttachmentPickerContext();\n const {\n channel,\n disabled,\n EmptyStateIndicator,\n error,\n loadChannelAtMessage,\n loading,\n LoadingIndicator,\n markRead,\n NetworkDownIndicator,\n reloadChannel,\n scrollToFirstUnreadThreshold,\n setTargetedMessage,\n StickyHeader,\n targetedMessage,\n typingEventsEnabled,\n } = useChannelContext<At, Ch, Co, Ev, Me, Re, Us>();\n const { client } = useChatContext<At, Ch, Co, Ev, Me, Re, Us>();\n const { setImages } = useImageGalleryContext<At, Ch, Co, Ev, Me, Re, Us>();\n const {\n DateHeader,\n disableTypingIndicator,\n FlatList,\n initialScrollToFirstUnreadMessage,\n InlineDateSeparator,\n InlineUnreadIndicator,\n Message,\n MessageSystem,\n myMessageTheme,\n ScrollToBottomButton,\n TypingIndicator,\n TypingIndicatorContainer,\n } = useMessagesContext<At, Ch, Co, Ev, Me, Re, Us>();\n const { loadMore, loadMoreRecent } = usePaginatedMessageListContext<At, Ch, Co, Ev, Me, Re, Us>();\n const { overlay } = useOverlayContext();\n const { loadMoreThread, thread } = useThreadContext<At, Ch, Co, Ev, Me, Re, Us>();\n const { t, tDateTimeParser } = useTranslationContext();\n\n return (\n <MessageListWithContext\n {...{\n channel,\n client,\n closePicker,\n DateHeader,\n disabled,\n disableTypingIndicator,\n EmptyStateIndicator,\n error,\n FlatList,\n initialScrollToFirstUnreadMessage,\n InlineDateSeparator,\n InlineUnreadIndicator,\n loadChannelAtMessage,\n loading,\n LoadingIndicator,\n loadMore,\n loadMoreRecent,\n loadMoreThread,\n markRead,\n Message,\n MessageSystem,\n myMessageTheme,\n NetworkDownIndicator,\n overlay,\n reloadChannel,\n ScrollToBottomButton,\n scrollToFirstUnreadThreshold,\n selectedPicker,\n setImages,\n setSelectedPicker,\n setTargetedMessage,\n StickyHeader,\n t,\n targetedMessage,\n tDateTimeParser,\n thread,\n typingEventsEnabled,\n TypingIndicator,\n TypingIndicatorContainer,\n }}\n {...props}\n />\n );\n};\n"]}
1
+ {"version":3,"sources":["MessageList.tsx"],"names":["styles","StyleSheet","create","container","alignItems","flex","width","contentContainer","flexGrow","paddingBottom","invert","transform","scaleY","listContainer","messagePadding","paddingHorizontal","stickyHeader","position","top","keyExtractor","item","id","created_at","toISOString","Date","now","toString","flatListViewabilityConfig","viewAreaCoveragePercentThreshold","MessageListWithContext","props","LoadingMoreIndicator","threadList","InlineLoadingMoreThreadIndicator","InlineLoadingMoreIndicator","additionalFlatListProps","channel","client","closePicker","DateHeader","disabled","disableTypingIndicator","EmptyStateIndicator","FlatList","FooterComponent","HeaderComponent","InlineLoadingMoreRecentIndicator","hideStickyDateHeader","initialScrollToFirstUnreadMessage","InlineDateSeparator","InlineUnreadIndicator","inverted","legacyImageViewerSwipeBehaviour","loadChannelAtMessage","loading","LoadingIndicator","loadMore","loadMoreRecent","loadMoreThread","markRead","Message","MessageSystem","myMessageTheme","NetworkDownIndicator","noGroupByUser","onListScroll","onThreadSelect","overlay","reloadChannel","ScrollToBottomButton","scrollToFirstUnreadThreshold","selectedPicker","setFlatListRef","setImages","setSelectedPicker","setTargetedMessage","StickyHeader","targetedMessage","tDateTimeParser","thread","typingEventsEnabled","TypingIndicator","TypingIndicatorContainer","theme","white_snow","colors","messageList","modifiedTheme","style","messageListLengthBeforeUpdate","messageListLengthAfterUpdate","length","topMessageBeforeUpdate","topMessageAfterUpdate","autoscrollToTop","setAutoscrollToTop","onStartReachedTracker","onEndReachedTracker","onStartReachedInPromise","onEndReachedInPromise","flatListRef","initialScrollSet","channelResyncScrollSet","hasMoved","setHasMoved","lastReceivedId","setLastReceivedId","scrollToBottomButtonVisible","setScrollToBottomButtonVisible","stickyHeaderDate","setStickyHeaderDate","stickyHeaderDateRef","getLastReadSafely","initialized","lastRead","undefined","channelLastRead","isUnreadMessage","message","setInitialScrollIfNeeded","current","scrollToEnd","setTimeout","updateStickyHeaderDateIfNeeded","viewableItems","lastItem","pop","deleted_at","toDateString","onViewableItemsChanged","resetPaginationTrackers","countUnread","lastReceivedMessage","hasNewMessage","isMyMessage","user","userID","scrollToBottomIfNeeded","scrollToOffset","offset","state","isUpToDate","maybeCallOnStartReached","renderItem","index","lastMessage","showUnreadUnderlay","insertInlineUnreadIndicator","type","wrapMessageInTheme","goToMessage","groupStyles","dateSeparator","quoted_message_id","limit","callback","Promise","resolve","onError","then","maybeCallOnEndReached","handleScroll","event","nativeEvent","contentOffset","y","visibleLength","layoutMeasurement","height","contentLength","contentSize","isScrollAtStart","isScrollAtEnd","isScrollAtBottom","showScrollToBottomButton","shouldMarkRead","goToNewMessages","messageId","indexOfParentInMessageList","findIndex","scrollToIndex","viewPosition","_","messagesWithImages","filter","attachments","some","attachment","title_link","og_scrape_url","image_url","thumb_url","imageString","map","join","numberOfMessagesWithImages","threadExists","stickyHeaderFormatDate","getFullYear","tStickyHeaderDate","stickyHeaderDateToRender","format","dismissImagePicker","onScrollBeginDrag","onScrollEndDrag","refCallback","ref","renderListEmptyComponent","backgroundColor","autoscrollToTopThreshold","minIndexForVisible","MessageList","enableMessageGroupingByUser","error","t"],"mappings":";;;;;;;;;;;;;;;;;AAAA;;AACA;;AASA;;AAKA;;AACA;;AACA;;AACA;;AAEA;;AAIA;;AAIA;;AACA;;AAIA;;AAIA;;AAIA;;AAIA;;AACA;;AACA;;;;;;;;;AAmBA,IAAMA,MAAM,GAAGC,wBAAWC,MAAX,CAAkB;AAC/BC,EAAAA,SAAS,EAAE;AACTC,IAAAA,UAAU,EAAE,QADH;AAETC,IAAAA,IAAI,EAAE,CAFG;AAGTC,IAAAA,KAAK,EAAE;AAHE,GADoB;AAM/BC,EAAAA,gBAAgB,EAAE;AAChBC,IAAAA,QAAQ,EAAE,CADM;AAQhBC,IAAAA,aAAa,EAAE;AARC,GANa;AAgB/BJ,EAAAA,IAAI,EAAE;AAAEA,IAAAA,IAAI,EAAE;AAAR,GAhByB;AAiB/BK,EAAAA,MAAM,EAAE;AAAEC,IAAAA,SAAS,EAAE,CAAC;AAAEC,MAAAA,MAAM,EAAE,CAAC;AAAX,KAAD;AAAb,GAjBuB;AAkB/BC,EAAAA,aAAa,EAAE;AACbR,IAAAA,IAAI,EAAE,CADO;AAEbC,IAAAA,KAAK,EAAE;AAFM,GAlBgB;AAsB/BQ,EAAAA,cAAc,EAAE;AACdC,IAAAA,iBAAiB,EAAE;AADL,GAtBe;AAyB/BC,EAAAA,YAAY,EAAE;AACZC,IAAAA,QAAQ,EAAE,UADE;AAEZC,IAAAA,GAAG,EAAE;AAFO;AAzBiB,CAAlB,CAAf;;AA+BA,IAAMC,YAAY,GAAG,SAAfA,YAAe,CASnBC,IATmB;AAAA,SAWnBA,IAAI,CAACC,EAAL,KACCD,IAAI,CAACE,UAAL,GACG,OAAOF,IAAI,CAACE,UAAZ,KAA2B,QAA3B,GACEF,IAAI,CAACE,UADP,GAEEF,IAAI,CAACE,UAAL,CAAgBC,WAAhB,EAHL,GAIGC,IAAI,CAACC,GAAL,GAAWC,QAAX,EALJ,CAXmB;AAAA,CAArB;;AAkBA,IAAMC,yBAAyB,GAAG;AAChCC,EAAAA,gCAAgC,EAAE;AADF,CAAlC;;AA+HA,IAAMC,sBAAsB,GAAG,SAAzBA,sBAAyB,CAS7BC,KAT6B,EAU1B;AAAA;;AACH,MAAMC,oBAAoB,GAAGD,KAAK,CAACE,UAAN,GACzBC,kEADyB,GAEzBC,sDAFJ;AAGA,MACEC,uBADF,GAiDIL,KAjDJ,CACEK,uBADF;AAAA,MAEEC,OAFF,GAiDIN,KAjDJ,CAEEM,OAFF;AAAA,MAGEC,MAHF,GAiDIP,KAjDJ,CAGEO,MAHF;AAAA,MAIEC,WAJF,GAiDIR,KAjDJ,CAIEQ,WAJF;AAAA,MAKEC,UALF,GAiDIT,KAjDJ,CAKES,UALF;AAAA,MAMEC,QANF,GAiDIV,KAjDJ,CAMEU,QANF;AAAA,MAOEC,sBAPF,GAiDIX,KAjDJ,CAOEW,sBAPF;AAAA,MAQEC,mBARF,GAiDIZ,KAjDJ,CAQEY,mBARF;AAAA,MASEC,QATF,GAiDIb,KAjDJ,CASEa,QATF;AAAA,8BAiDIb,KAjDJ,CAUEc,eAVF;AAAA,MAUEA,eAVF,sCAUoBb,oBAVpB;AAAA,8BAiDID,KAjDJ,CAWEe,eAXF;AAAA,MAWEA,eAXF,sCAWoBC,kEAXpB;AAAA,MAYEC,oBAZF,GAiDIjB,KAjDJ,CAYEiB,oBAZF;AAAA,MAaEC,iCAbF,GAiDIlB,KAjDJ,CAaEkB,iCAbF;AAAA,MAcEC,mBAdF,GAiDInB,KAjDJ,CAcEmB,mBAdF;AAAA,MAeEC,qBAfF,GAiDIpB,KAjDJ,CAeEoB,qBAfF;AAAA,wBAiDIpB,KAjDJ,CAgBEqB,QAhBF;AAAA,MAgBEA,QAhBF,gCAgBa,IAhBb;AAAA,MAiBEC,+BAjBF,GAiDItB,KAjDJ,CAiBEsB,+BAjBF;AAAA,MAkBEC,oBAlBF,GAiDIvB,KAjDJ,CAkBEuB,oBAlBF;AAAA,MAmBEC,OAnBF,GAiDIxB,KAjDJ,CAmBEwB,OAnBF;AAAA,MAoBEC,gBApBF,GAiDIzB,KAjDJ,CAoBEyB,gBApBF;AAAA,MAqBEC,QArBF,GAiDI1B,KAjDJ,CAqBE0B,QArBF;AAAA,MAsBEC,cAtBF,GAiDI3B,KAjDJ,CAsBE2B,cAtBF;AAAA,MAuBEC,cAvBF,GAiDI5B,KAjDJ,CAuBE4B,cAvBF;AAAA,MAwBEC,QAxBF,GAiDI7B,KAjDJ,CAwBE6B,QAxBF;AAAA,MAyBEC,OAzBF,GAiDI9B,KAjDJ,CAyBE8B,OAzBF;AAAA,MA0BEC,aA1BF,GAiDI/B,KAjDJ,CA0BE+B,aA1BF;AAAA,MA2BEC,cA3BF,GAiDIhC,KAjDJ,CA2BEgC,cA3BF;AAAA,MA4BEC,oBA5BF,GAiDIjC,KAjDJ,CA4BEiC,oBA5BF;AAAA,MA6BEC,aA7BF,GAiDIlC,KAjDJ,CA6BEkC,aA7BF;AAAA,MA8BEC,YA9BF,GAiDInC,KAjDJ,CA8BEmC,YA9BF;AAAA,MA+BEC,cA/BF,GAiDIpC,KAjDJ,CA+BEoC,cA/BF;AAAA,MAgCEC,OAhCF,GAiDIrC,KAjDJ,CAgCEqC,OAhCF;AAAA,MAiCEC,aAjCF,GAiDItC,KAjDJ,CAiCEsC,aAjCF;AAAA,MAkCEC,oBAlCF,GAiDIvC,KAjDJ,CAkCEuC,oBAlCF;AAAA,MAmCEC,4BAnCF,GAiDIxC,KAjDJ,CAmCEwC,4BAnCF;AAAA,MAoCEC,cApCF,GAiDIzC,KAjDJ,CAoCEyC,cApCF;AAAA,MAqCEC,cArCF,GAiDI1C,KAjDJ,CAqCE0C,cArCF;AAAA,MAsCEC,SAtCF,GAiDI3C,KAjDJ,CAsCE2C,SAtCF;AAAA,MAuCEC,iBAvCF,GAiDI5C,KAjDJ,CAuCE4C,iBAvCF;AAAA,MAwCEC,kBAxCF,GAiDI7C,KAjDJ,CAwCE6C,kBAxCF;AAAA,MAyCEC,YAzCF,GAiDI9C,KAjDJ,CAyCE8C,YAzCF;AAAA,MA0CEC,eA1CF,GAiDI/C,KAjDJ,CA0CE+C,eA1CF;AAAA,MA2CEC,eA3CF,GAiDIhD,KAjDJ,CA2CEgD,eA3CF;AAAA,MA4CEC,MA5CF,GAiDIjD,KAjDJ,CA4CEiD,MA5CF;AAAA,0BAiDIjD,KAjDJ,CA6CEE,UA7CF;AAAA,MA6CEA,UA7CF,kCA6Ce,KA7Cf;AAAA,MA8CEgD,mBA9CF,GAiDIlD,KAjDJ,CA8CEkD,mBA9CF;AAAA,MA+CEC,eA/CF,GAiDInD,KAjDJ,CA+CEmD,eA/CF;AAAA,MAgDEC,wBAhDF,GAiDIpD,KAjDJ,CAgDEoD,wBAhDF;;AAmDA,kBAAkB,6BAAlB;AAAA,MAAQC,KAAR,aAAQA,KAAR;;AAEA,MACYC,UADZ,GAGID,KAHJ,CACEE,MADF,CACYD,UADZ;AAAA,2BAGID,KAHJ,CAEEG,WAFF;AAAA,MAEiBnF,SAFjB,sBAEiBA,SAFjB;AAAA,MAE4BI,gBAF5B,sBAE4BA,gBAF5B;AAAA,MAE8CM,aAF9C,sBAE8CA,aAF9C;AAKA,MAAM0E,aAAa,GAAG,oBACpB;AAAA,WAAM,+BAAY;AAAEC,MAAAA,KAAK,EAAE1B,cAAT;AAAyBqB,MAAAA,KAAK,EAALA;AAAzB,KAAZ,CAAN;AAAA,GADoB,EAEpB,CAACrB,cAAD,EAAiBqB,KAAjB,CAFoB,CAAtB;AAKA,MAAMG,WAAW,GAAG,oCAA2C;AAC7DnC,IAAAA,QAAQ,EAARA,QAD6D;AAE7Da,IAAAA,aAAa,EAAbA,aAF6D;AAG7DhC,IAAAA,UAAU,EAAVA;AAH6D,GAA3C,CAApB;AAKA,MAAMyD,6BAA6B,GAAG,mBAAO,CAAP,CAAtC;AACA,MAAMC,4BAA4B,GAAGJ,WAAW,CAACK,MAAjD;AAMA,MAAMC,sBAAsB,GAAG,oBAA/B;AACA,MAAMC,qBAAqB,GAAGP,WAAW,CAACA,WAAW,CAACK,MAAZ,GAAqB,CAAtB,CAAzC;;AAEA,kBAA8C,qBAAS,KAAT,CAA9C;AAAA;AAAA,MAAOG,eAAP;AAAA,MAAwBC,kBAAxB;;AAMA,MAAMC,qBAAqB,GAAG,mBAAgC,EAAhC,CAA9B;AACA,MAAMC,mBAAmB,GAAG,mBAAgC,EAAhC,CAA5B;AAEA,MAAMC,uBAAuB,GAAG,mBAA6B,IAA7B,CAAhC;AACA,MAAMC,qBAAqB,GAAG,mBAA6B,IAA7B,CAA9B;AAEA,MAAMC,WAAW,GAAG,mBAAqE,IAArE,CAApB;AAEA,MAAMC,gBAAgB,GAAG,mBAAgB,KAAhB,CAAzB;AACA,MAAMC,sBAAsB,GAAG,mBAAgB,IAAhB,CAA/B;;AAEA,mBAAgC,qBAAS,KAAT,CAAhC;AAAA;AAAA,MAAOC,QAAP;AAAA,MAAiBC,WAAjB;;AACA,mBAA4C,8CAAS,oDAAuBlB,WAAvB,CAAT,qBAAS,sBAAqCjE,EAA9C,CAA5C;AAAA;AAAA,MAAOoF,cAAP;AAAA,MAAuBC,iBAAvB;;AACA,mBAAsE,qBAAS,KAAT,CAAtE;AAAA;AAAA,MAAOC,2BAAP;AAAA,MAAoCC,8BAApC;;AAEA,mBAAgD,sBAAhD;AAAA;AAAA,MAAOC,gBAAP;AAAA,MAAyBC,mBAAzB;;AACA,MAAMC,mBAAmB,GAAG,oBAA5B;;AAIA,MAAMC,iBAAiB,GAAG,SAApBA,iBAAoB;AAAA,WAAO5E,OAAO,QAAP,IAAAA,OAAO,CAAE6E,WAAT,GAAuB7E,OAAO,CAAC8E,QAAR,EAAvB,GAA4CC,SAAnD;AAAA,GAA1B;;AAEA,MAAMC,eAAe,GAAG,mBAAOJ,iBAAiB,EAAxB,CAAxB;;AAEA,MAAMK,eAAe,GAAG,SAAlBA,eAAkB,CACtBC,OADsB,EAEtBJ,QAFsB;AAAA,WAGnBI,OAAO,IAAIJ,QAAX,IAAuBI,OAAO,CAAChG,UAA/B,IAA6C4F,QAAQ,GAAGI,OAAO,CAAChG,UAH7C;AAAA,GAAxB;;AAUA,MAAMiG,wBAAwB,GAAG,SAA3BA,wBAA2B,GAAM;AAErC,QAAI,CAACvE,iCAAD,IAAsCqD,gBAAgB,CAACmB,OAA3D,EAAoE;AAClEnB,MAAAA,gBAAgB,CAACmB,OAAjB,GAA2B,IAA3B;AACA;AACD;;AACD,QAAIH,eAAe,CAACzB,sBAAsB,CAAC4B,OAAxB,EAAiCJ,eAAe,CAACI,OAAjD,CAAnB,EAA8E;AAC5E,UAAIpB,WAAW,CAACoB,OAAhB,EAAyB;AACvBpB,QAAAA,WAAW,CAACoB,OAAZ,CAAoBC,WAApB;AACD;;AACDC,MAAAA,UAAU,CAAC,YAAM;AACfrB,QAAAA,gBAAgB,CAACmB,OAAjB,GAA2B,IAA3B;AACD,OAFS,EAEP,GAFO,CAAV;AAGD,KAPD,MAOO,IAAI,CAACnB,gBAAgB,CAACmB,OAAtB,EAA+B;AACpCnB,MAAAA,gBAAgB,CAACmB,OAAjB,GAA2B,IAA3B;AACD;AACF,GAhBD;;AAkBA,MAAMG,8BAA8B,GAAG,SAAjCA,8BAAiC,CAACC,aAAD,EAAgC;AACrE,QAAIA,aAAa,CAACjC,MAAlB,EAA0B;AAAA;;AACxB,UAAMkC,QAAQ,GAAGD,aAAa,CAACE,GAAd,EAAjB;;AAIA,UACED,QAAQ,QAAR,sBAAAA,QAAQ,CAAEzG,IAAV,4BAAgBE,UAAhB,IACA,CAACuG,QAAQ,CAACzG,IAAT,CAAc2G,UADf,IAEA,OAAOF,QAAQ,CAACzG,IAAT,CAAcE,UAArB,KAAoC,QAFpC,IAGAuG,QAAQ,CAACzG,IAAT,CAAcE,UAAd,CAAyB0G,YAAzB,iCAA4CjB,mBAAmB,CAACS,OAAhE,qBAA4C,sBAA6BQ,YAA7B,EAA5C,CAJF,EAKE;AACAjB,QAAAA,mBAAmB,CAACS,OAApB,GAA8BK,QAAQ,CAACzG,IAAT,CAAcE,UAA5C;AACAwF,QAAAA,mBAAmB,CAACe,QAAQ,CAACzG,IAAT,CAAcE,UAAf,CAAnB;AACD;AACF;AACF,GAhBD;;AAsBA,MAAM2G,sBAAsB,GAAG,mBAC7B,gBAAmE;AAAA,QAAhEL,aAAgE,QAAhEA,aAAgE;;AACjE,QAAIA,aAAa,IAAI,CAAC7E,oBAAtB,EAA4C;AAC1C4E,MAAAA,8BAA8B,CAACC,aAAD,CAA9B;AACD;;AACDL,IAAAA,wBAAwB;AACzB,GAN4B,CAA/B;;AASA,MAAMW,uBAAuB,GAAG,SAA1BA,uBAA0B,GAAM;AACpClC,IAAAA,qBAAqB,CAACwB,OAAtB,GAAgC,EAAhC;AACAvB,IAAAA,mBAAmB,CAACuB,OAApB,GAA8B,EAA9B;AACD,GAHD;;AAKA,wBAAU,YAAM;AACdZ,IAAAA,8BAA8B,CAAC,KAAD,CAA9B;AACD,GAFD,EAEG,CAACpE,QAAD,CAFH;AAIA,wBAAU,YAAM;AACd,QAAI,CAACc,OAAD,IAAYlB,OAAZ,IAAuBA,OAAO,CAAC+F,WAAR,MAAyB7D,4BAApD,EAAkF;AAChFX,MAAAA,QAAQ;AACT;AACF,GAJD,EAIG,CAACL,OAAD,CAJH;AAMA,wBAAU,YAAM;AAAA;;AACd,QAAM8E,mBAAmB,GAAG,oDAAuB9C,WAAvB,CAA5B;AAEA,QAAM+C,aAAa,GAAG5B,cAAc,MAAK2B,mBAAL,oBAAKA,mBAAmB,CAAE/G,EAA1B,CAApC;AACA,QAAMiH,WAAW,GAAG,CAAAF,mBAAmB,QAAnB,qCAAAA,mBAAmB,CAAEG,IAArB,2CAA2BlH,EAA3B,MAAkCgB,MAAM,CAACmG,MAA7D;AAEA9B,IAAAA,iBAAiB,CAAC0B,mBAAD,oBAACA,mBAAmB,CAAE/G,EAAtB,CAAjB;;AAQA,QAAMoH,sBAAsB,GAAG,SAAzBA,sBAAyB,GAAM;AAAA;;AACnC,UAAI,CAACpG,MAAD,IAAW,CAACD,OAAZ,IAAuBkD,WAAW,CAACK,MAAZ,KAAuB,CAAlD,EAAqD;AACnD;AACD;;AAED,UACG0C,aAAa,IAAIC,WAAlB,IACA5C,4BAA4B,GAAGD,6BAA6B,CAAC+B,OAD7D,IAEC,yBAAA5B,sBAAsB,CAAC4B,OAAvB,mCAAgClG,UAAhC,IACCuE,qBADD,YACCA,qBAAqB,CAAEvE,UADxB,IAECsE,sBAAsB,CAAC4B,OAAvB,CAA+BlG,UAA/B,GAA4CuE,qBAAqB,CAACvE,UALtE,EAME;AACAgF,QAAAA,sBAAsB,CAACkB,OAAvB,GAAiC,KAAjC;AACAZ,QAAAA,8BAA8B,CAAC,KAAD,CAA9B;AACAsB,QAAAA,uBAAuB;AAEvBR,QAAAA,UAAU,CACR;AAAA;;AAAA,yCACEtB,WAAW,CAACoB,OADd,qBACE,qBAAqBkB,cAArB,CAAoC;AAClCC,YAAAA,MAAM,EAAE;AAD0B,WAApC,CADF;AAAA,SADQ,EAKR,EALQ,CAAV;AAOAjB,QAAAA,UAAU,CAAC,YAAM;AACfpB,UAAAA,sBAAsB,CAACkB,OAAvB,GAAiC,IAAjC;;AACA,cAAIpF,OAAO,CAAC+F,WAAR,KAAwB,CAA5B,EAA+B;AAC7BxE,YAAAA,QAAQ;AACT;AACF,SALS,EAKP,GALO,CAAV;AAMD;AACF,KA9BD;;AAgCA,QAAI3B,UAAU,IAAII,OAAJ,YAAIA,OAAO,CAAEwG,KAAT,CAAeC,UAAjC,EAA6C;AAC3CJ,MAAAA,sBAAsB;AACvB,KAFD,MAEO,IAAI,CAAC9B,2BAAL,EAAkC;AACvCC,MAAAA,8BAA8B,CAAC,IAAD,CAA9B;AACD;;AAED,QACE,EAACxE,OAAD,YAACA,OAAO,CAAEwG,KAAT,CAAeC,UAAhB,KACAzC,WAAW,CAACoB,OADZ,IAEA/B,6BAA6B,CAAC+B,OAA9B,KAA0C,CAF1C,IAGA9B,4BAA4B,GAAG,EAJjC,EAKE;AAKAoD,MAAAA,uBAAuB,CAAC,EAAD,CAAvB;AACD;;AAOD,QAAI9F,iCAAiC,IAAI,CAACqD,gBAAgB,CAACmB,OAA3D,EAAoE;AAClEJ,MAAAA,eAAe,CAACI,OAAhB,GAA0BR,iBAAiB,EAA3C;AACD;;AAEDvB,IAAAA,6BAA6B,CAAC+B,OAA9B,GAAwC9B,4BAAxC;AACAE,IAAAA,sBAAsB,CAAC4B,OAAvB,GAAiC3B,qBAAjC;AACD,GA5ED,EA4EG,CAACH,4BAAD,EAA+BG,qBAA/B,oBAA+BA,qBAAqB,CAAExE,EAAtD,CA5EH;AA8EA,wBAAU,YAAM;AACd,QAAI,EAACe,OAAD,YAACA,OAAO,CAAEwG,KAAT,CAAeC,UAAhB,KAA8B/C,eAAlC,EAAmD;AACjDC,MAAAA,kBAAkB,CAAC,KAAD,CAAlB;AACD,KAFD,MAEO,IAAI3D,OAAO,QAAP,IAAAA,OAAO,CAAEwG,KAAT,CAAeC,UAAf,IAA6B,CAAC/C,eAAlC,EAAmD;AACxDC,MAAAA,kBAAkB,CAAC,IAAD,CAAlB;AACD;AACF,GAND,EAMG,CAACL,4BAAD,CANH;;AAQA,MAAMqD,UAAU,GAAG,SAAbA,UAAa,QAMb;AAAA;;AAAA,QALJC,KAKI,SALJA,KAKI;AAAA,QAJE1B,OAIF,SAJJlG,IAII;AACJ,QAAI,CAACgB,OAAD,IAAY,CAACA,OAAO,CAAC6E,WAAzB,EAAsC,OAAO,IAAP;AAEtC,QAAMC,QAAQ,GAAGF,iBAAiB,EAAlC;AAEA,QAAMiC,WAAW,GAAG3D,WAAH,oBAAGA,WAAW,CAAG0D,KAAK,GAAG,CAAX,CAA/B;AAEA,QAAME,kBAAkB,GAAG,CAAC,CAAC7B,eAAe,CAACC,OAAD,EAAUJ,QAAV,CAAjB,IAAwCP,2BAAnE;AACA,QAAMwC,2BAA2B,GAC/BD,kBAAkB,IAAI,CAAC7B,eAAe,CAAC4B,WAAD,EAAc/B,QAAd,CADxC;;AAGA,QAAII,OAAO,CAAC8B,IAAR,KAAiB,QAArB,EAA+B;AAC7B,aACE,kEACE,gCAAC,aAAD;AAAe,QAAA,OAAO,EAAE9B,OAAxB;AAAiC,QAAA,KAAK,EAAEtH,MAAM,CAACc,cAA/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QADF,EAEGqI,2BAA2B,IAAI,gCAAC,qBAAD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAFlC,CADF;AAMD;;AAED,QAAME,kBAAkB,GAAGhH,MAAM,CAACmG,MAAP,uBAAkBlB,OAAO,CAACiB,IAA1B,qBAAkB,cAAclH,EAAhC,KAAsC,CAAC,CAACyC,cAAnE;AACA,WAAOuF,kBAAkB,GACvB,kEACE,gCAAC,2BAAD;AAAe,MAAA,WAAW,EAAE9D,aAA5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OACE,gCAAC,OAAD;AACE,MAAA,WAAW,EAAE+D,WADf;AAEE,MAAA,WAAW,EACT,+DAA0ChC,OAA1C,IAAqDA,OAAO,CAACiC,WAA7D,GAA2E,EAH/E;AAKE,MAAA,cAAc,EAAE9C,cAAc,KAAKa,OAAO,CAACjG,EAA3B,GAAgCoF,cAAhC,GAAiDU,SALnE;AAME,MAAA,OAAO,EAAEG,OANX;AAOE,MAAA,cAAc,EAAEpD,cAPlB;AAQE,MAAA,kBAAkB,EAAEgF,kBARtB;AASE,MAAA,KAAK,EAAElJ,MAAM,CAACc,cAThB;AAUE,MAAA,eAAe,EAAE+D,eAAe,KAAKyC,OAAO,CAACjG,EAV/C;AAWE,MAAA,UAAU,EAAEW,UAXd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MADF,CADF,EAgBG,+DAA0CsF,OAA1C,KAAsDA,OAAO,CAACkC,aAA9D,IACC,gCAAC,mBAAD;AAAqB,MAAA,IAAI,EAAElC,OAAO,CAACkC,aAAnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAjBJ,EAoBGL,2BAA2B,IAAI,gCAAC,qBAAD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MApBlC,CADuB,GAwBvB,kEACE,gCAAC,OAAD;AACE,MAAA,WAAW,EAAEG,WADf;AAEE,MAAA,WAAW,EACT,+DAA0ChC,OAA1C,IAAqDA,OAAO,CAACiC,WAA7D,GAA2E,EAH/E;AAKE,MAAA,cAAc,EACZ9C,cAAc,KAAKa,OAAO,CAACjG,EAA3B,IAAiCiG,OAAO,CAACmC,iBAAzC,GAA6DhD,cAA7D,GAA8EU,SANlF;AAQE,MAAA,OAAO,EAAEG,OARX;AASE,MAAA,cAAc,EAAEpD,cATlB;AAUE,MAAA,kBAAkB,EAAEgF,kBAVtB;AAWE,MAAA,KAAK,EAAElJ,MAAM,CAACc,cAXhB;AAYE,MAAA,eAAe,EAAE+D,eAAe,KAAKyC,OAAO,CAACjG,EAZ/C;AAaE,MAAA,UAAU,EAAEW,UAbd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MADF,EAgBG,+DAA0CsF,OAA1C,KAAsDA,OAAO,CAACkC,aAA9D,IACC,gCAAC,mBAAD;AAAqB,MAAA,IAAI,EAAElC,OAAO,CAACkC,aAAnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAjBJ,EAoBGL,2BAA2B,IAAI,gCAAC,qBAAD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MApBlC,CAxBF;AA+CD,GA1ED;;AAmGA,MAAML,uBAAuB,GAAG,SAA1BA,uBAA0B,CAACY,KAAD,EAAoB;AAElD,QAAIpE,WAAW,QAAX,IAAAA,WAAW,CAAEK,MAAb,IAAuBK,qBAAqB,CAACwB,OAAtB,CAA8BlC,WAAW,CAACK,MAA1C,CAA3B,EAA8E;AAC5E;AACD;;AAED,QAAIL,WAAJ,YAAIA,WAAW,CAAEK,MAAjB,EAAyB;AACvBK,MAAAA,qBAAqB,CAACwB,OAAtB,CAA8BlC,WAAW,CAACK,MAA1C,IAAoD,IAApD;AACD;;AAED,QAAMgE,QAAQ,GAAG,SAAXA,QAAW,GAAM;AACrBzD,MAAAA,uBAAuB,CAACsB,OAAxB,GAAkC,IAAlC;AAEA,aAAOoC,OAAO,CAACC,OAAR,EAAP;AACD,KAJD;;AAMA,QAAMC,OAAO,GAAG,SAAVA,OAAU,GAAM;AAEpBpC,MAAAA,UAAU,CAAC,YAAM;AACf1B,QAAAA,qBAAqB,CAACwB,OAAtB,GAAgC,EAAhC;AACD,OAFS,EAEP,IAFO,CAAV;AAGD,KALD;;AAQA,QAAIrB,qBAAqB,CAACqB,OAA1B,EAAmC;AACjCrB,MAAAA,qBAAqB,CAACqB,OAAtB,YAAsC,YAAM;AAC1CtB,QAAAA,uBAAuB,CAACsB,OAAxB,GAAkC/D,cAAc,CAACiG,KAAD,CAAd,CAAsBK,IAAtB,CAA2BJ,QAA3B,WAA2CG,OAA3C,CAAlC;AACD,OAFD;AAGD,KAJD,MAIO;AACL5D,MAAAA,uBAAuB,CAACsB,OAAxB,GAAkC/D,cAAc,CAACiG,KAAD,CAAd,CAAsBK,IAAtB,CAA2BJ,QAA3B,WAA2CG,OAA3C,CAAlC;AACD;AACF,GA/BD;;AAsCA,MAAME,qBAAqB,GAAG,SAAxBA,qBAAwB,GAAM;AAElC,QAAI1E,WAAW,QAAX,IAAAA,WAAW,CAAEK,MAAb,IAAuBM,mBAAmB,CAACuB,OAApB,CAA4BlC,WAAW,CAACK,MAAxC,CAA3B,EAA4E;AAC1E;AACD;;AAED,QAAIL,WAAJ,YAAIA,WAAW,CAAEK,MAAjB,EAAyB;AACvBM,MAAAA,mBAAmB,CAACuB,OAApB,CAA4BlC,WAAW,CAACK,MAAxC,IAAkD,IAAlD;AACD;;AAED,QAAMgE,QAAQ,GAAG,SAAXA,QAAW,GAAM;AACrBxD,MAAAA,qBAAqB,CAACqB,OAAtB,GAAgC,IAAhC;AACA,aAAOoC,OAAO,CAACC,OAAR,EAAP;AACD,KAHD;;AAKA,QAAMC,OAAO,GAAG,SAAVA,OAAU,GAAM;AAEpBpC,MAAAA,UAAU,CAAC,YAAM;AACfzB,QAAAA,mBAAmB,CAACuB,OAApB,GAA8B,EAA9B;AACD,OAFS,EAEP,IAFO,CAAV;AAGD,KALD;;AAQA,QAAItB,uBAAuB,CAACsB,OAA5B,EAAqC;AACnCtB,MAAAA,uBAAuB,CAACsB,OAAxB,YAAwC,YAAM;AAC5CrB,QAAAA,qBAAqB,CAACqB,OAAtB,GAAgC,CAACxF,UAAU,GAAG0B,cAAc,EAAjB,GAAsBF,QAAQ,EAAzC,EAC7BuG,IAD6B,CACxBJ,QADwB,WAEvBG,OAFuB,CAAhC;AAGD,OAJD;AAKD,KAND,MAMO;AACL3D,MAAAA,qBAAqB,CAACqB,OAAtB,GAAgC,CAACxF,UAAU,GAAG0B,cAAc,EAAjB,GAAsBF,QAAQ,EAAzC,EAC7BuG,IAD6B,CACxBJ,QADwB,WAEvBG,OAFuB,CAAhC;AAGD;AACF,GAlCD;;AA2CA,MAAMG,YAAyC,GAAG,SAA5CA,YAA4C,CAACC,KAAD,EAAW;AAC3D,QAAI,CAAC9H,OAAD,IAAY,CAACiE,gBAAgB,CAACmB,OAA9B,IAAyC,CAAClB,sBAAsB,CAACkB,OAArE,EAA8E;AAC5E;AACD;;AAED,QAAMmB,MAAM,GAAGuB,KAAK,CAACC,WAAN,CAAkBC,aAAlB,CAAgCC,CAA/C;AACA,QAAMC,aAAa,GAAGJ,KAAK,CAACC,WAAN,CAAkBI,iBAAlB,CAAoCC,MAA1D;AACA,QAAMC,aAAa,GAAGP,KAAK,CAACC,WAAN,CAAkBO,WAAlB,CAA8BF,MAApD;AAEA,QAAMG,eAAe,GAAGhC,MAAM,GAAG,GAAjC;AACA,QAAMiC,aAAa,GAAGH,aAAa,GAAGH,aAAhB,GAAgC3B,MAAhC,GAAyC,GAA/D;;AAEA,QAAIgC,eAAJ,EAAqB;AACnB7B,MAAAA,uBAAuB;AACxB;;AAED,QAAI8B,aAAJ,EAAmB;AACjBZ,MAAAA,qBAAqB;AACtB;;AAGD,QAAMa,gBAAgB,GAAGlC,MAAM,IAAI,GAAnC;AACA,QAAMmC,wBAAwB,GAAG,CAACD,gBAAD,IAAqB,EAACzI,OAAD,YAACA,OAAO,CAAEwG,KAAT,CAAeC,UAAhB,CAAtD;AAEA,QAAMkC,cAAc,GAClB,CAAC/I,UAAD,IAAe2G,MAAM,IAAI,CAAzB,KAA8BvG,OAA9B,oBAA8BA,OAAO,CAAEwG,KAAT,CAAeC,UAA7C,KAA2DzG,OAAO,CAAC+F,WAAR,KAAwB,CADrF;;AAGA,QAAI4C,cAAJ,EAAoB;AAClBpH,MAAAA,QAAQ;AACT;;AAED,QAAImH,wBAAwB,IAAI,CAACnE,2BAAjC,EAA8D;AAC5DC,MAAAA,8BAA8B,CAAC,IAAD,CAA9B;AACD,KAFD,MAEO,IAAI,CAACkE,wBAAD,IAA6BnE,2BAAjC,EAA8D;AACnEC,MAAAA,8BAA8B,CAAC,KAAD,CAA9B;AACD;;AAED,QAAI3C,YAAJ,EAAkB;AAChBA,MAAAA,YAAY,CAACiG,KAAD,CAAZ;AACD;AACF,GAxCD;;AA0CA,MAAMc,eAAe;AAAA,gFAAG;AAAA;AAAA;AAAA;AAAA;AAAA,kBACjB5I,OADiB,YACjBA,OAAO,CAAEwG,KAAT,CAAeC,UADE;AAAA;AAAA;AAAA;;AAEpBX,cAAAA,uBAAuB;AAFH;AAAA,qBAId9D,aAAa,EAJC;;AAAA;AAAA;AAAA;;AAAA;AAKf,kBAAIgC,WAAW,CAACoB,OAAhB,EAAyB;AAC9BpB,gBAAAA,WAAW,CAACoB,OAAZ,CAAoBkB,cAApB,CAAmC;AACjCC,kBAAAA,MAAM,EAAE;AADyB,iBAAnC;AAGD;;AATqB;AAWtB/B,cAAAA,8BAA8B,CAAC,KAAD,CAA9B;;AACA,kBAAI,CAAC5E,UAAL,EAAiB;AACf2B,gBAAAA,QAAQ;AACT;;AAdqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAH;;AAAA,oBAAfqH,eAAe;AAAA;AAAA;AAAA,KAArB;;AAiBA,MAAM1B,WAAW,GAAG,wBAClB,UAAC2B,SAAD,EAAuB;AACrB,QAAMC,0BAA0B,GAAG5F,WAAW,CAAC6F,SAAZ,CACjC,UAAC7D,OAAD;AAAA,aAAa,CAAAA,OAAO,QAAP,YAAAA,OAAO,CAAEjG,EAAT,MAAgB4J,SAA7B;AAAA,KADiC,CAAnC;;AAIA,QAAIC,0BAA0B,GAAG,CAAC,CAAlC,EAAqC;AACnC,UAAI;AACF,YAAI9E,WAAW,CAACoB,OAAhB,EAAyB;AACvBpB,UAAAA,WAAW,CAACoB,OAAZ,CAAoB4D,aAApB,CAAkC;AAChCpC,YAAAA,KAAK,EAAEkC,0BADyB;AAEhCG,YAAAA,YAAY,EAAE;AAFkB,WAAlC;AAIA1G,UAAAA,kBAAkB,CAACsG,SAAD,CAAlB;AAEA;AACD;AACF,OAVD,CAUE,OAAOK,CAAP,EAAU,CAEX;AACF;;AAEDjI,IAAAA,oBAAoB,CAAC;AAAE4H,MAAAA,SAAS,EAATA;AAAF,KAAD,CAApB;AACA/C,IAAAA,uBAAuB;AACxB,GAxBiB,EAyBlB,CAACxC,4BAAD,CAzBkB,CAApB;AA4BA,MAAM6F,kBAAkB,GACtBnI,+BAA+B,IAC/BkC,WAAW,CAACkG,MAAZ,CAAmB,UAAClE,OAAD,EAAa;AAC9B,QAAI,CAACA,OAAO,CAACS,UAAT,IAAuBT,OAAO,CAACmE,WAAnC,EAAgD;AAC9C,aAAOnE,OAAO,CAACmE,WAAR,CAAoBC,IAApB,CACL,UAACC,UAAD;AAAA,eACEA,UAAU,CAACvC,IAAX,KAAoB,OAApB,IACA,CAACuC,UAAU,CAACC,UADZ,IAEA,CAACD,UAAU,CAACE,aAFZ,KAGCF,UAAU,CAACG,SAAX,IAAwBH,UAAU,CAACI,SAHpC,CADF;AAAA,OADK,CAAP;AAOD;;AACD,WAAO,KAAP;AACD,GAXD,CAFF;AAmBA,MAAMC,WAAW,GACf5I,+BAA+B,IAC/BmI,kBADA,IAEAA,kBAAkB,CACfU,GADH,CACO,UAAC3E,OAAD;AAAA;;AAAA,mCACHA,OAAO,CAACmE,WADL,qBACH,qBACIQ,GADJ,CACQ,UAACN,UAAD;AAAA,aAAgBA,UAAU,CAACG,SAAX,IAAwBH,UAAU,CAACI,SAAnC,IAAgD,EAAhE;AAAA,KADR,EAEGG,IAFH,EADG;AAAA,GADP,EAMGA,IANH,EAHF;AAWA,MAAMC,0BAA0B,GAC9B/I,+BAA+B,IAAImI,kBAAnC,IAAyDA,kBAAkB,CAAC5F,MAD9E;AAEA,MAAMyG,YAAY,GAAG,CAAC,CAACrH,MAAvB;AAEA,wBAAU,YAAM;AACd,QAAI3B,+BAA+B,KAAMpB,UAAU,IAAI+C,MAAf,IAA2B,CAAC/C,UAAD,IAAe,CAAC+C,MAAhD,CAAnC,EAA6F;AAC3FN,MAAAA,SAAS,CAAC8G,kBAAD,CAAT;AACD;AACF,GAJD,EAIG,CACDS,WADC,EAED5I,+BAFC,EAGD+I,0BAHC,EAIDC,YAJC,EAKDpK,UALC,CAJH;AAYA,MAAMqK,sBAAsB,GAC1B,CAAAxF,gBAAgB,QAAhB,YAAAA,gBAAgB,CAAEyF,WAAlB,QAAoC,IAAI9K,IAAJ,GAAW8K,WAAX,EAApC,GAA+D,OAA/D,GAAyE,aAD3E;AAEA,MAAMC,iBAAiB,GACrB1F,gBAAgB,IAAI,CAAC9D,oBAArB,GAA4C+B,eAAe,CAAC+B,gBAAD,CAA3D,GAAgF,IADlF;AAEA,MAAM2F,wBAAwB,GAC5BD,iBAAiB,KAAK,IAAtB,IAA8BxJ,oBAA9B,GACI,IADJ,GAEI,uCAAcwJ,iBAAd,IACAA,iBAAiB,CAACE,MAAlB,CAAyBJ,sBAAzB,CADA,GAEA,IAAI7K,IAAJ,CAAS+K,iBAAT,EAA4BvE,YAA5B,EALN;;AAOA,MAAM0E,kBAAkB,GAAG,SAArBA,kBAAqB,GAAM;AAC/B,QAAI,CAACnG,QAAD,IAAahC,cAAjB,EAAiC;AAC/BG,MAAAA,iBAAiB,CAACyC,SAAD,CAAjB;AACA7E,MAAAA,WAAW;AACZ;AACF,GALD;;AAMA,MAAMqK,iBAAiB,GAAG,SAApBA,iBAAoB;AAAA,WAAM,CAACpG,QAAD,IAAahC,cAAb,IAA+BiC,WAAW,CAAC,IAAD,CAAhD;AAAA,GAA1B;;AACA,MAAMoG,eAAe,GAAG,SAAlBA,eAAkB;AAAA,WAAMrG,QAAQ,IAAIhC,cAAZ,IAA8BiC,WAAW,CAAC,KAAD,CAA/C;AAAA,GAAxB;;AAEA,MAAMqG,WAAW,GAAG,SAAdA,WAAc,CAACC,GAAD,EAAgE;AAClF1G,IAAAA,WAAW,CAACoB,OAAZ,GAAsBsF,GAAtB;;AAEA,QAAItI,cAAJ,EAAoB;AAClBA,MAAAA,cAAc,CAACsI,GAAD,CAAd;AACD;AACF,GAND;;AAOA,MAAMC,wBAAwB,GAAG,SAA3BA,wBAA2B;AAAA,WAC/B,gCAAC,iBAAD;AAAM,MAAA,KAAK,EAAE,CAAC/M,MAAM,CAACK,IAAR,EAAcL,MAAM,CAACU,MAArB,CAAb;AAA2C,MAAA,MAAM,EAAC,aAAlD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OACE,gCAAC,mBAAD;AAAqB,MAAA,QAAQ,EAAC,SAA9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MADF,CAD+B;AAAA,GAAjC;;AAMA,MAAI,CAACiC,QAAL,EAAe,OAAO,IAAP;;AAEf,MAAIW,OAAJ,EAAa;AACX,WACE,gCAAC,iBAAD;AAAM,MAAA,KAAK,EAAEtD,MAAM,CAACK,IAApB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OACE,gCAAC,gBAAD;AAAkB,MAAA,QAAQ,EAAC,SAA3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MADF,CADF;AAKD;;AAED,SACE,gCAAC,iBAAD;AAAM,IAAA,KAAK,EAAE,CAACL,MAAM,CAACG,SAAR,EAAmB;AAAE6M,MAAAA,eAAe,EAAE5H;AAAnB,KAAnB,EAAoDjF,SAApD,CAAb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KACE,gCAAC,QAAD;AACE,IAAA,qBAAqB,EAAE,CAACH,MAAM,CAACO,gBAAR,EAA0BA,gBAA1B,CADzB;AAEE,IAAA,IAAI,EAAE+E,WAFR;AAIE,IAAA,SAAS,EAAE9C,QAAQ,IAAI,EAACJ,OAAD,YAACA,OAAO,CAAEwG,KAAT,CAAeC,UAAhB,CAJzB;AAKE,IAAA,QAAQ,EAAE1F,QALZ;AAME,IAAA,yBAAyB,EAAC,SAN5B;AAOE,IAAA,YAAY,EAAEhC,YAPhB;AAQE,IAAA,kBAAkB,EAAE4L,wBARtB;AASE,IAAA,mBAAmB,EAAEnK,eATvB;AAUE,IAAA,mBAAmB,EAAEC,eAVvB;AAWE,IAAA,8BAA8B,EAAE;AAC9BoK,MAAAA,wBAAwB,EAAEnH,eAAe,GAAG,EAAH,GAAQqB,SADnB;AAE9B+F,MAAAA,kBAAkB,EAAE;AAFU,KAXlC;AAeE,IAAA,QAAQ,EAAEjD,YAfZ;AAgBE,IAAA,iBAAiB,EAAE0C,iBAhBrB;AAiBE,IAAA,eAAe,EAAEC,eAjBnB;AAkBE,IAAA,UAAU,EAAEF,kBAlBd;AAmBE,IAAA,sBAAsB,EAAEzE,sBAAsB,CAACT,OAnBjD;AAoBE,IAAA,GAAG,EAAEqF,WApBP;AAqBE,IAAA,UAAU,EAAE9D,UArBd;AAsBE,IAAA,aAAa,EAAE5E,OAAO,KAAK,MAtB7B;AAuBE,IAAA,KAAK,EAAE,CAACnE,MAAM,CAACa,aAAR,EAAuBA,aAAvB,CAvBT;AAwBE,IAAA,MAAM,EAAC,mBAxBT;AAyBE,IAAA,iBAAiB,EAAEc;AAzBrB,KA0BMQ,uBA1BN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KADF,EA6BG,CAACmB,OAAD,IACC,kEACE,gCAAC,iBAAD;AAAM,IAAA,KAAK,EAAEtD,MAAM,CAACgB,YAApB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KACGwL,wBAAwB,KACtB5H,YAAY,GACX,gCAAC,YAAD;AAAc,IAAA,UAAU,EAAE4H,wBAA1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IADW,GAET9G,4BAA4B,GAC9B,gCAAC,UAAD;AAAY,IAAA,UAAU,EAAE8G,wBAAxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAD8B,GAE5B,IALmB,CAD3B,CADF,EASG,CAAC/J,sBAAD,IAA2BwC,eAA3B,IAA8CD,mBAAmB,KAAK,KAAtE,IACC,gCAAC,wBAAD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KACE,gCAAC,eAAD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IADF,CAVJ,EAcE,gCAAC,oBAAD;AACE,IAAA,OAAO,EAAEgG,eADX;AAEE,IAAA,gBAAgB,EAAErE,2BAFpB;AAGE,IAAA,WAAW,EAAE3E,UAAU,GAAG,CAAH,GAAOI,OAAP,oBAAOA,OAAO,CAAE+F,WAAT,EAHhC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAdF,CA9BJ,EAmDE,gCAAC,oBAAD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAnDF,CADF;AAuDD,CArrBD;;AAisBO,IAAMgF,WAAW,GAAG,SAAdA,WAAc,CASzBrL,KATyB,EAUtB;AACH,8BAA2D,0DAA3D;AAAA,MAAQQ,WAAR,yBAAQA,WAAR;AAAA,MAAqBiC,cAArB,yBAAqBA,cAArB;AAAA,MAAqCG,iBAArC,yBAAqCA,iBAArC;;AACA,2BAkBI,wCAlBJ;AAAA,MACEtC,OADF,sBACEA,OADF;AAAA,MAEEI,QAFF,sBAEEA,QAFF;AAAA,MAGEE,mBAHF,sBAGEA,mBAHF;AAAA,MAIE0K,2BAJF,sBAIEA,2BAJF;AAAA,MAKEC,KALF,sBAKEA,KALF;AAAA,MAMEtK,oBANF,sBAMEA,oBANF;AAAA,MAOEM,oBAPF,sBAOEA,oBAPF;AAAA,MAQEC,OARF,sBAQEA,OARF;AAAA,MASEC,gBATF,sBASEA,gBATF;AAAA,MAUEI,QAVF,sBAUEA,QAVF;AAAA,MAWEI,oBAXF,sBAWEA,oBAXF;AAAA,MAYEK,aAZF,sBAYEA,aAZF;AAAA,MAaEE,4BAbF,sBAaEA,4BAbF;AAAA,MAcEK,kBAdF,sBAcEA,kBAdF;AAAA,MAeEC,YAfF,sBAeEA,YAfF;AAAA,MAgBEC,eAhBF,sBAgBEA,eAhBF;AAAA,MAiBEG,mBAjBF,sBAiBEA,mBAjBF;;AAmBA,wBAAmB,kCAAnB;AAAA,MAAQ3C,MAAR,mBAAQA,MAAR;;AACA,8BAAsB,kDAAtB;AAAA,MAAQoC,SAAR,yBAAQA,SAAR;;AACA,4BAcI,0CAdJ;AAAA,MACElC,UADF,uBACEA,UADF;AAAA,MAEEE,sBAFF,uBAEEA,sBAFF;AAAA,MAGEE,QAHF,uBAGEA,QAHF;AAAA,MAIEK,iCAJF,uBAIEA,iCAJF;AAAA,MAKEC,mBALF,uBAKEA,mBALF;AAAA,MAMEC,qBANF,uBAMEA,qBANF;AAAA,MAOEE,+BAPF,uBAOEA,+BAPF;AAAA,MAQEQ,OARF,uBAQEA,OARF;AAAA,MASEC,aATF,uBASEA,aATF;AAAA,MAUEC,cAVF,uBAUEA,cAVF;AAAA,MAWEO,oBAXF,uBAWEA,oBAXF;AAAA,MAYEY,eAZF,uBAYEA,eAZF;AAAA,MAaEC,wBAbF,uBAaEA,wBAbF;;AAeA,8BAAqC,kEAArC;AAAA,MAAQ1B,QAAR,yBAAQA,QAAR;AAAA,MAAkBC,cAAlB,yBAAkBA,cAAlB;;AACA,2BAAoB,wCAApB;AAAA,MAAQU,OAAR,sBAAQA,OAAR;;AACA,0BAAmC,sCAAnC;AAAA,MAAQT,cAAR,qBAAQA,cAAR;AAAA,MAAwBqB,MAAxB,qBAAwBA,MAAxB;;AACA,8BAA+B,gDAA/B;AAAA,MAAQuI,CAAR,yBAAQA,CAAR;AAAA,MAAWxI,eAAX,yBAAWA,eAAX;;AAEA,SACE,gCAAC,sBAAD;AAEI1C,IAAAA,OAAO,EAAPA,OAFJ;AAGIC,IAAAA,MAAM,EAANA,MAHJ;AAIIC,IAAAA,WAAW,EAAXA,WAJJ;AAKIC,IAAAA,UAAU,EAAVA,UALJ;AAMIC,IAAAA,QAAQ,EAARA,QANJ;AAOIC,IAAAA,sBAAsB,EAAtBA,sBAPJ;AAQIC,IAAAA,mBAAmB,EAAnBA,mBARJ;AASI0K,IAAAA,2BAA2B,EAA3BA,2BATJ;AAUIC,IAAAA,KAAK,EAALA,KAVJ;AAWI1K,IAAAA,QAAQ,EAARA,QAXJ;AAYII,IAAAA,oBAAoB,EAApBA,oBAZJ;AAaIC,IAAAA,iCAAiC,EAAjCA,iCAbJ;AAcIC,IAAAA,mBAAmB,EAAnBA,mBAdJ;AAeIC,IAAAA,qBAAqB,EAArBA,qBAfJ;AAgBIE,IAAAA,+BAA+B,EAA/BA,+BAhBJ;AAiBIC,IAAAA,oBAAoB,EAApBA,oBAjBJ;AAkBIC,IAAAA,OAAO,EAAPA,OAlBJ;AAmBIC,IAAAA,gBAAgB,EAAhBA,gBAnBJ;AAoBIC,IAAAA,QAAQ,EAARA,QApBJ;AAqBIC,IAAAA,cAAc,EAAdA,cArBJ;AAsBIC,IAAAA,cAAc,EAAdA,cAtBJ;AAuBIC,IAAAA,QAAQ,EAARA,QAvBJ;AAwBIC,IAAAA,OAAO,EAAPA,OAxBJ;AAyBIC,IAAAA,aAAa,EAAbA,aAzBJ;AA0BIC,IAAAA,cAAc,EAAdA,cA1BJ;AA2BIC,IAAAA,oBAAoB,EAApBA,oBA3BJ;AA4BII,IAAAA,OAAO,EAAPA,OA5BJ;AA6BIC,IAAAA,aAAa,EAAbA,aA7BJ;AA8BIC,IAAAA,oBAAoB,EAApBA,oBA9BJ;AA+BIC,IAAAA,4BAA4B,EAA5BA,4BA/BJ;AAgCIC,IAAAA,cAAc,EAAdA,cAhCJ;AAiCIE,IAAAA,SAAS,EAATA,SAjCJ;AAkCIC,IAAAA,iBAAiB,EAAjBA,iBAlCJ;AAmCIC,IAAAA,kBAAkB,EAAlBA,kBAnCJ;AAoCIC,IAAAA,YAAY,EAAZA,YApCJ;AAqCI0I,IAAAA,CAAC,EAADA,CArCJ;AAsCIzI,IAAAA,eAAe,EAAfA,eAtCJ;AAuCIC,IAAAA,eAAe,EAAfA,eAvCJ;AAwCIC,IAAAA,MAAM,EAANA,MAxCJ;AAyCIC,IAAAA,mBAAmB,EAAnBA,mBAzCJ;AA0CIC,IAAAA,eAAe,EAAfA,eA1CJ;AA2CIC,IAAAA,wBAAwB,EAAxBA;AA3CJ,KA6CMpD,KA7CN;AA8CE,IAAA,aAAa,EAAE,CAACsL,2BAAD,IAAgCtL,KAAK,CAACkC,aA9CvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KADF;AAkDD,CAvGM","sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n FlatListProps,\n FlatList as FlatListType,\n ScrollViewProps,\n StyleSheet,\n View,\n ViewToken,\n} from 'react-native';\n\nimport {\n isMessageWithStylesReadByAndDateSeparator,\n MessageType,\n useMessageList,\n} from './hooks/useMessageList';\nimport { InlineLoadingMoreIndicator } from './InlineLoadingMoreIndicator';\nimport { InlineLoadingMoreRecentIndicator } from './InlineLoadingMoreRecentIndicator';\nimport { InlineLoadingMoreThreadIndicator } from './InlineLoadingMoreThreadIndicator';\nimport { getLastReceivedMessage } from './utils/getLastReceivedMessage';\n\nimport {\n AttachmentPickerContextValue,\n useAttachmentPickerContext,\n} from '../../contexts/attachmentPickerContext/AttachmentPickerContext';\nimport {\n ChannelContextValue,\n useChannelContext,\n} from '../../contexts/channelContext/ChannelContext';\nimport { ChatContextValue, useChatContext } from '../../contexts/chatContext/ChatContext';\nimport {\n ImageGalleryContextValue,\n useImageGalleryContext,\n} from '../../contexts/imageGalleryContext/ImageGalleryContext';\nimport {\n MessagesContextValue,\n useMessagesContext,\n} from '../../contexts/messagesContext/MessagesContext';\nimport {\n OverlayContextValue,\n useOverlayContext,\n} from '../../contexts/overlayContext/OverlayContext';\nimport {\n PaginatedMessageListContextValue,\n usePaginatedMessageListContext,\n} from '../../contexts/paginatedMessageListContext/PaginatedMessageListContext';\nimport { ThreadContextValue, useThreadContext } from '../../contexts/threadContext/ThreadContext';\nimport { mergeThemes, ThemeProvider, useTheme } from '../../contexts/themeContext/ThemeContext';\nimport {\n isDayOrMoment,\n TranslationContextValue,\n useTranslationContext,\n} from '../../contexts/translationContext/TranslationContext';\n\nimport type { Channel as StreamChannel } from 'stream-chat';\n\nimport type {\n DefaultAttachmentType,\n DefaultChannelType,\n DefaultCommandType,\n DefaultEventType,\n DefaultMessageType,\n DefaultReactionType,\n DefaultUserType,\n UnknownType,\n} from '../../types/types';\n\nconst styles = StyleSheet.create({\n container: {\n alignItems: 'center',\n flex: 1,\n width: '100%',\n },\n contentContainer: {\n flexGrow: 1,\n /**\n * paddingBottom is set to 4 to account for the default date\n * header and inline indicator alignment. The top margin is 8\n * on the header but 4 on the inline date, this adjusts the spacing\n * to allow the \"first\" inline date to align with the date header.\n */\n paddingBottom: 4,\n },\n flex: { flex: 1 },\n invert: { transform: [{ scaleY: -1 }] },\n listContainer: {\n flex: 1,\n width: '100%',\n },\n messagePadding: {\n paddingHorizontal: 8,\n },\n stickyHeader: {\n position: 'absolute',\n top: 0,\n },\n});\n\nconst keyExtractor = <\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n>(\n item: MessageType<At, Ch, Co, Ev, Me, Re, Us>,\n) =>\n item.id ||\n (item.created_at\n ? typeof item.created_at === 'string'\n ? item.created_at\n : item.created_at.toISOString()\n : Date.now().toString());\n\nconst flatListViewabilityConfig = {\n viewAreaCoveragePercentThreshold: 1,\n};\n\ntype MessageListPropsWithContext<\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n> = Pick<AttachmentPickerContextValue, 'closePicker' | 'selectedPicker' | 'setSelectedPicker'> &\n Pick<\n ChannelContextValue<At, Ch, Co, Ev, Me, Re, Us>,\n | 'channel'\n | 'disabled'\n | 'EmptyStateIndicator'\n | 'hideStickyDateHeader'\n | 'loadChannelAtMessage'\n | 'loading'\n | 'LoadingIndicator'\n | 'markRead'\n | 'NetworkDownIndicator'\n | 'reloadChannel'\n | 'scrollToFirstUnreadThreshold'\n | 'setTargetedMessage'\n | 'StickyHeader'\n | 'targetedMessage'\n | 'typingEventsEnabled'\n > &\n Pick<ChatContextValue<At, Ch, Co, Ev, Me, Re, Us>, 'client'> &\n Pick<ImageGalleryContextValue<At, Ch, Co, Ev, Me, Re, Us>, 'setImages'> &\n Pick<\n PaginatedMessageListContextValue<At, Ch, Co, Ev, Me, Re, Us>,\n 'loadMore' | 'loadMoreRecent'\n > &\n Pick<OverlayContextValue, 'overlay'> &\n Pick<\n MessagesContextValue<At, Ch, Co, Ev, Me, Re, Us>,\n | 'DateHeader'\n | 'disableTypingIndicator'\n | 'FlatList'\n | 'initialScrollToFirstUnreadMessage'\n | 'InlineDateSeparator'\n | 'InlineUnreadIndicator'\n | 'legacyImageViewerSwipeBehaviour'\n | 'Message'\n | 'ScrollToBottomButton'\n | 'MessageSystem'\n | 'myMessageTheme'\n | 'TypingIndicator'\n | 'TypingIndicatorContainer'\n > &\n Pick<ThreadContextValue<At, Ch, Co, Ev, Me, Re, Us>, 'loadMoreThread' | 'thread'> &\n Pick<TranslationContextValue, 't' | 'tDateTimeParser'> & {\n /**\n * Besides existing (default) UX behavior of underlying FlatList of MessageList component, if you want\n * to attach some additional props to underlying FlatList, you can add it to following prop.\n *\n * You can find list of all the available FlatList props here - https://facebook.github.io/react-native/docs/flatlist#props\n *\n * **NOTE** Don't use `additionalFlatListProps` to get access to ref of flatlist. Use `setFlatListRef` instead.\n *\n * e.g.\n * ```js\n * <MessageList\n * additionalFlatListProps={{ bounces: true, keyboardDismissMode: true }} />\n * ```\n */\n additionalFlatListProps?: Partial<FlatListProps<MessageType<At, Ch, Co, Ev, Me, Re, Us>>>;\n /**\n * UI component for footer of message list. By default message list will use `InlineLoadingMoreIndicator`\n * as FooterComponent. If you want to implement your own inline loading indicator, you can access `loadingMore`\n * from context.\n *\n * This is a [ListHeaderComponent](https://facebook.github.io/react-native/docs/flatlist#listheadercomponent) of FlatList\n * used in MessageList. Should be used for header by default if inverted is true or defaulted\n */\n FooterComponent?: React.ComponentType;\n /**\n * UI component for header of message list. By default message list will use `InlineLoadingMoreRecentIndicator`\n * as HeaderComponent. If you want to implement your own inline loading indicator, you can access `loadingMoreRecent`\n * from context.\n *\n * This is a [ListFooterComponent](https://facebook.github.io/react-native/docs/flatlist#listheadercomponent) of FlatList\n * used in MessageList. Should be used for header if inverted is false\n */\n HeaderComponent?: React.ComponentType;\n /** Whether or not the FlatList is inverted. Defaults to true */\n inverted?: boolean;\n /** Turn off grouping of messages by user */\n noGroupByUser?: boolean;\n onListScroll?: ScrollViewProps['onScroll'];\n /**\n * Handler to open the thread on message. This is callback for touch event for replies button.\n *\n * @param message A message object to open the thread upon.\n */\n onThreadSelect?: (message: ThreadContextValue<At, Ch, Co, Ev, Me, Re, Us>['thread']) => void;\n /**\n * Use `setFlatListRef` to get access to ref to inner FlatList.\n *\n * e.g.\n * ```js\n * <MessageList\n * setFlatListRef={(ref) => {\n * // Use ref for your own good\n * }}\n * ```\n */\n setFlatListRef?: (ref: FlatListType<MessageType<At, Ch, Co, Ev, Me, Re, Us>> | null) => void;\n /**\n * Boolean whether or not the Messages in the MessageList are part of a Thread\n **/\n threadList?: boolean;\n };\n\n/**\n * The message list component renders a list of messages. It consumes the following contexts:\n *\n * [ChannelContext](https://getstream.github.io/stream-chat-react-native/v3/#channelcontext)\n * [ChatContext](https://getstream.github.io/stream-chat-react-native/v3/#chatcontext)\n * [MessagesContext](https://getstream.github.io/stream-chat-react-native/v3/#messagescontext)\n * [ThreadContext](https://getstream.github.io/stream-chat-react-native/v3/#threadcontext)\n * [TranslationContext](https://getstream.github.io/stream-chat-react-native/v3/#translationcontext)\n */\nconst MessageListWithContext = <\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n>(\n props: MessageListPropsWithContext<At, Ch, Co, Ev, Me, Re, Us>,\n) => {\n const LoadingMoreIndicator = props.threadList\n ? InlineLoadingMoreThreadIndicator\n : InlineLoadingMoreIndicator;\n const {\n additionalFlatListProps,\n channel,\n client,\n closePicker,\n DateHeader,\n disabled,\n disableTypingIndicator,\n EmptyStateIndicator,\n FlatList,\n FooterComponent = LoadingMoreIndicator,\n HeaderComponent = InlineLoadingMoreRecentIndicator,\n hideStickyDateHeader,\n initialScrollToFirstUnreadMessage,\n InlineDateSeparator,\n InlineUnreadIndicator,\n inverted = true,\n legacyImageViewerSwipeBehaviour,\n loadChannelAtMessage,\n loading,\n LoadingIndicator,\n loadMore,\n loadMoreRecent,\n loadMoreThread,\n markRead,\n Message,\n MessageSystem,\n myMessageTheme,\n NetworkDownIndicator,\n noGroupByUser,\n onListScroll,\n onThreadSelect,\n overlay,\n reloadChannel,\n ScrollToBottomButton,\n scrollToFirstUnreadThreshold,\n selectedPicker,\n setFlatListRef,\n setImages,\n setSelectedPicker,\n setTargetedMessage,\n StickyHeader,\n targetedMessage,\n tDateTimeParser,\n thread,\n threadList = false,\n typingEventsEnabled,\n TypingIndicator,\n TypingIndicatorContainer,\n } = props;\n\n const { theme } = useTheme();\n\n const {\n colors: { white_snow },\n messageList: { container, contentContainer, listContainer },\n } = theme;\n\n const modifiedTheme = useMemo(\n () => mergeThemes({ style: myMessageTheme, theme }),\n [myMessageTheme, theme],\n );\n\n const messageList = useMessageList<At, Ch, Co, Ev, Me, Re, Us>({\n inverted,\n noGroupByUser,\n threadList,\n });\n const messageListLengthBeforeUpdate = useRef(0);\n const messageListLengthAfterUpdate = messageList.length;\n\n /**\n * We need topMessage and channelLastRead values to set the initial scroll position.\n * So these values only get used if `initialScrollToFirstUnreadMessage` prop is true.\n */\n const topMessageBeforeUpdate = useRef<MessageType<At, Ch, Co, Ev, Me, Re, Us>>();\n const topMessageAfterUpdate = messageList[messageList.length - 1];\n\n const [autoscrollToTop, setAutoscrollToTop] = useState(false);\n\n /**\n * We want to call onEndReached and onStartReached only once, per content length.\n * We keep track of calls to these functions per content length, with following trackers.\n */\n const onStartReachedTracker = useRef<Record<number, boolean>>({});\n const onEndReachedTracker = useRef<Record<number, boolean>>({});\n\n const onStartReachedInPromise = useRef<Promise<void> | null>(null);\n const onEndReachedInPromise = useRef<Promise<void> | null>(null);\n\n const flatListRef = useRef<FlatListType<MessageType<At, Ch, Co, Ev, Me, Re, Us>> | null>(null);\n\n const initialScrollSet = useRef<boolean>(false);\n const channelResyncScrollSet = useRef<boolean>(true);\n\n const [hasMoved, setHasMoved] = useState(false);\n const [lastReceivedId, setLastReceivedId] = useState(getLastReceivedMessage(messageList)?.id);\n const [scrollToBottomButtonVisible, setScrollToBottomButtonVisible] = useState(false);\n\n const [stickyHeaderDate, setStickyHeaderDate] = useState<Date | undefined>();\n const stickyHeaderDateRef = useRef<Date | undefined>();\n /**\n * channel.lastRead throws error if the channel is not initialized.\n */\n const getLastReadSafely = () => (channel?.initialized ? channel.lastRead() : undefined);\n\n const channelLastRead = useRef(getLastReadSafely());\n\n const isUnreadMessage = (\n message: MessageType<At, Ch, Co, Ev, Me, Re, Us> | undefined,\n lastRead?: ReturnType<StreamChannel<At, Ch, Co, Ev, Me, Re, Us>['lastRead']>,\n ) => message && lastRead && message.created_at && lastRead < message.created_at;\n\n /**\n * If the top message in the list is unread, then we should scroll to top of the list.\n * This is to handle the case when entire message list is unread.\n * This scroll get set only on load, and never again.\n */\n const setInitialScrollIfNeeded = () => {\n // If the feature is disabled or initial scroll position is already set.\n if (!initialScrollToFirstUnreadMessage || initialScrollSet.current) {\n initialScrollSet.current = true;\n return;\n }\n if (isUnreadMessage(topMessageBeforeUpdate.current, channelLastRead.current)) {\n if (flatListRef.current) {\n flatListRef.current.scrollToEnd();\n }\n setTimeout(() => {\n initialScrollSet.current = true;\n }, 500);\n } else if (!initialScrollSet.current) {\n initialScrollSet.current = true;\n }\n };\n\n const updateStickyHeaderDateIfNeeded = (viewableItems: ViewToken[]) => {\n if (viewableItems.length) {\n const lastItem = viewableItems.pop() as {\n item: MessageType<At, Ch, Co, Ev, Me, Re, Us>;\n };\n\n if (\n lastItem?.item?.created_at &&\n !lastItem.item.deleted_at &&\n typeof lastItem.item.created_at !== 'string' &&\n lastItem.item.created_at.toDateString() !== stickyHeaderDateRef.current?.toDateString()\n ) {\n stickyHeaderDateRef.current = lastItem.item.created_at;\n setStickyHeaderDate(lastItem.item.created_at);\n }\n }\n };\n\n /**\n * FlatList doesn't accept changeable function for onViewableItemsChanged prop.\n * Thus useRef.\n */\n const onViewableItemsChanged = useRef(\n ({ viewableItems }: { viewableItems: ViewToken[] | undefined }) => {\n if (viewableItems && !hideStickyDateHeader) {\n updateStickyHeaderDateIfNeeded(viewableItems);\n }\n setInitialScrollIfNeeded();\n },\n );\n\n const resetPaginationTrackers = () => {\n onStartReachedTracker.current = {};\n onEndReachedTracker.current = {};\n };\n\n useEffect(() => {\n setScrollToBottomButtonVisible(false);\n }, [disabled]);\n\n useEffect(() => {\n if (!loading && channel && channel.countUnread() <= scrollToFirstUnreadThreshold) {\n markRead();\n }\n }, [loading]);\n\n useEffect(() => {\n const lastReceivedMessage = getLastReceivedMessage(messageList);\n\n const hasNewMessage = lastReceivedId !== lastReceivedMessage?.id;\n const isMyMessage = lastReceivedMessage?.user?.id === client.userID;\n\n setLastReceivedId(lastReceivedMessage?.id);\n\n /**\n * Scroll down when\n * 1. you send a new message to channel\n * 2. new message list is small than the one before update - channel has resynced\n * 3. created_at timestamp of top message before update is lesser than created_at timestamp of top message after update - channel has resynced\n */\n const scrollToBottomIfNeeded = () => {\n if (!client || !channel || messageList.length === 0) {\n return;\n }\n\n if (\n (hasNewMessage && isMyMessage) ||\n messageListLengthAfterUpdate < messageListLengthBeforeUpdate.current ||\n (topMessageBeforeUpdate.current?.created_at &&\n topMessageAfterUpdate?.created_at &&\n topMessageBeforeUpdate.current.created_at < topMessageAfterUpdate.created_at)\n ) {\n channelResyncScrollSet.current = false;\n setScrollToBottomButtonVisible(false);\n resetPaginationTrackers();\n\n setTimeout(\n () =>\n flatListRef.current?.scrollToOffset({\n offset: 0,\n }),\n 50,\n );\n setTimeout(() => {\n channelResyncScrollSet.current = true;\n if (channel.countUnread() > 0) {\n markRead();\n }\n }, 500);\n }\n };\n\n if (threadList || channel?.state.isUpToDate) {\n scrollToBottomIfNeeded();\n } else if (!scrollToBottomButtonVisible) {\n setScrollToBottomButtonVisible(true);\n }\n\n if (\n !channel?.state.isUpToDate &&\n flatListRef.current &&\n messageListLengthBeforeUpdate.current === 0 &&\n messageListLengthAfterUpdate < 10\n ) {\n /**\n * Trigger onStartReached on first load, if messages are not enough to fill the screen.\n * This is important especially for android, where you can't overscroll.\n */\n maybeCallOnStartReached(10);\n }\n\n /**\n * channelLastRead and topMessage are only used for setting initial scroll.\n * So lets not set it if `initialScrollToFirstUnreadMessage` prop is false.\n * OR if the scroll is already set.\n */\n if (initialScrollToFirstUnreadMessage && !initialScrollSet.current) {\n channelLastRead.current = getLastReadSafely();\n }\n\n messageListLengthBeforeUpdate.current = messageListLengthAfterUpdate;\n topMessageBeforeUpdate.current = topMessageAfterUpdate;\n }, [messageListLengthAfterUpdate, topMessageAfterUpdate?.id]);\n\n useEffect(() => {\n if (!channel?.state.isUpToDate && autoscrollToTop) {\n setAutoscrollToTop(false);\n } else if (channel?.state.isUpToDate && !autoscrollToTop) {\n setAutoscrollToTop(true);\n }\n }, [messageListLengthAfterUpdate]);\n\n const renderItem = ({\n index,\n item: message,\n }: {\n index: number;\n item: MessageType<At, Ch, Co, Ev, Me, Re, Us>;\n }) => {\n if (!channel || !channel.initialized) return null;\n\n const lastRead = getLastReadSafely();\n\n const lastMessage = messageList?.[index + 1];\n\n const showUnreadUnderlay = !!isUnreadMessage(message, lastRead) && scrollToBottomButtonVisible;\n const insertInlineUnreadIndicator =\n showUnreadUnderlay && !isUnreadMessage(lastMessage, lastRead);\n\n if (message.type === 'system') {\n return (\n <>\n <MessageSystem message={message} style={styles.messagePadding} />\n {insertInlineUnreadIndicator && <InlineUnreadIndicator />}\n </>\n );\n }\n\n const wrapMessageInTheme = client.userID === message.user?.id && !!myMessageTheme;\n return wrapMessageInTheme ? (\n <>\n <ThemeProvider mergedStyle={modifiedTheme}>\n <Message\n goToMessage={goToMessage}\n groupStyles={\n isMessageWithStylesReadByAndDateSeparator(message) ? message.groupStyles : []\n }\n lastReceivedId={lastReceivedId === message.id ? lastReceivedId : undefined}\n message={message}\n onThreadSelect={onThreadSelect}\n showUnreadUnderlay={showUnreadUnderlay}\n style={styles.messagePadding}\n targetedMessage={targetedMessage === message.id}\n threadList={threadList}\n />\n </ThemeProvider>\n {isMessageWithStylesReadByAndDateSeparator(message) && message.dateSeparator && (\n <InlineDateSeparator date={message.dateSeparator} />\n )}\n {/* Adding indicator below the messages, since the list is inverted */}\n {insertInlineUnreadIndicator && <InlineUnreadIndicator />}\n </>\n ) : (\n <>\n <Message\n goToMessage={goToMessage}\n groupStyles={\n isMessageWithStylesReadByAndDateSeparator(message) ? message.groupStyles : []\n }\n lastReceivedId={\n lastReceivedId === message.id || message.quoted_message_id ? lastReceivedId : undefined\n }\n message={message}\n onThreadSelect={onThreadSelect}\n showUnreadUnderlay={showUnreadUnderlay}\n style={styles.messagePadding}\n targetedMessage={targetedMessage === message.id}\n threadList={threadList}\n />\n {isMessageWithStylesReadByAndDateSeparator(message) && message.dateSeparator && (\n <InlineDateSeparator date={message.dateSeparator} />\n )}\n {/* Adding indicator below the messages, since the list is inverted */}\n {insertInlineUnreadIndicator && <InlineUnreadIndicator />}\n </>\n );\n };\n\n /**\n * We are keeping full control on message pagination, and not relying on react-native for it.\n * The reasons being,\n * 1. FlatList doesn't support onStartReached prop\n * 2. `onEndReached` function prop available on react-native, gets executed\n * once per content length (and thats actually a nice optimization strategy).\n * But it also means, we always need to prioritize onEndReached above our\n * logic for `onStartReached`.\n * 3. `onEndReachedThreshold` prop decides - at which scroll position to call `onEndReached`.\n * Its a factor of content length (which is necessary for \"real\" infinite scroll). But on\n * the other hand, it also makes calls to `onEndReached` (and this `channel.query`) way\n * too early during scroll, which we don't really need. So we are going to instead\n * keep some fixed offset distance, to decide when to call `loadMore` or `loadMoreRecent`.\n *\n * We are still gonna keep the optimization, which react-native does - only call onEndReached\n * once per content length.\n */\n\n /**\n * 1. Makes a call to `loadMoreRecent` function, which queries more recent messages.\n * 2. Ensures that we call `loadMoreRecent`, once per content length\n * 3. If the call to `loadMore` is in progress, we wait for it to finish to make sure scroll doesn't jump.\n */\n const maybeCallOnStartReached = (limit?: number) => {\n // If onStartReached has already been called for given data length, then ignore.\n if (messageList?.length && onStartReachedTracker.current[messageList.length]) {\n return;\n }\n\n if (messageList?.length) {\n onStartReachedTracker.current[messageList.length] = true;\n }\n\n const callback = () => {\n onStartReachedInPromise.current = null;\n\n return Promise.resolve();\n };\n\n const onError = () => {\n /** Release the onStartReached trigger after 2 seconds, to try again */\n setTimeout(() => {\n onStartReachedTracker.current = {};\n }, 2000);\n };\n\n // If onEndReached is in progress, better to wait for it to finish for smooth UX\n if (onEndReachedInPromise.current) {\n onEndReachedInPromise.current.finally(() => {\n onStartReachedInPromise.current = loadMoreRecent(limit).then(callback).catch(onError);\n });\n } else {\n onStartReachedInPromise.current = loadMoreRecent(limit).then(callback).catch(onError);\n }\n };\n\n /**\n * 1. Makes a call to `loadMore` function, which queries more older messages.\n * 2. Ensures that we call `loadMore`, once per content length\n * 3. If the call to `loadMoreRecent` is in progress, we wait for it to finish to make sure scroll doesn't jump.\n */\n const maybeCallOnEndReached = () => {\n // If onEndReached has already been called for given messageList length, then ignore.\n if (messageList?.length && onEndReachedTracker.current[messageList.length]) {\n return;\n }\n\n if (messageList?.length) {\n onEndReachedTracker.current[messageList.length] = true;\n }\n\n const callback = () => {\n onEndReachedInPromise.current = null;\n return Promise.resolve();\n };\n\n const onError = () => {\n /** Release the onEndReachedTracker trigger after 2 seconds, to try again */\n setTimeout(() => {\n onEndReachedTracker.current = {};\n }, 2000);\n };\n\n // If onStartReached is in progress, better to wait for it to finish for smooth UX\n if (onStartReachedInPromise.current) {\n onStartReachedInPromise.current.finally(() => {\n onEndReachedInPromise.current = (threadList ? loadMoreThread() : loadMore())\n .then(callback)\n .catch(onError);\n });\n } else {\n onEndReachedInPromise.current = (threadList ? loadMoreThread() : loadMore())\n .then(callback)\n .catch(onError);\n }\n };\n\n /**\n * Following if condition covers following cases:\n * 1. If I scroll up -> show scrollToBottom button.\n * 2. If I scroll to bottom of screen\n * |-> hide scrollToBottom button.\n * |-> if channel is unread, call markRead().\n */\n const handleScroll: ScrollViewProps['onScroll'] = (event) => {\n if (!channel || !initialScrollSet.current || !channelResyncScrollSet.current) {\n return;\n }\n\n const offset = event.nativeEvent.contentOffset.y;\n const visibleLength = event.nativeEvent.layoutMeasurement.height;\n const contentLength = event.nativeEvent.contentSize.height;\n // Check if scroll has reached either start of end of list.\n const isScrollAtStart = offset < 100;\n const isScrollAtEnd = contentLength - visibleLength - offset < 100;\n\n if (isScrollAtStart) {\n maybeCallOnStartReached();\n }\n\n if (isScrollAtEnd) {\n maybeCallOnEndReached();\n }\n\n // Show scrollToBottom button once scroll position goes beyond 300.\n const isScrollAtBottom = offset <= 300;\n const showScrollToBottomButton = !isScrollAtBottom || !channel?.state.isUpToDate;\n\n const shouldMarkRead =\n !threadList && offset <= 0 && channel?.state.isUpToDate && channel.countUnread() > 0;\n\n if (shouldMarkRead) {\n markRead();\n }\n\n if (showScrollToBottomButton && !scrollToBottomButtonVisible) {\n setScrollToBottomButtonVisible(true);\n } else if (!showScrollToBottomButton && scrollToBottomButtonVisible) {\n setScrollToBottomButtonVisible(false);\n }\n\n if (onListScroll) {\n onListScroll(event);\n }\n };\n\n const goToNewMessages = async () => {\n if (!channel?.state.isUpToDate) {\n resetPaginationTrackers();\n\n await reloadChannel();\n } else if (flatListRef.current) {\n flatListRef.current.scrollToOffset({\n offset: 0,\n });\n }\n\n setScrollToBottomButtonVisible(false);\n if (!threadList) {\n markRead();\n }\n };\n\n const goToMessage = useCallback(\n (messageId: string) => {\n const indexOfParentInMessageList = messageList.findIndex(\n (message) => message?.id === messageId,\n );\n\n if (indexOfParentInMessageList > -1) {\n try {\n if (flatListRef.current) {\n flatListRef.current.scrollToIndex({\n index: indexOfParentInMessageList,\n viewPosition: 0.5,\n });\n setTargetedMessage(messageId);\n\n return;\n }\n } catch (_) {\n // do nothing;\n }\n }\n\n loadChannelAtMessage({ messageId });\n resetPaginationTrackers();\n },\n [messageListLengthAfterUpdate],\n );\n\n const messagesWithImages =\n legacyImageViewerSwipeBehaviour &&\n messageList.filter((message) => {\n if (!message.deleted_at && message.attachments) {\n return message.attachments.some(\n (attachment) =>\n attachment.type === 'image' &&\n !attachment.title_link &&\n !attachment.og_scrape_url &&\n (attachment.image_url || attachment.thumb_url),\n );\n }\n return false;\n });\n\n /**\n * This is for the useEffect to run again in the case that a message\n * gets edited with more or the same number of images\n */\n const imageString =\n legacyImageViewerSwipeBehaviour &&\n messagesWithImages &&\n messagesWithImages\n .map((message) =>\n message.attachments\n ?.map((attachment) => attachment.image_url || attachment.thumb_url || '')\n .join(),\n )\n .join();\n\n const numberOfMessagesWithImages =\n legacyImageViewerSwipeBehaviour && messagesWithImages && messagesWithImages.length;\n const threadExists = !!thread;\n\n useEffect(() => {\n if (legacyImageViewerSwipeBehaviour && ((threadList && thread) || (!threadList && !thread))) {\n setImages(messagesWithImages as MessageType<At, Ch, Co, Ev, Me, Re, Us>[]);\n }\n }, [\n imageString,\n legacyImageViewerSwipeBehaviour,\n numberOfMessagesWithImages,\n threadExists,\n threadList,\n ]);\n\n const stickyHeaderFormatDate =\n stickyHeaderDate?.getFullYear() === new Date().getFullYear() ? 'MMM D' : 'MMM D, YYYY';\n const tStickyHeaderDate =\n stickyHeaderDate && !hideStickyDateHeader ? tDateTimeParser(stickyHeaderDate) : null;\n const stickyHeaderDateToRender =\n tStickyHeaderDate === null || hideStickyDateHeader\n ? null\n : isDayOrMoment(tStickyHeaderDate)\n ? tStickyHeaderDate.format(stickyHeaderFormatDate)\n : new Date(tStickyHeaderDate).toDateString();\n\n const dismissImagePicker = () => {\n if (!hasMoved && selectedPicker) {\n setSelectedPicker(undefined);\n closePicker();\n }\n };\n const onScrollBeginDrag = () => !hasMoved && selectedPicker && setHasMoved(true);\n const onScrollEndDrag = () => hasMoved && selectedPicker && setHasMoved(false);\n\n const refCallback = (ref: FlatListType<MessageType<At, Ch, Co, Ev, Me, Re, Us>>) => {\n flatListRef.current = ref;\n\n if (setFlatListRef) {\n setFlatListRef(ref);\n }\n };\n const renderListEmptyComponent = () => (\n <View style={[styles.flex, styles.invert]} testID='empty-state'>\n <EmptyStateIndicator listType='message' />\n </View>\n );\n\n if (!FlatList) return null;\n\n if (loading) {\n return (\n <View style={styles.flex}>\n <LoadingIndicator listType='message' />\n </View>\n );\n }\n\n return (\n <View style={[styles.container, { backgroundColor: white_snow }, container]}>\n <FlatList\n contentContainerStyle={[styles.contentContainer, contentContainer]}\n data={messageList}\n /** Disables the MessageList UI. Which means, message actions, reactions won't work. */\n extraData={disabled || !channel?.state.isUpToDate}\n inverted={inverted}\n keyboardShouldPersistTaps='handled'\n keyExtractor={keyExtractor}\n ListEmptyComponent={renderListEmptyComponent}\n ListFooterComponent={FooterComponent}\n ListHeaderComponent={HeaderComponent}\n maintainVisibleContentPosition={{\n autoscrollToTopThreshold: autoscrollToTop ? 10 : undefined,\n minIndexForVisible: 1,\n }}\n onScroll={handleScroll}\n onScrollBeginDrag={onScrollBeginDrag}\n onScrollEndDrag={onScrollEndDrag}\n onTouchEnd={dismissImagePicker}\n onViewableItemsChanged={onViewableItemsChanged.current}\n ref={refCallback}\n renderItem={renderItem}\n scrollEnabled={overlay === 'none'}\n style={[styles.listContainer, listContainer]}\n testID='message-flat-list'\n viewabilityConfig={flatListViewabilityConfig}\n {...additionalFlatListProps}\n />\n {!loading && (\n <>\n <View style={styles.stickyHeader}>\n {stickyHeaderDateToRender &&\n (StickyHeader ? (\n <StickyHeader dateString={stickyHeaderDateToRender} />\n ) : messageListLengthAfterUpdate ? (\n <DateHeader dateString={stickyHeaderDateToRender} />\n ) : null)}\n </View>\n {!disableTypingIndicator && TypingIndicator && typingEventsEnabled !== false && (\n <TypingIndicatorContainer>\n <TypingIndicator />\n </TypingIndicatorContainer>\n )}\n <ScrollToBottomButton\n onPress={goToNewMessages}\n showNotification={scrollToBottomButtonVisible}\n unreadCount={threadList ? 0 : channel?.countUnread()}\n />\n </>\n )}\n <NetworkDownIndicator />\n </View>\n );\n};\n\nexport type MessageListProps<\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n> = Partial<MessageListPropsWithContext<At, Ch, Co, Ev, Me, Re, Us>>;\n\nexport const MessageList = <\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n>(\n props: MessageListProps<At, Ch, Co, Ev, Me, Re, Us>,\n) => {\n const { closePicker, selectedPicker, setSelectedPicker } = useAttachmentPickerContext();\n const {\n channel,\n disabled,\n EmptyStateIndicator,\n enableMessageGroupingByUser,\n error,\n hideStickyDateHeader,\n loadChannelAtMessage,\n loading,\n LoadingIndicator,\n markRead,\n NetworkDownIndicator,\n reloadChannel,\n scrollToFirstUnreadThreshold,\n setTargetedMessage,\n StickyHeader,\n targetedMessage,\n typingEventsEnabled,\n } = useChannelContext<At, Ch, Co, Ev, Me, Re, Us>();\n const { client } = useChatContext<At, Ch, Co, Ev, Me, Re, Us>();\n const { setImages } = useImageGalleryContext<At, Ch, Co, Ev, Me, Re, Us>();\n const {\n DateHeader,\n disableTypingIndicator,\n FlatList,\n initialScrollToFirstUnreadMessage,\n InlineDateSeparator,\n InlineUnreadIndicator,\n legacyImageViewerSwipeBehaviour,\n Message,\n MessageSystem,\n myMessageTheme,\n ScrollToBottomButton,\n TypingIndicator,\n TypingIndicatorContainer,\n } = useMessagesContext<At, Ch, Co, Ev, Me, Re, Us>();\n const { loadMore, loadMoreRecent } = usePaginatedMessageListContext<At, Ch, Co, Ev, Me, Re, Us>();\n const { overlay } = useOverlayContext();\n const { loadMoreThread, thread } = useThreadContext<At, Ch, Co, Ev, Me, Re, Us>();\n const { t, tDateTimeParser } = useTranslationContext();\n\n return (\n <MessageListWithContext\n {...{\n channel,\n client,\n closePicker,\n DateHeader,\n disabled,\n disableTypingIndicator,\n EmptyStateIndicator,\n enableMessageGroupingByUser,\n error,\n FlatList,\n hideStickyDateHeader,\n initialScrollToFirstUnreadMessage,\n InlineDateSeparator,\n InlineUnreadIndicator,\n legacyImageViewerSwipeBehaviour,\n loadChannelAtMessage,\n loading,\n LoadingIndicator,\n loadMore,\n loadMoreRecent,\n loadMoreThread,\n markRead,\n Message,\n MessageSystem,\n myMessageTheme,\n NetworkDownIndicator,\n overlay,\n reloadChannel,\n ScrollToBottomButton,\n scrollToFirstUnreadThreshold,\n selectedPicker,\n setImages,\n setSelectedPicker,\n setTargetedMessage,\n StickyHeader,\n t,\n targetedMessage,\n tDateTimeParser,\n thread,\n typingEventsEnabled,\n TypingIndicator,\n TypingIndicatorContainer,\n }}\n {...props}\n noGroupByUser={!enableMessageGroupingByUser || props.noGroupByUser}\n />\n );\n};\n"]}
@@ -69,7 +69,7 @@ var useMessageList = function useMessageList(params) {
69
69
  }).map(function (msg) {
70
70
  return (0, _extends2["default"])({}, msg, {
71
71
  dateSeparator: dateSeparators[msg.id] || undefined,
72
- groupStyles: messageGroupStyles[msg.id] || [],
72
+ groupStyles: messageGroupStyles[msg.id] || ['single'],
73
73
  readBy: msg.id ? readData[msg.id] || false : false
74
74
  });
75
75
  });