stream-chat-react-native-core 7.0.0-rc.8 → 7.0.0

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 (498) hide show
  1. package/README.md +1 -1
  2. package/lib/commonjs/components/Attachment/AudioAttachment.js +19 -9
  3. package/lib/commonjs/components/Attachment/AudioAttachment.js.map +1 -1
  4. package/lib/commonjs/components/Attachment/FileAttachmentGroup.js +3 -1
  5. package/lib/commonjs/components/Attachment/FileAttachmentGroup.js.map +1 -1
  6. package/lib/commonjs/components/Attachment/Gallery.js +16 -3
  7. package/lib/commonjs/components/Attachment/Gallery.js.map +1 -1
  8. package/lib/commonjs/components/Attachment/ImageReloadIndicator.js.map +1 -1
  9. package/lib/commonjs/components/AttachmentPicker/AttachmentPicker.js +2 -2
  10. package/lib/commonjs/components/AttachmentPicker/AttachmentPicker.js.map +1 -1
  11. package/lib/commonjs/components/AttachmentPicker/components/AttachmentPickerItem.js +7 -24
  12. package/lib/commonjs/components/AttachmentPicker/components/AttachmentPickerItem.js.map +1 -1
  13. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteInput.js +2 -4
  14. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteInput.js.map +1 -1
  15. package/lib/commonjs/components/Channel/Channel.js +320 -310
  16. package/lib/commonjs/components/Channel/Channel.js.map +1 -1
  17. package/lib/commonjs/components/Channel/hooks/useChannelDataState.js.map +1 -1
  18. package/lib/commonjs/components/Channel/hooks/useCreateMessagesContext.js +2 -0
  19. package/lib/commonjs/components/Channel/hooks/useCreateMessagesContext.js.map +1 -1
  20. package/lib/commonjs/components/Channel/hooks/useMessageListPagination.js +133 -147
  21. package/lib/commonjs/components/Channel/hooks/useMessageListPagination.js.map +1 -1
  22. package/lib/commonjs/components/Chat/Chat.js.map +1 -1
  23. package/lib/commonjs/components/KeyboardCompatibleView/KeyboardCompatibleView.js +8 -13
  24. package/lib/commonjs/components/KeyboardCompatibleView/KeyboardCompatibleView.js.map +1 -1
  25. package/lib/commonjs/components/Message/Message.js +14 -7
  26. package/lib/commonjs/components/Message/Message.js.map +1 -1
  27. package/lib/commonjs/components/Message/MessageSimple/MessageFooter.js.map +1 -1
  28. package/lib/commonjs/components/Message/MessageSimple/MessageSimple.js +70 -54
  29. package/lib/commonjs/components/Message/MessageSimple/MessageSimple.js.map +1 -1
  30. package/lib/commonjs/components/Message/MessageSimple/MessageStatus.js +14 -6
  31. package/lib/commonjs/components/Message/MessageSimple/MessageStatus.js.map +1 -1
  32. package/lib/commonjs/components/Message/MessageSimple/MessageTextContainer.js.map +1 -1
  33. package/lib/commonjs/components/Message/MessageSimple/utils/renderText.js.map +1 -1
  34. package/lib/commonjs/components/Message/hooks/useCreateMessageContext.js +3 -1
  35. package/lib/commonjs/components/Message/hooks/useCreateMessageContext.js.map +1 -1
  36. package/lib/commonjs/components/Message/hooks/useMessageActionHandlers.js.map +1 -1
  37. package/lib/commonjs/components/Message/hooks/useMessageActions.js.map +1 -1
  38. package/lib/commonjs/components/MessageInput/FileUploadPreview.js +25 -39
  39. package/lib/commonjs/components/MessageInput/FileUploadPreview.js.map +1 -1
  40. package/lib/commonjs/components/MessageInput/InputButtons.js +18 -15
  41. package/lib/commonjs/components/MessageInput/InputButtons.js.map +1 -1
  42. package/lib/commonjs/components/MessageInput/MessageInput.js +96 -74
  43. package/lib/commonjs/components/MessageInput/MessageInput.js.map +1 -1
  44. package/lib/commonjs/components/MessageInput/components/AudioRecorder/AudioRecordingButton.js +2 -1
  45. package/lib/commonjs/components/MessageInput/components/AudioRecorder/AudioRecordingButton.js.map +1 -1
  46. package/lib/commonjs/components/MessageInput/hooks/useAudioController.js +4 -4
  47. package/lib/commonjs/components/MessageInput/hooks/useAudioController.js.map +1 -1
  48. package/lib/commonjs/components/MessageList/MessageList.js +281 -223
  49. package/lib/commonjs/components/MessageList/MessageList.js.map +1 -1
  50. package/lib/commonjs/components/MessageList/hooks/useMessageList.js +65 -48
  51. package/lib/commonjs/components/MessageList/hooks/useMessageList.js.map +1 -1
  52. package/lib/commonjs/components/MessageList/hooks/useShouldScrollToRecentOnNewOwnMessage.js.map +1 -1
  53. package/lib/commonjs/components/MessageList/utils/getGroupStyles.js +1 -1
  54. package/lib/commonjs/components/MessageList/utils/getGroupStyles.js.map +1 -1
  55. package/lib/commonjs/components/MessageList/utils/getLastReceivedMessage.js.map +1 -1
  56. package/lib/commonjs/components/MessageList/utils/getReadState.js +20 -0
  57. package/lib/commonjs/components/MessageList/utils/getReadState.js.map +1 -0
  58. package/lib/commonjs/components/MessageMenu/hooks/useFetchReactions.js.map +1 -1
  59. package/lib/commonjs/components/Poll/components/Button.js.map +1 -1
  60. package/lib/commonjs/components/Poll/components/PollResults/PollResultItem.js.map +1 -1
  61. package/lib/commonjs/components/Reply/Reply.js +2 -2
  62. package/lib/commonjs/components/Reply/Reply.js.map +1 -1
  63. package/lib/commonjs/components/Thread/components/ThreadFooterComponent.js +24 -6
  64. package/lib/commonjs/components/Thread/components/ThreadFooterComponent.js.map +1 -1
  65. package/lib/commonjs/components/ThreadList/ThreadListItem.js.map +1 -1
  66. package/lib/commonjs/components/UIComponents/BottomSheetModal.js +10 -6
  67. package/lib/commonjs/components/UIComponents/BottomSheetModal.js.map +1 -1
  68. package/lib/commonjs/components/index.js +15 -4
  69. package/lib/commonjs/components/index.js.map +1 -1
  70. package/lib/commonjs/contexts/attachmentPickerContext/AttachmentPickerContext.js.map +1 -1
  71. package/lib/commonjs/contexts/channelsStateContext/useChannelState.js +5 -1
  72. package/lib/commonjs/contexts/channelsStateContext/useChannelState.js.map +1 -1
  73. package/lib/commonjs/contexts/debugContext/DebugContext.js.map +1 -1
  74. package/lib/commonjs/contexts/imageGalleryContext/ImageGalleryContext.js.map +1 -1
  75. package/lib/commonjs/contexts/messageContext/MessageContext.js.map +1 -1
  76. package/lib/commonjs/contexts/messageInputContext/MessageInputContext.js +535 -523
  77. package/lib/commonjs/contexts/messageInputContext/MessageInputContext.js.map +1 -1
  78. package/lib/commonjs/contexts/messageInputContext/hooks/useCreateMessageInputContext.js +7 -6
  79. package/lib/commonjs/contexts/messageInputContext/hooks/useCreateMessageInputContext.js.map +1 -1
  80. package/lib/commonjs/contexts/messageInputContext/hooks/useMessageDetailsForState.js +37 -41
  81. package/lib/commonjs/contexts/messageInputContext/hooks/useMessageDetailsForState.js.map +1 -1
  82. package/lib/commonjs/contexts/messageInputContext/utils/utils.js +4 -4
  83. package/lib/commonjs/contexts/messageInputContext/utils/utils.js.map +1 -1
  84. package/lib/commonjs/contexts/messagesContext/MessagesContext.js.map +1 -1
  85. package/lib/commonjs/contexts/pollContext/pollContext.js.map +1 -1
  86. package/lib/commonjs/contexts/suggestionsContext/SuggestionsContext.js +23 -14
  87. package/lib/commonjs/contexts/suggestionsContext/SuggestionsContext.js.map +1 -1
  88. package/lib/commonjs/contexts/themeContext/utils/theme.js +2 -1
  89. package/lib/commonjs/contexts/themeContext/utils/theme.js.map +1 -1
  90. package/lib/commonjs/contexts/threadContext/ThreadContext.js.map +1 -1
  91. package/lib/commonjs/contexts/threadsContext/ThreadListItemContext.js.map +1 -1
  92. package/lib/commonjs/hooks/index.js +22 -0
  93. package/lib/commonjs/hooks/index.js.map +1 -1
  94. package/lib/commonjs/hooks/useAudioPlayer.js +60 -69
  95. package/lib/commonjs/hooks/useAudioPlayer.js.map +1 -1
  96. package/lib/commonjs/hooks/useStableCallback.js +13 -0
  97. package/lib/commonjs/hooks/useStableCallback.js.map +1 -0
  98. package/lib/commonjs/hooks/useTranslatedMessage.js.map +1 -1
  99. package/lib/commonjs/i18n/en.json +3 -0
  100. package/lib/commonjs/i18n/es.json +3 -0
  101. package/lib/commonjs/i18n/fr.json +3 -0
  102. package/lib/commonjs/i18n/he.json +3 -0
  103. package/lib/commonjs/i18n/hi.json +2 -0
  104. package/lib/commonjs/i18n/it.json +3 -0
  105. package/lib/commonjs/i18n/ja.json +1 -0
  106. package/lib/commonjs/i18n/ko.json +1 -0
  107. package/lib/commonjs/i18n/nl.json +2 -0
  108. package/lib/commonjs/i18n/pt-br.json +3 -0
  109. package/lib/commonjs/i18n/ru.json +4 -0
  110. package/lib/commonjs/i18n/tr.json +2 -0
  111. package/lib/commonjs/mock-builders/api/channelMocks.js.map +1 -1
  112. package/lib/commonjs/native.js.map +1 -1
  113. package/lib/commonjs/store/mappers/mapMessageToStorable.js.map +1 -1
  114. package/lib/commonjs/types/types.js.map +1 -1
  115. package/lib/commonjs/utils/compressImage.js +1 -1
  116. package/lib/commonjs/utils/compressImage.js.map +1 -1
  117. package/lib/commonjs/utils/removeReservedFields.js.map +1 -1
  118. package/lib/commonjs/utils/utils.js +17 -4
  119. package/lib/commonjs/utils/utils.js.map +1 -1
  120. package/lib/commonjs/version.json +1 -1
  121. package/lib/module/components/Attachment/AudioAttachment.js +19 -9
  122. package/lib/module/components/Attachment/AudioAttachment.js.map +1 -1
  123. package/lib/module/components/Attachment/FileAttachmentGroup.js +3 -1
  124. package/lib/module/components/Attachment/FileAttachmentGroup.js.map +1 -1
  125. package/lib/module/components/Attachment/Gallery.js +16 -3
  126. package/lib/module/components/Attachment/Gallery.js.map +1 -1
  127. package/lib/module/components/Attachment/ImageReloadIndicator.js.map +1 -1
  128. package/lib/module/components/AttachmentPicker/AttachmentPicker.js +2 -2
  129. package/lib/module/components/AttachmentPicker/AttachmentPicker.js.map +1 -1
  130. package/lib/module/components/AttachmentPicker/components/AttachmentPickerItem.js +7 -24
  131. package/lib/module/components/AttachmentPicker/components/AttachmentPickerItem.js.map +1 -1
  132. package/lib/module/components/AutoCompleteInput/AutoCompleteInput.js +2 -4
  133. package/lib/module/components/AutoCompleteInput/AutoCompleteInput.js.map +1 -1
  134. package/lib/module/components/Channel/Channel.js +320 -310
  135. package/lib/module/components/Channel/Channel.js.map +1 -1
  136. package/lib/module/components/Channel/hooks/useChannelDataState.js.map +1 -1
  137. package/lib/module/components/Channel/hooks/useCreateMessagesContext.js +2 -0
  138. package/lib/module/components/Channel/hooks/useCreateMessagesContext.js.map +1 -1
  139. package/lib/module/components/Channel/hooks/useMessageListPagination.js +133 -147
  140. package/lib/module/components/Channel/hooks/useMessageListPagination.js.map +1 -1
  141. package/lib/module/components/Chat/Chat.js.map +1 -1
  142. package/lib/module/components/KeyboardCompatibleView/KeyboardCompatibleView.js +8 -13
  143. package/lib/module/components/KeyboardCompatibleView/KeyboardCompatibleView.js.map +1 -1
  144. package/lib/module/components/Message/Message.js +14 -7
  145. package/lib/module/components/Message/Message.js.map +1 -1
  146. package/lib/module/components/Message/MessageSimple/MessageFooter.js.map +1 -1
  147. package/lib/module/components/Message/MessageSimple/MessageSimple.js +70 -54
  148. package/lib/module/components/Message/MessageSimple/MessageSimple.js.map +1 -1
  149. package/lib/module/components/Message/MessageSimple/MessageStatus.js +14 -6
  150. package/lib/module/components/Message/MessageSimple/MessageStatus.js.map +1 -1
  151. package/lib/module/components/Message/MessageSimple/MessageTextContainer.js.map +1 -1
  152. package/lib/module/components/Message/MessageSimple/utils/renderText.js.map +1 -1
  153. package/lib/module/components/Message/hooks/useCreateMessageContext.js +3 -1
  154. package/lib/module/components/Message/hooks/useCreateMessageContext.js.map +1 -1
  155. package/lib/module/components/Message/hooks/useMessageActionHandlers.js.map +1 -1
  156. package/lib/module/components/Message/hooks/useMessageActions.js.map +1 -1
  157. package/lib/module/components/MessageInput/FileUploadPreview.js +25 -39
  158. package/lib/module/components/MessageInput/FileUploadPreview.js.map +1 -1
  159. package/lib/module/components/MessageInput/InputButtons.js +18 -15
  160. package/lib/module/components/MessageInput/InputButtons.js.map +1 -1
  161. package/lib/module/components/MessageInput/MessageInput.js +96 -74
  162. package/lib/module/components/MessageInput/MessageInput.js.map +1 -1
  163. package/lib/module/components/MessageInput/components/AudioRecorder/AudioRecordingButton.js +2 -1
  164. package/lib/module/components/MessageInput/components/AudioRecorder/AudioRecordingButton.js.map +1 -1
  165. package/lib/module/components/MessageInput/hooks/useAudioController.js +4 -4
  166. package/lib/module/components/MessageInput/hooks/useAudioController.js.map +1 -1
  167. package/lib/module/components/MessageList/MessageList.js +281 -223
  168. package/lib/module/components/MessageList/MessageList.js.map +1 -1
  169. package/lib/module/components/MessageList/hooks/useMessageList.js +65 -48
  170. package/lib/module/components/MessageList/hooks/useMessageList.js.map +1 -1
  171. package/lib/module/components/MessageList/hooks/useShouldScrollToRecentOnNewOwnMessage.js.map +1 -1
  172. package/lib/module/components/MessageList/utils/getGroupStyles.js +1 -1
  173. package/lib/module/components/MessageList/utils/getGroupStyles.js.map +1 -1
  174. package/lib/module/components/MessageList/utils/getLastReceivedMessage.js.map +1 -1
  175. package/lib/module/components/MessageList/utils/getReadState.js +20 -0
  176. package/lib/module/components/MessageList/utils/getReadState.js.map +1 -0
  177. package/lib/module/components/MessageMenu/hooks/useFetchReactions.js.map +1 -1
  178. package/lib/module/components/Poll/components/Button.js.map +1 -1
  179. package/lib/module/components/Poll/components/PollResults/PollResultItem.js.map +1 -1
  180. package/lib/module/components/Reply/Reply.js +2 -2
  181. package/lib/module/components/Reply/Reply.js.map +1 -1
  182. package/lib/module/components/Thread/components/ThreadFooterComponent.js +24 -6
  183. package/lib/module/components/Thread/components/ThreadFooterComponent.js.map +1 -1
  184. package/lib/module/components/ThreadList/ThreadListItem.js.map +1 -1
  185. package/lib/module/components/UIComponents/BottomSheetModal.js +10 -6
  186. package/lib/module/components/UIComponents/BottomSheetModal.js.map +1 -1
  187. package/lib/module/components/index.js +15 -4
  188. package/lib/module/components/index.js.map +1 -1
  189. package/lib/module/contexts/attachmentPickerContext/AttachmentPickerContext.js.map +1 -1
  190. package/lib/module/contexts/channelsStateContext/useChannelState.js +5 -1
  191. package/lib/module/contexts/channelsStateContext/useChannelState.js.map +1 -1
  192. package/lib/module/contexts/debugContext/DebugContext.js.map +1 -1
  193. package/lib/module/contexts/imageGalleryContext/ImageGalleryContext.js.map +1 -1
  194. package/lib/module/contexts/messageContext/MessageContext.js.map +1 -1
  195. package/lib/module/contexts/messageInputContext/MessageInputContext.js +535 -523
  196. package/lib/module/contexts/messageInputContext/MessageInputContext.js.map +1 -1
  197. package/lib/module/contexts/messageInputContext/hooks/useCreateMessageInputContext.js +7 -6
  198. package/lib/module/contexts/messageInputContext/hooks/useCreateMessageInputContext.js.map +1 -1
  199. package/lib/module/contexts/messageInputContext/hooks/useMessageDetailsForState.js +37 -41
  200. package/lib/module/contexts/messageInputContext/hooks/useMessageDetailsForState.js.map +1 -1
  201. package/lib/module/contexts/messageInputContext/utils/utils.js +4 -4
  202. package/lib/module/contexts/messageInputContext/utils/utils.js.map +1 -1
  203. package/lib/module/contexts/messagesContext/MessagesContext.js.map +1 -1
  204. package/lib/module/contexts/pollContext/pollContext.js.map +1 -1
  205. package/lib/module/contexts/suggestionsContext/SuggestionsContext.js +23 -14
  206. package/lib/module/contexts/suggestionsContext/SuggestionsContext.js.map +1 -1
  207. package/lib/module/contexts/themeContext/utils/theme.js +2 -1
  208. package/lib/module/contexts/themeContext/utils/theme.js.map +1 -1
  209. package/lib/module/contexts/threadContext/ThreadContext.js.map +1 -1
  210. package/lib/module/contexts/threadsContext/ThreadListItemContext.js.map +1 -1
  211. package/lib/module/hooks/index.js +22 -0
  212. package/lib/module/hooks/index.js.map +1 -1
  213. package/lib/module/hooks/useAudioPlayer.js +60 -69
  214. package/lib/module/hooks/useAudioPlayer.js.map +1 -1
  215. package/lib/module/hooks/useStableCallback.js +13 -0
  216. package/lib/module/hooks/useStableCallback.js.map +1 -0
  217. package/lib/module/hooks/useTranslatedMessage.js.map +1 -1
  218. package/lib/module/i18n/en.json +3 -0
  219. package/lib/module/i18n/es.json +3 -0
  220. package/lib/module/i18n/fr.json +3 -0
  221. package/lib/module/i18n/he.json +3 -0
  222. package/lib/module/i18n/hi.json +2 -0
  223. package/lib/module/i18n/it.json +3 -0
  224. package/lib/module/i18n/ja.json +1 -0
  225. package/lib/module/i18n/ko.json +1 -0
  226. package/lib/module/i18n/nl.json +2 -0
  227. package/lib/module/i18n/pt-br.json +3 -0
  228. package/lib/module/i18n/ru.json +4 -0
  229. package/lib/module/i18n/tr.json +2 -0
  230. package/lib/module/mock-builders/api/channelMocks.js.map +1 -1
  231. package/lib/module/native.js.map +1 -1
  232. package/lib/module/store/mappers/mapMessageToStorable.js.map +1 -1
  233. package/lib/module/types/types.js.map +1 -1
  234. package/lib/module/utils/compressImage.js +1 -1
  235. package/lib/module/utils/compressImage.js.map +1 -1
  236. package/lib/module/utils/removeReservedFields.js.map +1 -1
  237. package/lib/module/utils/utils.js +17 -4
  238. package/lib/module/utils/utils.js.map +1 -1
  239. package/lib/module/version.json +1 -1
  240. package/lib/typescript/components/Attachment/AudioAttachment.d.ts +2 -2
  241. package/lib/typescript/components/Attachment/AudioAttachment.d.ts.map +1 -1
  242. package/lib/typescript/components/Attachment/FileAttachmentGroup.d.ts.map +1 -1
  243. package/lib/typescript/components/Attachment/Gallery.d.ts +3 -3
  244. package/lib/typescript/components/Attachment/Gallery.d.ts.map +1 -1
  245. package/lib/typescript/components/Attachment/ImageReloadIndicator.d.ts +4 -3
  246. package/lib/typescript/components/Attachment/ImageReloadIndicator.d.ts.map +1 -1
  247. package/lib/typescript/components/AttachmentPicker/AttachmentPicker.d.ts.map +1 -1
  248. package/lib/typescript/components/AttachmentPicker/components/AttachmentPickerItem.d.ts +2 -2
  249. package/lib/typescript/components/AttachmentPicker/components/AttachmentPickerItem.d.ts.map +1 -1
  250. package/lib/typescript/components/AutoCompleteInput/AutoCompleteInput.d.ts +2 -3
  251. package/lib/typescript/components/AutoCompleteInput/AutoCompleteInput.d.ts.map +1 -1
  252. package/lib/typescript/components/Channel/Channel.d.ts +3 -4
  253. package/lib/typescript/components/Channel/Channel.d.ts.map +1 -1
  254. package/lib/typescript/components/Channel/hooks/useChannelDataState.d.ts +2 -3
  255. package/lib/typescript/components/Channel/hooks/useChannelDataState.d.ts.map +1 -1
  256. package/lib/typescript/components/Channel/hooks/useCreateMessagesContext.d.ts +1 -1
  257. package/lib/typescript/components/Channel/hooks/useCreateMessagesContext.d.ts.map +1 -1
  258. package/lib/typescript/components/Channel/hooks/useCreateThreadContext.d.ts +6 -6
  259. package/lib/typescript/components/Channel/hooks/useCreateThreadContext.d.ts.map +1 -1
  260. package/lib/typescript/components/Channel/hooks/useMessageListPagination.d.ts +3 -3
  261. package/lib/typescript/components/Channel/hooks/useMessageListPagination.d.ts.map +1 -1
  262. package/lib/typescript/components/ChannelPreview/hooks/useChannelPreviewData.d.ts +1 -1
  263. package/lib/typescript/components/ChannelPreview/hooks/useLatestMessagePreview.d.ts +1 -1
  264. package/lib/typescript/components/Chat/Chat.d.ts +0 -9
  265. package/lib/typescript/components/Chat/Chat.d.ts.map +1 -1
  266. package/lib/typescript/components/KeyboardCompatibleView/KeyboardCompatibleView.d.ts +3 -0
  267. package/lib/typescript/components/KeyboardCompatibleView/KeyboardCompatibleView.d.ts.map +1 -1
  268. package/lib/typescript/components/Message/Message.d.ts +4 -5
  269. package/lib/typescript/components/Message/Message.d.ts.map +1 -1
  270. package/lib/typescript/components/Message/MessageSimple/MessageFooter.d.ts +2 -3
  271. package/lib/typescript/components/Message/MessageSimple/MessageFooter.d.ts.map +1 -1
  272. package/lib/typescript/components/Message/MessageSimple/MessageSimple.d.ts.map +1 -1
  273. package/lib/typescript/components/Message/MessageSimple/MessageStatus.d.ts +1 -1
  274. package/lib/typescript/components/Message/MessageSimple/MessageStatus.d.ts.map +1 -1
  275. package/lib/typescript/components/Message/MessageSimple/MessageTextContainer.d.ts.map +1 -1
  276. package/lib/typescript/components/Message/MessageSimple/utils/renderText.d.ts +2 -2
  277. package/lib/typescript/components/Message/MessageSimple/utils/renderText.d.ts.map +1 -1
  278. package/lib/typescript/components/Message/hooks/useCreateMessageContext.d.ts +1 -1
  279. package/lib/typescript/components/Message/hooks/useCreateMessageContext.d.ts.map +1 -1
  280. package/lib/typescript/components/Message/hooks/useMessageActionHandlers.d.ts.map +1 -1
  281. package/lib/typescript/components/Message/hooks/useMessageActions.d.ts +2 -2
  282. package/lib/typescript/components/Message/hooks/useMessageActions.d.ts.map +1 -1
  283. package/lib/typescript/components/MessageInput/FileUploadPreview.d.ts +2 -4
  284. package/lib/typescript/components/MessageInput/FileUploadPreview.d.ts.map +1 -1
  285. package/lib/typescript/components/MessageInput/InputButtons.d.ts +1 -1
  286. package/lib/typescript/components/MessageInput/InputButtons.d.ts.map +1 -1
  287. package/lib/typescript/components/MessageInput/MessageInput.d.ts +1 -1
  288. package/lib/typescript/components/MessageInput/MessageInput.d.ts.map +1 -1
  289. package/lib/typescript/components/MessageInput/hooks/useAudioController.d.ts.map +1 -1
  290. package/lib/typescript/components/MessageList/MessageList.d.ts +4 -4
  291. package/lib/typescript/components/MessageList/MessageList.d.ts.map +1 -1
  292. package/lib/typescript/components/MessageList/MessageSystem.d.ts +2 -2
  293. package/lib/typescript/components/MessageList/MessageSystem.d.ts.map +1 -1
  294. package/lib/typescript/components/MessageList/hooks/useMessageList.d.ts +14 -9
  295. package/lib/typescript/components/MessageList/hooks/useMessageList.d.ts.map +1 -1
  296. package/lib/typescript/components/MessageList/hooks/useShouldScrollToRecentOnNewOwnMessage.d.ts +2 -2
  297. package/lib/typescript/components/MessageList/hooks/useShouldScrollToRecentOnNewOwnMessage.d.ts.map +1 -1
  298. package/lib/typescript/components/MessageList/utils/getGroupStyles.d.ts.map +1 -1
  299. package/lib/typescript/components/MessageList/utils/getLastReceivedMessage.d.ts +2 -2
  300. package/lib/typescript/components/MessageList/utils/getLastReceivedMessage.d.ts.map +1 -1
  301. package/lib/typescript/components/MessageList/utils/getReadState.d.ts +9 -0
  302. package/lib/typescript/components/MessageList/utils/getReadState.d.ts.map +1 -0
  303. package/lib/typescript/components/MessageMenu/hooks/useFetchReactions.d.ts +2 -3
  304. package/lib/typescript/components/MessageMenu/hooks/useFetchReactions.d.ts.map +1 -1
  305. package/lib/typescript/components/Poll/components/Button.d.ts +2 -3
  306. package/lib/typescript/components/Poll/components/Button.d.ts.map +1 -1
  307. package/lib/typescript/components/Poll/components/PollResults/PollResultItem.d.ts +2 -3
  308. package/lib/typescript/components/Poll/components/PollResults/PollResultItem.d.ts.map +1 -1
  309. package/lib/typescript/components/Reply/Reply.d.ts.map +1 -1
  310. package/lib/typescript/components/Thread/components/ThreadFooterComponent.d.ts.map +1 -1
  311. package/lib/typescript/components/ThreadList/ThreadListItem.d.ts.map +1 -1
  312. package/lib/typescript/components/UIComponents/BottomSheetModal.d.ts.map +1 -1
  313. package/lib/typescript/components/index.d.ts +2 -1
  314. package/lib/typescript/components/index.d.ts.map +1 -1
  315. package/lib/typescript/contexts/attachmentPickerContext/AttachmentPickerContext.d.ts +3 -3
  316. package/lib/typescript/contexts/attachmentPickerContext/AttachmentPickerContext.d.ts.map +1 -1
  317. package/lib/typescript/contexts/channelsStateContext/useChannelState.d.ts.map +1 -1
  318. package/lib/typescript/contexts/debugContext/DebugContext.d.ts +2 -3
  319. package/lib/typescript/contexts/debugContext/DebugContext.d.ts.map +1 -1
  320. package/lib/typescript/contexts/imageGalleryContext/ImageGalleryContext.d.ts +3 -3
  321. package/lib/typescript/contexts/imageGalleryContext/ImageGalleryContext.d.ts.map +1 -1
  322. package/lib/typescript/contexts/messageContext/MessageContext.d.ts +6 -4
  323. package/lib/typescript/contexts/messageContext/MessageContext.d.ts.map +1 -1
  324. package/lib/typescript/contexts/messageInputContext/MessageInputContext.d.ts +13 -15
  325. package/lib/typescript/contexts/messageInputContext/MessageInputContext.d.ts.map +1 -1
  326. package/lib/typescript/contexts/messageInputContext/hooks/useCreateMessageInputContext.d.ts +1 -1
  327. package/lib/typescript/contexts/messageInputContext/hooks/useCreateMessageInputContext.d.ts.map +1 -1
  328. package/lib/typescript/contexts/messageInputContext/hooks/useMessageDetailsForState.d.ts +3 -3
  329. package/lib/typescript/contexts/messageInputContext/hooks/useMessageDetailsForState.d.ts.map +1 -1
  330. package/lib/typescript/contexts/messageInputContext/utils/utils.d.ts +2 -2
  331. package/lib/typescript/contexts/messageInputContext/utils/utils.d.ts.map +1 -1
  332. package/lib/typescript/contexts/messagesContext/MessagesContext.d.ts +25 -21
  333. package/lib/typescript/contexts/messagesContext/MessagesContext.d.ts.map +1 -1
  334. package/lib/typescript/contexts/pollContext/pollContext.d.ts +2 -3
  335. package/lib/typescript/contexts/pollContext/pollContext.d.ts.map +1 -1
  336. package/lib/typescript/contexts/suggestionsContext/SuggestionsContext.d.ts.map +1 -1
  337. package/lib/typescript/contexts/themeContext/utils/theme.d.ts +1 -0
  338. package/lib/typescript/contexts/themeContext/utils/theme.d.ts.map +1 -1
  339. package/lib/typescript/contexts/threadContext/ThreadContext.d.ts +4 -5
  340. package/lib/typescript/contexts/threadContext/ThreadContext.d.ts.map +1 -1
  341. package/lib/typescript/contexts/threadsContext/ThreadListItemContext.d.ts +3 -4
  342. package/lib/typescript/contexts/threadsContext/ThreadListItemContext.d.ts.map +1 -1
  343. package/lib/typescript/hooks/index.d.ts +2 -0
  344. package/lib/typescript/hooks/index.d.ts.map +1 -1
  345. package/lib/typescript/hooks/useAudioPlayer.d.ts.map +1 -1
  346. package/lib/typescript/hooks/useStableCallback.d.ts +26 -0
  347. package/lib/typescript/hooks/useStableCallback.d.ts.map +1 -0
  348. package/lib/typescript/hooks/useTranslatedMessage.d.ts +59 -58
  349. package/lib/typescript/hooks/useTranslatedMessage.d.ts.map +1 -1
  350. package/lib/typescript/i18n/en.json +3 -0
  351. package/lib/typescript/i18n/es.json +3 -0
  352. package/lib/typescript/i18n/fr.json +3 -0
  353. package/lib/typescript/i18n/he.json +3 -0
  354. package/lib/typescript/i18n/hi.json +2 -0
  355. package/lib/typescript/i18n/it.json +3 -0
  356. package/lib/typescript/i18n/ja.json +1 -0
  357. package/lib/typescript/i18n/ko.json +1 -0
  358. package/lib/typescript/i18n/nl.json +2 -0
  359. package/lib/typescript/i18n/pt-br.json +3 -0
  360. package/lib/typescript/i18n/ru.json +4 -0
  361. package/lib/typescript/i18n/tr.json +2 -0
  362. package/lib/typescript/native.d.ts +8 -11
  363. package/lib/typescript/native.d.ts.map +1 -1
  364. package/lib/typescript/store/apis/insertReaction.d.ts +2 -2
  365. package/lib/typescript/store/apis/insertReaction.d.ts.map +1 -1
  366. package/lib/typescript/store/apis/updateMessage.d.ts +2 -2
  367. package/lib/typescript/store/apis/updateMessage.d.ts.map +1 -1
  368. package/lib/typescript/store/apis/updateReaction.d.ts +2 -2
  369. package/lib/typescript/store/apis/updateReaction.d.ts.map +1 -1
  370. package/lib/typescript/store/mappers/mapMessageToStorable.d.ts +2 -2
  371. package/lib/typescript/store/mappers/mapMessageToStorable.d.ts.map +1 -1
  372. package/lib/typescript/types/types.d.ts +28 -50
  373. package/lib/typescript/types/types.d.ts.map +1 -1
  374. package/lib/typescript/utils/compressImage.d.ts +2 -2
  375. package/lib/typescript/utils/compressImage.d.ts.map +1 -1
  376. package/lib/typescript/utils/i18n/Streami18n.d.ts +3 -0
  377. package/lib/typescript/utils/i18n/Streami18n.d.ts.map +1 -1
  378. package/lib/typescript/utils/removeReservedFields.d.ts +2 -3
  379. package/lib/typescript/utils/removeReservedFields.d.ts.map +1 -1
  380. package/lib/typescript/utils/utils.d.ts +10 -10
  381. package/lib/typescript/utils/utils.d.ts.map +1 -1
  382. package/package.json +4 -3
  383. package/src/components/Attachment/AudioAttachment.tsx +12 -6
  384. package/src/components/Attachment/FileAttachmentGroup.tsx +3 -1
  385. package/src/components/Attachment/Gallery.tsx +22 -7
  386. package/src/components/Attachment/ImageReloadIndicator.tsx +4 -5
  387. package/src/components/AttachmentPicker/AttachmentPicker.tsx +4 -10
  388. package/src/components/AttachmentPicker/components/AttachmentPickerItem.tsx +9 -37
  389. package/src/components/AutoCompleteInput/AutoCompleteInput.tsx +27 -23
  390. package/src/components/AutoCompleteInput/__tests__/AutoCompleteInput.test.js +12 -12
  391. package/src/components/Channel/Channel.tsx +423 -361
  392. package/src/components/Channel/__tests__/Channel.test.js +10 -3
  393. package/src/components/Channel/hooks/useChannelDataState.ts +2 -4
  394. package/src/components/Channel/hooks/useCreateMessagesContext.ts +2 -0
  395. package/src/components/Channel/hooks/useMessageListPagination.tsx +150 -150
  396. package/src/components/Chat/Chat.tsx +0 -9
  397. package/src/components/ImageGallery/__tests__/ImageGallery.test.tsx +8 -7
  398. package/src/components/ImageGallery/__tests__/ImageGalleryFooter.test.tsx +5 -4
  399. package/src/components/ImageGallery/__tests__/ImageGalleryHeader.test.tsx +5 -4
  400. package/src/components/ImageGallery/__tests__/ImageGalleryOverlay.test.tsx +3 -2
  401. package/src/components/KeyboardCompatibleView/KeyboardCompatibleView.tsx +12 -5
  402. package/src/components/Message/Message.tsx +16 -15
  403. package/src/components/Message/MessageSimple/MessageFooter.tsx +2 -3
  404. package/src/components/Message/MessageSimple/MessageSimple.tsx +112 -70
  405. package/src/components/Message/MessageSimple/MessageStatus.tsx +19 -17
  406. package/src/components/Message/MessageSimple/MessageTextContainer.tsx +3 -3
  407. package/src/components/Message/MessageSimple/__tests__/MessageStatus.test.js +11 -5
  408. package/src/components/Message/MessageSimple/__tests__/MessageTextContainer.test.tsx +5 -4
  409. package/src/components/Message/MessageSimple/utils/renderText.tsx +2 -3
  410. package/src/components/Message/hooks/useCreateMessageContext.ts +3 -0
  411. package/src/components/Message/hooks/useMessageActionHandlers.ts +1 -3
  412. package/src/components/Message/hooks/useMessageActions.tsx +4 -3
  413. package/src/components/MessageInput/FileUploadPreview.tsx +41 -70
  414. package/src/components/MessageInput/ImageUploadPreview.tsx +2 -2
  415. package/src/components/MessageInput/InputButtons.tsx +14 -10
  416. package/src/components/MessageInput/MessageInput.tsx +28 -30
  417. package/src/components/MessageInput/__tests__/FileUploadPreview.test.js +1 -1
  418. package/src/components/MessageInput/__tests__/MessageInput.test.js +3 -1
  419. package/src/components/MessageInput/components/AudioRecorder/AudioRecordingButton.tsx +1 -0
  420. package/src/components/MessageInput/hooks/useAudioController.tsx +6 -5
  421. package/src/components/MessageList/MessageList.tsx +253 -137
  422. package/src/components/MessageList/MessageSystem.tsx +2 -2
  423. package/src/components/MessageList/hooks/useMessageList.ts +82 -64
  424. package/src/components/MessageList/hooks/useShouldScrollToRecentOnNewOwnMessage.ts +2 -2
  425. package/src/components/MessageList/utils/getGroupStyles.ts +7 -5
  426. package/src/components/MessageList/utils/getLastReceivedMessage.ts +3 -3
  427. package/src/components/MessageList/utils/getReadState.ts +27 -0
  428. package/src/components/MessageMenu/__tests__/MessageUserReactions.test.tsx +2 -3
  429. package/src/components/MessageMenu/hooks/useFetchReactions.ts +2 -3
  430. package/src/components/Poll/components/Button.tsx +2 -4
  431. package/src/components/Poll/components/PollResults/PollResultItem.tsx +2 -3
  432. package/src/components/Reply/Reply.tsx +1 -2
  433. package/src/components/Thread/__tests__/__snapshots__/Thread.test.js.snap +318 -847
  434. package/src/components/Thread/components/ThreadFooterComponent.tsx +31 -9
  435. package/src/components/ThreadList/ThreadListItem.tsx +6 -4
  436. package/src/components/UIComponents/BottomSheetModal.tsx +11 -7
  437. package/src/components/index.ts +2 -1
  438. package/src/contexts/attachmentPickerContext/AttachmentPickerContext.tsx +5 -4
  439. package/src/contexts/channelsStateContext/useChannelState.ts +5 -1
  440. package/src/contexts/debugContext/DebugContext.tsx +2 -4
  441. package/src/contexts/imageGalleryContext/ImageGalleryContext.tsx +5 -4
  442. package/src/contexts/messageContext/MessageContext.tsx +6 -4
  443. package/src/contexts/messageInputContext/MessageInputContext.tsx +295 -262
  444. package/src/contexts/messageInputContext/__tests__/__snapshots__/sendMessage.test.tsx.snap +10 -6
  445. package/src/contexts/messageInputContext/__tests__/sendMessage.test.tsx +6 -5
  446. package/src/contexts/messageInputContext/__tests__/updateMessage.test.tsx +3 -5
  447. package/src/contexts/messageInputContext/__tests__/useMessageDetailsForState.test.tsx +14 -9
  448. package/src/contexts/messageInputContext/hooks/useCreateMessageInputContext.ts +7 -3
  449. package/src/contexts/messageInputContext/hooks/useMessageDetailsForState.ts +37 -40
  450. package/src/contexts/messageInputContext/utils/utils.ts +6 -8
  451. package/src/contexts/messagesContext/MessagesContext.tsx +26 -20
  452. package/src/contexts/pollContext/pollContext.tsx +2 -4
  453. package/src/contexts/suggestionsContext/SuggestionsContext.tsx +33 -14
  454. package/src/contexts/themeContext/utils/theme.ts +2 -0
  455. package/src/contexts/threadContext/ThreadContext.tsx +4 -6
  456. package/src/contexts/threadsContext/ThreadListItemContext.tsx +3 -5
  457. package/src/hooks/index.ts +2 -0
  458. package/src/hooks/useAudioPlayer.ts +37 -31
  459. package/src/hooks/useStableCallback.ts +37 -0
  460. package/src/hooks/useTranslatedMessage.ts +2 -2
  461. package/src/i18n/en.json +3 -0
  462. package/src/i18n/es.json +3 -0
  463. package/src/i18n/fr.json +3 -0
  464. package/src/i18n/he.json +3 -0
  465. package/src/i18n/hi.json +2 -0
  466. package/src/i18n/it.json +3 -0
  467. package/src/i18n/ja.json +1 -0
  468. package/src/i18n/ko.json +1 -0
  469. package/src/i18n/nl.json +2 -0
  470. package/src/i18n/pt-br.json +3 -0
  471. package/src/i18n/ru.json +4 -0
  472. package/src/i18n/tr.json +2 -0
  473. package/src/mock-builders/api/channelMocks.tsx +2 -8
  474. package/src/native.ts +13 -8
  475. package/src/store/apis/insertReaction.ts +2 -2
  476. package/src/store/apis/updateMessage.ts +2 -2
  477. package/src/store/apis/updateReaction.ts +2 -2
  478. package/src/store/mappers/mapMessageToStorable.ts +2 -2
  479. package/src/types/stream-chat-common-custom-data.d.ts +22 -22
  480. package/src/types/types.ts +35 -54
  481. package/src/utils/compressImage.ts +3 -4
  482. package/src/utils/removeReservedFields.ts +3 -5
  483. package/src/utils/utils.ts +25 -16
  484. package/src/version.json +1 -1
  485. package/lib/commonjs/components/MessageList/hooks/useLastReadData.js +0 -20
  486. package/lib/commonjs/components/MessageList/hooks/useLastReadData.js.map +0 -1
  487. package/lib/commonjs/components/MessageList/utils/getReadStates.js +0 -34
  488. package/lib/commonjs/components/MessageList/utils/getReadStates.js.map +0 -1
  489. package/lib/module/components/MessageList/hooks/useLastReadData.js +0 -20
  490. package/lib/module/components/MessageList/hooks/useLastReadData.js.map +0 -1
  491. package/lib/module/components/MessageList/utils/getReadStates.js +0 -34
  492. package/lib/module/components/MessageList/utils/getReadStates.js.map +0 -1
  493. package/lib/typescript/components/MessageList/hooks/useLastReadData.d.ts +0 -12
  494. package/lib/typescript/components/MessageList/hooks/useLastReadData.d.ts.map +0 -1
  495. package/lib/typescript/components/MessageList/utils/getReadStates.d.ts +0 -5
  496. package/lib/typescript/components/MessageList/utils/getReadStates.d.ts.map +0 -1
  497. package/src/components/MessageList/hooks/useLastReadData.ts +0 -29
  498. package/src/components/MessageList/utils/getReadStates.ts +0 -55
