stream-chat-react-native-core 6.7.3-beta.1 → 6.7.3-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 (64) hide show
  1. package/lib/commonjs/components/Channel/Channel.js +296 -293
  2. package/lib/commonjs/components/Channel/Channel.js.map +1 -1
  3. package/lib/commonjs/components/Channel/hooks/useMessageListPagination.js +133 -147
  4. package/lib/commonjs/components/Channel/hooks/useMessageListPagination.js.map +1 -1
  5. package/lib/commonjs/components/KeyboardCompatibleView/KeyboardCompatibleView.js +7 -12
  6. package/lib/commonjs/components/KeyboardCompatibleView/KeyboardCompatibleView.js.map +1 -1
  7. package/lib/commonjs/components/MessageList/MessageList.js +167 -179
  8. package/lib/commonjs/components/MessageList/MessageList.js.map +1 -1
  9. package/lib/commonjs/components/MessageList/hooks/useMessageList.js +60 -37
  10. package/lib/commonjs/components/MessageList/hooks/useMessageList.js.map +1 -1
  11. package/lib/commonjs/contexts/messageInputContext/MessageInputContext.js +450 -459
  12. package/lib/commonjs/contexts/messageInputContext/MessageInputContext.js.map +1 -1
  13. package/lib/commonjs/contexts/messagesContext/MessagesContext.js.map +1 -1
  14. package/lib/commonjs/hooks/index.js +11 -0
  15. package/lib/commonjs/hooks/index.js.map +1 -1
  16. package/lib/commonjs/hooks/useStableCallback.js +13 -0
  17. package/lib/commonjs/hooks/useStableCallback.js.map +1 -0
  18. package/lib/commonjs/version.json +1 -1
  19. package/lib/module/components/Channel/Channel.js +296 -293
  20. package/lib/module/components/Channel/Channel.js.map +1 -1
  21. package/lib/module/components/Channel/hooks/useMessageListPagination.js +133 -147
  22. package/lib/module/components/Channel/hooks/useMessageListPagination.js.map +1 -1
  23. package/lib/module/components/KeyboardCompatibleView/KeyboardCompatibleView.js +7 -12
  24. package/lib/module/components/KeyboardCompatibleView/KeyboardCompatibleView.js.map +1 -1
  25. package/lib/module/components/MessageList/MessageList.js +167 -179
  26. package/lib/module/components/MessageList/MessageList.js.map +1 -1
  27. package/lib/module/components/MessageList/hooks/useMessageList.js +60 -37
  28. package/lib/module/components/MessageList/hooks/useMessageList.js.map +1 -1
  29. package/lib/module/contexts/messageInputContext/MessageInputContext.js +450 -459
  30. package/lib/module/contexts/messageInputContext/MessageInputContext.js.map +1 -1
  31. package/lib/module/contexts/messagesContext/MessagesContext.js.map +1 -1
  32. package/lib/module/hooks/index.js +11 -0
  33. package/lib/module/hooks/index.js.map +1 -1
  34. package/lib/module/hooks/useStableCallback.js +13 -0
  35. package/lib/module/hooks/useStableCallback.js.map +1 -0
  36. package/lib/module/version.json +1 -1
  37. package/lib/typescript/components/Channel/Channel.d.ts.map +1 -1
  38. package/lib/typescript/components/Channel/hooks/useMessageListPagination.d.ts +3 -3
  39. package/lib/typescript/components/Channel/hooks/useMessageListPagination.d.ts.map +1 -1
  40. package/lib/typescript/components/KeyboardCompatibleView/KeyboardCompatibleView.d.ts +3 -0
  41. package/lib/typescript/components/KeyboardCompatibleView/KeyboardCompatibleView.d.ts.map +1 -1
  42. package/lib/typescript/components/MessageList/MessageList.d.ts.map +1 -1
  43. package/lib/typescript/components/MessageList/hooks/useMessageList.d.ts +4 -0
  44. package/lib/typescript/components/MessageList/hooks/useMessageList.d.ts.map +1 -1
  45. package/lib/typescript/contexts/messageInputContext/MessageInputContext.d.ts.map +1 -1
  46. package/lib/typescript/contexts/messagesContext/MessagesContext.d.ts +1 -1
  47. package/lib/typescript/contexts/messagesContext/MessagesContext.d.ts.map +1 -1
  48. package/lib/typescript/hooks/index.d.ts +1 -0
  49. package/lib/typescript/hooks/index.d.ts.map +1 -1
  50. package/lib/typescript/hooks/useStableCallback.d.ts +26 -0
  51. package/lib/typescript/hooks/useStableCallback.d.ts.map +1 -0
  52. package/package.json +1 -1
  53. package/src/components/Channel/Channel.tsx +462 -431
  54. package/src/components/Channel/__tests__/Channel.test.js +8 -3
  55. package/src/components/Channel/hooks/useMessageListPagination.tsx +152 -147
  56. package/src/components/KeyboardCompatibleView/KeyboardCompatibleView.tsx +6 -4
  57. package/src/components/MessageList/MessageList.tsx +147 -112
  58. package/src/components/MessageList/hooks/useMessageList.ts +69 -38
  59. package/src/contexts/messageInputContext/MessageInputContext.tsx +293 -267
  60. package/src/contexts/messageInputContext/__tests__/pickFile.test.tsx +2 -1
  61. package/src/contexts/messagesContext/MessagesContext.tsx +1 -0
  62. package/src/hooks/index.ts +1 -0
  63. package/src/hooks/useStableCallback.ts +37 -0
  64. package/src/version.json +1 -1
@@ -37,6 +37,7 @@ var _ThemeContext = require("../../contexts/themeContext/ThemeContext");
37
37
  var _ThreadContext = require("../../contexts/threadContext/ThreadContext");
