stream-chat-react-native-core 5.23.0-beta.1 → 5.23.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/lib/commonjs/components/Channel/Channel.js +587 -384
  2. package/lib/commonjs/components/Channel/Channel.js.map +1 -1
  3. package/lib/commonjs/components/Channel/hooks/useCreateMessagesContext.js +1 -1
  4. package/lib/commonjs/components/Channel/hooks/useCreateMessagesContext.js.map +1 -1
  5. package/lib/commonjs/components/MessageList/MessageList.js +174 -180
  6. package/lib/commonjs/components/MessageList/MessageList.js.map +1 -1
  7. package/lib/commonjs/components/MessageList/hooks/useMessageList.js +6 -1
  8. package/lib/commonjs/components/MessageList/hooks/useMessageList.js.map +1 -1
  9. package/lib/commonjs/components/MessageList/hooks/useShouldScrollToRecentOnNewOwnMessage.js +36 -0
  10. package/lib/commonjs/components/MessageList/hooks/useShouldScrollToRecentOnNewOwnMessage.js.map +1 -0
  11. package/lib/commonjs/components/MessageOverlay/MessageOverlay.js +30 -36
  12. package/lib/commonjs/components/MessageOverlay/MessageOverlay.js.map +1 -1
  13. package/lib/commonjs/i18n/en.json +1 -1
  14. package/lib/commonjs/i18n/fr.json +45 -45
  15. package/lib/commonjs/i18n/hi.json +43 -43
  16. package/lib/commonjs/i18n/it.json +43 -43
  17. package/lib/commonjs/i18n/nl.json +43 -43
  18. package/lib/commonjs/i18n/ru.json +45 -45
  19. package/lib/commonjs/i18n/tr.json +45 -45
  20. package/lib/commonjs/version.json +1 -1
  21. package/lib/module/components/Channel/Channel.js +587 -384
  22. package/lib/module/components/Channel/Channel.js.map +1 -1
  23. package/lib/module/components/Channel/hooks/useCreateMessagesContext.js +1 -1
  24. package/lib/module/components/Channel/hooks/useCreateMessagesContext.js.map +1 -1
  25. package/lib/module/components/MessageList/MessageList.js +174 -180
  26. package/lib/module/components/MessageList/MessageList.js.map +1 -1
  27. package/lib/module/components/MessageList/hooks/useMessageList.js +6 -1
  28. package/lib/module/components/MessageList/hooks/useMessageList.js.map +1 -1
  29. package/lib/module/components/MessageList/hooks/useShouldScrollToRecentOnNewOwnMessage.js +36 -0
  30. package/lib/module/components/MessageList/hooks/useShouldScrollToRecentOnNewOwnMessage.js.map +1 -0
  31. package/lib/module/components/MessageOverlay/MessageOverlay.js +30 -36
  32. package/lib/module/components/MessageOverlay/MessageOverlay.js.map +1 -1
  33. package/lib/module/i18n/en.json +1 -1
  34. package/lib/module/i18n/fr.json +45 -45
  35. package/lib/module/i18n/hi.json +43 -43
  36. package/lib/module/i18n/it.json +43 -43
  37. package/lib/module/i18n/nl.json +43 -43
  38. package/lib/module/i18n/ru.json +45 -45
  39. package/lib/module/i18n/tr.json +45 -45
  40. package/lib/module/version.json +1 -1
  41. package/lib/typescript/components/MessageList/hooks/useMessageList.d.ts +6 -1
  42. package/lib/typescript/components/MessageList/hooks/useShouldScrollToRecentOnNewOwnMessage.d.ts +4 -0
  43. package/lib/typescript/i18n/en.json +1 -1
  44. package/lib/typescript/i18n/fr.json +45 -45
  45. package/lib/typescript/i18n/hi.json +43 -43
  46. package/lib/typescript/i18n/it.json +43 -43
  47. package/lib/typescript/i18n/nl.json +43 -43
  48. package/lib/typescript/i18n/ru.json +45 -45
  49. package/lib/typescript/i18n/tr.json +45 -45
  50. package/package.json +1 -1
  51. package/src/components/Channel/Channel.tsx +237 -61
  52. package/src/components/Channel/hooks/useCreateMessagesContext.ts +1 -0
  53. package/src/components/MessageList/MessageList.tsx +193 -181
  54. package/src/components/MessageList/__tests__/useMessageList.test.tsx +5 -2
  55. package/src/components/MessageList/hooks/useMessageList.ts +8 -1
  56. package/src/components/MessageList/hooks/useShouldScrollToRecentOnNewOwnMessage.ts +44 -0
  57. package/src/components/MessageOverlay/MessageOverlay.tsx +1 -6
  58. package/src/i18n/en.json +1 -1
  59. package/src/i18n/fr.json +45 -45
  60. package/src/i18n/hi.json +43 -43
  61. package/src/i18n/it.json +43 -43
  62. package/src/i18n/nl.json +43 -43
  63. package/src/i18n/ru.json +45 -45
  64. package/src/i18n/tr.json +45 -45
  65. package/src/version.json +1 -1
@@ -11,7 +11,8 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
11
11
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
12
12
  var _react = _interopRequireWildcard(require("react"));
13
13
  var _reactNative = require("react-native");
14
- var _useMessageList = require("./hooks/useMessageList");
14
+ var _useMessageList2 = require("./hooks/useMessageList");
15
+ var _useShouldScrollToRecentOnNewOwnMessage = require("./hooks/useShouldScrollToRecentOnNewOwnMessage");
15
16
  var _InlineLoadingMoreIndicator = require("./InlineLoadingMoreIndicator");
16
17
  var _InlineLoadingMoreRecentIndicator = require("./InlineLoadingMoreRecentIndicator");
17
18
  var _InlineLoadingMoreThreadIndicator = require("./InlineLoadingMoreThreadIndicator");