@@ -77,6 +77,8 @@ describe('Channel', () => {
77
77
  useMockedApis(chatClient, [getOrCreateChannelApi(mockedChannel)]);
78
78
  channel = chatClient.channel('messaging', mockedChannel.id);
79
79
  channel.cid = mockedChannel.channel.cid;
80
+ const getConfigSpy = jest.fn();
81
+ channel.getConfig = getConfigSpy;
80
82
  });
81
83
 
82
84
  afterEach(() => {
@@ -356,7 +358,7 @@ describe('Channel initial load useEffect', () => {
356
358
  cleanup();
357
359
  });
358
360
 
359
- it('should not call channel.watch if channel is not initialized', async () => {
361
+ it('should still call channel.watch if we are online and DB channels are loaded', async () => {
360
362
  const messages = Array.from({ length: 10 }, (_, i) => generateMessage({ id: i }));
361
363
  const mockedChannel = generateChannelResponse({
362
364
  messages,
@@ -366,13 +368,18 @@ describe('Channel initial load useEffect', () => {
366
368
  const channel = chatClient.channel('messaging', mockedChannel.id);
367
369
  await channel.watch();
368
370
  channel.offlineMode = true;
369
- channel.state = channelInitialState;
371
+ channel.state = {
372
+ ...channelInitialState,
373
+ messagePagination: {
374
+ hasPrev: true,
375
+ },
376
+ };
370
377
  const watchSpy = jest.fn();
371
378
  channel.watch = watchSpy;
372
379
 
373
380
  renderComponent({ channel });
374
381
 
375
- await waitFor(() => expect(watchSpy).not.toHaveBeenCalled());
382
+ await waitFor(() => expect(watchSpy).toHaveBeenCalledTimes(1));
376
383
  });
377
384
 
378
385
  it("should call channel.watch if channel is initialized and it's not in offline mode", async () => {
@@ -1,8 +1,6 @@
1
1
  import { useCallback, useState } from 'react';
2
2
 
3
- import { Channel, ChannelState as StreamChannelState } from 'stream-chat';
4
-
5
- import { MessageType } from '../../MessageList/hooks/useMessageList';
3
+ import { Channel, LocalMessage, ChannelState as StreamChannelState } from 'stream-chat';
6
4
 
7
5
  export const channelInitialState = {
8
6
  hasMore: true,
@@ -38,7 +36,7 @@ export type ChannelMessagesState = {
38
36
  * The ChannelThreadState object
39
37
  */
40
38
  export type ChannelThreadState = {
41
- thread: MessageType | null;
39
+ thread: LocalMessage | null;
42
40
  threadHasMore?: boolean;
43
41
  threadLoadingMore?: boolean;
44
42
  threadMessages?: StreamChannelState['messages'];
@@ -45,6 +45,7 @@ export const useCreateMessagesContext = ({
45
45
  hasCreatePoll,
46
46
  ImageLoadingFailedIndicator,
47
47
  ImageLoadingIndicator,
48
+ ImageReloadIndicator,
48
49
  initialScrollToFirstUnreadMessage,
49
50
  InlineDateSeparator,
50
51
  InlineUnreadIndicator,
@@ -162,6 +163,7 @@ export const useCreateMessagesContext = ({
162
163
  hasCreatePoll,
163
164
  ImageLoadingFailedIndicator,
164
165
  ImageLoadingIndicator,
166
+ ImageReloadIndicator,
165
167
  initialScrollToFirstUnreadMessage,
166
168
  InlineDateSeparator,
167
169
  InlineUnreadIndicator,
@@ -6,6 +6,7 @@ import { Channel, ChannelState, MessageResponse } from 'stream-chat';
6
6
  import { useChannelMessageDataState } from './useChannelDataState';
7
7
 
8
8
  import { ChannelContextValue } from '../../../contexts/channelContext/ChannelContext';
9
+ import { useStableCallback } from '../../../hooks';
9
10
  import { findInMessagesByDate, findInMessagesById } from '../../../utils/utils';
10
11
 
11
12
  const defaultDebounceInterval = 500;
@@ -59,7 +60,7 @@ export const useMessageListPagination = ({ channel }: { channel: Channel }) => {
59
60
  /**
60
61
  * This function loads the latest messages in the channel.
61
62
  */
62
- const loadLatestMessages = async () => {
63
+ const loadLatestMessages = useStableCallback(async () => {
63
64
  try {
64
65
  setLoading(true);
65
66
  await channel.state.loadMessageIntoState('latest');
@@ -68,12 +69,12 @@ export const useMessageListPagination = ({ channel }: { channel: Channel }) => {
68
69
  } catch (err) {
69
70
  console.warn('Loading latest messages failed with error:', err);
70
71
  }
71
- };
72
+ });
72
73
 
73
74
  /**
74
75
  * This function loads more messages before the first message in current channel state.
75
76
  */
76
- const loadMore = async (limit = 20) => {
77
+ const loadMore = useStableCallback(async (limit: number = 20) => {
77
78
  if (!channel.state.messagePagination.hasPrev) {
78
79
  return;
79
80
  }
@@ -97,12 +98,12 @@ export const useMessageListPagination = ({ channel }: { channel: Channel }) => {
97
98
  setLoadingMore(false);
98
99
  console.warn('Message pagination(fetching old messages) request failed with error:', e);
99
100
  }
100
- };
101
+ });
101
102
 
102
103
  /**
103
104
  * This function loads more messages after the most recent message in current channel state.
104
105
  */
105
- const loadMoreRecent = async (limit = 10) => {
106
+ const loadMoreRecent = useStableCallback(async (limit: number = 10) => {
106
107
  if (!channel.state.messagePagination.hasNext) {
107
108
  return;
108
109
  }
@@ -126,180 +127,179 @@ export const useMessageListPagination = ({ channel }: { channel: Channel }) => {
126
127
  console.warn('Message pagination(fetching new messages) request failed with error:', e);
127
128
  return;
128
129
  }
129
- };
130
+ });
130
131
 
131
132
  /**
132
133
  * Loads channel around a specific message
133
134
  *
134
135
  * @param messageId If undefined, channel will be loaded at most recent message.
135
136
  */
136
- const loadChannelAroundMessage: ChannelContextValue['loadChannelAroundMessage'] = async ({
137
- limit = 25,
138
- messageId: messageIdToLoadAround,
139
- setTargetedMessage,
140
- }) => {
141
- if (!messageIdToLoadAround) {
142
- return;
143
- }
144
- setLoadingMore(true);
145
- setLoading(true);
146
- try {
147
- await channel.state.loadMessageIntoState(messageIdToLoadAround, undefined, limit);
148
- loadMoreFinished(channel.state.messagePagination.hasPrev, channel.state.messages);
149
- jumpToMessageFinished(channel.state.messagePagination.hasNext, messageIdToLoadAround);
137
+ const loadChannelAroundMessage: ChannelContextValue['loadChannelAroundMessage'] =
138
+ useStableCallback(
139
+ async ({ limit = 25, messageId: messageIdToLoadAround, setTargetedMessage }) => {
140
+ if (!messageIdToLoadAround) {
141
+ return;
142
+ }
143
+ setLoadingMore(true);
144
+ setLoading(true);
145
+ try {
146
+ await channel.state.loadMessageIntoState(messageIdToLoadAround, undefined, limit);
147
+ loadMoreFinished(channel.state.messagePagination.hasPrev, channel.state.messages);
148
+ jumpToMessageFinished(channel.state.messagePagination.hasNext, messageIdToLoadAround);
150
149
 
151
- if (setTargetedMessage) {
152
- setTargetedMessage(messageIdToLoadAround);
153
- }
154
- } catch (error) {
155
- setLoadingMore(false);
156
- setLoading(false);
157
- console.warn(
158
- 'Message pagination(fetching messages in the channel around a message id) request failed with error:',
159
- error,
160
- );
161
- return;
162
- }
163
- };
150
+ if (setTargetedMessage) {
151
+ setTargetedMessage(messageIdToLoadAround);
152
+ }
153
+ } catch (error) {
154
+ setLoadingMore(false);
155
+ setLoading(false);
156
+ console.warn(
157
+ 'Message pagination(fetching messages in the channel around a message id) request failed with error:',
158
+ error,
159
+ );
160
+ return;
161
+ }
162
+ },
163
+ );
164
164
 
165
165
  /**
166
166
  * Fetch messages around a specific timestamp.
167
167
  */
168
- const fetchMessagesAround = async (
169
- channel: Channel,
170
- timestamp: string,
171
- limit: number,
172
- ): Promise<MessageResponse[]> => {
173
- try {
174
- const { messages } = await channel.query(
175
- { messages: { created_at_around: timestamp, limit } },
176
- 'new',
177
- );
178
- return messages;
179
- } catch (error) {
180
- console.error('Error fetching messages around timestamp:', error);
181
- throw error;
182
- }
183
- };
168
+ const fetchMessagesAround = useStableCallback(
169
+ async (channel: Channel, timestamp: string, limit: number): Promise<MessageResponse[]> => {
170
+ try {
171
+ const { messages } = await channel.query(
172
+ { messages: { created_at_around: timestamp, limit } },
173
+ 'new',
174
+ );
175
+ return messages;
176
+ } catch (error) {
177
+ console.error('Error fetching messages around timestamp:', error);
178
+ throw error;
179
+ }
180
+ },
181
+ );
184
182
 
185
183
  /**
186
184
  * Loads channel at first unread message.
187
185
  */
188
186
  const loadChannelAtFirstUnreadMessage: ChannelContextValue['loadChannelAtFirstUnreadMessage'] =
189
- async ({ channelUnreadState, limit = 25, setChannelUnreadState, setTargetedMessage }) => {
190
- try {
191
- if (!channelUnreadState?.unread_messages) {
192
- return;
193
- }
194
- const { first_unread_message_id, last_read, last_read_message_id } = channelUnreadState;
195
- let firstUnreadMessageId = first_unread_message_id;
196
- let lastReadMessageId = last_read_message_id;
197
- let isInCurrentMessageSet = false;
198
- const messagesState = channel.state.messages;
187
+ useStableCallback(
188
+ async ({ channelUnreadState, limit = 25, setChannelUnreadState, setTargetedMessage }) => {
189
+ try {
190
+ if (!channelUnreadState?.unread_messages) {
191
+ return;
192
+ }
193
+ const { first_unread_message_id, last_read, last_read_message_id } = channelUnreadState;
194
+ let firstUnreadMessageId = first_unread_message_id;
195
+ let lastReadMessageId = last_read_message_id;
196
+ let isInCurrentMessageSet = false;
197
+ const messagesState = channel.state.messages;
199
198
 
200
- // If the first unread message is already in the current message set, we don't need to load more messages.
201
- if (firstUnreadMessageId) {
202
- const messageIdx = findInMessagesById(messagesState, firstUnreadMessageId);
203
- isInCurrentMessageSet = messageIdx !== -1;
204
- }
205
- // If the last read message is already in the current message set, we don't need to load more messages, and we set the first unread message id as that is what we want to operate on.
206
- else if (lastReadMessageId) {
207
- const messageIdx = findInMessagesById(messagesState, lastReadMessageId);
208
- isInCurrentMessageSet = messageIdx !== -1;
209
- firstUnreadMessageId = messageIdx > -1 ? messagesState[messageIdx + 1]?.id : undefined;
210
- } else {
211
- const lastReadTimestamp = last_read.getTime();
212
- const { index: lastReadIdx, message: lastReadMessage } = findInMessagesByDate(
213
- messagesState,
214
- last_read,
215
- );
216
- if (lastReadMessage) {
217
- lastReadMessageId = lastReadMessage.id;
218
- firstUnreadMessageId = messagesState[lastReadIdx + 1].id;
219
- isInCurrentMessageSet = !!firstUnreadMessageId;
199
+ // If the first unread message is already in the current message set, we don't need to load more messages.
200
+ if (firstUnreadMessageId) {
201
+ const messageIdx = findInMessagesById(messagesState, firstUnreadMessageId);
202
+ isInCurrentMessageSet = messageIdx !== -1;
203
+ }
204
+ // If the last read message is already in the current message set, we don't need to load more messages, and we set the first unread message id as that is what we want to operate on.
205
+ else if (lastReadMessageId) {
206
+ const messageIdx = findInMessagesById(messagesState, lastReadMessageId);
207
+ isInCurrentMessageSet = messageIdx !== -1;
208
+ firstUnreadMessageId = messageIdx > -1 ? messagesState[messageIdx + 1]?.id : undefined;
220
209
  } else {
221
- setLoadingMore(true);
222
- setLoading(true);
223
- let messages;
224
- try {
225
- messages = await fetchMessagesAround(channel, last_read.toISOString(), limit);
226
- } catch (error) {
227
- setLoading(false);
228
- loadMoreFinished(channel.state.messagePagination.hasPrev, messagesState);
229
- console.log('Loading channel at first unread message failed with error:', error);
230
- return;
231
- }
210
+ const lastReadTimestamp = last_read.getTime();
211
+ const { index: lastReadIdx, message: lastReadMessage } = findInMessagesByDate(
212
+ messagesState,
213
+ last_read,
214
+ );
215
+ if (lastReadMessage) {
216
+ lastReadMessageId = lastReadMessage.id;
217
+ firstUnreadMessageId = messagesState[lastReadIdx + 1].id;
218
+ isInCurrentMessageSet = !!firstUnreadMessageId;
219
+ } else {
220
+ setLoadingMore(true);
221
+ setLoading(true);
222
+ let messages;
223
+ try {
224
+ messages = await fetchMessagesAround(channel, last_read.toISOString(), limit);
225
+ } catch (error) {
226
+ setLoading(false);
227
+ loadMoreFinished(channel.state.messagePagination.hasPrev, messagesState);
228
+ console.log('Loading channel at first unread message failed with error:', error);
229
+ return;
230
+ }
232
231
 
233
- const firstMessageWithCreationDate = messages.find((msg) => msg.created_at);
234
- if (!firstMessageWithCreationDate) {
235
- loadMoreFinished(channel.state.messagePagination.hasPrev, channel.state.messages);
236
- throw new Error('Failed to jump to first unread message id.');
237
- }
238
- const firstMessageTimestamp = new Date(
239
- firstMessageWithCreationDate.created_at as string,
240
- ).getTime();
232
+ const firstMessageWithCreationDate = messages.find((msg) => msg.created_at);
233
+ if (!firstMessageWithCreationDate) {
234
+ loadMoreFinished(channel.state.messagePagination.hasPrev, channel.state.messages);
235
+ throw new Error('Failed to jump to first unread message id.');
236
+ }
237
+ const firstMessageTimestamp = new Date(
238
+ firstMessageWithCreationDate.created_at as string,
239
+ ).getTime();
241
240
 
242
- if (lastReadTimestamp < firstMessageTimestamp) {
243
- // whole channel is unread
244
- firstUnreadMessageId = firstMessageWithCreationDate.id;
245
- } else {
246
- const result = findInMessagesByDate(messages, last_read);
247
- lastReadMessageId = result.message?.id;
241
+ if (lastReadTimestamp < firstMessageTimestamp) {
242
+ // whole channel is unread
243
+ firstUnreadMessageId = firstMessageWithCreationDate.id;
244
+ } else {
245
+ const result = findInMessagesByDate(messages, last_read);
246
+ lastReadMessageId = result.message?.id;
247
+ }
248
+ loadMoreFinished(channel.state.messagePagination.hasPrev, channel.state.messages);
248
249
  }
249
- loadMoreFinished(channel.state.messagePagination.hasPrev, channel.state.messages);
250
250
  }
251
- }
252
251
 
253
- // If we still don't have the first and last read message id, we can't proceed.
254
- if (!firstUnreadMessageId && !lastReadMessageId) {
255
- throw new Error('Failed to jump to first unread message id.');
256
- }
252
+ // If we still don't have the first and last read message id, we can't proceed.
253
+ if (!firstUnreadMessageId && !lastReadMessageId) {
254
+ throw new Error('Failed to jump to first unread message id.');
255
+ }
257
256
 
258
- // If the first unread message is not in the current message set, we need to load message around the id.
259
- if (!isInCurrentMessageSet) {
260
- try {
261
- setLoadingMore(true);
262
- setLoading(true);
263
- const targetedMessage = (firstUnreadMessageId || lastReadMessageId) as string;
264
- await channel.state.loadMessageIntoState(targetedMessage, undefined, limit);
265
- /**
266
- * if the index of the last read message on the page is beyond the half of the page,
267
- * we have arrived to the oldest page of the channel
268
- */
269
- const indexOfTarget = channel.state.messages.findIndex(
270
- (message) => message.id === targetedMessage,
271
- );
257
+ // If the first unread message is not in the current message set, we need to load message around the id.
258
+ if (!isInCurrentMessageSet) {
259
+ try {
260
+ setLoadingMore(true);
261
+ setLoading(true);
262
+ const targetedMessage = (firstUnreadMessageId || lastReadMessageId) as string;
263
+ await channel.state.loadMessageIntoState(targetedMessage, undefined, limit);
264
+ /**
265
+ * if the index of the last read message on the page is beyond the half of the page,
266
+ * we have arrived to the oldest page of the channel
267
+ */
268
+ const indexOfTarget = channel.state.messages.findIndex(
269
+ (message) => message.id === targetedMessage,
270
+ );
272
271
 
273
- loadMoreFinished(channel.state.messagePagination.hasPrev, channel.state.messages);
274
- firstUnreadMessageId =
275
- firstUnreadMessageId ?? channel.state.messages[indexOfTarget + 1].id;
276
- } catch (error) {
277
- setLoading(false);
278
- loadMoreFinished(channel.state.messagePagination.hasPrev, channel.state.messages);
279
- console.log('Loading channel at first unread message failed with error:', error);
280
- return;
272
+ loadMoreFinished(channel.state.messagePagination.hasPrev, channel.state.messages);
273
+ firstUnreadMessageId =
274
+ firstUnreadMessageId ?? channel.state.messages[indexOfTarget + 1].id;
275
+ } catch (error) {
276
+ setLoading(false);
277
+ loadMoreFinished(channel.state.messagePagination.hasPrev, channel.state.messages);
278
+ console.log('Loading channel at first unread message failed with error:', error);
279
+ return;
280
+ }
281
281
  }
282
- }
283
282
 
284
- if (!firstUnreadMessageId) {
285
- throw new Error('Failed to jump to first unread message id.');
286
- }
287
- if (!first_unread_message_id && setChannelUnreadState) {
288
- setChannelUnreadState({
289
- ...channelUnreadState,
290
- first_unread_message_id: firstUnreadMessageId,
291
- last_read_message_id: lastReadMessageId,
292
- });
293
- }
283
+ if (!firstUnreadMessageId) {
284
+ throw new Error('Failed to jump to first unread message id.');
285
+ }
286
+ if (!first_unread_message_id && setChannelUnreadState) {
287
+ setChannelUnreadState({
288
+ ...channelUnreadState,
289
+ first_unread_message_id: firstUnreadMessageId,
290
+ last_read_message_id: lastReadMessageId,
291
+ });
292
+ }
294
293
 
295
- jumpToMessageFinished(channel.state.messagePagination.hasNext, firstUnreadMessageId);
296
- if (setTargetedMessage) {
297
- setTargetedMessage(firstUnreadMessageId);
294
+ jumpToMessageFinished(channel.state.messagePagination.hasNext, firstUnreadMessageId);
295
+ if (setTargetedMessage) {
296
+ setTargetedMessage(firstUnreadMessageId);
297
+ }
298
+ } catch (error) {
299
+ console.log('Loading channel at first unread message failed with error:', error);
298
300
  }
299
- } catch (error) {
300
- console.log('Loading channel at first unread message failed with error:', error);
301
- }
302
- };
301
+ },
302
+ );
303
303
 
304
304
  return {
305
305
  copyMessagesStateFromChannel,
@@ -308,15 +308,6 @@ const ChatWithContext = (props: PropsWithChildren<ChatProps>) => {
308
308
  * - connectionRecovering - whether or not websocket is reconnecting
309
309
  * - isOnline - whether or not set user is active
310
310
  * - setActiveChannel - function to set the currently active channel
311
- *
312
- * The Chat Component takes the following generics in order:
313
- * - At (AttachmentType) - custom Attachment object extension
314
- * - Ct (ChannelType) - custom Channel object extension
315
- * - Co (CommandType) - custom Command string union extension
316
- * - Ev (EventType) - custom Event object extension
317
- * - Me (MessageType) - custom Message object extension
318
- * - Re (ReactionType) - custom Reaction object extension
319
- * - Us (UserType) - custom User object extension
320
311
  */
321
312
  export const Chat = (props: PropsWithChildren<ChatProps>) => {
322
313
  const { style } = useOverlayContext();
@@ -4,6 +4,8 @@ import type { SharedValue } from 'react-native-reanimated';
4
4
 
5
5
  import { act, fireEvent, render, screen, waitFor } from '@testing-library/react-native';
6
6
 
7
+ import { LocalMessage } from 'stream-chat';
8
+
7
9
  import {
8
10
  ImageGalleryContext,
9
11
  ImageGalleryContextValue,
@@ -18,7 +20,6 @@ import {
18
20
  } from '../../../mock-builders/generator/attachment';
19
21
  import { generateMessage } from '../../../mock-builders/generator/message';
20
22
 
21
- import type { MessageType } from '../../MessageList/hooks/useMessageList';
22
23
  import { ImageGallery } from '../ImageGallery';
23
24
 
24
25
  jest.mock('../../../native.ts', () => {
@@ -56,7 +57,7 @@ describe('ImageGallery', () => {
56
57
  generateVideoAttachment({ type: 'video' }),
57
58
  ],
58
59
  }),
59
- ] as unknown as MessageType[],
60
+ ] as unknown as LocalMessage[],
60
61
  }),
61
62
  );
62
63
 
@@ -73,7 +74,7 @@ describe('ImageGallery', () => {
73
74
  });
74
75
  render(
75
76
  getComponent({
76
- messages: [message] as unknown as MessageType[],
77
+ messages: [message] as unknown as LocalMessage[],
77
78
  }),
78
79
  );
79
80
 
@@ -102,7 +103,7 @@ describe('ImageGallery', () => {
102
103
  generateMessage({
103
104
  attachments: [generateVideoAttachment({ type: 'video' })],
104
105
  }),
105
- ] as unknown as MessageType[],
106
+ ] as unknown as LocalMessage[],
106
107
  }),
107
108
  );
108
109
 
@@ -128,7 +129,7 @@ describe('ImageGallery', () => {
128
129
 
129
130
  render(
130
131
  getComponent({
131
- messages: [message] as unknown as MessageType[],
132
+ messages: [message] as unknown as LocalMessage[],
132
133
  }),
133
134
  );
134
135
 
@@ -163,7 +164,7 @@ describe('ImageGallery', () => {
163
164
  generateMessage({
164
165
  attachments: [generateVideoAttachment({ type: 'video' })],
165
166
  }),
166
- ] as unknown as MessageType[],
167
+ ] as unknown as LocalMessage[],
167
168
  }),
168
169
  );
169
170
 
@@ -193,7 +194,7 @@ describe('ImageGallery', () => {
193
194
  });
194
195
  render(
195
196
  getComponent({
196
- messages: [message] as unknown as MessageType[],
197
+ messages: [message] as unknown as LocalMessage[],
197
198
  }),
198
199
  );
199
200
 
@@ -7,6 +7,8 @@ import { ReactTestInstance } from 'react-test-renderer';
7
7
 
8
8
  import { render, screen, userEvent, waitFor } from '@testing-library/react-native';
9
9
 
10
+ import { LocalMessage } from 'stream-chat';
11
+
10
12
  import { Chat } from '../../../components/Chat/Chat';
11
13
  import {
12
14
  ImageGalleryContext,
@@ -20,7 +22,6 @@ import {
20
22
  import { generateMessage } from '../../../mock-builders/generator/message';
21
23
  import { getTestClientWithUser } from '../../../mock-builders/mock';
22
24
  import { NativeHandlers } from '../../../native';
23
- import type { MessageType } from '../../MessageList/hooks/useMessageList';
24
25
  import { ImageGallery, ImageGalleryCustomComponents } from '../ImageGallery';
25
26
 
26
27
  jest.mock('../../../native.ts', () => {
@@ -76,7 +77,7 @@ describe('ImageGalleryFooter', () => {
76
77
  generateMessage({
77
78
  attachments: [generateVideoAttachment({ type: 'video' })],
78
79
  }),
79
- ] as unknown as MessageType[],
80
+ ] as unknown as LocalMessage[],
80
81
  } as unknown as ImageGalleryContextValue
81
82
  }
82
83
  >
@@ -131,7 +132,7 @@ describe('ImageGalleryFooter', () => {
131
132
  generateMessage({
132
133
  attachments: [generateVideoAttachment({ type: 'video' })],
133
134
  }),
134
- ] as unknown as MessageType[],
135
+ ] as unknown as LocalMessage[],
135
136
  } as unknown as ImageGalleryContextValue
136
137
  }
137
138
  >
@@ -174,7 +175,7 @@ describe('ImageGalleryFooter', () => {
174
175
  generateMessage({
175
176
  attachments: [generateImageAttachment()],
176
177
  }),
177
- ] as unknown as MessageType[],
178
+ ] as unknown as LocalMessage[],
178
179
  } as unknown as ImageGalleryContextValue
179
180
  }
180
181
  >
@@ -7,6 +7,8 @@ import { act } from 'react-test-renderer';
7
7
 
8
8
  import { render, screen, userEvent, waitFor } from '@testing-library/react-native';
9
9
 
10
+ import { LocalMessage } from 'stream-chat';
11
+
10
12
  import { Chat } from '../../../components/Chat/Chat';
11
13
  import {
12
14
  ImageGalleryContext,
@@ -24,7 +26,6 @@ import {
24
26
  import { generateMessage } from '../../../mock-builders/generator/message';
25
27
  import { getTestClientWithUser } from '../../../mock-builders/mock';
26
28
 
27
- import type { MessageType } from '../../MessageList/hooks/useMessageList';
28
29
  import { ImageGallery, ImageGalleryCustomComponents } from '../ImageGallery';
29
30
 
30
31
  jest.mock('../../../native.ts', () => {
@@ -71,7 +72,7 @@ describe('ImageGalleryHeader', () => {
71
72
  generateMessage({
72
73
  attachments: [generateImageAttachment()],
73
74
  }),
74
- ] as unknown as MessageType[],
75
+ ] as unknown as LocalMessage[],
75
76
  } as unknown as ImageGalleryContextValue
76
77
  }
77
78
  >
@@ -118,7 +119,7 @@ describe('ImageGalleryHeader', () => {
118
119
  generateMessage({
119
120
  attachments: [generateVideoAttachment({ type: 'video' })],
120
121
  }),
121
- ] as unknown as MessageType[],
122
+ ] as unknown as LocalMessage[],
122
123
  } as unknown as ImageGalleryContextValue
123
124
  }
124
125
  >
@@ -158,7 +159,7 @@ describe('ImageGalleryHeader', () => {
158
159
  generateMessage({
159
160
  attachments: [generateImageAttachment()],
160
161
  }),
161
- ] as unknown as MessageType[],
162
+ ] as unknown as LocalMessage[],
162
163
  } as unknown as ImageGalleryContextValue
163
164
  }
164
165
  >
@@ -7,6 +7,8 @@ import { act } from 'react-test-renderer';
7
7
 
8
8
  import { fireEvent, render, waitFor } from '@testing-library/react-native';
9
9
 
10
+ import { LocalMessage } from 'stream-chat';
11
+
10
12
  import { Chat } from '../../../components/Chat/Chat';
11
13
  import {
12
14
  ImageGalleryContext,
@@ -20,7 +22,6 @@ import { generateImageAttachment } from '../../../mock-builders/generator/attach
20
22
  import { generateMessage } from '../../../mock-builders/generator/message';
21
23
  import { getTestClientWithUser } from '../../../mock-builders/mock';
22
24
 
23
- import type { MessageType } from '../../MessageList/hooks/useMessageList';
24
25
  import { ImageGalleryOverlay } from '../components/ImageGalleryOverlay';
25
26
 
26
27
  describe('ImageGalleryOverlay', () => {
@@ -39,7 +40,7 @@ describe('ImageGalleryOverlay', () => {
39
40
  generateMessage({
40
41
  attachments: [generateImageAttachment()],
41
42
  }),
42
- ] as unknown as MessageType[],
43
+ ] as unknown as LocalMessage[],
43
44
  } as unknown as ImageGalleryContextValue
44
45
  }
45
46
  >