38
38
  var _TranslationContext = require("../../contexts/translationContext/TranslationContext");
39
39
  var _TypingContext = require("../../contexts/typingContext/TypingContext");
40
+ var _hooks = require("../../hooks");
40
41
  var _useAppStateListener = require("../../hooks/useAppStateListener");
41
42
  var _icons = require("../../icons");
42
43
  var _native = require("../../native");
@@ -518,6 +519,9 @@ var ChannelWithContext = function ChannelWithContext(props) {
518
519
  setTargetedMessage = _useTargetedMessage.setTargetedMessage,
519
520
  targetedMessage = _useTargetedMessage.targetedMessage;
520
521
  var uploadAbortControllerRef = (0, _react.useRef)(new Map());
522
+ var optimisticallyUpdatedNewMessages = (0, _react.useMemo)(function () {
523
+ return new Set();
524
+ }, []);
521
525
  var channelId = (channel == null ? void 0 : channel.id) || '';
522
526
  var pollCreationEnabled = !channel.disconnected && !!(channel != null && channel.id) && (channel == null || (_channel$getConfig = channel.getConfig()) == null ? void 0 : _channel$getConfig.polls);
523
527
  var _useChannelDataState = (0, _useChannelDataState2.useChannelDataState)(channel),
@@ -537,16 +541,29 @@ var ChannelWithContext = function ChannelWithContext(props) {
537
541
  loadMore = _useMessageListPagina.loadMore,
538
542
  loadMoreRecent = _useMessageListPagina.loadMoreRecent,
539
543
  channelMessagesState = _useMessageListPagina.state;
540
- var copyChannelStateThrottlingTime = newMessageStateUpdateThrottleInterval > stateUpdateThrottleInterval ? newMessageStateUpdateThrottleInterval : stateUpdateThrottleInterval;
544
+ var setReadThrottled = (0, _react.useMemo)(function () {
545
+ return (0, _throttle["default"])(function () {
546
+ if (channel) {
547
+ setRead(channel);
548
+ }
549
+ }, stateUpdateThrottleInterval, throttleOptions);
550
+ }, [channel, stateUpdateThrottleInterval, setRead]);
551
+ var copyMessagesStateFromChannelThrottled = (0, _react.useMemo)(function () {
552
+ return (0, _throttle["default"])(function () {
553
+ if (channel) {
554
+ copyMessagesStateFromChannel(channel);
555
+ }
556
+ }, newMessageStateUpdateThrottleInterval, throttleOptions);
557
+ }, [channel, newMessageStateUpdateThrottleInterval, copyMessagesStateFromChannel]);
541
558
  var copyChannelState = (0, _react.useMemo)(function () {
542
559
  return (0, _throttle["default"])(function () {
543
560
  if (channel) {
544
561
  copyStateFromChannel(channel);
545
562
  copyMessagesStateFromChannel(channel);
546
563
  }
547
- }, copyChannelStateThrottlingTime, throttleOptions);
548
- }, [channel, copyChannelStateThrottlingTime, copyMessagesStateFromChannel, copyStateFromChannel]);
549
- var handleEvent = function handleEvent(event) {
564
+ }, stateUpdateThrottleInterval, throttleOptions);
565
+ }, [stateUpdateThrottleInterval, channel, copyStateFromChannel, copyMessagesStateFromChannel]);
566
+ var handleEvent = (0, _hooks.useStableCallback)(function (event) {
550
567
  if (shouldSyncChannel) {
551
568
  if (event.type.startsWith('poll.') || event.type === 'user.watching.start' || event.type === 'user.watching.stop') {
552
569
  return;
@@ -586,10 +603,23 @@ var ChannelWithContext = function ChannelWithContext(props) {
586
603
  setChannelUnreadState(undefined);
587
604
  }
588
605
  if (channel && channel.initialized) {
606
+ if (event.type === 'message.new' || event.type === 'notification.message_new') {
607
+ var _event$message$id, _event$message2, _event$user2;
608
+ var _messageId = (_event$message$id = (_event$message2 = event.message) == null ? void 0 : _event$message2.id) != null ? _event$message$id : '';
609
+ if (((_event$user2 = event.user) == null ? void 0 : _event$user2.id) !== client.userID || !optimisticallyUpdatedNewMessages.has(_messageId)) {
610
+ copyMessagesStateFromChannelThrottled();
611
+ }
612
+ optimisticallyUpdatedNewMessages["delete"](_messageId);
613
+ return;
614
+ }
615
+ if (event.type === 'message.read' || event.type === 'notification.mark_read') {
616
+ setReadThrottled();
617
+ return;
618
+ }
589
619
  copyChannelState();
590
620
  }
591
621
  }
592
- };
622
+ });
593
623
  (0, _react.useEffect)(function () {
594
624
  var listener;
595
625
  var initChannel = function () {
@@ -601,7 +631,7 @@ var ChannelWithContext = function ChannelWithContext(props) {
601
631
  case 0:
602
632
  setLastRead(new Date());
603
633
  unreadCount = channel.countUnread();
604
- if (!(!channel || !shouldSyncChannel || channel.offlineMode)) {
634
+ if (!(!channel || !shouldSyncChannel)) {
605
635
  _context.next = 4;
606
636
  break;
607
637
  }
@@ -695,16 +725,6 @@ var ChannelWithContext = function ChannelWithContext(props) {
695
725
  unsubscribe = _client$on.unsubscribe;
696
726
  return unsubscribe;
697
727
  }, [channel == null ? void 0 : channel.cid, client]);
698
- (0, _react.useEffect)(function () {
699
- var handleEvent = function handleEvent(event) {
700
- if (channel.cid === event.cid) {
701
- setRead(channel);
702
- }
703
- };
704
- var _client$on2 = client.on('notification.mark_read', handleEvent),
705
- unsubscribe = _client$on2.unsubscribe;
706
- return unsubscribe;
707
- }, [channel, client, setRead]);
708
728
  var threadPropsExists = !!threadProps;
709
729
  (0, _react.useEffect)(function () {
710
730
  if (threadProps && shouldSyncChannel) {
@@ -728,7 +748,7 @@ var ChannelWithContext = function ChannelWithContext(props) {
728
748
  }
729
749
  }, [thread == null ? void 0 : thread.id, channelId]);
730
750
  (0, _useAppStateListener.useAppStateListener)(undefined, handleAppBackground);
731
- var markRead = (0, _throttle["default"])(function () {
751
+ var markReadInternal = (0, _throttle["default"])(function () {
732
752
  var _ref2 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee2(options) {
733
753
  var _ref3, _ref3$updateChannelUn, updateChannelUnreadState, response;
734
754
  return _regenerator["default"].wrap(function _callee2$(_context2) {
@@ -778,147 +798,138 @@ var ChannelWithContext = function ChannelWithContext(props) {
778
798
  return _ref2.apply(this, arguments);
779
799
  };
780
800
  }(), defaultThrottleInterval, throttleOptions);
781
- var reloadThread = function () {
782
- var _ref4 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee3() {
783
- var parentID, limit, queryResponse, updatedHasMore, updatedThreadMessages, _yield$channel$getMes, messages, _messages, threadMessage, formattedMessage;
784
- return _regenerator["default"].wrap(function _callee3$(_context3) {
785
- while (1) switch (_context3.prev = _context3.next) {
786
- case 0:
787
- if (!(!channel || !(thread != null && thread.id))) {
788
- _context3.next = 2;
789
- break;
790
- }
791
- return _context3.abrupt("return");
792
- case 2:
793
- setThreadLoadingMore(true);
794
- _context3.prev = 3;
795
- parentID = thread.id;
796
- limit = 50;
797
- channel.state.threads[parentID] = [];
798
- _context3.next = 9;
799
- return channel.getReplies(parentID, {
800
- limit: limit
801
- });
802
- case 9:
803
- queryResponse = _context3.sent;
804
- updatedHasMore = queryResponse.messages.length === limit;
805
- updatedThreadMessages = channel.state.threads[parentID] || [];
806
- loadMoreThreadFinished(updatedHasMore, updatedThreadMessages);
807
- _context3.next = 15;
808
- return channel.getMessagesById([parentID]);
809
- case 15:
810
- _yield$channel$getMes = _context3.sent;
811
- messages = _yield$channel$getMes.messages;
812
- _messages = (0, _slicedToArray2["default"])(messages, 1), threadMessage = _messages[0];
813
- if (threadMessage && !threadInstance) {
814
- formattedMessage = channel.state.formatMessage(threadMessage);
815
- setThread(formattedMessage);
816
- }
817
- _context3.next = 27;
801
+ var markRead = (0, _hooks.useStableCallback)(markReadInternal);
802
+ var reloadThread = (0, _hooks.useStableCallback)((0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee3() {
803
+ var parentID, limit, queryResponse, updatedHasMore, updatedThreadMessages, _yield$channel$getMes, messages, _messages, threadMessage, formattedMessage;
804
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
805
+ while (1) switch (_context3.prev = _context3.next) {
806
+ case 0:
807
+ if (!(!channel || !(thread != null && thread.id))) {
808
+ _context3.next = 2;
818
809
  break;
819
- case 21:
820
- _context3.prev = 21;
821
- _context3.t0 = _context3["catch"](3);
822
- console.warn('Thread loading request failed with error', _context3.t0);
823
- if (_context3.t0 instanceof Error) {
824
- setError(_context3.t0);
825
- } else {
826
- setError(true);
827
- }
828
- setThreadLoadingMore(false);
829
- throw _context3.t0;
830
- case 27:
831
- case "end":
832
- return _context3.stop();
833
- }
834
- }, _callee3, null, [[3, 21]]);
835
- }));
836
- return function reloadThread() {
837
- return _ref4.apply(this, arguments);
838
- };
839
- }();
840
- var resyncChannel = function () {
841
- var _ref5 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee4() {
842
- var parseMessage, _channelMessagesState, failedMessages, failedThreadMessages;
843
- return _regenerator["default"].wrap(function _callee4$(_context4) {
844
- while (1) switch (_context4.prev = _context4.next) {
845
- case 0:
846
- if (!(!channel || syncingChannelRef.current)) {
847
- _context4.next = 2;
848
- break;
849
- }
850
- return _context4.abrupt("return");
851
- case 2:
852
- syncingChannelRef.current = true;
853
- setError(false);
854
- if (!(channelMessagesState != null && channelMessagesState.messages)) {
855
- _context4.next = 7;
856
- break;
857
- }
810
+ }
811
+ return _context3.abrupt("return");
812
+ case 2:
813
+ setThreadLoadingMore(true);
814
+ _context3.prev = 3;
815
+ parentID = thread.id;
816
+ limit = 50;
817
+ channel.state.threads[parentID] = [];
818
+ _context3.next = 9;
819
+ return channel.getReplies(parentID, {
820
+ limit: limit
821
+ });
822
+ case 9:
823
+ queryResponse = _context3.sent;
824
+ updatedHasMore = queryResponse.messages.length === limit;
825
+ updatedThreadMessages = channel.state.threads[parentID] || [];
826
+ loadMoreThreadFinished(updatedHasMore, updatedThreadMessages);
827
+ _context3.next = 15;
828
+ return channel.getMessagesById([parentID]);
829
+ case 15:
830
+ _yield$channel$getMes = _context3.sent;
831
+ messages = _yield$channel$getMes.messages;
832
+ _messages = (0, _slicedToArray2["default"])(messages, 1), threadMessage = _messages[0];
833
+ if (threadMessage && !threadInstance) {
834
+ formattedMessage = channel.state.formatMessage(threadMessage);
835
+ setThread(formattedMessage);
836
+ }
837
+ _context3.next = 27;
838
+ break;
839
+ case 21:
840
+ _context3.prev = 21;
841
+ _context3.t0 = _context3["catch"](3);
842
+ console.warn('Thread loading request failed with error', _context3.t0);
843
+ if (_context3.t0 instanceof Error) {
844
+ setError(_context3.t0);
845
+ } else {
846
+ setError(true);
847
+ }
848
+ setThreadLoadingMore(false);
849
+ throw _context3.t0;
850
+ case 27:
851
+ case "end":
852
+ return _context3.stop();
853
+ }
854
+ }, _callee3, null, [[3, 21]]);
855
+ })));
856
+ var resyncChannel = (0, _hooks.useStableCallback)((0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee4() {
857
+ var parseMessage, _channelMessagesState, failedMessages, failedThreadMessages;
858
+ return _regenerator["default"].wrap(function _callee4$(_context4) {
859
+ while (1) switch (_context4.prev = _context4.next) {
860
+ case 0:
861
+ if (!(!channel || syncingChannelRef.current)) {
862
+ _context4.next = 2;
863
+ break;
864
+ }
865
+ return _context4.abrupt("return");
866
+ case 2:
867
+ syncingChannelRef.current = true;
868
+ setError(false);
869
+ if (!(channelMessagesState != null && channelMessagesState.messages)) {
858
870
  _context4.next = 7;
859
- return channel == null ? void 0 : channel.watch({
860
- messages: {
861
- limit: channelMessagesState.messages.length + 30
862
- }
863
- });
864
- case 7:
865
- parseMessage = function parseMessage(message) {
866
- var _message$pinned_at, _message$updated_at;
867
- return Object.assign({}, message, {
868
- created_at: message.created_at.toString(),
869
- pinned_at: (_message$pinned_at = message.pinned_at) == null ? void 0 : _message$pinned_at.toString(),
870
- updated_at: (_message$updated_at = message.updated_at) == null ? void 0 : _message$updated_at.toString()
871
- });
872
- };
873
- _context4.prev = 8;
874
- if (thread) {
875
- _context4.next = 16;
876
- break;
877
- }
878
- copyChannelState();
879
- failedMessages = (_channelMessagesState = channelMessagesState.messages) == null ? void 0 : _channelMessagesState.filter(function (message) {
880
- return message.status === _utils.MessageStatusTypes.FAILED;
881
- }).map(parseMessage);
882
- if (failedMessages != null && failedMessages.length) {
883
- channel.state.addMessagesSorted(failedMessages);
884
- }
885
- channel.state.setIsUpToDate(true);
886
- _context4.next = 20;
887
871
  break;
888
- case 16:
889
- _context4.next = 18;
890
- return reloadThread();
891
- case 18:
892
- failedThreadMessages = thread ? threadMessages.filter(function (message) {
893
- return message.status === _utils.MessageStatusTypes.FAILED;
894
- }).map(parseMessage) : [];
895
- if (failedThreadMessages.length) {
896
- channel.state.addMessagesSorted(failedThreadMessages);
897
- setThreadMessages((0, _toConsumableArray2["default"])(channel.state.threads[thread.id]));
872
+ }
873
+ _context4.next = 7;
874
+ return channel == null ? void 0 : channel.watch({
875
+ messages: {
876
+ limit: channelMessagesState.messages.length + 30
898
877
  }
899
- case 20:
900
- _context4.next = 25;
878
+ });
879
+ case 7:
880
+ parseMessage = function parseMessage(message) {
881
+ var _message$pinned_at, _message$updated_at;
882
+ return Object.assign({}, message, {
883
+ created_at: message.created_at.toString(),
884
+ pinned_at: (_message$pinned_at = message.pinned_at) == null ? void 0 : _message$pinned_at.toString(),
885
+ updated_at: (_message$updated_at = message.updated_at) == null ? void 0 : _message$updated_at.toString()
886
+ });
887
+ };
888
+ _context4.prev = 8;
889
+ if (thread) {
890
+ _context4.next = 16;
901
891
  break;
902
- case 22:
903
- _context4.prev = 22;
904
- _context4.t0 = _context4["catch"](8);
905
- if (_context4.t0 instanceof Error) {
906
- setError(_context4.t0);
907
- } else {
908
- setError(true);
909
- }
910
- case 25:
911
- syncingChannelRef.current = false;
912
- case 26:
913
- case "end":
914
- return _context4.stop();
915
- }
916
- }, _callee4, null, [[8, 22]]);
917
- }));
918
- return function resyncChannel() {
919
- return _ref5.apply(this, arguments);
920
- };
921
- }();
892
+ }
893
+ copyChannelState();
894
+ failedMessages = (_channelMessagesState = channelMessagesState.messages) == null ? void 0 : _channelMessagesState.filter(function (message) {
895
+ return message.status === _utils.MessageStatusTypes.FAILED;
896
+ }).map(parseMessage);
897
+ if (failedMessages != null && failedMessages.length) {
898
+ channel.state.addMessagesSorted(failedMessages);
899
+ }
900
+ channel.state.setIsUpToDate(true);
901
+ _context4.next = 20;
902
+ break;
903
+ case 16:
904
+ _context4.next = 18;
905
+ return reloadThread();
906
+ case 18:
907
+ failedThreadMessages = thread ? threadMessages.filter(function (message) {
908
+ return message.status === _utils.MessageStatusTypes.FAILED;
909
+ }).map(parseMessage) : [];
910
+ if (failedThreadMessages.length) {
911
+ channel.state.addMessagesSorted(failedThreadMessages);
912
+ setThreadMessages((0, _toConsumableArray2["default"])(channel.state.threads[thread.id]));
913
+ }
914
+ case 20:
915
+ _context4.next = 25;
916
+ break;
917
+ case 22:
918
+ _context4.prev = 22;
919
+ _context4.t0 = _context4["catch"](8);
920
+ if (_context4.t0 instanceof Error) {
921
+ setError(_context4.t0);
922
+ } else {
923
+ setError(true);
924
+ }
925
+ case 25:
926
+ syncingChannelRef.current = false;
927
+ case 26:
928
+ case "end":
929
+ return _context4.stop();
930
+ }
931
+ }, _callee4, null, [[8, 22]]);
932
+ })));
922
933
  var resyncChannelRef = (0, _react.useRef)(resyncChannel);
923
934
  resyncChannelRef.current = resyncChannel;
924
935
  (0, _react.useEffect)(function () {
@@ -953,32 +964,27 @@ var ChannelWithContext = function ChannelWithContext(props) {
953
964
  }
954
965
  };
955
966
  var clientChannelConfig = getChannelConfigSafely();
956
- var reloadChannel = function () {
957
- var _ref6 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee5() {
958
- return _regenerator["default"].wrap(function _callee5$(_context5) {
959
- while (1) switch (_context5.prev = _context5.next) {
960
- case 0:
961
- _context5.prev = 0;
962
- _context5.next = 3;
963
- return loadLatestMessages();
964
- case 3:
965
- _context5.next = 8;
966
- break;
967
- case 5:
968
- _context5.prev = 5;
969
- _context5.t0 = _context5["catch"](0);
970
- console.warn('Reloading channel failed with error:', _context5.t0);
971
- case 8:
972
- case "end":
973
- return _context5.stop();
974
- }
975
- }, _callee5, null, [[0, 5]]);
976
- }));
977
- return function reloadChannel() {
978
- return _ref6.apply(this, arguments);
979
- };
980
- }();
981
- var loadChannelAroundMessage = function () {
967
+ var reloadChannel = (0, _hooks.useStableCallback)((0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee5() {
968
+ return _regenerator["default"].wrap(function _callee5$(_context5) {
969
+ while (1) switch (_context5.prev = _context5.next) {
970
+ case 0:
971
+ _context5.prev = 0;
972
+ _context5.next = 3;
973
+ return loadLatestMessages();
974
+ case 3:
975
+ _context5.next = 8;
976
+ break;
977
+ case 5:
978
+ _context5.prev = 5;
979
+ _context5.t0 = _context5["catch"](0);
980
+ console.warn('Reloading channel failed with error:', _context5.t0);
981
+ case 8:
982
+ case "end":
983
+ return _context5.stop();
984
+ }
985
+ }, _callee5, null, [[0, 5]]);
986
+ })));
987
+ var loadChannelAroundMessage = (0, _hooks.useStableCallback)(function () {
982
988
  var _ref8 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee6(_ref7) {
983
989
  var messageIdToLoadAround;
984
990
  return _regenerator["default"].wrap(function _callee6$(_context6) {
@@ -1039,23 +1045,28 @@ var ChannelWithContext = function ChannelWithContext(props) {
1039
1045
  }
1040
1046
  }, _callee6, null, [[3, 24], [6, 14]]);
1041
1047
  }));
1042
- return function loadChannelAroundMessage(_x2) {
1048
+ return function (_x2) {
1043
1049
  return _ref8.apply(this, arguments);
1044
1050
  };
1045
- }();
1046
- var updateMessage = function updateMessage(updatedMessage) {
1051
+ }());
1052
+ var updateMessage = (0, _hooks.useStableCallback)(function (updatedMessage) {
1047
1053
  var extraState = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1054
+ var throttled = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1048
1055
  if (!channel) {
1049
1056
  return;
1050
1057
  }
1051
1058
  channel.state.addMessageSorted(updatedMessage, true);
1052
- copyMessagesStateFromChannel(channel);
1059
+ if (throttled) {
1060
+ copyMessagesStateFromChannelThrottled();
1061
+ } else {
1062
+ copyMessagesStateFromChannel(channel);
1063
+ }
1053
1064
  if (thread && updatedMessage.parent_id) {
1054
1065
  extraState.threadMessages = channel.state.threads[updatedMessage.parent_id] || [];
1055
1066
  setThreadMessages(extraState.threadMessages);
1056
1067
  }
1057
- };
1058
- var replaceMessage = function replaceMessage(oldMessage, newMessage) {
1068
+ });
1069
+ var replaceMessage = (0, _hooks.useStableCallback)(function (oldMessage, newMessage) {
1059
1070
  if (channel) {
1060
1071
  channel.state.removeMessage(oldMessage);
1061
1072
  channel.state.addMessageSorted(newMessage, true);
@@ -1065,8 +1076,8 @@ var ChannelWithContext = function ChannelWithContext(props) {
1065
1076
  setThreadMessages(_threadMessages);
1066
1077
  }
1067
1078
  }
1068
- };
1069
- var createMessagePreview = function createMessagePreview(_ref9) {
1079
+ });
1080
+ var createMessagePreview = (0, _hooks.useStableCallback)(function (_ref9) {
1070
1081
  var attachments = _ref9.attachments,
1071
1082
  mentioned_users = _ref9.mentioned_users,
1072
1083
  parent_id = _ref9.parent_id,
@@ -1109,8 +1120,8 @@ var ChannelWithContext = function ChannelWithContext(props) {
1109
1120
  preview.quoted_message = _quotedMessage;
1110
1121
  }
1111
1122
  return preview;
1112
- };
1113
- var uploadPendingAttachments = function () {
1123
+ });
1124
+ var uploadPendingAttachments = (0, _hooks.useStableCallback)(function () {
1114
1125
  var _ref10 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee7(message) {
1115
1126
  var _updatedMessage$attac;
1116
1127
  var updatedMessage, i, _updatedMessage$attac2, attachment, image, file, _image$name, filename, controller, compressedUri, contentType, uploadResponse, _controller, response;
@@ -1221,11 +1232,11 @@ var ChannelWithContext = function ChannelWithContext(props) {
1221
1232
  }
1222
1233
  }, _callee7);
1223
1234
  }));