@@ -74,7 +75,7 @@ var InvertedCellRendererComponent = function InvertedCellRendererComponent(props
74
75
  __self: _this,
75
76
  __source: {
76
77
  fileName: _jsxFileName,
77
- lineNumber: 94,
78
+ lineNumber: 98,
78
79
  columnNumber: 3
79
80
  }
80
81
  }));
@@ -152,24 +153,31 @@ var MessageListWithContext = function MessageListWithContext(props) {
152
153
  listContainer = _theme$messageList.listContainer,
153
154
  messageContainer = _theme$messageList.messageContainer,
154
155
  screenPadding = theme.screenPadding;
156
+ var myMessageThemeString = (0, _react.useMemo)(function () {
157
+ return JSON.stringify(myMessageTheme);
158
+ }, [myMessageTheme]);
155
159
  var modifiedTheme = (0, _react.useMemo)(function () {
156
160
  return (0, _ThemeContext.mergeThemes)({
157
161
  style: myMessageTheme,
158
162
  theme: theme
159
163
  });
160
- }, [myMessageTheme, theme]);
161
- var messageList = (0, _useMessageList.useMessageList)({
162
- noGroupByUser: noGroupByUser,
163
- threadList: threadList
164
- });
164
+ }, [myMessageThemeString, theme]);
165
+ var _useMessageList = (0, _useMessageList2.useMessageList)({
166
+ noGroupByUser: noGroupByUser,
167
+ threadList: threadList
168
+ }),
169
+ processedMessageList = _useMessageList.processedMessageList,
170
+ rawMessageList = _useMessageList.rawMessageList;
165
171
  var messageListLengthBeforeUpdate = (0, _react.useRef)(0);
166
- var messageListLengthAfterUpdate = messageList.length;
172
+ var messageListLengthAfterUpdate = processedMessageList.length;
167
173
  var topMessageBeforeUpdate = (0, _react.useRef)();
168
- var topMessageAfterUpdate = messageList[messageList.length - 1];
174
+ var latestNonCurrentMessageBeforeUpdateRef = (0, _react.useRef)();
175
+ var topMessageAfterUpdate = rawMessageList[0];
176
+ var shouldScrollToRecentOnNewOwnMessageRef = (0, _useShouldScrollToRecentOnNewOwnMessage.useShouldScrollToRecentOnNewOwnMessage)(rawMessageList, client.userID);
169
177
  var _useState = (0, _react.useState)(false),
170
178
  _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
171
- autoscrollToTop = _useState2[0],
172
- setAutoscrollToTop = _useState2[1];
179
+ autoscrollToRecent = _useState2[0],
180
+ setAutoscrollToRecent = _useState2[1];
173
181
  var onStartReachedTracker = (0, _react.useRef)({});
174
182
  var onEndReachedTracker = (0, _react.useRef)({});
175
183
  var onStartReachedInPromise = (0, _react.useRef)(null);
@@ -182,14 +190,13 @@ var MessageListWithContext = function MessageListWithContext(props) {
182
190
  var channelResyncScrollSet = (0, _react.useRef)(true);
183
191
  var scrollToDebounceTimeoutRef = (0, _react.useRef)();
184
192
  var initialScrollSettingTimeoutRef = (0, _react.useRef)();
185
- var tempDisablePaginationTrackersTimeoutRef = (0, _react.useRef)();
186
- var messageIdToScrollToRef = (0, _react.useRef)();
193
+ var onScrollEventTimeoutRef = (0, _react.useRef)();
187
194
  var messageIdLastScrolledToRef = (0, _react.useRef)();
188
195
  var _useState5 = (0, _react.useState)(false),
189
196
  _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
190
197
  hasMoved = _useState6[0],
191
198
  setHasMoved = _useState6[1];
192
- var _useState7 = (0, _react.useState)((_getLastReceivedMessa = (0, _getLastReceivedMessage.getLastReceivedMessage)(messageList)) == null ? void 0 : _getLastReceivedMessa.id),
199
+ var _useState7 = (0, _react.useState)((_getLastReceivedMessa = (0, _getLastReceivedMessage.getLastReceivedMessage)(processedMessageList)) == null ? void 0 : _getLastReceivedMessa.id),
193
200
  _useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
194
201
  lastReceivedId = _useState8[0],
195
202
  setLastReceivedId = _useState8[1];
@@ -228,15 +235,6 @@ var MessageListWithContext = function MessageListWithContext(props) {
228
235
  onStartReachedTracker.current = {};
229
236
  onEndReachedTracker.current = {};
230
237
  });
231
- var tempDisablePaginationTrackersRef = (0, _react.useRef)(function (messageListLength) {
232
- clearTimeout(tempDisablePaginationTrackersTimeoutRef.current);
233
- onStartReachedTracker.current[messageListLength] = true;
234
- onEndReachedTracker.current[messageListLength] = true;
235
- tempDisablePaginationTrackersTimeoutRef.current = setTimeout(function () {
236
- onStartReachedTracker.current[messageListLength] = false;
237
- onEndReachedTracker.current[messageListLength] = false;
238
- }, 1000);
239
- });
240
238
  (0, _react.useEffect)(function () {
241
239
  setScrollToBottomButtonVisible(false);
242
240
  }, [disabled]);
@@ -259,17 +257,14 @@ var MessageListWithContext = function MessageListWithContext(props) {
259
257
  }
260
258
  }, [loading, scrollToBottomButtonVisible, isInitialScrollDone]);
