stream-chat-react-native-core 6.7.3-beta.2 → 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 (63) hide show
  1. package/lib/commonjs/components/Channel/Channel.js +273 -281
  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 +273 -281
  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 +424 -408
  54. package/src/components/Channel/hooks/useMessageListPagination.tsx +152 -147
  55. package/src/components/KeyboardCompatibleView/KeyboardCompatibleView.tsx +6 -4
  56. package/src/components/MessageList/MessageList.tsx +147 -112
  57. package/src/components/MessageList/hooks/useMessageList.ts +69 -38
  58. package/src/contexts/messageInputContext/MessageInputContext.tsx +293 -267
  59. package/src/contexts/messageInputContext/__tests__/pickFile.test.tsx +2 -1
  60. package/src/contexts/messagesContext/MessagesContext.tsx +1 -0
  61. package/src/hooks/index.ts +1 -0
  62. package/src/hooks/useStableCallback.ts +37 -0
  63. 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),
@@ -559,7 +563,7 @@ var ChannelWithContext = function ChannelWithContext(props) {
559
563
  }
560
564
  }, stateUpdateThrottleInterval, throttleOptions);
561
565
  }, [stateUpdateThrottleInterval, channel, copyStateFromChannel, copyMessagesStateFromChannel]);
562
- var handleEvent = function handleEvent(event) {
566
+ var handleEvent = (0, _hooks.useStableCallback)(function (event) {
563
567
  if (shouldSyncChannel) {
564
568
  if (event.type.startsWith('poll.') || event.type === 'user.watching.start' || event.type === 'user.watching.stop') {
565
569
  return;
@@ -599,8 +603,13 @@ var ChannelWithContext = function ChannelWithContext(props) {
599
603
  setChannelUnreadState(undefined);
600
604
  }
601
605
  if (channel && channel.initialized) {
602
- if (event.type === 'message.new') {
603
- copyMessagesStateFromChannelThrottled();
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);
604
613
  return;
605
614
  }
606
615
  if (event.type === 'message.read' || event.type === 'notification.mark_read') {
@@ -610,7 +619,7 @@ var ChannelWithContext = function ChannelWithContext(props) {
610
619
  copyChannelState();
611
620
  }
612
621
  }
613
- };
622
+ });
614
623
  (0, _react.useEffect)(function () {
615
624
  var listener;
616
625
  var initChannel = function () {
@@ -739,7 +748,7 @@ var ChannelWithContext = function ChannelWithContext(props) {
739
748
  }
740
749
  }, [thread == null ? void 0 : thread.id, channelId]);
741
750
  (0, _useAppStateListener.useAppStateListener)(undefined, handleAppBackground);
742
- var markRead = (0, _throttle["default"])(function () {
751
+ var markReadInternal = (0, _throttle["default"])(function () {
743
752
  var _ref2 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee2(options) {
744
753
  var _ref3, _ref3$updateChannelUn, updateChannelUnreadState, response;
745
754
  return _regenerator["default"].wrap(function _callee2$(_context2) {
@@ -789,147 +798,138 @@ var ChannelWithContext = function ChannelWithContext(props) {
789
798
  return _ref2.apply(this, arguments);
790
799
  };
791
800
  }(), defaultThrottleInterval, throttleOptions);
792
- var reloadThread = function () {
793
- var _ref4 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee3() {
794
- var parentID, limit, queryResponse, updatedHasMore, updatedThreadMessages, _yield$channel$getMes, messages, _messages, threadMessage, formattedMessage;
795
- return _regenerator["default"].wrap(function _callee3$(_context3) {
796
- while (1) switch (_context3.prev = _context3.next) {
797
- case 0:
798
- if (!(!channel || !(thread != null && thread.id))) {
799
- _context3.next = 2;
800
- break;
801
- }
802
- return _context3.abrupt("return");
803
- case 2:
804
- setThreadLoadingMore(true);
805
- _context3.prev = 3;
806
- parentID = thread.id;
807
- limit = 50;
808
- channel.state.threads[parentID] = [];
809
- _context3.next = 9;
810
- return channel.getReplies(parentID, {
811
- limit: limit
812
- });
813
- case 9:
814
- queryResponse = _context3.sent;
815
- updatedHasMore = queryResponse.messages.length === limit;
816
- updatedThreadMessages = channel.state.threads[parentID] || [];
817
- loadMoreThreadFinished(updatedHasMore, updatedThreadMessages);
818
- _context3.next = 15;
819
- return channel.getMessagesById([parentID]);
820
- case 15:
821
- _yield$channel$getMes = _context3.sent;
822
- messages = _yield$channel$getMes.messages;
823
- _messages = (0, _slicedToArray2["default"])(messages, 1), threadMessage = _messages[0];
824
- if (threadMessage && !threadInstance) {
825
- formattedMessage = channel.state.formatMessage(threadMessage);
826
- setThread(formattedMessage);
827
- }
828
- _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;
829
809
  break;
830
- case 21:
831
- _context3.prev = 21;
832
- _context3.t0 = _context3["catch"](3);
833
- console.warn('Thread loading request failed with error', _context3.t0);
834
- if (_context3.t0 instanceof Error) {
835
- setError(_context3.t0);
836
- } else {
837
- setError(true);
838
- }
839
- setThreadLoadingMore(false);
840
- throw _context3.t0;
841
- case 27:
842
- case "end":
843
- return _context3.stop();
844
- }
845
- }, _callee3, null, [[3, 21]]);
846
- }));
847
- return function reloadThread() {
848
- return _ref4.apply(this, arguments);
849
- };
850
- }();
851
- var resyncChannel = function () {
852
- var _ref5 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee4() {
853
- var parseMessage, _channelMessagesState, failedMessages, failedThreadMessages;
854
- return _regenerator["default"].wrap(function _callee4$(_context4) {
855
- while (1) switch (_context4.prev = _context4.next) {
856
- case 0:
857
- if (!(!channel || syncingChannelRef.current)) {
858
- _context4.next = 2;
859
- break;
860
- }
861
- return _context4.abrupt("return");
862
- case 2:
863
- syncingChannelRef.current = true;
864
- setError(false);
865
- if (!(channelMessagesState != null && channelMessagesState.messages)) {
866
- _context4.next = 7;
867
- break;
868
- }
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)) {
869
870
  _context4.next = 7;
870
- return channel == null ? void 0 : channel.watch({
871
- messages: {
872
- limit: channelMessagesState.messages.length + 30
873
- }
874
- });
875
- case 7:
876
- parseMessage = function parseMessage(message) {
877
- var _message$pinned_at, _message$updated_at;
878
- return Object.assign({}, message, {
879
- created_at: message.created_at.toString(),
880
- pinned_at: (_message$pinned_at = message.pinned_at) == null ? void 0 : _message$pinned_at.toString(),
881
- updated_at: (_message$updated_at = message.updated_at) == null ? void 0 : _message$updated_at.toString()
882
- });
883
- };
884
- _context4.prev = 8;
885
- if (thread) {
886
- _context4.next = 16;
887
- break;
888
- }
889
- copyChannelState();
890
- failedMessages = (_channelMessagesState = channelMessagesState.messages) == null ? void 0 : _channelMessagesState.filter(function (message) {
891
- return message.status === _utils.MessageStatusTypes.FAILED;
892
- }).map(parseMessage);
893
- if (failedMessages != null && failedMessages.length) {
894
- channel.state.addMessagesSorted(failedMessages);
895
- }
896
- channel.state.setIsUpToDate(true);
897
- _context4.next = 20;
898
871
  break;
899
- case 16:
900
- _context4.next = 18;
901
- return reloadThread();
902
- case 18:
903
- failedThreadMessages = thread ? threadMessages.filter(function (message) {
904
- return message.status === _utils.MessageStatusTypes.FAILED;
905
- }).map(parseMessage) : [];
906
- if (failedThreadMessages.length) {
907
- channel.state.addMessagesSorted(failedThreadMessages);
908
- 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
909
877
  }
910
- case 20:
911
- _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;
912
891
  break;
913
- case 22:
914
- _context4.prev = 22;
915
- _context4.t0 = _context4["catch"](8);
916
- if (_context4.t0 instanceof Error) {
917
- setError(_context4.t0);
918
- } else {
919
- setError(true);
920
- }
921
- case 25:
922
- syncingChannelRef.current = false;
923
- case 26:
924
- case "end":
925
- return _context4.stop();
926
- }
927
- }, _callee4, null, [[8, 22]]);
928
- }));
929
- return function resyncChannel() {
930
- return _ref5.apply(this, arguments);
931
- };
932
- }();
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
+ })));
933
933
  var resyncChannelRef = (0, _react.useRef)(resyncChannel);