1224
- return function uploadPendingAttachments(_x3) {
1235
+ return function (_x3) {
1225
1236
  return _ref10.apply(this, arguments);
1226
1237
  };
1227
- }();
1228
- var sendMessageRequest = function () {
1238
+ }());
1239
+ var sendMessageRequest = (0, _hooks.useStableCallback)(function () {
1229
1240
  var _ref11 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee8(message, retrying) {
1230
1241
  var updatedMessage, extraFields, attachments, id, mentioned_users, parent_id, text, mentionedUserIds, messageData, messageResponse, _updatedMessage;
1231
1242
  return _regenerator["default"].wrap(function _callee8$(_context8) {
@@ -1294,10 +1305,10 @@ var ChannelWithContext = function ChannelWithContext(props) {
1294
1305
  if (retrying) {
1295
1306
  replaceMessage(message, messageResponse.message);
1296
1307
  } else {
1297
- updateMessage(messageResponse.message);
1308
+ updateMessage(messageResponse.message, {}, true);
1298
1309
  }
1299
1310
  case 27:
1300
- _context8.next = 39;
1311
+ _context8.next = 40;
1301
1312
  break;
1302
1313
  case 29:
1303
1314
  _context8.prev = 29;
@@ -1311,27 +1322,28 @@ var ChannelWithContext = function ChannelWithContext(props) {
1311
1322
  threadInstance == null || threadInstance.upsertReplyLocally == null || threadInstance.upsertReplyLocally({
1312
1323
  message: _updatedMessage
1313
1324
  });
1325
+ optimisticallyUpdatedNewMessages["delete"](message.id);
1314
1326
  if (!enableOfflineSupport) {
1315
- _context8.next = 39;
1327
+ _context8.next = 40;
1316
1328
  break;
1317
1329
  }
1318
- _context8.next = 39;
1330
+ _context8.next = 40;
1319
1331
  return dbApi.updateMessage({
1320
1332
  message: Object.assign({}, message, {
1321
1333
  cid: channel.cid
1322
1334
  })
1323
1335
  });
1324
- case 39:
1336
+ case 40:
1325
1337
  case "end":
1326
1338
  return _context8.stop();
1327
1339
  }
1328
1340
  }, _callee8, null, [[0, 29]]);
1329
1341
  }));
1330
- return function sendMessageRequest(_x4, _x5) {
1342
+ return function (_x4, _x5) {
1331
1343
  return _ref11.apply(this, arguments);
1332
1344
  };
1333
- }();
1334
- var sendMessage = function () {
1345
+ }());
1346
+ var sendMessage = (0, _hooks.useStableCallback)(function () {
1335
1347
  var _ref12 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee9(message) {
1336
1348
  var _channel$state;
1337
1349
  var messagePreview;
@@ -1351,31 +1363,32 @@ var ChannelWithContext = function ChannelWithContext(props) {
1351
1363
  threadInstance == null || threadInstance.upsertReplyLocally == null || threadInstance.upsertReplyLocally({
1352
1364
  message: messagePreview
1353
1365
  });
1366
+ optimisticallyUpdatedNewMessages.add(messagePreview.id);
1354
1367
  if (!enableOfflineSupport) {
1355
- _context9.next = 7;
1368
+ _context9.next = 8;
1356
1369
  break;
1357
1370
  }
1358
- _context9.next = 7;
1371
+ _context9.next = 8;
1359
1372
  return dbApi.upsertMessages({
1360
1373
  messages: [Object.assign({}, messagePreview, {
1361
1374
  cid: channel.cid,
1362
1375
  status: _utils.MessageStatusTypes.FAILED
1363
1376
  })]
1364
1377
  });
1365
- case 7:
1366
- _context9.next = 9;
1378
+ case 8:
1379
+ _context9.next = 10;
1367
1380
  return sendMessageRequest(messagePreview);
1368
- case 9:
1381
+ case 10:
1369
1382
  case "end":
1370
1383
  return _context9.stop();
1371
1384
  }
1372
1385
  }, _callee9);
1373
1386
  }));