261
259
  (0, _react.useEffect)(function () {
262
- var _lastReceivedMessage$;
263
- var lastReceivedMessage = (0, _getLastReceivedMessage.getLastReceivedMessage)(messageList);
264
- var hasNewMessage = lastReceivedId !== (lastReceivedMessage == null ? void 0 : lastReceivedMessage.id);
265
- var isMyMessage = (lastReceivedMessage == null ? void 0 : (_lastReceivedMessage$ = lastReceivedMessage.user) == null ? void 0 : _lastReceivedMessage$.id) === client.userID;
260
+ var lastReceivedMessage = (0, _getLastReceivedMessage.getLastReceivedMessage)(processedMessageList);
266
261
  setLastReceivedId(lastReceivedMessage == null ? void 0 : lastReceivedMessage.id);
267
262
  var scrollToBottomIfNeeded = function scrollToBottomIfNeeded() {
268
263
  var _topMessageBeforeUpda;
269
- if (!client || !channel || messageList.length === 0) {
264
+ if (!client || !channel || rawMessageList.length === 0) {
270
265
  return;
271
266
  }
272
- if (hasNewMessage && isMyMessage || messageListLengthAfterUpdate < messageListLengthBeforeUpdate.current || (_topMessageBeforeUpda = topMessageBeforeUpdate.current) != null && _topMessageBeforeUpda.created_at && topMessageAfterUpdate != null && topMessageAfterUpdate.created_at && topMessageBeforeUpdate.current.created_at < topMessageAfterUpdate.created_at) {
267
+ if ((_topMessageBeforeUpda = topMessageBeforeUpdate.current) != null && _topMessageBeforeUpda.created_at && topMessageAfterUpdate != null && topMessageAfterUpdate.created_at && topMessageBeforeUpdate.current.created_at < topMessageAfterUpdate.created_at) {
273
268
  channelResyncScrollSet.current = false;
274
269
  setScrollToBottomButtonVisible(false);
275
270
  resetPaginationTrackersRef.current();
@@ -297,23 +292,61 @@ var MessageListWithContext = function MessageListWithContext(props) {
297
292
  }
298
293
  messageListLengthBeforeUpdate.current = messageListLengthAfterUpdate;
299
294
  topMessageBeforeUpdate.current = topMessageAfterUpdate;
300
- }, [hasNoMoreRecentMessagesToLoad, messageListLengthAfterUpdate, topMessageAfterUpdate == null ? void 0 : topMessageAfterUpdate.id]);
295
+ }, [threadList, hasNoMoreRecentMessagesToLoad, messageListLengthAfterUpdate, topMessageAfterUpdate == null ? void 0 : topMessageAfterUpdate.id]);
301
296
  (0, _react.useEffect)(function () {
302
- setAutoscrollToTop(hasNoMoreRecentMessagesToLoad);
303
- }, [messageList, hasNoMoreRecentMessagesToLoad]);
297
+ if (!rawMessageList.length) return;
298
+ var notLatestSet = !threadList && channel.state.messages !== channel.state.latestMessages;
299
+ if (notLatestSet) {
300
+ latestNonCurrentMessageBeforeUpdateRef.current = channel.state.latestMessages[channel.state.latestMessages.length - 1];
301
+ setAutoscrollToRecent(false);
302
+ setScrollToBottomButtonVisible(true);
303
+ return;
304
+ }
305
+ var latestNonCurrentMessageBeforeUpdate = latestNonCurrentMessageBeforeUpdateRef.current;
306
+ latestNonCurrentMessageBeforeUpdateRef.current = undefined;
307
+ var latestCurrentMessageAfterUpdate = rawMessageList[rawMessageList.length - 1];
308
+ if (!latestCurrentMessageAfterUpdate) {
309
+ setAutoscrollToRecent(true);
310
+ return;
311
+ }
312
+ var didMergeMessageSetsWithNoUpdates = (latestNonCurrentMessageBeforeUpdate == null ? void 0 : latestNonCurrentMessageBeforeUpdate.id) === latestCurrentMessageAfterUpdate.id;
313
+ setAutoscrollToRecent(!didMergeMessageSetsWithNoUpdates);
314
+ if (!didMergeMessageSetsWithNoUpdates) {
315
+ var shouldScrollToRecentOnNewOwnMessage = shouldScrollToRecentOnNewOwnMessageRef.current();
316
+ if (shouldScrollToRecentOnNewOwnMessage) {
317
+ setTimeout(function () {
318
+ var _flatListRef$current2;
319
+ (_flatListRef$current2 = flatListRef.current) == null ? void 0 : _flatListRef$current2.scrollToOffset({
320
+ animated: true,
321
+ offset: 0
322
+ });
323
+ }, 150);
324
+ }
325
+ }
326
+ }, [rawMessageList, threadList]);
304
327
  var shouldApplyAndroidWorkaround = inverted && _reactNative.Platform.OS === 'android';
305
328
  var renderItem = function renderItem(_ref2) {
306
329
  var _message$user;
307
330
  var index = _ref2.index,
308
331
  message = _ref2.item;
309
332
  if (!channel || channel.disconnected || !channel.initialized && !channel.offlineMode) return null;
333
+ var unreadCount = channel.countUnread();
310
334
  var lastRead = channel.lastRead();
311
335
  function isMessageUnread(messageArrayIndex) {
312
- var msg = messageList == null ? void 0 : messageList[messageArrayIndex];
313
- if (lastRead && msg != null && msg.created_at) {
314
- return lastRead < msg.created_at;
336
+ var isLatestMessageSetShown = !!channel.state.messageSets.find(function (set) {
337
+ return set.isCurrent && set.isLatest;
338
+ });
339
+ var msg = processedMessageList == null ? void 0 : processedMessageList[messageArrayIndex];
340
+ if (!isLatestMessageSetShown) {
341
+ if (channel.state.latestMessages.length !== 0 && unreadCount > channel.state.latestMessages.length) {
342
+ return messageArrayIndex <= unreadCount - channel.state.latestMessages.length - 1;
343
+ } else if (lastRead && msg.created_at) {
344
+ return lastRead < msg.created_at;
345
+ }
346
+ return false;
347
+ } else {
348
+ return messageArrayIndex <= unreadCount - 1;
315
349
  }
316
- return false;
317
350
  }
318
351
  var isCurrentMessageUnread = isMessageUnread(index);
319
352
  var showUnreadUnderlay = !channel.muteStatus().muted && isCurrentMessageUnread && scrollToBottomButtonVisible;
@@ -324,7 +357,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
324
357
  __self: _this,
325
358
  __source: {
326
359
  fileName: _jsxFileName,
327
- lineNumber: 584,
360
+ lineNumber: 628,
328
361
  columnNumber: 11
329
362
  }
330
363
  }, _react["default"].createElement(MessageSystem, {
@@ -335,48 +368,33 @@ var MessageListWithContext = function MessageListWithContext(props) {
335
368
  __self: _this,
336
369
  __source: {
337
370
  fileName: _jsxFileName,
338
- lineNumber: 585,
371
+ lineNumber: 629,
339
372
  columnNumber: 13
340
373
  }
341
374
  })), insertInlineUnreadIndicator && _react["default"].createElement(InlineUnreadIndicator, {
342
375
  __self: _this,
343
376
  __source: {
344
377
  fileName: _jsxFileName,
345
- lineNumber: 590,
378
+ lineNumber: 634,
346
379
  columnNumber: 43
347
380
  }
348
381
  }));