934
934
  resyncChannelRef.current = resyncChannel;
935
935
  (0, _react.useEffect)(function () {
@@ -964,32 +964,27 @@ var ChannelWithContext = function ChannelWithContext(props) {
964
964
  }
965
965
  };
966
966
  var clientChannelConfig = getChannelConfigSafely();
967
- var reloadChannel = function () {
968
- var _ref6 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee5() {
969
- return _regenerator["default"].wrap(function _callee5$(_context5) {
970
- while (1) switch (_context5.prev = _context5.next) {
971
- case 0:
972
- _context5.prev = 0;
973
- _context5.next = 3;
974
- return loadLatestMessages();
975
- case 3:
976
- _context5.next = 8;
977
- break;
978
- case 5:
979
- _context5.prev = 5;
980
- _context5.t0 = _context5["catch"](0);
981
- console.warn('Reloading channel failed with error:', _context5.t0);
982
- case 8:
983
- case "end":
984
- return _context5.stop();
985
- }
986
- }, _callee5, null, [[0, 5]]);
987
- }));
988
- return function reloadChannel() {
989
- return _ref6.apply(this, arguments);
990
- };
991
- }();
992
- 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 () {
993
988
  var _ref8 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee6(_ref7) {
994
989
  var messageIdToLoadAround;
995
990
  return _regenerator["default"].wrap(function _callee6$(_context6) {
@@ -1050,23 +1045,28 @@ var ChannelWithContext = function ChannelWithContext(props) {
1050
1045
  }
1051
1046
  }, _callee6, null, [[3, 24], [6, 14]]);
1052
1047
  }));