1374
- return function sendMessage(_x6) {
1387
+ return function (_x6) {
1375
1388
  return _ref12.apply(this, arguments);
1376
1389
  };
1377
- }();
1378
- var retrySendMessage = function () {
1390
+ }());
1391
+ var retrySendMessage = (0, _hooks.useStableCallback)(function () {
1379
1392
  var _ref13 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee10(message) {
1380
1393
  var statusPendingMessage, messageWithoutReservedFields;
1381
1394
  return _regenerator["default"].wrap(function _callee10$(_context10) {
@@ -1396,27 +1409,27 @@ var ChannelWithContext = function ChannelWithContext(props) {
1396
1409
  }
1397
1410
  }, _callee10);
1398
1411
  }));
1399
- return function retrySendMessage(_x7) {
1412
+ return function (_x7) {
1400
1413
  return _ref13.apply(this, arguments);
1401
1414
  };
1402
- }();
1403
- var editMessage = function editMessage(updatedMessage) {
1415
+ }());
1416
+ var editMessage = (0, _hooks.useStableCallback)(function (updatedMessage) {
1404
1417
  return doUpdateMessageRequest ? doUpdateMessageRequest((channel == null ? void 0 : channel.cid) || '', updatedMessage) : client.updateMessage(updatedMessage);
1405
- };
1406
- var setEditingState = function setEditingState(message) {
1418
+ });
1419
+ var setEditingState = (0, _hooks.useStableCallback)(function (message) {
1407
1420
  clearQuotedMessageState();
1408
1421
  setEditing(message);
1409
- };
1410
- var setQuotedMessageState = function setQuotedMessageState(messageOrBoolean) {
1422
+ });
1423
+ var setQuotedMessageState = (0, _hooks.useStableCallback)(function (messageOrBoolean) {
1411
1424
  setQuotedMessage(messageOrBoolean);
1412
- };
1413
- var clearEditingState = function clearEditingState() {
1425
+ });
1426
+ var clearEditingState = (0, _hooks.useStableCallback)(function () {
1414
1427
  return setEditing(undefined);
1415
- };
1416
- var clearQuotedMessageState = function clearQuotedMessageState() {
1428
+ });
1429
+ var clearQuotedMessageState = (0, _hooks.useStableCallback)(function () {
1417
1430
  return setQuotedMessage(undefined);
1418
- };
1419
- var removeMessage = function () {
1431
+ });
1432
+ var removeMessage = (0, _hooks.useStableCallback)(function () {
1420
1433
  var _ref14 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee11(message) {
1421
1434
  return _regenerator["default"].wrap(function _callee11$(_context11) {
1422
1435
  while (1) switch (_context11.prev = _context11.next) {
@@ -1442,11 +1455,11 @@ var ChannelWithContext = function ChannelWithContext(props) {
1442
1455
  }
1443
1456
  }, _callee11);
1444
1457
  }));
1445
- return function removeMessage(_x8) {
1458
+ return function (_x8) {
1446
1459
  return _ref14.apply(this, arguments);
1447
1460
  };
1448
- }();
1449
- var sendReaction = function () {
1461
+ }());
1462
+ var sendReaction = (0, _hooks.useStableCallback)(function () {
1450
1463
  var _ref15 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee12(type, messageId) {
1451
1464
  var payload, sendReactionResponse;
1452
1465
  return _regenerator["default"].wrap(function _callee12$(_context12) {
@@ -1504,11 +1517,11 @@ var ChannelWithContext = function ChannelWithContext(props) {
1504
1517
  }
1505
1518
  }, _callee12);
1506
1519
  }));
