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

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