1053
- return function loadChannelAroundMessage(_x2) {
1048
+ return function (_x2) {
1054
1049
  return _ref8.apply(this, arguments);
1055
1050
  };
1056
- }();
1057
- var updateMessage = function updateMessage(updatedMessage) {
1051
+ }());
1052
+ var updateMessage = (0, _hooks.useStableCallback)(function (updatedMessage) {
1058
1053
  var extraState = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1054
+ var throttled = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1059
1055
  if (!channel) {
1060
1056
  return;
1061
1057
  }
1062
1058
  channel.state.addMessageSorted(updatedMessage, true);
1063
- copyMessagesStateFromChannel(channel);
1059
+ if (throttled) {
1060
+ copyMessagesStateFromChannelThrottled();
1061
+ } else {
1062
+ copyMessagesStateFromChannel(channel);
1063
+ }
1064
1064
  if (thread && updatedMessage.parent_id) {
1065
1065
  extraState.threadMessages = channel.state.threads[updatedMessage.parent_id] || [];
1066
1066
  setThreadMessages(extraState.threadMessages);
1067
1067
  }
1068
- };
1069
- var replaceMessage = function replaceMessage(oldMessage, newMessage) {
1068
+ });
1069
+ var replaceMessage = (0, _hooks.useStableCallback)(function (oldMessage, newMessage) {
1070
1070
  if (channel) {
1071
1071
  channel.state.removeMessage(oldMessage);
1072
1072
  channel.state.addMessageSorted(newMessage, true);
@@ -1076,8 +1076,8 @@ var ChannelWithContext = function ChannelWithContext(props) {
1076
1076
  setThreadMessages(_threadMessages);
1077
1077
  }
1078
1078
  }
1079
- };
1080
- var createMessagePreview = function createMessagePreview(_ref9) {
1079
+ });
1080
+ var createMessagePreview = (0, _hooks.useStableCallback)(function (_ref9) {
1081
1081
  var attachments = _ref9.attachments,
1082
1082
  mentioned_users = _ref9.mentioned_users,
1083
1083
  parent_id = _ref9.parent_id,
@@ -1120,8 +1120,8 @@ var ChannelWithContext = function ChannelWithContext(props) {
1120
1120
  preview.quoted_message = _quotedMessage;
1121
1121
  }
1122
1122
  return preview;
1123
- };
1124
- var uploadPendingAttachments = function () {
1123
+ });
1124
+ var uploadPendingAttachments = (0, _hooks.useStableCallback)(function () {
1125
1125
  var _ref10 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee7(message) {
1126
1126
  var _updatedMessage$attac;
1127
1127
  var updatedMessage, i, _updatedMessage$attac2, attachment, image, file, _image$name, filename, controller, compressedUri, contentType, uploadResponse, _controller, response;
@@ -1232,11 +1232,11 @@ var ChannelWithContext = function ChannelWithContext(props) {
1232
1232
  }
1233
1233
  }, _callee7);
1234
1234
  }));