1507
- return function sendReaction(_x9, _x10) {
1520
+ return function (_x9, _x10) {
1508
1521
  return _ref15.apply(this, arguments);
1509
1522
  };
1510
- }();
1511
- var deleteMessage = function () {
1523
+ }());
1524
+ var deleteMessage = (0, _hooks.useStableCallback)(function () {
1512
1525
  var _ref16 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee13(message) {
1513
1526
  var updatedMessage, data;
1514
1527
  return _regenerator["default"].wrap(function _callee13$(_context13) {
@@ -1584,11 +1597,11 @@ var ChannelWithContext = function ChannelWithContext(props) {
1584
1597
  }
1585
1598
  }, _callee13);
1586
1599
  }));
1587
- return function deleteMessage(_x11) {
1600
+ return function (_x11) {
1588
1601
  return _ref16.apply(this, arguments);
1589
1602
  };
1590
- }();
1591
- var deleteReaction = function () {
1603
+ }());
1604
+ var deleteReaction = (0, _hooks.useStableCallback)(function () {
1592
1605
  var _ref17 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee14(type, messageId) {
1593
1606
  var payload;
1594
1607
  return _regenerator["default"].wrap(function _callee14$(_context14) {
@@ -1634,10 +1647,10 @@ var ChannelWithContext = function ChannelWithContext(props) {
1634
1647
  }
1635
1648
  }, _callee14);
1636
1649
  }));