349
382
  }
350
383
  var wrapMessageInTheme = client.userID === ((_message$user = message.user) == null ? void 0 : _message$user.id) && !!myMessageTheme;
351
- return wrapMessageInTheme ? _react["default"].createElement(_react["default"].Fragment, null, shouldApplyAndroidWorkaround && (0, _useMessageList.isMessageWithStylesReadByAndDateSeparator)(message) && message.dateSeparator && _react["default"].createElement(InlineDateSeparator, {
384
+ var renderDateSeperator = (0, _useMessageList2.isMessageWithStylesReadByAndDateSeparator)(message) && message.dateSeparator && _react["default"].createElement(InlineDateSeparator, {
352
385
  date: message.dateSeparator,
353
386
  __self: _this,
354
387
  __source: {
355
388
  fileName: _jsxFileName,
356
- lineNumber: 600,
357
- columnNumber: 36
358
- }
359
- }), _react["default"].createElement(_ThemeContext.ThemeProvider, {
360
- mergedStyle: modifiedTheme,
361
- __self: _this,
362
- __source: {
363
- fileName: _jsxFileName,
364
- lineNumber: 601,
365
- columnNumber: 9
366
- }
367
- }, _react["default"].createElement(_reactNative.View, {
368
- testID: "message-list-item-" + index,
369
- __self: _this,
370
- __source: {
371
- fileName: _jsxFileName,
372
- lineNumber: 602,
373
- columnNumber: 11
389
+ lineNumber: 641,
390
+ columnNumber: 32
374
391
  }
375
- }, _react["default"].createElement(Message, {
392
+ });
393
+ var renderMessage = _react["default"].createElement(Message, {
376
394
  goToMessage: goToMessage,
377
- groupStyles: (0, _useMessageList.isMessageWithStylesReadByAndDateSeparator)(message) ? message.groupStyles : [],
395
+ groupStyles: (0, _useMessageList2.isMessageWithStylesReadByAndDateSeparator)(message) ? message.groupStyles : [],
378
396
  isTargetedMessage: targetedMessage === message.id,
379
- lastReceivedId: lastReceivedId === message.id ? lastReceivedId : undefined,
397
+ lastReceivedId: lastReceivedId === message.id || message.quoted_message_id ? lastReceivedId : undefined,
380
398
  message: message,
381
399
  onThreadSelect: onThreadSelect,
382
400
  showUnreadUnderlay: showUnreadUnderlay,
@@ -387,71 +405,46 @@ var MessageListWithContext = function MessageListWithContext(props) {
387
405
  __self: _this,
388
406
  __source: {
389
407
  fileName: _jsxFileName,
390
- lineNumber: 603,
391
- columnNumber: 13
392
- }
393
- }))), !shouldApplyAndroidWorkaround && (0, _useMessageList.isMessageWithStylesReadByAndDateSeparator)(message) && message.dateSeparator && _react["default"].createElement(InlineDateSeparator, {
394
- date: message.dateSeparator,
395
- __self: _this,
396
- __source: {
397
- fileName: _jsxFileName,
398
- lineNumber: 620,
399
- columnNumber: 36
400
- }
401
- }), insertInlineUnreadIndicator && _react["default"].createElement(InlineUnreadIndicator, {
402
- __self: _this,
403
- __source: {
404
- fileName: _jsxFileName,
405
- lineNumber: 622,
406
- columnNumber: 41
408
+ lineNumber: 643,
409
+ columnNumber: 7
407
410
  }
408
- })) : _react["default"].createElement(_react["default"].Fragment, null, _react["default"].createElement(_reactNative.View, {
409
- testID: "message-list-item-" + index,
411
+ });
412
+ return wrapMessageInTheme ? _react["default"].createElement(_react["default"].Fragment, null, shouldApplyAndroidWorkaround && renderDateSeperator, _react["default"].createElement(_ThemeContext.ThemeProvider, {
413
+ mergedStyle: modifiedTheme,
410
414
  __self: _this,
411
415
  __source: {
412
416
  fileName: _jsxFileName,
413
- lineNumber: 626,
417
+ lineNumber: 660,
414
418
  columnNumber: 9
415
419
  }
416
- }, shouldApplyAndroidWorkaround && (0, _useMessageList.isMessageWithStylesReadByAndDateSeparator)(message) && message.dateSeparator && _react["default"].createElement(InlineDateSeparator, {
417
- date: message.dateSeparator,
420
+ }, _react["default"].createElement(_reactNative.View, {
421
+ testID: "message-list-item-" + index,
418
422
  __self: _this,
419
423
  __source: {
420
424
  fileName: _jsxFileName,
421
- lineNumber: 629,
422
- columnNumber: 38
425
+ lineNumber: 661,
426
+ columnNumber: 11
423
427
  }
424
- }), _react["default"].createElement(Message, {
425
- goToMessage: goToMessage,
426
- groupStyles: (0, _useMessageList.isMessageWithStylesReadByAndDateSeparator)(message) ? message.groupStyles : [],
427
- isTargetedMessage: targetedMessage === message.id,
428
- lastReceivedId: lastReceivedId === message.id || message.quoted_message_id ? lastReceivedId : undefined,
429
- message: message,
430
- onThreadSelect: onThreadSelect,
431
- showUnreadUnderlay: showUnreadUnderlay,
432
- style: [{
433
- paddingHorizontal: screenPadding
434
- }, messageContainer],
435
- threadList: threadList,
428
+ }, renderMessage)), !shouldApplyAndroidWorkaround && renderDateSeperator, insertInlineUnreadIndicator && _react["default"].createElement(InlineUnreadIndicator, {
436
429
  __self: _this,
437
430
  __source: {
438
431
  fileName: _jsxFileName,
439
- lineNumber: 630,
440
- columnNumber: 11
432
+ lineNumber: 665,
433
+ columnNumber: 41
441
434
  }
442
- })), !shouldApplyAndroidWorkaround && (0, _useMessageList.isMessageWithStylesReadByAndDateSeparator)(message) && message.dateSeparator && _react["default"].createElement(InlineDateSeparator, {
443
- date: message.dateSeparator,
435
+ })) : _react["default"].createElement(_react["default"].Fragment, null, _react["default"].createElement(_reactNative.View, {
436
+ testID: "message-list-item-" + index,
444
437
  __self: _this,
445
438
  __source: {
446
439
  fileName: _jsxFileName,
447
- lineNumber: 650,
448
- columnNumber: 36
440
+ lineNumber: 669,
441
+ columnNumber: 9
449
442
  }
450
- }), insertInlineUnreadIndicator && _react["default"].createElement(InlineUnreadIndicator, {
443
+ }, shouldApplyAndroidWorkaround && renderDateSeperator, renderMessage), !shouldApplyAndroidWorkaround && renderDateSeperator, insertInlineUnreadIndicator && _react["default"].createElement(InlineUnreadIndicator, {
451
444
  __self: _this,
452
445
  __source: {
453
446
  fileName: _jsxFileName,
454
- lineNumber: 652,
447
+ lineNumber: 675,
455
448
  columnNumber: 41
456
449
  }
457
450
  }));
@@ -462,14 +455,14 @@ var MessageListWithContext = function MessageListWithContext(props) {
462
455
  return _regenerator["default"].wrap(function _callee$(_context) {
463
456
  while (1) switch (_context.prev = _context.next) {
464
457
  case 0:
465
- if (!(messageList != null && messageList.length && onStartReachedTracker.current[messageList.length])) {
458
+ if (!(processedMessageList != null && processedMessageList.length && onStartReachedTracker.current[processedMessageList.length])) {
466
459
  _context.next = 2;
467
460
  break;
468
461
  }
469
462
  return _context.abrupt("return");
470
463
  case 2:
471
- if (messageList != null && messageList.length) {
472
- onStartReachedTracker.current[messageList.length] = true;
464
+ if (processedMessageList != null && processedMessageList.length) {
465
+ onStartReachedTracker.current[processedMessageList.length] = true;
473
466
  }
474
467
  callback = function callback() {
475
468
  onStartReachedInPromise.current = null;
@@ -508,14 +501,14 @@ var MessageListWithContext = function MessageListWithContext(props) {
508
501
  return _regenerator["default"].wrap(function _callee2$(_context2) {
509
502
  while (1) switch (_context2.prev = _context2.next) {
510
503
  case 0:
511
- if (!(messageList != null && messageList.length && onEndReachedTracker.current[messageList.length])) {
504
+ if (!(processedMessageList != null && processedMessageList.length && onEndReachedTracker.current[processedMessageList.length])) {
512
505
  _context2.next = 2;
513
506
  break;
514
507
  }
515
508
  return _context2.abrupt("return");
516
509
  case 2:
517
- if (messageList != null && messageList.length) {
518
- onEndReachedTracker.current[messageList.length] = true;
510
+ if (processedMessageList != null && processedMessageList.length) {
511
+ onEndReachedTracker.current[processedMessageList.length] = true;
519
512
  }
520
513
  callback = function callback() {
521
514
  onEndReachedInPromise.current = null;
@@ -548,13 +541,15 @@ var MessageListWithContext = function MessageListWithContext(props) {
548
541
  return _ref4.apply(this, arguments);
549
542
  };
550
543
  }();
551
- var onScrollEvent = function onScrollEvent(event) {
544
+ var onUserScrollEvent = function onUserScrollEvent(event) {
545
+ var nativeEvent = event.nativeEvent;
546
+ clearTimeout(onScrollEventTimeoutRef.current);
547
+ var offset = nativeEvent.contentOffset.y;
548
+ var visibleLength = nativeEvent.layoutMeasurement.height;
549
+ var contentLength = nativeEvent.contentSize.height;
552
550
  if (!channel || !channelResyncScrollSet.current) {
553
551
  return;
554
552
  }
555
- var offset = event.nativeEvent.contentOffset.y;
556
- var visibleLength = event.nativeEvent.layoutMeasurement.height;
557
- var contentLength = event.nativeEvent.contentSize.height;
558
553
  var isScrollAtStart = offset < 100;
559
554
  var isScrollAtEnd = contentLength - visibleLength - offset < 100;
560
555
  if (isScrollAtStart) {
@@ -563,47 +558,59 @@ var MessageListWithContext = function MessageListWithContext(props) {
563
558
  if (isScrollAtEnd) {
564
559
  maybeCallOnEndReached();
565
560
  }
561
+ };
562
+ var handleScroll = function handleScroll(event) {
563
+ var offset = event.nativeEvent.contentOffset.y;
566
564
  var isScrollAtBottom = offset <= 150;
567
- var showScrollToBottomButton = !isScrollAtBottom || !hasNoMoreRecentMessagesToLoad;
568
- var shouldMarkRead = !threadList && offset <= 0 && hasNoMoreRecentMessagesToLoad && channel.countUnread() > 0;
565
+ var notLatestSet = channel.state.messages !== channel.state.latestMessages;
566
+ var showScrollToBottomButton = !threadList && notLatestSet || !isScrollAtBottom || !hasNoMoreRecentMessagesToLoad;
567
+ setScrollToBottomButtonVisible(showScrollToBottomButton);
568
+ var shouldMarkRead = !threadList && !notLatestSet && offset <= 0 && hasNoMoreRecentMessagesToLoad && channel.countUnread() > 0;
569
569
  if (shouldMarkRead) {
570
570
  markRead();
571
571
  }
572
- setScrollToBottomButtonVisible(showScrollToBottomButton);
573
- };
574
- var handleScroll = function handleScroll(event) {
575
- onScrollEvent(event);
572
+ setInitialScrollDone(false);
576
573
  if (onListScroll) {
577
574
  onListScroll(event);
578
575
  }
579
576
  };
580
577
  var goToNewMessages = function () {
581
578
  var _ref5 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee3() {
579
+ var isNotLatestSet;
582
580
  return _regenerator["default"].wrap(function _callee3$(_context3) {
583
581
  while (1) switch (_context3.prev = _context3.next) {
584
582
  case 0:
583
+ isNotLatestSet = channel.state.messages !== channel.state.latestMessages;
584
+ if (!(isNotLatestSet && hasNoMoreRecentMessagesToLoad)) {
585
+ _context3.next = 5;
586
+ break;
587
+ }
588
+ loadChannelAroundMessage({});
589
+ _context3.next = 12;
590
+ break;
591
+ case 5:
585
592
  if (hasNoMoreRecentMessagesToLoad) {
586
- _context3.next = 6;
593
+ _context3.next = 11;
587
594
  break;
588
595
  }
589
596
  resetPaginationTrackersRef.current();
590
- _context3.next = 4;
597
+ _context3.next = 9;
591
598
  return reloadChannel();
592
- case 4:
593
- _context3.next = 7;
599
+ case 9:
600
+ _context3.next = 12;
594
601
  break;
595
- case 6:
602
+ case 11:
596
603
  if (flatListRef.current) {
597
604
  flatListRef.current.scrollToOffset({
598
605
  offset: 0
599
606
  });
600
607
  }
601
- case 7:
608
+ case 12:
602
609
  setScrollToBottomButtonVisible(false);
603
610
  if (!threadList) {
604
611
  markRead();
605
612
  }
606
- case 9:
613
+ case 14:
607
614
  case "end":
608
615
  return _context3.stop();
609
616
  }
@@ -616,23 +623,15 @@ var MessageListWithContext = function MessageListWithContext(props) {
616
623
  var scrollToIndexFailedRetryCountRef = (0, _react.useRef)(0);
617
624
  var failScrollTimeoutId = (0, _react.useRef)();
618
625
  var onScrollToIndexFailedRef = (0, _react.useRef)(function (info) {
619
- var _flatListRef$current$, _flatListRef$current$2;
620
626
  if (!flatListRef.current) return;
621
- var dataLength = (_flatListRef$current$ = flatListRef.current.props) == null ? void 0 : (_flatListRef$current$2 = _flatListRef$current$.data) == null ? void 0 : _flatListRef$current$2.length;
622
- if (dataLength) {
623
- tempDisablePaginationTrackersRef.current(dataLength);
624
- }
625
627
  flatListRef.current.scrollToOffset({
626
628
  animated: false,
627
629
  offset: info.averageItemLength * info.index
628
630
  });
629
631
  failScrollTimeoutId.current = setTimeout(function () {
630
632
  try {
631
- var _flatListRef$current2;
632
- if (dataLength) {
633
- tempDisablePaginationTrackersRef.current(dataLength);
634
- }
635
- (_flatListRef$current2 = flatListRef.current) == null ? void 0 : _flatListRef$current2.scrollToIndex({
633
+ var _flatListRef$current3;
634
+ (_flatListRef$current3 = flatListRef.current) == null ? void 0 : _flatListRef$current3.scrollToIndex({
636
635
  animated: false,
637
636
  index: info.index,
638
637
  viewPosition: 0.5
@@ -643,7 +642,6 @@ var MessageListWithContext = function MessageListWithContext(props) {
643
642
  scrollToIndexFailedRetryCountRef.current = 0;
644
643
  } catch (e) {
645
644
  if (!onScrollToIndexFailedRef.current || scrollToIndexFailedRetryCountRef.current > MAX_RETRIES_AFTER_SCROLL_FAILURE) {
646
- console.log("Scrolling to index failed after " + MAX_RETRIES_AFTER_SCROLL_FAILURE + " retries", e);
647
645
  scrollToIndexFailedRetryCountRef.current = 0;
648
646
  return;
649
647
  }
@@ -652,61 +650,56 @@ var MessageListWithContext = function MessageListWithContext(props) {
652
650
  }
653
651
  }, WAIT_FOR_SCROLL_TO_OFFSET_TIMEOUT);
654
652
  });
655
- var goToMessage = (0, _react.useCallback)(function (messageId) {
656
- var indexOfParentInMessageList = messageList.findIndex(function (message) {
653
+ var goToMessage = function goToMessage(messageId) {
654
+ var indexOfParentInMessageList = processedMessageList.findIndex(function (message) {
657
655
  return (message == null ? void 0 : message.id) === messageId;
658
656
  });
659
657
  if (indexOfParentInMessageList !== -1 && flatListRef.current) {
660
658
  clearTimeout(failScrollTimeoutId.current);
661
659
  scrollToIndexFailedRetryCountRef.current = 0;
662
- tempDisablePaginationTrackersRef.current(messageList.length);
660
+ messageIdLastScrolledToRef.current = messageId;
661
+ setTargetedMessage(messageId);
663
662
  flatListRef.current.scrollToIndex({
664
663
  animated: true,
665
664
  index: indexOfParentInMessageList,
666
665
  viewPosition: 0.5
667
666
  });
668
- messageIdLastScrolledToRef.current = messageId;
669
- setTargetedMessage(messageId);
670
667
  return;
671
668
  }
672
- messageIdToScrollToRef.current = messageId;
673
669
  loadChannelAroundMessage({
674
670
  messageId: messageId
675
671
  });
676
- resetPaginationTrackersRef.current();
677
- }, [messageList]);
672
+ };
678
673
  (0, _react.useEffect)(function () {
679
674
  scrollToDebounceTimeoutRef.current = setTimeout(function () {
680
675
  if (initialScrollToFirstUnreadMessage) {
681
676
  clearTimeout(initialScrollSettingTimeoutRef.current);
682
677
  initialScrollSettingTimeoutRef.current = setTimeout(function () {
683
678
  setInitialScrollDone(true);
684
- }, 500);
679
+ }, 2000);
685
680
  }
686
- var messageIdToScroll = messageIdToScrollToRef.current;
681
+ var messageIdToScroll;
687
682
  if (targetedMessage && messageIdLastScrolledToRef.current !== targetedMessage) {
688
683
  messageIdToScroll = targetedMessage;
689
684
  }
690
685
  if (!messageIdToScroll) return;
691
- var indexOfParentInMessageList = messageList.findIndex(function (message) {
686
+ var indexOfParentInMessageList = processedMessageList.findIndex(function (message) {
692
687
  return (message == null ? void 0 : message.id) === messageIdToScroll;
693
688
  });
694
689
  if (indexOfParentInMessageList !== -1 && flatListRef.current) {
695
690
  clearTimeout(scrollToDebounceTimeoutRef.current);
696
691
  clearTimeout(failScrollTimeoutId.current);
697
- tempDisablePaginationTrackersRef.current(messageList.length);
692
+ messageIdLastScrolledToRef.current = messageIdToScroll;
698
693
  scrollToIndexFailedRetryCountRef.current = 0;
699
694
  flatListRef.current.scrollToIndex({
700
695
  animated: false,
701
696
  index: indexOfParentInMessageList,
702
697
  viewPosition: 0.5
703
698
  });
704
- messageIdToScrollToRef.current = undefined;
705
- messageIdLastScrolledToRef.current = messageIdToScroll;
706
699
  }
707
- }, 150);
708
- }, [targetedMessage, initialScrollToFirstUnreadMessage, messageList]);
709
- var messagesWithImages = legacyImageViewerSwipeBehaviour && messageList.filter(function (message) {
700
+ }, 50);
701
+ }, [targetedMessage, initialScrollToFirstUnreadMessage]);
702
+ var messagesWithImages = legacyImageViewerSwipeBehaviour && processedMessageList.filter(function (message) {
710
703
  var isMessageTypeDeleted = message.type === 'deleted';
711
704
  if (!isMessageTypeDeleted && message.attachments) {
712
705
  return message.attachments.some(function (attachment) {
@@ -743,11 +736,11 @@ var MessageListWithContext = function MessageListWithContext(props) {
743
736
  };
744
737
  var onScrollBeginDrag = function onScrollBeginDrag(event) {
745
738
  !hasMoved && selectedPicker && setHasMoved(true);
746
- onScrollEvent(event);
739
+ onUserScrollEvent(event);
747
740
  };
748
741
  var onScrollEndDrag = function onScrollEndDrag(event) {
749
742
  hasMoved && selectedPicker && setHasMoved(false);
750
- onScrollEvent(event);
743
+ onUserScrollEvent(event);
751
744
  };
752
745
  var refCallback = function refCallback(ref) {
753
746
  flatListRef.current = ref;
@@ -761,7 +754,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
761
754
  if (debugRef.current.setEventType) debugRef.current.setEventType('send');
762
755
  if (debugRef.current.setSendEventParams) debugRef.current.setSendEventParams({
763
756
  action: thread ? 'ThreadList' : 'Messages',
764
- data: messageList
757
+ data: processedMessageList
765
758
  });
766
759
  }
767
760
  var renderListEmptyComponent = (0, _react.useCallback)(function () {
@@ -771,7 +764,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
771
764
  __self: _this,
772
765
  __source: {
773
766
  fileName: _jsxFileName,
774
- lineNumber: 1063,
767
+ lineNumber: 1069,
775
768
  columnNumber: 7
776
769
  }
777
770
  }, _react["default"].createElement(EmptyStateIndicator, {
@@ -779,7 +772,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
779
772
  __self: _this,
780
773
  __source: {
781
774
  fileName: _jsxFileName,
782
- lineNumber: 1067,
775
+ lineNumber: 1073,
783
776
  columnNumber: 9
784
777
  }
785
778
  }));
@@ -790,14 +783,14 @@ var MessageListWithContext = function MessageListWithContext(props) {
790
783
  __self: _this,
791
784
  __source: {
792
785
  fileName: _jsxFileName,
793
- lineNumber: 1075,
786
+ lineNumber: 1081,
794
787
  columnNumber: 7
795
788
  }
796
789
  }, _react["default"].createElement(FooterComponent, {
797
790
  __self: _this,
798
791
  __source: {
799
792
  fileName: _jsxFileName,
800
- lineNumber: 1076,
793
+ lineNumber: 1082,
801
794
  columnNumber: 9
802
795
  }
803
796
  }));
@@ -808,14 +801,14 @@ var MessageListWithContext = function MessageListWithContext(props) {
808
801
  __self: _this,
809
802
  __source: {
810
803
  fileName: _jsxFileName,
811
- lineNumber: 1084,
804
+ lineNumber: 1090,
812
805
  columnNumber: 7
813
806
  }
814
807
  }, _react["default"].createElement(HeaderComponent, {
815
808
  __self: _this,
816
809
  __source: {
817
810
  fileName: _jsxFileName,
818
- lineNumber: 1085,
811
+ lineNumber: 1091,
819
812
  columnNumber: 9
820
813
  }
821
814
  }));
@@ -827,7 +820,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
827
820
  __self: _this,
828
821
  __source: {
829
822
  fileName: _jsxFileName,
830
- lineNumber: 1095,
823
+ lineNumber: 1101,
831
824
  columnNumber: 7
832
825
  }
833
826
  }, _react["default"].createElement(LoadingIndicator, {
@@ -835,7 +828,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
835
828
  __self: _this,
836
829
  __source: {
837
830
  fileName: _jsxFileName,
838
- lineNumber: 1096,
831
+ lineNumber: 1102,
839
832
  columnNumber: 9
840
833
  }
841
834
  }));
@@ -847,7 +840,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
847
840
  __self: _this,
848
841
  __source: {
849
842
  fileName: _jsxFileName,
850
- lineNumber: 1103,
843
+ lineNumber: 1109,
851
844
  columnNumber: 30
852
845
  }
853
846
  });
@@ -856,7 +849,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
856
849
  __self: _this,
857
850
  __source: {
858
851
  fileName: _jsxFileName,
859
- lineNumber: 1104,
852
+ lineNumber: 1110,
860
853
  columnNumber: 46
861
854
  }
862
855
  });
@@ -877,13 +870,13 @@ var MessageListWithContext = function MessageListWithContext(props) {
877
870
  __self: _this,
878
871
  __source: {
879
872
  fileName: _jsxFileName,
880
- lineNumber: 1120,
873
+ lineNumber: 1126,
881
874
  columnNumber: 5
882
875
  }
883
876
  }, _react["default"].createElement(FlatList, (0, _extends2["default"])({
884
877
  CellRendererComponent: shouldApplyAndroidWorkaround ? InvertedCellRendererComponent : undefined,
885
878
  contentContainerStyle: [styles.contentContainer, additionalFlatListProps == null ? void 0 : additionalFlatListProps.contentContainerStyle, contentContainer],
886
- data: messageList,
879
+ data: processedMessageList,
887
880
  extraData: disabled || !hasNoMoreRecentMessagesToLoad,
888
881
  inverted: shouldApplyAndroidWorkaround ? false : inverted,
889
882
  keyboardShouldPersistTaps: "handled",
@@ -892,10 +885,11 @@ var MessageListWithContext = function MessageListWithContext(props) {
892
885
  ListFooterComponent: ListFooterComponent,
893
886
  ListHeaderComponent: ListHeaderComponent,
894
887
  maintainVisibleContentPosition: {
895
- autoscrollToTopThreshold: autoscrollToTop ? 10 : undefined,
888
+ autoscrollToTopThreshold: autoscrollToRecent ? 10 : undefined,
896
889
  minIndexForVisible: 1
897
890
  },
898
891
  maxToRenderPerBatch: 30,
892
+ onMomentumScrollEnd: onUserScrollEvent,
899
893
  onScroll: handleScroll,
900
894
  onScrollBeginDrag: onScrollBeginDrag,
901
895
  onScrollEndDrag: onScrollEndDrag,
@@ -913,7 +907,7 @@ var MessageListWithContext = function MessageListWithContext(props) {
913
907
  __self: _this,
914
908
  __source: {
915
909
  fileName: _jsxFileName,
916
- lineNumber: 1124,
910
+ lineNumber: 1130,
917
911
  columnNumber: 7
918
912
  }
919
913
  })), !loading && _react["default"].createElement(_react["default"].Fragment, null, _react["default"].createElement(_reactNative.View, {
@@ -921,28 +915,28 @@ var MessageListWithContext = function MessageListWithContext(props) {
921
915
  __self: _this,
922
916
  __source: {
923
917
  fileName: _jsxFileName,
924
- lineNumber: 1169,
918
+ lineNumber: 1181,
925
919
  columnNumber: 11
926
920
  }
927
921
  }, _react["default"].createElement(StickyHeaderComponent, {
928
922
  __self: _this,
929
923
  __source: {
930
924
  fileName: _jsxFileName,
931
- lineNumber: 1170,
925
+ lineNumber: 1182,
932
926
  columnNumber: 13
933
927
  }
934
928
  })), !disableTypingIndicator && TypingIndicator && _react["default"].createElement(TypingIndicatorContainer, {
935
929
  __self: _this,
936
930
  __source: {
937
931
  fileName: _jsxFileName,
938
- lineNumber: 1173,
932
+ lineNumber: 1185,
939
933
  columnNumber: 13
940
934
  }
941
935
  }, _react["default"].createElement(TypingIndicator, {
942
936
  __self: _this,
943
937
  __source: {
944
938
  fileName: _jsxFileName,
945
- lineNumber: 1174,
939
+ lineNumber: 1186,
946
940
  columnNumber: 15
947
941
  }
948
942
  })), _react["default"].createElement(ScrollToBottomButton, {
@@ -952,14 +946,14 @@ var MessageListWithContext = function MessageListWithContext(props) {
952
946
  __self: _this,
953
947
  __source: {
954
948
  fileName: _jsxFileName,
955
- lineNumber: 1177,
949
+ lineNumber: 1189,
956
950
  columnNumber: 11
957
951
  }
958
952
  })), _react["default"].createElement(NetworkDownIndicator, {
959
953
  __self: _this,
960
954
  __source: {
961
955
  fileName: _jsxFileName,
962
- lineNumber: 1184,
956
+ lineNumber: 1196,
963
957
  columnNumber: 7
964
958
  }
965
959
  }));
@@ -1066,7 +1060,7 @@ var MessageList = function MessageList(props) {
1066
1060
  __self: _this,
1067
1061
  __source: {
1068
1062
  fileName: _jsxFileName,
1069
- lineNumber: 1242,
1063
+ lineNumber: 1254,
1070
1064
  columnNumber: 5
1071
1065
  }
1072
1066
  }));