1235
- return function uploadPendingAttachments(_x3) {
1235
+ return function (_x3) {
1236
1236
  return _ref10.apply(this, arguments);
1237
1237
  };
1238
- }();
1239
- var sendMessageRequest = function () {
1238
+ }());
1239
+ var sendMessageRequest = (0, _hooks.useStableCallback)(function () {
1240
1240
  var _ref11 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee8(message, retrying) {
1241
1241
  var updatedMessage, extraFields, attachments, id, mentioned_users, parent_id, text, mentionedUserIds, messageData, messageResponse, _updatedMessage;
1242
1242
  return _regenerator["default"].wrap(function _callee8$(_context8) {
@@ -1305,10 +1305,10 @@ var ChannelWithContext = function ChannelWithContext(props) {
1305
1305
  if (retrying) {
1306
1306
  replaceMessage(message, messageResponse.message);
1307
1307
  } else {
1308
- updateMessage(messageResponse.message);
1308
+ updateMessage(messageResponse.message, {}, true);
1309
1309
  }
1310
1310
  case 27:
1311
- _context8.next = 39;
1311
+ _context8.next = 40;
1312
1312
  break;
1313
1313
  case 29:
1314
1314
  _context8.prev = 29;
@@ -1322,27 +1322,28 @@ var ChannelWithContext = function ChannelWithContext(props) {
1322
1322
  threadInstance == null || threadInstance.upsertReplyLocally == null || threadInstance.upsertReplyLocally({
1323
1323
  message: _updatedMessage
1324
1324
  });
1325
+ optimisticallyUpdatedNewMessages["delete"](message.id);
1325
1326
  if (!enableOfflineSupport) {
1326
- _context8.next = 39;
1327
+ _context8.next = 40;
1327
1328
  break;
1328
1329
  }
1329
- _context8.next = 39;
1330
+ _context8.next = 40;
1330
1331
  return dbApi.updateMessage({
1331
1332
  message: Object.assign({}, message, {
1332
1333
  cid: channel.cid
1333
1334
  })
1334
1335
  });
1335
- case 39:
1336
+ case 40:
1336
1337
  case "end":
1337
1338
  return _context8.stop();
1338
1339
  }
1339
1340
  }, _callee8, null, [[0, 29]]);
1340
1341
  }));
1341
- return function sendMessageRequest(_x4, _x5) {
1342
+ return function (_x4, _x5) {
1342
1343
  return _ref11.apply(this, arguments);
1343
1344
  };
1344
- }();
1345
- var sendMessage = function () {
1345
+ }());
1346
+ var sendMessage = (0, _hooks.useStableCallback)(function () {
1346
1347
  var _ref12 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee9(message) {
1347
1348
  var _channel$state;
1348
1349
  var messagePreview;
@@ -1362,31 +1363,32 @@ var ChannelWithContext = function ChannelWithContext(props) {
1362
1363
  threadInstance == null || threadInstance.upsertReplyLocally == null || threadInstance.upsertReplyLocally({
1363
1364
  message: messagePreview
1364
1365
  });
1366
+ optimisticallyUpdatedNewMessages.add(messagePreview.id);
1365
1367
  if (!enableOfflineSupport) {
1366
- _context9.next = 7;
1368
+ _context9.next = 8;
1367
1369
  break;
1368
1370
  }
1369
- _context9.next = 7;
1371
+ _context9.next = 8;
1370
1372
  return dbApi.upsertMessages({
1371
1373
  messages: [Object.assign({}, messagePreview, {
1372
1374
  cid: channel.cid,
1373
1375
  status: _utils.MessageStatusTypes.FAILED
1374
1376
  })]
1375
1377
  });
1376
- case 7:
1377
- _context9.next = 9;
1378
+ case 8:
1379
+ _context9.next = 10;
1378
1380
  return sendMessageRequest(messagePreview);
1379
- case 9:
1381
+ case 10:
1380
1382
  case "end":
1381
1383
  return _context9.stop();
1382
1384
  }
1383
1385
  }, _callee9);
1384
1386
  }));