1637
- return function deleteReaction(_x12, _x13) {
1650
+ return function (_x12, _x13) {
1638
1651
  return _ref17.apply(this, arguments);
1639
1652
  };
1640
- }();
1653
+ }());
1641
1654
  var openThread = (0, _react.useCallback)(function (message) {
1642
1655
  setThread(message);
1643
1656
  if (channel.initialized) {
@@ -1655,62 +1668,57 @@ var ChannelWithContext = function ChannelWithContext(props) {
1655
1668
  setThreadLoadingMore(false);
1656
1669
  setThreadMessages(updatedThreadMessages);
1657
1670
  }, defaultDebounceInterval, debounceOptions)).current;
1658
- var loadMoreThread = function () {
1659
- var _ref18 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee15() {
1660
- var _threadMessages$, parentID, oldestMessageID, limit, queryResponse, updatedHasMore, updatedThreadMessages;
1661
- return _regenerator["default"].wrap(function _callee15$(_context15) {
1662
- while (1) switch (_context15.prev = _context15.next) {
1663
- case 0:
1664
- if (!(threadLoadingMore || !(thread != null && thread.id))) {
1665
- _context15.next = 2;
1666
- break;
1667
- }
1668
- return _context15.abrupt("return");
1669
- case 2:
1670
- setThreadLoadingMore(true);
1671
- _context15.prev = 3;
1672
- if (!channel) {
1673
- _context15.next = 15;
1674
- break;
1675
- }
1676
- parentID = thread.id;
1677
- channel.state.threads[parentID] = threadMessages;
1678
- oldestMessageID = threadMessages == null || (_threadMessages$ = threadMessages[0]) == null ? void 0 : _threadMessages$.id;
1679
- limit = 50;
1680
- _context15.next = 11;
1681
- return channel.getReplies(parentID, {
1682
- id_lt: oldestMessageID,
1683
- limit: limit
1684
- });
1685
- case 11:
1686
- queryResponse = _context15.sent;
1687
- updatedHasMore = queryResponse.messages.length === limit;
1688
- updatedThreadMessages = channel.state.threads[parentID] || [];
1689
- loadMoreThreadFinished(updatedHasMore, updatedThreadMessages);
1690
- case 15:
1691
- _context15.next = 23;
1671
+ var loadMoreThread = (0, _hooks.useStableCallback)((0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee15() {
1672
+ var _threadMessages$, parentID, oldestMessageID, limit, queryResponse, updatedHasMore, updatedThreadMessages;
1673
+ return _regenerator["default"].wrap(function _callee15$(_context15) {
1674
+ while (1) switch (_context15.prev = _context15.next) {
1675
+ case 0:
1676
+ if (!(threadLoadingMore || !(thread != null && thread.id))) {
1677
+ _context15.next = 2;
1692
1678
  break;
1693
- case 17:
1694
- _context15.prev = 17;
1695
- _context15.t0 = _context15["catch"](3);
1696
- console.warn('Message pagination request failed with error', _context15.t0);
1697
- if (_context15.t0 instanceof Error) {
1698
- setError(_context15.t0);
1699
- } else {
1700
- setError(true);
1701
- }
1702
- setThreadLoadingMore(false);
1703
- throw _context15.t0;
1704
- case 23:
1705
- case "end":
1706
- return _context15.stop();
1707
- }
1708
- }, _callee15, null, [[3, 17]]);
1709
- }));
1710
- return function loadMoreThread() {
1711
- return _ref18.apply(this, arguments);
1712
- };
1713
- }();
1679
+ }
1680
+ return _context15.abrupt("return");
1681
+ case 2:
1682
+ setThreadLoadingMore(true);
1683
+ _context15.prev = 3;
1684
+ if (!channel) {
1685
+ _context15.next = 15;
1686
+ break;
1687
+ }
1688
+ parentID = thread.id;
1689
+ channel.state.threads[parentID] = threadMessages;
1690
+ oldestMessageID = threadMessages == null || (_threadMessages$ = threadMessages[0]) == null ? void 0 : _threadMessages$.id;
1691
+ limit = 50;
1692
+ _context15.next = 11;
1693
+ return channel.getReplies(parentID, {
1694
+ id_lt: oldestMessageID,
1695
+ limit: limit
1696
+ });
1697
+ case 11:
1698
+ queryResponse = _context15.sent;
1699
+ updatedHasMore = queryResponse.messages.length === limit;
1700
+ updatedThreadMessages = channel.state.threads[parentID] || [];
1701
+ loadMoreThreadFinished(updatedHasMore, updatedThreadMessages);
1702
+ case 15:
1703
+ _context15.next = 23;
1704
+ break;
1705
+ case 17:
1706
+ _context15.prev = 17;
1707
+ _context15.t0 = _context15["catch"](3);
1708
+ console.warn('Message pagination request failed with error', _context15.t0);
1709
+ if (_context15.t0 instanceof Error) {
1710
+ setError(_context15.t0);
1711
+ } else {
1712
+ setError(true);
1713
+ }
1714
+ setThreadLoadingMore(false);
1715
+ throw _context15.t0;
1716
+ case 23:
1717
+ case "end":
1718
+ return _context15.stop();
1719
+ }
1720
+ }, _callee15, null, [[3, 17]]);
1721
+ })));
1714
1722
  var ownCapabilitiesContext = (0, _useCreateOwnCapabilitiesContext.useCreateOwnCapabilitiesContext)({
1715
1723
  channel: channel,
1716
1724
  overrideCapabilities: overrideOwnCapabilities
@@ -1752,11 +1760,6 @@ var ChannelWithContext = function ChannelWithContext(props) {
1752
1760
  watcherCount: channelState.watcherCount,
1753
1761
  watchers: channelState.watchers
1754
1762
  });
1755
- var sendMessageRef = (0, _react.useRef)(sendMessage);
1756
- sendMessageRef.current = sendMessage;
1757
- var sendMessageStable = (0, _react.useCallback)(function () {
1758
- return sendMessageRef.current.apply(sendMessageRef, arguments);
1759
- }, []);
1760
1763
  var inputMessageInputContext = (0, _useCreateInputMessageInputContext.useCreateInputMessageInputContext)({
1761
1764
  additionalTextInputProps: additionalTextInputProps,
1762
1765
  asyncMessagesLockDistance: asyncMessagesLockDistance,
@@ -1809,7 +1812,7 @@ var ChannelWithContext = function ChannelWithContext(props) {
1809
1812
  quotedMessage: quotedMessage,
1810
1813
  SendButton: SendButton,
1811
1814
  sendImageAsync: sendImageAsync,
1812
- sendMessage: sendMessageStable,
1815
+ sendMessage: sendMessage,
1813
1816
  SendMessageDisallowedIndicator: SendMessageDisallowedIndicator,
1814
1817
  setInputRef: setInputRef,
1815
1818
  setQuotedMessageState: setQuotedMessageState,