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.
- package/lib/commonjs/components/Attachment/Gallery.js +21 -9
- package/lib/commonjs/components/Attachment/Gallery.js.map +1 -1
- package/lib/commonjs/components/Channel/Channel.js +52 -30
- package/lib/commonjs/components/Channel/Channel.js.map +1 -1
- package/lib/commonjs/components/Channel/hooks/useCreateChannelContext.js +4 -0
- package/lib/commonjs/components/Channel/hooks/useCreateChannelContext.js.map +1 -1
- package/lib/commonjs/components/Channel/hooks/useCreateMessagesContext.js +4 -0
- package/lib/commonjs/components/Channel/hooks/useCreateMessagesContext.js.map +1 -1
- package/lib/commonjs/components/Message/MessageSimple/MessageSimple.js +9 -6
- package/lib/commonjs/components/Message/MessageSimple/MessageSimple.js.map +1 -1
- package/lib/commonjs/components/MessageInput/FileUploadPreview.js +28 -23
- package/lib/commonjs/components/MessageInput/FileUploadPreview.js.map +1 -1
- package/lib/commonjs/components/MessageList/MessageList.js +40 -31
- package/lib/commonjs/components/MessageList/MessageList.js.map +1 -1
- package/lib/commonjs/components/MessageList/hooks/useMessageList.js +1 -1
- package/lib/commonjs/components/MessageList/hooks/useMessageList.js.map +1 -1
- package/lib/commonjs/components/MessageList/utils/getGroupStyles.js +1 -5
- package/lib/commonjs/components/MessageList/utils/getGroupStyles.js.map +1 -1
- package/lib/commonjs/contexts/channelContext/ChannelContext.js +2 -2
- package/lib/commonjs/contexts/channelContext/ChannelContext.js.map +1 -1
- package/lib/commonjs/contexts/messagesContext/MessagesContext.js +2 -2
- package/lib/commonjs/contexts/messagesContext/MessagesContext.js.map +1 -1
- package/lib/commonjs/version.json +1 -1
- package/lib/module/components/Attachment/Gallery.js +21 -9
- package/lib/module/components/Attachment/Gallery.js.map +1 -1
- package/lib/module/components/Channel/Channel.js +52 -30
- package/lib/module/components/Channel/Channel.js.map +1 -1
- package/lib/module/components/Channel/hooks/useCreateChannelContext.js +4 -0
- package/lib/module/components/Channel/hooks/useCreateChannelContext.js.map +1 -1
- package/lib/module/components/Channel/hooks/useCreateMessagesContext.js +4 -0
- package/lib/module/components/Channel/hooks/useCreateMessagesContext.js.map +1 -1
- package/lib/module/components/Message/MessageSimple/MessageSimple.js +9 -6
- package/lib/module/components/Message/MessageSimple/MessageSimple.js.map +1 -1
- package/lib/module/components/MessageInput/FileUploadPreview.js +28 -23
- package/lib/module/components/MessageInput/FileUploadPreview.js.map +1 -1
- package/lib/module/components/MessageList/MessageList.js +40 -31
- package/lib/module/components/MessageList/MessageList.js.map +1 -1
- package/lib/module/components/MessageList/hooks/useMessageList.js +1 -1
- package/lib/module/components/MessageList/hooks/useMessageList.js.map +1 -1
- package/lib/module/components/MessageList/utils/getGroupStyles.js +1 -5
- package/lib/module/components/MessageList/utils/getGroupStyles.js.map +1 -1
- package/lib/module/contexts/channelContext/ChannelContext.js +2 -2
- package/lib/module/contexts/channelContext/ChannelContext.js.map +1 -1
- package/lib/module/contexts/messagesContext/MessagesContext.js +2 -2
- package/lib/module/contexts/messagesContext/MessagesContext.js.map +1 -1
- package/lib/module/version.json +1 -1
- package/lib/typescript/components/Attachment/Gallery.d.ts +1 -1
- package/lib/typescript/components/Channel/Channel.d.ts +3 -1
- package/lib/typescript/components/Channel/hooks/useCreateChannelContext.d.ts +1 -1
- package/lib/typescript/components/Channel/hooks/useCreateMessagesContext.d.ts +4 -2
- package/lib/typescript/components/Message/MessageSimple/MessageSimple.d.ts +1 -1
- package/lib/typescript/components/MessageList/MessageList.d.ts +1 -1
- package/lib/typescript/contexts/channelContext/ChannelContext.d.ts +3 -1
- package/lib/typescript/contexts/messagesContext/MessagesContext.d.ts +3 -1
- package/package.json +1 -1
- package/src/components/Attachment/Gallery.tsx +20 -5
- package/src/components/Channel/Channel.tsx +124 -67
- package/src/components/Channel/hooks/useCreateChannelContext.ts +4 -0
- package/src/components/Channel/hooks/useCreateMessagesContext.ts +4 -0
- package/src/components/Message/MessageSimple/MessageSimple.tsx +9 -3
- package/src/components/MessageInput/FileUploadPreview.tsx +68 -58
- package/src/components/MessageInput/__tests__/__snapshots__/FileUploadPreview.test.js.snap +778 -730
- package/src/components/MessageList/MessageList.tsx +52 -27
- package/src/components/MessageList/hooks/useMessageList.ts +1 -1
- package/src/components/MessageList/utils/getGroupStyles.ts +3 -8
- package/src/contexts/channelContext/ChannelContext.tsx +2 -0
- package/src/contexts/messagesContext/MessagesContext.tsx +2 -0
- package/src/version.json +1 -1
- package/lib/commonjs/components/Channel/utils/debounce.js +0 -20
- package/lib/commonjs/components/Channel/utils/debounce.js.map +0 -1
- package/lib/commonjs/components/Channel/utils/throttle.js +0 -20
- package/lib/commonjs/components/Channel/utils/throttle.js.map +0 -1
- package/lib/module/components/Channel/utils/debounce.js +0 -20
- package/lib/module/components/Channel/utils/debounce.js.map +0 -1
- package/lib/module/components/Channel/utils/throttle.js +0 -20
- package/lib/module/components/Channel/utils/throttle.js.map +0 -1
- package/lib/typescript/components/Channel/utils/debounce.d.ts +0 -2
- package/lib/typescript/components/Channel/utils/throttle.d.ts +0 -2
- package/src/components/Channel/utils/debounce.ts +0 -12
- 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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
});
|