1385
- return function sendMessage(_x6) {
1387
+ return function (_x6) {
1386
1388
  return _ref12.apply(this, arguments);
1387
1389
  };
1388
- }();
1389
- var retrySendMessage = function () {
1390
+ }());
1391
+ var retrySendMessage = (0, _hooks.useStableCallback)(function () {
1390
1392
  var _ref13 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee10(message) {
1391
1393
  var statusPendingMessage, messageWithoutReservedFields;
1392
1394
  return _regenerator["default"].wrap(function _callee10$(_context10) {
@@ -1407,27 +1409,27 @@ var ChannelWithContext = function ChannelWithContext(props) {
1407
1409
  }
1408
1410
  }, _callee10);
1409
1411
  }));
1410
- return function retrySendMessage(_x7) {
1412
+ return function (_x7) {
1411
1413
  return _ref13.apply(this, arguments);
1412
1414
  };
1413
- }();
1414
- var editMessage = function editMessage(updatedMessage) {
1415
+ }());
1416
+ var editMessage = (0, _hooks.useStableCallback)(function (updatedMessage) {
1415
1417
  return doUpdateMessageRequest ? doUpdateMessageRequest((channel == null ? void 0 : channel.cid) || '', updatedMessage) : client.updateMessage(updatedMessage);
1416
- };
1417
- var setEditingState = function setEditingState(message) {
1418
+ });
1419
+ var setEditingState = (0, _hooks.useStableCallback)(function (message) {
1418
1420
  clearQuotedMessageState();
1419
1421
  setEditing(message);
1420
- };
1421
- var setQuotedMessageState = function setQuotedMessageState(messageOrBoolean) {
1422
+ });
1423
+ var setQuotedMessageState = (0, _hooks.useStableCallback)(function (messageOrBoolean) {
1422
1424
  setQuotedMessage(messageOrBoolean);
1423
- };
1424
- var clearEditingState = function clearEditingState() {
1425
+ });
1426
+ var clearEditingState = (0, _hooks.useStableCallback)(function () {
1425
1427
  return setEditing(undefined);
1426
- };
1427
- var clearQuotedMessageState = function clearQuotedMessageState() {
1428
+ });
1429
+ var clearQuotedMessageState = (0, _hooks.useStableCallback)(function () {
1428
1430
  return setQuotedMessage(undefined);
1429
- };
1430
- var removeMessage = function () {
1431
+ });
1432
+ var removeMessage = (0, _hooks.useStableCallback)(function () {
1431
1433
  var _ref14 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee11(message) {
1432
1434
  return _regenerator["default"].wrap(function _callee11$(_context11) {
1433
1435
  while (1) switch (_context11.prev = _context11.next) {
@@ -1453,11 +1455,11 @@ var ChannelWithContext = function ChannelWithContext(props) {
1453
1455
  }
1454
1456
  }, _callee11);
1455
1457
  }));
1456
- return function removeMessage(_x8) {
1458
+ return function (_x8) {
1457
1459
  return _ref14.apply(this, arguments);
1458
1460
  };
1459
- }();
1460
- var sendReaction = function () {
1461
+ }());
1462
+ var sendReaction = (0, _hooks.useStableCallback)(function () {
1461
1463
  var _ref15 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee12(type, messageId) {
1462
1464
  var payload, sendReactionResponse;
1463
1465
  return _regenerator["default"].wrap(function _callee12$(_context12) {
@@ -1515,11 +1517,11 @@ var ChannelWithContext = function ChannelWithContext(props) {
1515
1517
  }
1516
1518
  }, _callee12);
1517
1519
  }));
1518
- return function sendReaction(_x9, _x10) {
1520
+ return function (_x9, _x10) {
1519
1521
  return _ref15.apply(this, arguments);
1520
1522
  };
1521
- }();
1522
- var deleteMessage = function () {
1523
+ }());
1524
+ var deleteMessage = (0, _hooks.useStableCallback)(function () {
1523
1525
  var _ref16 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee13(message) {
1524
1526
  var updatedMessage, data;
1525
1527
  return _regenerator["default"].wrap(function _callee13$(_context13) {
@@ -1595,11 +1597,11 @@ var ChannelWithContext = function ChannelWithContext(props) {
1595
1597
  }
1596
1598
  }, _callee13);
1597
1599
  }));
1598
- return function deleteMessage(_x11) {
1600
+ return function (_x11) {
1599
1601
  return _ref16.apply(this, arguments);
1600
1602
  };
1601
- }();
1602
- var deleteReaction = function () {
1603
+ }());
1604
+ var deleteReaction = (0, _hooks.useStableCallback)(function () {
1603
1605
  var _ref17 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee14(type, messageId) {
1604
1606
  var payload;
1605
1607
  return _regenerator["default"].wrap(function _callee14$(_context14) {
@@ -1645,10 +1647,10 @@ var ChannelWithContext = function ChannelWithContext(props) {
1645
1647
  }
1646
1648
  }, _callee14);
1647
1649
  }));
1648
- return function deleteReaction(_x12, _x13) {
1650
+ return function (_x12, _x13) {
1649
1651
  return _ref17.apply(this, arguments);
1650
1652
  };
1651
- }();
1653
+ }());
1652
1654
  var openThread = (0, _react.useCallback)(function (message) {
1653
1655
  setThread(message);
1654
1656
  if (channel.initialized) {
@@ -1666,62 +1668,57 @@ var ChannelWithContext = function ChannelWithContext(props) {
1666
1668
  setThreadLoadingMore(false);
1667
1669
  setThreadMessages(updatedThreadMessages);
1668
1670
  }, defaultDebounceInterval, debounceOptions)).current;
1669
- var loadMoreThread = function () {
1670
- var _ref18 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee15() {
1671
- var _threadMessages$, parentID, oldestMessageID, limit, queryResponse, updatedHasMore, updatedThreadMessages;
1672
- return _regenerator["default"].wrap(function _callee15$(_context15) {
1673
- while (1) switch (_context15.prev = _context15.next) {
1674
- case 0:
1675
- if (!(threadLoadingMore || !(thread != null && thread.id))) {
1676
- _context15.next = 2;
1677
- break;
1678
- }
1679
- return _context15.abrupt("return");
1680
- case 2:
1681
- setThreadLoadingMore(true);
1682
- _context15.prev = 3;
1683
- if (!channel) {
1684
- _context15.next = 15;
1685
- break;
1686
- }
1687
- parentID = thread.id;
1688
- channel.state.threads[parentID] = threadMessages;
1689
- oldestMessageID = threadMessages == null || (_threadMessages$ = threadMessages[0]) == null ? void 0 : _threadMessages$.id;
1690
- limit = 50;
1691
- _context15.next = 11;
1692
- return channel.getReplies(parentID, {
1693
- id_lt: oldestMessageID,
1694
- limit: limit
1695
- });
1696
- case 11:
1697
- queryResponse = _context15.sent;
1698
- updatedHasMore = queryResponse.messages.length === limit;
1699
- updatedThreadMessages = channel.state.threads[parentID] || [];
1700
- loadMoreThreadFinished(updatedHasMore, updatedThreadMessages);
1701
- case 15:
1702
- _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;
1703
1678
  break;
1704
- case 17:
1705
- _context15.prev = 17;
1706
- _context15.t0 = _context15["catch"](3);
1707
- console.warn('Message pagination request failed with error', _context15.t0);
1708
- if (_context15.t0 instanceof Error) {
1709
- setError(_context15.t0);
1710
- } else {
1711
- setError(true);
1712
- }
1713
- setThreadLoadingMore(false);
1714
- throw _context15.t0;
1715
- case 23:
1716
- case "end":
1717
- return _context15.stop();
1718
- }
1719
- }, _callee15, null, [[3, 17]]);
1720
- }));
1721
- return function loadMoreThread() {
1722
- return _ref18.apply(this, arguments);
1723
- };
1724
- }();
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
+ })));
1725
1722
  var ownCapabilitiesContext = (0, _useCreateOwnCapabilitiesContext.useCreateOwnCapabilitiesContext)({
1726
1723
  channel: channel,
1727
1724
  overrideCapabilities: overrideOwnCapabilities
@@ -1763,11 +1760,6 @@ var ChannelWithContext = function ChannelWithContext(props) {
1763
1760
  watcherCount: channelState.watcherCount,
1764
1761
  watchers: channelState.watchers
1765
1762
  });
1766
- var sendMessageRef = (0, _react.useRef)(sendMessage);
1767
- sendMessageRef.current = sendMessage;
1768
- var sendMessageStable = (0, _react.useCallback)(function () {
1769
- return sendMessageRef.current.apply(sendMessageRef, arguments);
1770
- }, []);
1771
1763
  var inputMessageInputContext = (0, _useCreateInputMessageInputContext.useCreateInputMessageInputContext)({
1772
1764
  additionalTextInputProps: additionalTextInputProps,
1773
1765
  asyncMessagesLockDistance: asyncMessagesLockDistance,
@@ -1820,7 +1812,7 @@ var ChannelWithContext = function ChannelWithContext(props) {
1820
1812
  quotedMessage: quotedMessage,
1821
1813
  SendButton: SendButton,
1822
1814
  sendImageAsync: sendImageAsync,
1823
- sendMessage: sendMessageStable,
1815
+ sendMessage: sendMessage,
1824
1816
  SendMessageDisallowedIndicator: SendMessageDisallowedIndicator,
1825
1817
  setInputRef: setInputRef,
1826
1818
  setQuotedMessageState: setQuotedMessageState,