stream-chat-react-native-core 9.0.1 → 9.0.2-beta.1

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 (387) hide show
  1. package/README.md +1 -1
  2. package/lib/commonjs/components/Message/MessageItemView/utils/renderText.test.js +1 -1
  3. package/lib/commonjs/components/Message/MessageItemView/utils/renderText.test.js.map +1 -1
  4. package/lib/commonjs/components/MessageList/hooks/useMessageList.js.map +1 -1
  5. package/lib/commonjs/mock-builders/DB/mock.js.map +1 -1
  6. package/lib/commonjs/mock-builders/api/channelMocks.js +38 -31
  7. package/lib/commonjs/mock-builders/api/channelMocks.js.map +1 -1
  8. package/lib/commonjs/mock-builders/api/deleteMessage.js.map +1 -1
  9. package/lib/commonjs/mock-builders/api/deleteReaction.js.map +1 -1
  10. package/lib/commonjs/mock-builders/api/error.js.map +1 -1
  11. package/lib/commonjs/mock-builders/api/getOrCreateChannel.js.map +1 -1
  12. package/lib/commonjs/mock-builders/api/initiateClientWithChannels.js +1 -1
  13. package/lib/commonjs/mock-builders/api/initiateClientWithChannels.js.map +1 -1
  14. package/lib/commonjs/mock-builders/api/queryChannels.js.map +1 -1
  15. package/lib/commonjs/mock-builders/api/queryMembers.js +12 -11
  16. package/lib/commonjs/mock-builders/api/queryMembers.js.map +1 -1
  17. package/lib/commonjs/mock-builders/api/sendMessage.js.map +1 -1
  18. package/lib/commonjs/mock-builders/api/sendReaction.js.map +1 -1
  19. package/lib/commonjs/mock-builders/api/threadReplies.js.map +1 -1
  20. package/lib/commonjs/mock-builders/api/useMockedApis.js.map +1 -1
  21. package/lib/commonjs/mock-builders/api/utils.js.map +1 -1
  22. package/lib/commonjs/mock-builders/attachments.js.map +1 -1
  23. package/lib/commonjs/mock-builders/event/channelDeleted.js +3 -2
  24. package/lib/commonjs/mock-builders/event/channelDeleted.js.map +1 -1
  25. package/lib/commonjs/mock-builders/event/channelHidden.js +3 -2
  26. package/lib/commonjs/mock-builders/event/channelHidden.js.map +1 -1
  27. package/lib/commonjs/mock-builders/event/channelTruncated.js +3 -2
  28. package/lib/commonjs/mock-builders/event/channelTruncated.js.map +1 -1
  29. package/lib/commonjs/mock-builders/event/channelUpdated.js +3 -2
  30. package/lib/commonjs/mock-builders/event/channelUpdated.js.map +1 -1
  31. package/lib/commonjs/mock-builders/event/channelVisible.js +3 -2
  32. package/lib/commonjs/mock-builders/event/channelVisible.js.map +1 -1
  33. package/lib/commonjs/mock-builders/event/connectionChanged.js +3 -2
  34. package/lib/commonjs/mock-builders/event/connectionChanged.js.map +1 -1
  35. package/lib/commonjs/mock-builders/event/connectionRecovered.js +3 -2
  36. package/lib/commonjs/mock-builders/event/connectionRecovered.js.map +1 -1
  37. package/lib/commonjs/mock-builders/event/memberAdded.js +3 -2
  38. package/lib/commonjs/mock-builders/event/memberAdded.js.map +1 -1
  39. package/lib/commonjs/mock-builders/event/memberRemoved.js +3 -2
  40. package/lib/commonjs/mock-builders/event/memberRemoved.js.map +1 -1
  41. package/lib/commonjs/mock-builders/event/memberUpdated.js +3 -2
  42. package/lib/commonjs/mock-builders/event/memberUpdated.js.map +1 -1
  43. package/lib/commonjs/mock-builders/event/messageDeleted.js +3 -2
  44. package/lib/commonjs/mock-builders/event/messageDeleted.js.map +1 -1
  45. package/lib/commonjs/mock-builders/event/messageNew.js +3 -2
  46. package/lib/commonjs/mock-builders/event/messageNew.js.map +1 -1
  47. package/lib/commonjs/mock-builders/event/messageRead.js +3 -2
  48. package/lib/commonjs/mock-builders/event/messageRead.js.map +1 -1
  49. package/lib/commonjs/mock-builders/event/messageUpdated.js +3 -2
  50. package/lib/commonjs/mock-builders/event/messageUpdated.js.map +1 -1
  51. package/lib/commonjs/mock-builders/event/notificationAddedToChannel.js +3 -2
  52. package/lib/commonjs/mock-builders/event/notificationAddedToChannel.js.map +1 -1
  53. package/lib/commonjs/mock-builders/event/notificationChannelMutesUpdated.js +3 -2
  54. package/lib/commonjs/mock-builders/event/notificationChannelMutesUpdated.js.map +1 -1
  55. package/lib/commonjs/mock-builders/event/notificationMarkRead.js +3 -2
  56. package/lib/commonjs/mock-builders/event/notificationMarkRead.js.map +1 -1
  57. package/lib/commonjs/mock-builders/event/notificationMarkUnread.js +3 -2
  58. package/lib/commonjs/mock-builders/event/notificationMarkUnread.js.map +1 -1
  59. package/lib/commonjs/mock-builders/event/notificationMessageNew.js +3 -2
  60. package/lib/commonjs/mock-builders/event/notificationMessageNew.js.map +1 -1
  61. package/lib/commonjs/mock-builders/event/notificationMutesUpdated.js +3 -2
  62. package/lib/commonjs/mock-builders/event/notificationMutesUpdated.js.map +1 -1
  63. package/lib/commonjs/mock-builders/event/notificationRemovedFromChannel.js +3 -2
  64. package/lib/commonjs/mock-builders/event/notificationRemovedFromChannel.js.map +1 -1
  65. package/lib/commonjs/mock-builders/event/reactionDeleted.js +3 -2
  66. package/lib/commonjs/mock-builders/event/reactionDeleted.js.map +1 -1
  67. package/lib/commonjs/mock-builders/event/reactionNew.js +3 -2
  68. package/lib/commonjs/mock-builders/event/reactionNew.js.map +1 -1
  69. package/lib/commonjs/mock-builders/event/reactionUpdated.js +3 -2
  70. package/lib/commonjs/mock-builders/event/reactionUpdated.js.map +1 -1
  71. package/lib/commonjs/mock-builders/event/typing.js +3 -2
  72. package/lib/commonjs/mock-builders/event/typing.js.map +1 -1
  73. package/lib/commonjs/mock-builders/event/userPresence.js +3 -2
  74. package/lib/commonjs/mock-builders/event/userPresence.js.map +1 -1
  75. package/lib/commonjs/mock-builders/event/userUpdated.js +3 -2
  76. package/lib/commonjs/mock-builders/event/userUpdated.js.map +1 -1
  77. package/lib/commonjs/mock-builders/generator/attachment.js +0 -3
  78. package/lib/commonjs/mock-builders/generator/attachment.js.map +1 -1
  79. package/lib/commonjs/mock-builders/generator/channel.js +10 -12
  80. package/lib/commonjs/mock-builders/generator/channel.js.map +1 -1
  81. package/lib/commonjs/mock-builders/generator/member.js +3 -2
  82. package/lib/commonjs/mock-builders/generator/member.js.map +1 -1
  83. package/lib/commonjs/mock-builders/generator/message.js +12 -7
  84. package/lib/commonjs/mock-builders/generator/message.js.map +1 -1
  85. package/lib/commonjs/mock-builders/generator/reaction.js +3 -2
  86. package/lib/commonjs/mock-builders/generator/reaction.js.map +1 -1
  87. package/lib/commonjs/mock-builders/generator/user.js +4 -3
  88. package/lib/commonjs/mock-builders/generator/user.js.map +1 -1
  89. package/lib/commonjs/mock-builders/mock.js +15 -11
  90. package/lib/commonjs/mock-builders/mock.js.map +1 -1
  91. package/lib/commonjs/store/apis/addPendingTask.js.map +1 -1
  92. package/lib/commonjs/store/apis/deleteMessage.js.map +1 -1
  93. package/lib/commonjs/store/apis/upsertDraft.js.map +1 -1
  94. package/lib/commonjs/store/sqlite-utils/appendOrderByClause.js.map +1 -1
  95. package/lib/commonjs/store/sqlite-utils/appendWhereCluase.js.map +1 -1
  96. package/lib/commonjs/store/sqlite-utils/createCreateTableQuery.js.map +1 -1
  97. package/lib/commonjs/test-utils/BetterSqlite.js +11 -7
  98. package/lib/commonjs/test-utils/BetterSqlite.js.map +1 -1
  99. package/lib/commonjs/version.json +1 -1
  100. package/lib/module/components/Message/MessageItemView/utils/renderText.test.js +1 -1
  101. package/lib/module/components/Message/MessageItemView/utils/renderText.test.js.map +1 -1
  102. package/lib/module/components/MessageList/hooks/useMessageList.js.map +1 -1
  103. package/lib/module/mock-builders/DB/mock.js.map +1 -1
  104. package/lib/module/mock-builders/api/channelMocks.js +38 -31
  105. package/lib/module/mock-builders/api/channelMocks.js.map +1 -1
  106. package/lib/module/mock-builders/api/deleteMessage.js.map +1 -1
  107. package/lib/module/mock-builders/api/deleteReaction.js.map +1 -1
  108. package/lib/module/mock-builders/api/error.js.map +1 -1
  109. package/lib/module/mock-builders/api/getOrCreateChannel.js.map +1 -1
  110. package/lib/module/mock-builders/api/initiateClientWithChannels.js +1 -1
  111. package/lib/module/mock-builders/api/initiateClientWithChannels.js.map +1 -1
  112. package/lib/module/mock-builders/api/queryChannels.js.map +1 -1
  113. package/lib/module/mock-builders/api/queryMembers.js +12 -11
  114. package/lib/module/mock-builders/api/queryMembers.js.map +1 -1
  115. package/lib/module/mock-builders/api/sendMessage.js.map +1 -1
  116. package/lib/module/mock-builders/api/sendReaction.js.map +1 -1
  117. package/lib/module/mock-builders/api/threadReplies.js.map +1 -1
  118. package/lib/module/mock-builders/api/useMockedApis.js.map +1 -1
  119. package/lib/module/mock-builders/api/utils.js.map +1 -1
  120. package/lib/module/mock-builders/attachments.js.map +1 -1
  121. package/lib/module/mock-builders/event/channelDeleted.js +3 -2
  122. package/lib/module/mock-builders/event/channelDeleted.js.map +1 -1
  123. package/lib/module/mock-builders/event/channelHidden.js +3 -2
  124. package/lib/module/mock-builders/event/channelHidden.js.map +1 -1
  125. package/lib/module/mock-builders/event/channelTruncated.js +3 -2
  126. package/lib/module/mock-builders/event/channelTruncated.js.map +1 -1
  127. package/lib/module/mock-builders/event/channelUpdated.js +3 -2
  128. package/lib/module/mock-builders/event/channelUpdated.js.map +1 -1
  129. package/lib/module/mock-builders/event/channelVisible.js +3 -2
  130. package/lib/module/mock-builders/event/channelVisible.js.map +1 -1
  131. package/lib/module/mock-builders/event/connectionChanged.js +3 -2
  132. package/lib/module/mock-builders/event/connectionChanged.js.map +1 -1
  133. package/lib/module/mock-builders/event/connectionRecovered.js +3 -2
  134. package/lib/module/mock-builders/event/connectionRecovered.js.map +1 -1
  135. package/lib/module/mock-builders/event/memberAdded.js +3 -2
  136. package/lib/module/mock-builders/event/memberAdded.js.map +1 -1
  137. package/lib/module/mock-builders/event/memberRemoved.js +3 -2
  138. package/lib/module/mock-builders/event/memberRemoved.js.map +1 -1
  139. package/lib/module/mock-builders/event/memberUpdated.js +3 -2
  140. package/lib/module/mock-builders/event/memberUpdated.js.map +1 -1
  141. package/lib/module/mock-builders/event/messageDeleted.js +3 -2
  142. package/lib/module/mock-builders/event/messageDeleted.js.map +1 -1
  143. package/lib/module/mock-builders/event/messageNew.js +3 -2
  144. package/lib/module/mock-builders/event/messageNew.js.map +1 -1
  145. package/lib/module/mock-builders/event/messageRead.js +3 -2
  146. package/lib/module/mock-builders/event/messageRead.js.map +1 -1
  147. package/lib/module/mock-builders/event/messageUpdated.js +3 -2
  148. package/lib/module/mock-builders/event/messageUpdated.js.map +1 -1
  149. package/lib/module/mock-builders/event/notificationAddedToChannel.js +3 -2
  150. package/lib/module/mock-builders/event/notificationAddedToChannel.js.map +1 -1
  151. package/lib/module/mock-builders/event/notificationChannelMutesUpdated.js +3 -2
  152. package/lib/module/mock-builders/event/notificationChannelMutesUpdated.js.map +1 -1
  153. package/lib/module/mock-builders/event/notificationMarkRead.js +3 -2
  154. package/lib/module/mock-builders/event/notificationMarkRead.js.map +1 -1
  155. package/lib/module/mock-builders/event/notificationMarkUnread.js +3 -2
  156. package/lib/module/mock-builders/event/notificationMarkUnread.js.map +1 -1
  157. package/lib/module/mock-builders/event/notificationMessageNew.js +3 -2
  158. package/lib/module/mock-builders/event/notificationMessageNew.js.map +1 -1
  159. package/lib/module/mock-builders/event/notificationMutesUpdated.js +3 -2
  160. package/lib/module/mock-builders/event/notificationMutesUpdated.js.map +1 -1
  161. package/lib/module/mock-builders/event/notificationRemovedFromChannel.js +3 -2
  162. package/lib/module/mock-builders/event/notificationRemovedFromChannel.js.map +1 -1
  163. package/lib/module/mock-builders/event/reactionDeleted.js +3 -2
  164. package/lib/module/mock-builders/event/reactionDeleted.js.map +1 -1
  165. package/lib/module/mock-builders/event/reactionNew.js +3 -2
  166. package/lib/module/mock-builders/event/reactionNew.js.map +1 -1
  167. package/lib/module/mock-builders/event/reactionUpdated.js +3 -2
  168. package/lib/module/mock-builders/event/reactionUpdated.js.map +1 -1
  169. package/lib/module/mock-builders/event/typing.js +3 -2
  170. package/lib/module/mock-builders/event/typing.js.map +1 -1
  171. package/lib/module/mock-builders/event/userPresence.js +3 -2
  172. package/lib/module/mock-builders/event/userPresence.js.map +1 -1
  173. package/lib/module/mock-builders/event/userUpdated.js +3 -2
  174. package/lib/module/mock-builders/event/userUpdated.js.map +1 -1
  175. package/lib/module/mock-builders/generator/attachment.js +0 -3
  176. package/lib/module/mock-builders/generator/attachment.js.map +1 -1
  177. package/lib/module/mock-builders/generator/channel.js +10 -12
  178. package/lib/module/mock-builders/generator/channel.js.map +1 -1
  179. package/lib/module/mock-builders/generator/member.js +3 -2
  180. package/lib/module/mock-builders/generator/member.js.map +1 -1
  181. package/lib/module/mock-builders/generator/message.js +12 -7
  182. package/lib/module/mock-builders/generator/message.js.map +1 -1
  183. package/lib/module/mock-builders/generator/reaction.js +3 -2
  184. package/lib/module/mock-builders/generator/reaction.js.map +1 -1
  185. package/lib/module/mock-builders/generator/user.js +4 -3
  186. package/lib/module/mock-builders/generator/user.js.map +1 -1
  187. package/lib/module/mock-builders/mock.js +15 -11
  188. package/lib/module/mock-builders/mock.js.map +1 -1
  189. package/lib/module/store/apis/addPendingTask.js.map +1 -1
  190. package/lib/module/store/apis/deleteMessage.js.map +1 -1
  191. package/lib/module/store/apis/upsertDraft.js.map +1 -1
  192. package/lib/module/store/sqlite-utils/appendOrderByClause.js.map +1 -1
  193. package/lib/module/store/sqlite-utils/appendWhereCluase.js.map +1 -1
  194. package/lib/module/store/sqlite-utils/createCreateTableQuery.js.map +1 -1
  195. package/lib/module/test-utils/BetterSqlite.js +11 -7
  196. package/lib/module/test-utils/BetterSqlite.js.map +1 -1
  197. package/lib/module/version.json +1 -1
  198. package/lib/typescript/components/UIComponents/SwipableWrapper.d.ts +1 -1
  199. package/lib/typescript/components/UIComponents/SwipableWrapper.d.ts.map +1 -1
  200. package/lib/typescript/store/OfflineDB.d.ts +1 -1
  201. package/lib/typescript/store/OfflineDB.d.ts.map +1 -1
  202. package/lib/typescript/store/apis/addPendingTask.d.ts.map +1 -1
  203. package/lib/typescript/store/apis/deleteMessage.d.ts +2 -1
  204. package/lib/typescript/store/apis/deleteMessage.d.ts.map +1 -1
  205. package/lib/typescript/store/apis/upsertDraft.d.ts +1 -1
  206. package/lib/typescript/store/apis/upsertDraft.d.ts.map +1 -1
  207. package/lib/typescript/store/sqlite-utils/createCreateTableQuery.d.ts.map +1 -1
  208. package/lib/typescript/test-utils/BetterSqlite.d.ts +4 -3
  209. package/lib/typescript/test-utils/BetterSqlite.d.ts.map +1 -1
  210. package/package.json +5 -3
  211. package/src/__tests__/offline-support/{offline-feature.js → offline-feature.tsx} +282 -139
  212. package/src/__tests__/offline-support/{optimistic-update.js → optimistic-update.tsx} +154 -84
  213. package/src/components/Attachment/__tests__/{Attachment.test.js → Attachment.test.tsx} +12 -8
  214. package/src/components/Attachment/__tests__/{Gallery.test.js → Gallery.test.tsx} +10 -3
  215. package/src/components/Attachment/__tests__/{Giphy.test.js → Giphy.test.tsx} +48 -19
  216. package/src/components/Attachment/__tests__/{buildGallery.test.js → buildGallery.test.ts} +4 -2
  217. package/src/components/AutoCompleteInput/__tests__/{AutoCompleteInput.test.js → AutoCompleteInput.test.tsx} +21 -11
  218. package/src/components/Channel/__tests__/{Channel.test.js → Channel.test.tsx} +129 -89
  219. package/src/components/Channel/__tests__/{isAttachmentEqualHandler.test.js → isAttachmentEqualHandler.test.tsx} +25 -8
  220. package/src/components/Channel/__tests__/{ownCapabilities.test.js → ownCapabilities.test.tsx} +16 -12
  221. package/src/components/Channel/__tests__/{useMessageListPagination.test.js → useMessageListPagination.test.tsx} +105 -63
  222. package/src/components/ChannelList/__tests__/{ChannelList.test.js → ChannelList.test.tsx} +63 -29
  223. package/src/components/ChannelList/__tests__/{ChannelListView.test.js → ChannelListView.test.tsx} +30 -20
  224. package/src/components/ChannelList/hooks/__tests__/useChannelActionItems.test.tsx +6 -6
  225. package/src/components/ChannelList/hooks/__tests__/useChannelActionItemsById.test.tsx +2 -2
  226. package/src/components/ChannelList/hooks/listeners/__tests__/useChannelUpdated.test.tsx +17 -14
  227. package/src/components/ChannelPreview/__tests__/ChannelDetailsBottomSheet.test.tsx +14 -4
  228. package/src/components/ChannelPreview/__tests__/ChannelPreview.test.tsx +23 -12
  229. package/src/components/ChannelPreview/__tests__/{ChannelPreviewView.test.js → ChannelPreviewView.test.tsx} +9 -34
  230. package/src/components/ChannelPreview/__tests__/ChannelSwipableWrapper.test.tsx +4 -2
  231. package/src/components/ChannelPreview/hooks/__tests__/useChannelPreviewDisplayPresence.test.tsx +1 -1
  232. package/src/components/Chat/__tests__/{Chat.test.js → Chat.test.tsx} +37 -30
  233. package/src/components/ImageGallery/__tests__/ImageGallery.test.tsx +10 -14
  234. package/src/components/ImageGallery/__tests__/ImageGalleryFooter.test.tsx +3 -3
  235. package/src/components/ImageGallery/__tests__/ImageGalleryGrid.test.tsx +5 -4
  236. package/src/components/ImageGallery/__tests__/ImageGalleryHeader.test.tsx +7 -6
  237. package/src/components/ImageGallery/components/__tests__/ImageGalleryHeader.test.tsx +9 -13
  238. package/src/components/Message/MessageItemView/__tests__/{Message.test.js → Message.test.tsx} +20 -11
  239. package/src/components/Message/MessageItemView/__tests__/{MessageAuthor.test.js → MessageAuthor.test.tsx} +10 -12
  240. package/src/components/Message/MessageItemView/__tests__/{MessageContent.test.js → MessageContent.test.tsx} +22 -12
  241. package/src/components/Message/MessageItemView/__tests__/{MessageItemView.test.js → MessageItemView.test.tsx} +11 -4
  242. package/src/components/Message/MessageItemView/__tests__/{MessagePinnedHeader.test.js → MessagePinnedHeader.test.tsx} +5 -3
  243. package/src/components/Message/MessageItemView/__tests__/{MessageReplies.test.js → MessageReplies.test.tsx} +15 -36
  244. package/src/components/Message/MessageItemView/__tests__/{MessageStatus.test.js → MessageStatus.test.tsx} +20 -10
  245. package/src/components/Message/MessageItemView/__tests__/MessageTextContainer.test.tsx +8 -8
  246. package/src/components/Message/MessageItemView/__tests__/{ReactionListBottom.test.js → ReactionListBottom.test.tsx} +19 -8
  247. package/src/components/Message/MessageItemView/__tests__/{ReactionListTop.test.js → ReactionListTop.test.tsx} +8 -4
  248. package/src/components/Message/MessageItemView/utils/renderText.test.tsx +2 -4
  249. package/src/components/Message/MessageItemView/utils/renderText.tsx +1 -1
  250. package/src/components/Message/hooks/__tests__/useShouldUseOverlayStyles.test.tsx +2 -2
  251. package/src/components/MessageInput/__tests__/{AttachButton.test.js → AttachButton.test.tsx} +14 -4
  252. package/src/components/MessageInput/__tests__/{AttachmentUploadPreviewList.test.js → AttachmentUploadPreviewList.test.tsx} +27 -8
  253. package/src/components/MessageInput/__tests__/{AudioAttachmentUploadPreview.test.js → AudioAttachmentUploadPreview.test.tsx} +18 -5
  254. package/src/components/MessageInput/__tests__/AudioAttachmentUploadPreviewExpo.test.tsx +47 -15
  255. package/src/components/MessageInput/__tests__/AudioAttachmentUploadPreviewNative.test.tsx +57 -17
  256. package/src/components/MessageInput/__tests__/{InputButtons.test.js → InputButtons.test.tsx} +14 -4
  257. package/src/components/MessageInput/__tests__/{MessageComposer.test.js → MessageComposer.test.tsx} +28 -20
  258. package/src/components/MessageInput/__tests__/{SendButton.test.js → SendButton.test.tsx} +13 -4
  259. package/src/components/MessageInput/__tests__/{SendMessageDisallowedIndicator.test.js → SendMessageDisallowedIndicator.test.tsx} +47 -31
  260. package/src/components/MessageList/__tests__/{MessageList.test.js → MessageList.test.tsx} +31 -34
  261. package/src/components/MessageList/__tests__/{MessageSystem.test.js → MessageSystem.test.tsx} +13 -5
  262. package/src/components/MessageList/__tests__/{ScrollToBottomButton.test.js → ScrollToBottomButton.test.tsx} +8 -12
  263. package/src/components/MessageList/__tests__/{TypingIndicator.test.js → TypingIndicator.test.tsx} +6 -4
  264. package/src/components/MessageList/__tests__/useMessageList.test.tsx +2 -2
  265. package/src/components/MessageList/hooks/useMessageList.ts +1 -1
  266. package/src/components/MessageMenu/__tests__/MessageActionList.test.tsx +4 -1
  267. package/src/components/MessageMenu/__tests__/MessageActionListItem.test.tsx +1 -0
  268. package/src/components/MessageMenu/__tests__/MessageReactionPicker.test.tsx +6 -2
  269. package/src/components/MessageMenu/__tests__/MessageUserReactions.test.tsx +3 -3
  270. package/src/components/MessageMenu/__tests__/MessageUserReactionsAvatar.test.tsx +7 -3
  271. package/src/components/MessageMenu/__tests__/MessageUserReactionsItem.test.tsx +2 -1
  272. package/src/components/Thread/__tests__/{Thread.test.js → Thread.test.tsx} +41 -13
  273. package/src/components/Thread/__tests__/__snapshots__/{Thread.test.js.snap → Thread.test.tsx.snap} +0 -21
  274. package/src/components/UIComponents/SwipableWrapper.tsx +1 -1
  275. package/src/components/UIComponents/__tests__/SwipableWrapper.test.tsx +1 -1
  276. package/src/contexts/messageInputContext/__tests__/filePickers.test.tsx +31 -10
  277. package/src/contexts/messageInputContext/__tests__/sendMessage.test.tsx +24 -12
  278. package/src/contexts/overlayContext/__tests__/MessageOverlayHostLayer.test.tsx +2 -2
  279. package/src/hooks/__tests__/useTranslatedMessage.test.tsx +4 -4
  280. package/src/mock-builders/DB/mock.ts +1 -1
  281. package/src/mock-builders/api/channelMocks.tsx +39 -29
  282. package/src/mock-builders/api/deleteMessage.ts +21 -0
  283. package/src/mock-builders/api/deleteReaction.ts +23 -0
  284. package/src/mock-builders/api/{error.js → error.ts} +13 -5
  285. package/src/mock-builders/api/getOrCreateChannel.ts +22 -11
  286. package/src/mock-builders/api/{initiateClientWithChannels.js → initiateClientWithChannels.ts} +21 -3
  287. package/src/mock-builders/api/{queryChannels.js → queryChannels.ts} +2 -4
  288. package/src/mock-builders/api/{queryMembers.js → queryMembers.ts} +29 -27
  289. package/src/mock-builders/api/sendMessage.ts +25 -0
  290. package/src/mock-builders/api/sendReaction.ts +9 -5
  291. package/src/mock-builders/api/threadReplies.ts +18 -0
  292. package/src/mock-builders/api/{useMockedApis.js → useMockedApis.ts} +5 -4
  293. package/src/mock-builders/api/utils.ts +16 -0
  294. package/src/mock-builders/{attachments.js → attachments.ts} +24 -8
  295. package/src/mock-builders/event/channelDeleted.ts +12 -0
  296. package/src/mock-builders/event/channelHidden.ts +12 -0
  297. package/src/mock-builders/event/channelTruncated.ts +12 -0
  298. package/src/mock-builders/event/channelUpdated.ts +12 -0
  299. package/src/mock-builders/event/channelVisible.ts +12 -0
  300. package/src/mock-builders/event/connectionChanged.ts +11 -0
  301. package/src/mock-builders/event/connectionRecovered.ts +10 -0
  302. package/src/mock-builders/event/memberAdded.ts +19 -0
  303. package/src/mock-builders/event/memberRemoved.ts +18 -0
  304. package/src/mock-builders/event/memberUpdated.ts +18 -0
  305. package/src/mock-builders/event/messageDeleted.ts +23 -0
  306. package/src/mock-builders/event/messageNew.ts +26 -0
  307. package/src/mock-builders/event/messageRead.ts +23 -0
  308. package/src/mock-builders/event/messageUpdated.ts +23 -0
  309. package/src/mock-builders/event/notificationAddedToChannel.ts +12 -0
  310. package/src/mock-builders/event/notificationChannelMutesUpdated.ts +12 -0
  311. package/src/mock-builders/event/notificationMarkRead.ts +12 -0
  312. package/src/mock-builders/event/notificationMarkUnread.ts +22 -0
  313. package/src/mock-builders/event/notificationMessageNew.ts +12 -0
  314. package/src/mock-builders/event/notificationMutesUpdated.ts +16 -0
  315. package/src/mock-builders/event/notificationRemovedFromChannel.ts +12 -0
  316. package/src/mock-builders/event/reactionDeleted.ts +26 -0
  317. package/src/mock-builders/event/reactionNew.ts +26 -0
  318. package/src/mock-builders/event/reactionUpdated.ts +26 -0
  319. package/src/mock-builders/event/typing.ts +18 -0
  320. package/src/mock-builders/event/userPresence.ts +13 -0
  321. package/src/mock-builders/event/userUpdated.ts +13 -0
  322. package/src/mock-builders/generator/{attachment.js → attachment.ts} +17 -13
  323. package/src/mock-builders/generator/channel.ts +70 -39
  324. package/src/mock-builders/generator/member.ts +18 -0
  325. package/src/mock-builders/generator/message.ts +50 -0
  326. package/src/mock-builders/generator/reaction.ts +15 -0
  327. package/src/mock-builders/generator/{user.js → user.ts} +20 -16
  328. package/src/mock-builders/mock.ts +79 -0
  329. package/src/state-store/__tests__/audio-player.test.ts +3 -1
  330. package/src/state-store/__tests__/image-gallery-state-store.test.ts +31 -28
  331. package/src/state-store/__tests__/video-player-pool.test.ts +9 -9
  332. package/src/store/apis/__tests__/updatePendingTask.test.ts +17 -6
  333. package/src/store/apis/addPendingTask.ts +2 -1
  334. package/src/store/apis/deleteMessage.ts +2 -1
  335. package/src/store/apis/upsertDraft.ts +2 -2
  336. package/src/store/sqlite-utils/appendOrderByClause.ts +1 -1
  337. package/src/store/sqlite-utils/appendWhereCluase.ts +1 -1
  338. package/src/store/sqlite-utils/createCreateTableQuery.ts +7 -5
  339. package/src/test-utils/BetterSqlite.ts +38 -0
  340. package/src/utils/__tests__/{Streami18n.test.js → Streami18n.test.ts} +66 -31
  341. package/src/utils/__tests__/getResizedImageUrl.test.ts +10 -8
  342. package/src/utils/__tests__/{utils.test.js → utils.test.ts} +1 -1
  343. package/src/version.json +1 -1
  344. package/src/mock-builders/api/deleteMessage.js +0 -18
  345. package/src/mock-builders/api/deleteReaction.js +0 -19
  346. package/src/mock-builders/api/sendMessage.js +0 -18
  347. package/src/mock-builders/api/threadReplies.js +0 -16
  348. package/src/mock-builders/api/utils.js +0 -7
  349. package/src/mock-builders/event/channelDeleted.js +0 -7
  350. package/src/mock-builders/event/channelHidden.js +0 -7
  351. package/src/mock-builders/event/channelTruncated.js +0 -7
  352. package/src/mock-builders/event/channelUpdated.js +0 -7
  353. package/src/mock-builders/event/channelVisible.js +0 -7
  354. package/src/mock-builders/event/connectionChanged.js +0 -6
  355. package/src/mock-builders/event/connectionRecovered.js +0 -5
  356. package/src/mock-builders/event/memberAdded.js +0 -10
  357. package/src/mock-builders/event/memberRemoved.js +0 -9
  358. package/src/mock-builders/event/memberUpdated.js +0 -9
  359. package/src/mock-builders/event/messageDeleted.js +0 -8
  360. package/src/mock-builders/event/messageNew.js +0 -11
  361. package/src/mock-builders/event/messageRead.js +0 -15
  362. package/src/mock-builders/event/messageUpdated.js +0 -8
  363. package/src/mock-builders/event/notificationAddedToChannel.js +0 -7
  364. package/src/mock-builders/event/notificationChannelMutesUpdated.js +0 -7
  365. package/src/mock-builders/event/notificationMarkRead.js +0 -7
  366. package/src/mock-builders/event/notificationMarkUnread.js +0 -12
  367. package/src/mock-builders/event/notificationMessageNew.js +0 -7
  368. package/src/mock-builders/event/notificationMutesUpdated.js +0 -11
  369. package/src/mock-builders/event/notificationRemovedFromChannel.js +0 -7
  370. package/src/mock-builders/event/reactionDeleted.js +0 -9
  371. package/src/mock-builders/event/reactionNew.js +0 -9
  372. package/src/mock-builders/event/reactionUpdated.js +0 -9
  373. package/src/mock-builders/event/typing.js +0 -9
  374. package/src/mock-builders/event/userPresence.js +0 -8
  375. package/src/mock-builders/event/userUpdated.js +0 -8
  376. package/src/mock-builders/generator/member.js +0 -13
  377. package/src/mock-builders/generator/message.js +0 -32
  378. package/src/mock-builders/generator/reaction.js +0 -12
  379. package/src/mock-builders/mock.js +0 -57
  380. package/src/test-utils/BetterSqlite.js +0 -36
  381. /package/src/components/Message/MessageItemView/__tests__/__snapshots__/{MessageAuthor.test.js.snap → MessageAuthor.test.tsx.snap} +0 -0
  382. /package/src/components/Message/MessageItemView/__tests__/__snapshots__/{MessagePinnedHeader.test.js.snap → MessagePinnedHeader.test.tsx.snap} +0 -0
  383. /package/src/components/MessageInput/__tests__/__snapshots__/{AttachButton.test.js.snap → AttachButton.test.tsx.snap} +0 -0
  384. /package/src/components/MessageInput/__tests__/__snapshots__/{SendButton.test.js.snap → SendButton.test.tsx.snap} +0 -0
  385. /package/src/components/MessageList/__tests__/__snapshots__/{MessageSystem.test.js.snap → MessageSystem.test.tsx.snap} +0 -0
  386. /package/src/components/MessageList/__tests__/__snapshots__/{ScrollToBottomButton.test.js.snap → ScrollToBottomButton.test.tsx.snap} +0 -0
  387. /package/src/components/MessageList/__tests__/__snapshots__/{TypingIndicator.test.js.snap → TypingIndicator.test.tsx.snap} +0 -0
@@ -5,8 +5,34 @@ import { Text, View } from 'react-native';
5
5
 
6
6
  import { act, cleanup, render, screen, waitFor } from '@testing-library/react-native';
7
7
 
8
+ import type {
9
+ Channel as ChannelLLC,
10
+ ChannelFilters,
11
+ ChannelMemberResponse,
12
+ ChannelSort,
13
+ Event,
14
+ LocalMessage,
15
+ MessageResponse,
16
+ ReactionResponse,
17
+ StreamChat,
18
+ UserResponse,
19
+ } from 'stream-chat';
8
20
  import { v4 as uuidv4 } from 'uuid';
9
21
 
22
+ // Tests exercise internal APIs on StreamChat (private sync manager, legacy `wsConnection`).
23
+ // These helpers expose the internals at call sites without polluting the whole file with
24
+ // `any`; they use `as unknown as` because intersecting with the private `syncManager`
25
+ // collapses to `never`.
26
+ type TestSyncManager = { invokeSyncStatusListeners: (recovered: boolean) => Promise<void> };
27
+ const getSyncManager = (client: StreamChat): TestSyncManager =>
28
+ (client.offlineDb as unknown as { syncManager: TestSyncManager }).syncManager;
29
+ const asHydrateChannelsMock = (
30
+ client: StreamChat,
31
+ ): StreamChat['hydrateActiveChannels'] & { mock: { calls: unknown[][] } } =>
32
+ client.hydrateActiveChannels as StreamChat['hydrateActiveChannels'] & {
33
+ mock: { calls: unknown[][] };
34
+ };
35
+
10
36
  import { ChannelList } from '../../components/ChannelList/ChannelList';
11
37
  import { Chat } from '../../components/Chat/Chat';
12
38
  import { WithComponents } from '../../contexts/componentsContext/ComponentsContext';
@@ -52,7 +78,7 @@ import { BetterSqlite } from '../../test-utils/BetterSqlite';
52
78
  * Custom ChannelPreview component used via WithComponents.
53
79
  * Receives { channel, muted, unread, lastMessage } from ChannelPreview.
54
80
  */
55
- const ChannelPreviewComponent = ({ channel }) => (
81
+ const ChannelPreviewComponent = ({ channel }: { channel: ChannelLLC }) => (
56
82
  <View accessibilityLabel='list-item' testID={channel.cid}>
57
83
  <Text>{channel.data?.name}</Text>
58
84
  <Text>{channel.state?.messages?.[0]?.text}</Text>
@@ -63,7 +89,7 @@ test('Workaround to allow exporting tests', () => expect(true).toBe(true));
63
89
 
64
90
  export const Generic = () => {
65
91
  describe('Offline support is disabled', () => {
66
- let chatClient;
92
+ let chatClient: StreamChat;
67
93
 
68
94
  beforeAll(async () => {
69
95
  jest.clearAllMocks();
@@ -88,7 +114,7 @@ export const Generic = () => {
88
114
  await waitFor(() => expect(screen.getByTestId('test-child')).toBeTruthy());
89
115
 
90
116
  await waitFor(async () => {
91
- const tablesInDb = await BetterSqlite.getTables();
117
+ const tablesInDb = (await BetterSqlite.getTables()) as Array<{ name: string }>;
92
118
  const tableNamesInDB = tablesInDb.map((table) => table.name);
93
119
  const tablesNamesInSchema = Object.keys(tables);
94
120
 
@@ -100,16 +126,32 @@ export const Generic = () => {
100
126
  });
101
127
 
102
128
  describe('Offline support is enabled', () => {
103
- let chatClient;
104
- let channels;
105
-
106
- let allUsers;
107
- let allMessages;
108
- let allMembers;
109
- let allReactions;
110
- let allReads;
111
- const getRandomInt = (lower, upper) => Math.floor(lower + Math.random() * (upper - lower + 1));
112
- const createChannel = (messagesOverride) => {
129
+ // Generated channel response shape used throughout the tests. Widened to include the
130
+ // `cid` top-level field that is not part of `GeneratedChannelResponseCustomValues` but
131
+ // which the tests rely on.
132
+ type GeneratedChannelResponseWithCid = ReturnType<typeof generateChannelResponse> & {
133
+ cid: string;
134
+ };
135
+
136
+ type MemberWithCid = ChannelMemberResponse & { cid: string };
137
+ type ReadWithCid = {
138
+ cid: string;
139
+ last_read: Date;
140
+ unread_messages: number;
141
+ user: ChannelMemberResponse['user'];
142
+ };
143
+
144
+ let chatClient: StreamChat;
145
+ let channels: GeneratedChannelResponseWithCid[];
146
+
147
+ let allUsers: UserResponse[];
148
+ let allMessages: Array<Partial<MessageResponse> | LocalMessage>;
149
+ let allMembers: MemberWithCid[];
150
+ let allReactions: ReactionResponse[];
151
+ let allReads: ReadWithCid[];
152
+ const getRandomInt = (lower: number, upper: number) =>
153
+ Math.floor(lower + Math.random() * (upper - lower + 1));
154
+ const createChannel = (messagesOverride?: Partial<MessageResponse>[]) => {
113
155
  const id = uuidv4();
114
156
  const cid = `messaging:${id}`;
115
157
  // always guarantee at least 2 members for ease of use; cases that need to test specific behaviour
@@ -117,13 +159,19 @@ export const Generic = () => {
117
159
  const begin = getRandomInt(0, allUsers.length - 3); // begin shouldn't be the end of users.length
118
160
  const end = getRandomInt(begin + 2, allUsers.length - 1);
119
161
  const usersForMembers = allUsers.slice(begin, end);
120
- const members = usersForMembers.map((user) =>
121
- generateMember({
122
- cid,
123
- user,
124
- }),
162
+ const members: MemberWithCid[] = usersForMembers.map(
163
+ (user: UserResponse) =>
164
+ // `cid` is not part of `ChannelMemberResponse`, but tests rely on reading it back from
165
+ // the generated member objects — keep the runtime shape and widen the type.
166
+ ({
167
+ ...generateMember({ user }),
168
+ cid,
169
+ }) as unknown as MemberWithCid,
125
170
  );
126
- members.push(generateMember({ cid, user: chatClient.user }));
171
+ members.push({
172
+ ...generateMember({ user: chatClient.user as UserResponse }),
173
+ cid,
174
+ } as unknown as MemberWithCid);
127
175
 
128
176
  const messages =
129
177
  messagesOverride ||
@@ -137,7 +185,7 @@ export const Generic = () => {
137
185
  const end = getRandomInt(begin + 1, usersForMembers.length - 1);
138
186
 
139
187
  const usersForReactions = usersForMembers.slice(begin, end);
140
- const reactions = usersForReactions.map((user) =>
188
+ const reactions = usersForReactions.map((user: UserResponse) =>
141
189
  generateReaction({
142
190
  message_id: id,
143
191
  user,
@@ -149,11 +197,11 @@ export const Generic = () => {
149
197
  id,
150
198
  latest_reactions: reactions,
151
199
  user,
152
- userId: user.id,
200
+ user_id: user.id,
153
201
  });
154
202
  });
155
203
 
156
- const reads = members.map((member) => ({
204
+ const reads: ReadWithCid[] = members.map((member: MemberWithCid) => ({
157
205
  cid,
158
206
  last_read: new Date(new Date().setDate(new Date().getDate() - getRandomInt(0, 20))),
159
207
  unread_messages: 0,
@@ -164,20 +212,25 @@ export const Generic = () => {
164
212
  allMembers.push(...members);
165
213
  allReads.push(...reads);
166
214
 
215
+ // `cid` is not part of `GeneratedChannelResponseCustomValues`, but tests rely on reading it
216
+ // back as a top-level field on the generated channel response — keep the runtime shape and
217
+ // widen the input type.
167
218
  return generateChannelResponse({
168
219
  cid,
169
220
  id,
170
221
  members,
171
222
  messages,
172
223
  read: reads,
173
- });
224
+ } as unknown as Parameters<
225
+ typeof generateChannelResponse
226
+ >[0]) as GeneratedChannelResponseWithCid;
174
227
  };
175
228
 
176
229
  beforeEach(async () => {
177
230
  jest.clearAllMocks();
178
231
  chatClient = await getTestClientWithUser({ id: 'dan' });
179
232
  allUsers = Array(20).fill(1).map(generateUser);
180
- allUsers.push(chatClient.user);
233
+ allUsers.push(chatClient.user as UserResponse);
181
234
  allMessages = [];
182
235
  allMembers = [];
183
236
  allReactions = [];
@@ -201,8 +254,8 @@ export const Generic = () => {
201
254
  const filters = {
202
255
  foo: 'bar',
203
256
  type: 'messaging',
204
- };
205
- const sort = { last_updated: 1 };
257
+ } as ChannelFilters;
258
+ const sort: ChannelSort = { last_updated: 1 };
206
259
 
207
260
  const renderComponent = () =>
208
261
  render(
@@ -213,14 +266,18 @@ export const Generic = () => {
213
266
  </Chat>,
214
267
  );
215
268
 
216
- const expectCIDsOnUIToBeInDB = async (queryAllByLabelText) => {
269
+ const expectCIDsOnUIToBeInDB = async (
270
+ queryAllByLabelText: typeof screen.queryAllByLabelText,
271
+ ) => {
217
272
  const channelIdsOnUI = queryAllByLabelText('list-item').map(
218
- (node) => node._fiber.pendingProps.testID,
273
+ (node) =>
274
+ (node as unknown as { _fiber: { pendingProps: { testID: string } } })._fiber.pendingProps
275
+ .testID,
219
276
  );
220
277
 
221
278
  await waitFor(async () => {
222
279
  const channelQueriesRows = await BetterSqlite.selectFromTable('channelQueries');
223
- const cidsInDB = JSON.parse(channelQueriesRows[0].cids);
280
+ const cidsInDB = JSON.parse(channelQueriesRows[0].cids as string);
224
281
  const filterSortQueryInDB = channelQueriesRows[0].id;
225
282
  const actualFilterSortQueryInDB = convertFilterSortToQuery({ filters, sort });
226
283
 
@@ -228,16 +285,20 @@ export const Generic = () => {
228
285
  expect(filterSortQueryInDB).toBe(actualFilterSortQueryInDB);
229
286
 
230
287
  expect(cidsInDB.length).toBe(channelIdsOnUI.length);
231
- channelIdsOnUI.forEach((cidOnUi, index) => {
288
+ channelIdsOnUI.forEach((cidOnUi: string, index: number) => {
232
289
  expect(cidsInDB.includes(cidOnUi)).toBe(true);
233
290
  expect(index).toBe(cidsInDB.indexOf(cidOnUi));
234
291
  });
235
292
  });
236
293
  };
237
294
 
238
- const expectAllChannelsWithStateToBeInDB = async (queryAllByLabelText) => {
295
+ const expectAllChannelsWithStateToBeInDB = async (
296
+ queryAllByLabelText: typeof screen.queryAllByLabelText,
297
+ ) => {
239
298
  const channelIdsOnUI = queryAllByLabelText('list-item').map(
240
- (node) => node._fiber.pendingProps.testID,
299
+ (node) =>
300
+ (node as unknown as { _fiber: { pendingProps: { testID: string } } })._fiber.pendingProps
301
+ .testID,
241
302
  );
242
303
 
243
304
  await waitFor(async () => {
@@ -255,26 +316,32 @@ export const Generic = () => {
255
316
  expect(reactionsRows.length).toBe(allReactions.length);
256
317
 
257
318
  channelsRows.forEach((row) => {
258
- expect(channelIdsOnUI.includes(row.cid)).toBe(true);
319
+ expect(channelIdsOnUI.includes(row.cid as string)).toBe(true);
259
320
  });
260
321
 
261
322
  messagesRows.forEach((row) => {
262
- expect(allMessages.filter((m) => m.id === row.id)).toHaveLength(1);
323
+ expect(
324
+ allMessages.filter((m: Partial<MessageResponse> | LocalMessage) => m.id === row.id),
325
+ ).toHaveLength(1);
263
326
  });
264
327
  membersRows.forEach((row) =>
265
328
  expect(
266
- allMembers.filter((m) => m.cid === row.cid && m.user.id === row.userId),
329
+ allMembers.filter((m: MemberWithCid) => m.cid === row.cid && m.user?.id === row.userId),
267
330
  ).toHaveLength(1),
268
331
  );
269
- usersRows.forEach((row) => expect(allUsers.filter((u) => u.id === row.id)).toHaveLength(1));
332
+ usersRows.forEach((row) =>
333
+ expect(allUsers.filter((u: UserResponse) => u.id === row.id)).toHaveLength(1),
334
+ );
270
335
  reactionsRows.forEach((row) =>
271
336
  expect(
272
- allReactions.filter((r) => r.message_id === row.messageId && row.userId === r.user_id),
337
+ allReactions.filter(
338
+ (r: ReactionResponse) => r.message_id === row.messageId && row.userId === r.user_id,
339
+ ),
273
340
  ).toHaveLength(1),
274
341
  );
275
342
  readsRows.forEach((row) =>
276
343
  expect(
277
- allReads.filter((r) => r.user.id === row.userId && r.cid === row.cid),
344
+ allReads.filter((r: ReadWithCid) => r.user?.id === row.userId && r.cid === row.cid),
278
345
  ).toHaveLength(1),
279
346
  );
280
347
  });
@@ -289,7 +356,7 @@ export const Generic = () => {
289
356
 
290
357
  await waitFor(() => expect(screen.getByTestId('test-child')).toBeTruthy());
291
358
 
292
- const tablesInDb = await BetterSqlite.getTables();
359
+ const tablesInDb = (await BetterSqlite.getTables()) as Array<{ name: string }>;
293
360
  const tableNamesInDB = tablesInDb.map((table) => table.name);
294
361
  const tablesNamesInSchema = Object.keys(tables);
295
362
 
@@ -303,7 +370,7 @@ export const Generic = () => {
303
370
  await act(() => dispatchConnectionChangedEvent(chatClient, false));
304
371
  // await waiter();
305
372
  await act(() => dispatchConnectionChangedEvent(chatClient));
306
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
373
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
307
374
 
308
375
  await waitFor(async () => {
309
376
  expect(screen.getByTestId('channel-list-view')).toBeTruthy();
@@ -317,7 +384,7 @@ export const Generic = () => {
317
384
  renderComponent();
318
385
 
319
386
  act(() => dispatchConnectionChangedEvent(chatClient));
320
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
387
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
321
388
 
322
389
  await waitFor(
323
390
  async () => {
@@ -337,13 +404,11 @@ export const Generic = () => {
337
404
 
338
405
  await waitFor(async () => {
339
406
  act(() => dispatchConnectionChangedEvent(chatClient));
340
- await act(
341
- async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true),
342
- );
407
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
343
408
  expect(screen.getByTestId('channel-list-view')).toBeTruthy();
344
409
  expect(screen.getByTestId(emptyChannel.cid)).toBeTruthy();
345
410
  expect(chatClient.hydrateActiveChannels).toHaveBeenCalled();
346
- expect(chatClient.hydrateActiveChannels.mock.calls[0][0]).toStrictEqual([emptyChannel]);
411
+ expect(asHydrateChannelsMock(chatClient).mock.calls[0][0]).toStrictEqual([emptyChannel]);
347
412
  });
348
413
  });
349
414
 
@@ -352,7 +417,7 @@ export const Generic = () => {
352
417
 
353
418
  renderComponent();
354
419
  act(() => dispatchConnectionChangedEvent(chatClient));
355
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
420
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
356
421
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
357
422
  const targetChannel = channels[0].channel;
358
423
  const newMessage = generateMessage({
@@ -381,7 +446,7 @@ export const Generic = () => {
381
446
 
382
447
  renderComponent();
383
448
  act(() => dispatchConnectionChangedEvent(chatClient));
384
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
449
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
385
450
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
386
451
  const targetChannel = channels[0].channel;
387
452
 
@@ -443,7 +508,7 @@ export const Generic = () => {
443
508
 
444
509
  renderComponent();
445
510
  act(() => dispatchConnectionChangedEvent(chatClient));
446
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
511
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
447
512
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
448
513
  const targetChannel = channels[0].channel;
449
514
 
@@ -505,7 +570,7 @@ export const Generic = () => {
505
570
 
506
571
  renderComponent();
507
572
  act(() => dispatchConnectionChangedEvent(chatClient));
508
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
573
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
509
574
  await waitFor(() => {
510
575
  expect(screen.getByTestId('channel-list-view')).toBeTruthy();
511
576
  });
@@ -520,7 +585,11 @@ export const Generic = () => {
520
585
  await waitFor(() => {
521
586
  const channelIdsOnUI = screen
522
587
  .queryAllByLabelText('list-item')
523
- .map((node) => node._fiber.pendingProps.testID);
588
+ .map(
589
+ (node) =>
590
+ (node as unknown as { _fiber: { pendingProps: { testID: string } } })._fiber
591
+ .pendingProps.testID,
592
+ );
524
593
  expect(channelIdsOnUI.includes(newChannel.channel.cid)).toBeTruthy();
525
594
  });
526
595
 
@@ -542,13 +611,19 @@ export const Generic = () => {
542
611
 
543
612
  renderComponent();
544
613
  act(() => dispatchConnectionChangedEvent(chatClient));
545
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
614
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
546
615
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
547
616
 
548
617
  const updatedMessage = { ...channels[0].messages[0] };
549
618
  updatedMessage.text = uuidv4();
550
619
 
551
- act(() => dispatchMessageUpdatedEvent(chatClient, updatedMessage, channels[0].channel));
620
+ act(() =>
621
+ dispatchMessageUpdatedEvent(
622
+ chatClient,
623
+ updatedMessage as MessageResponse,
624
+ channels[0].channel,
625
+ ),
626
+ );
552
627
 
553
628
  await waitFor(async () => {
554
629
  const messagesRows = await BetterSqlite.selectFromTable('messages');
@@ -564,14 +639,18 @@ export const Generic = () => {
564
639
 
565
640
  renderComponent();
566
641
  act(() => dispatchConnectionChangedEvent(chatClient));
567
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
642
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
568
643
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
569
644
  const removedChannel = channels[getRandomInt(0, channels.length - 1)].channel;
570
645
  act(() => dispatchNotificationRemovedFromChannel(chatClient, removedChannel));
571
646
  await waitFor(async () => {
572
647
  const channelIdsOnUI = screen
573
648
  .queryAllByLabelText('list-item')
574
- .map((node) => node._fiber.pendingProps.testID);
649
+ .map(
650
+ (node) =>
651
+ (node as unknown as { _fiber: { pendingProps: { testID: string } } })._fiber
652
+ .pendingProps.testID,
653
+ );
575
654
  expect(channelIdsOnUI.includes(removedChannel.cid)).toBeFalsy();
576
655
  await expectCIDsOnUIToBeInDB(screen.queryAllByLabelText);
577
656
 
@@ -591,14 +670,18 @@ export const Generic = () => {
591
670
 
592
671
  renderComponent();
593
672
  act(() => dispatchConnectionChangedEvent(chatClient));
594
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
673
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
595
674
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
596
675
  const removedChannel = channels[getRandomInt(0, channels.length - 1)].channel;
597
676
  act(() => dispatchChannelDeletedEvent(chatClient, removedChannel));
598
677
  await waitFor(async () => {
599
678
  const channelIdsOnUI = screen
600
679
  .queryAllByLabelText('list-item')
601
- .map((node) => node._fiber.pendingProps.testID);
680
+ .map(
681
+ (node) =>
682
+ (node as unknown as { _fiber: { pendingProps: { testID: string } } })._fiber
683
+ .pendingProps.testID,
684
+ );
602
685
  expect(channelIdsOnUI.includes(removedChannel.cid)).toBeFalsy();
603
686
  await expectCIDsOnUIToBeInDB(screen.queryAllByLabelText);
604
687
 
@@ -618,14 +701,18 @@ export const Generic = () => {
618
701
 
619
702
  renderComponent();
620
703
  act(() => dispatchConnectionChangedEvent(chatClient));
621
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
704
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
622
705
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
623
706
  const hiddenChannel = channels[getRandomInt(0, channels.length - 1)].channel;
624
707
  act(() => dispatchChannelHiddenEvent(chatClient, hiddenChannel));
625
708
  await waitFor(async () => {
626
709
  const channelIdsOnUI = screen
627
710
  .queryAllByLabelText('list-item')
628
- .map((node) => node._fiber.pendingProps.testID);
711
+ .map(
712
+ (node) =>
713
+ (node as unknown as { _fiber: { pendingProps: { testID: string } } })._fiber
714
+ .pendingProps.testID,
715
+ );
629
716
  expect(channelIdsOnUI.includes(hiddenChannel.cid)).toBeFalsy();
630
717
  await expectCIDsOnUIToBeInDB(screen.queryAllByLabelText);
631
718
 
@@ -648,7 +735,7 @@ export const Generic = () => {
648
735
 
649
736
  renderComponent();
650
737
  act(() => dispatchConnectionChangedEvent(chatClient));
651
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
738
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
652
739
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
653
740
  const hiddenChannel = channels[getRandomInt(0, channels.length - 1)].channel;
654
741
  // first, we mark it as hidden
@@ -656,7 +743,11 @@ export const Generic = () => {
656
743
  await waitFor(async () => {
657
744
  const channelIdsOnUI = screen
658
745
  .queryAllByLabelText('list-item')
659
- .map((node) => node._fiber.pendingProps.testID);
746
+ .map(
747
+ (node) =>
748
+ (node as unknown as { _fiber: { pendingProps: { testID: string } } })._fiber
749
+ .pendingProps.testID,
750
+ );
660
751
  expect(channelIdsOnUI.includes(hiddenChannel.cid)).toBeFalsy();
661
752
  await expectCIDsOnUIToBeInDB(screen.queryAllByLabelText);
662
753
 
@@ -678,7 +769,11 @@ export const Generic = () => {
678
769
  await waitFor(async () => {
679
770
  const channelIdsOnUI = screen
680
771
  .queryAllByLabelText('list-item')
681
- .map((node) => node._fiber.pendingProps.testID);
772
+ .map(
773
+ (node) =>
774
+ (node as unknown as { _fiber: { pendingProps: { testID: string } } })._fiber
775
+ .pendingProps.testID,
776
+ );
682
777
  expect(channelIdsOnUI.includes(hiddenChannel.cid)).toBeFalsy();
683
778
  await expectCIDsOnUIToBeInDB(screen.queryAllByLabelText);
684
779
 
@@ -701,7 +796,7 @@ export const Generic = () => {
701
796
 
702
797
  renderComponent();
703
798
  act(() => dispatchConnectionChangedEvent(chatClient));
704
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
799
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
705
800
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
706
801
 
707
802
  const newChannel = createChannel();
@@ -713,7 +808,11 @@ export const Generic = () => {
713
808
  await waitFor(() => {
714
809
  const channelIdsOnUI = screen
715
810
  .queryAllByLabelText('list-item')
716
- .map((node) => node._fiber.pendingProps.testID);
811
+ .map(
812
+ (node) =>
813
+ (node as unknown as { _fiber: { pendingProps: { testID: string } } })._fiber
814
+ .pendingProps.testID,
815
+ );
717
816
  expect(channelIdsOnUI.includes(newChannel.channel.cid)).toBeTruthy();
718
817
  });
719
818
 
@@ -735,7 +834,7 @@ export const Generic = () => {
735
834
 
736
835
  renderComponent();
737
836
  act(() => dispatchConnectionChangedEvent(chatClient));
738
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
837
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
739
838
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
740
839
 
741
840
  const channelToTruncate = channels[getRandomInt(0, channels.length - 1)].channel;
@@ -744,7 +843,11 @@ export const Generic = () => {
744
843
  await waitFor(async () => {
745
844
  const channelIdsOnUI = screen
746
845
  .queryAllByLabelText('list-item')
747
- .map((node) => node._fiber.pendingProps.testID);
846
+ .map(
847
+ (node) =>
848
+ (node as unknown as { _fiber: { pendingProps: { testID: string } } })._fiber
849
+ .pendingProps.testID,
850
+ );
748
851
  expect(channelIdsOnUI.includes(channelToTruncate.cid)).toBeTruthy();
749
852
  expectCIDsOnUIToBeInDB(screen.queryAllByLabelText);
750
853
 
@@ -767,15 +870,19 @@ export const Generic = () => {
767
870
 
768
871
  renderComponent();
769
872
  act(() => dispatchConnectionChangedEvent(chatClient));
770
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
873
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
771
874
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
772
875
 
773
876
  const channelResponse = channels[getRandomInt(0, channels.length - 1)];
774
877
  const channelToTruncate = channelResponse.channel;
775
878
  const messages = channelResponse.messages;
776
- messages.sort((a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime());
879
+ messages.sort(
880
+ (a: Partial<MessageResponse> | LocalMessage, b: Partial<MessageResponse> | LocalMessage) =>
881
+ new Date(a.created_at as string | Date).getTime() -
882
+ new Date(b.created_at as string | Date).getTime(),
883
+ );
777
884
  // truncate at the middle
778
- const truncatedAt = messages[Number(messages.length / 2)].created_at;
885
+ const truncatedAt = messages[Number(messages.length / 2)].created_at as string | undefined;
779
886
  act(() =>
780
887
  dispatchChannelTruncatedEvent(chatClient, {
781
888
  ...channelToTruncate,
@@ -786,7 +893,11 @@ export const Generic = () => {
786
893
  await waitFor(async () => {
787
894
  const channelIdsOnUI = screen
788
895
  .queryAllByLabelText('list-item')
789
- .map((node) => node._fiber.pendingProps.testID);
896
+ .map(
897
+ (node) =>
898
+ (node as unknown as { _fiber: { pendingProps: { testID: string } } })._fiber
899
+ .pendingProps.testID,
900
+ );
790
901
  expect(channelIdsOnUI.includes(channelToTruncate.cid)).toBeTruthy();
791
902
  expectCIDsOnUIToBeInDB(screen.queryAllByLabelText);
792
903
 
@@ -811,7 +922,7 @@ export const Generic = () => {
811
922
 
812
923
  renderComponent();
813
924
  act(() => dispatchConnectionChangedEvent(chatClient));
814
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
925
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
815
926
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
816
927
 
817
928
  const channelResponse = channels[getRandomInt(0, channels.length - 1)];
@@ -827,7 +938,11 @@ export const Generic = () => {
827
938
  await waitFor(async () => {
828
939
  const channelIdsOnUI = screen
829
940
  .queryAllByLabelText('list-item')
830
- .map((node) => node._fiber.pendingProps.testID);
941
+ .map(
942
+ (node) =>
943
+ (node as unknown as { _fiber: { pendingProps: { testID: string } } })._fiber
944
+ .pendingProps.testID,
945
+ );
831
946
  expect(channelIdsOnUI.includes(channelToTruncate.cid)).toBeTruthy();
832
947
  expectCIDsOnUIToBeInDB(screen.queryAllByLabelText);
833
948
 
@@ -843,13 +958,17 @@ export const Generic = () => {
843
958
 
844
959
  renderComponent();
845
960
  act(() => dispatchConnectionChangedEvent(chatClient));
846
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
961
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
847
962
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
848
963
 
849
964
  const channelResponse = channels[getRandomInt(0, channels.length - 1)];
850
965
  const channelToTruncate = channelResponse.channel;
851
966
  const messages = channelResponse.messages;
852
- const latestTimestamp = Math.max(...messages.map((m) => new Date(m.created_at).getTime()));
967
+ const latestTimestamp = Math.max(
968
+ ...messages.map((m: Partial<MessageResponse> | LocalMessage) =>
969
+ new Date(m.created_at as string | Date).getTime(),
970
+ ),
971
+ );
853
972
  // truncate at the middle
854
973
  const truncatedAt = new Date(latestTimestamp + 1).toISOString();
855
974
  act(() =>
@@ -862,7 +981,11 @@ export const Generic = () => {
862
981
  await waitFor(async () => {
863
982
  const channelIdsOnUI = screen
864
983
  .queryAllByLabelText('list-item')
865
- .map((node) => node._fiber.pendingProps.testID);
984
+ .map(
985
+ (node) =>
986
+ (node as unknown as { _fiber: { pendingProps: { testID: string } } })._fiber
987
+ .pendingProps.testID,
988
+ );
866
989
  expect(channelIdsOnUI.includes(channelToTruncate.cid)).toBeTruthy();
867
990
  expectCIDsOnUIToBeInDB(screen.queryAllByLabelText);
868
991
 
@@ -877,7 +1000,7 @@ export const Generic = () => {
877
1000
  useMockedApis(chatClient, [queryChannelsApi(channels)]);
878
1001
  renderComponent();
879
1002
  act(() => dispatchConnectionChangedEvent(chatClient));
880
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
1003
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
881
1004
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
882
1005
 
883
1006
  const targetChannel = channels[getRandomInt(0, channels.length - 1)];
@@ -893,14 +1016,14 @@ export const Generic = () => {
893
1016
  });
894
1017
  const messageWithNewReaction = {
895
1018
  ...targetMessage,
896
- latest_reactions: [...targetMessage.latest_reactions, newReaction],
1019
+ latest_reactions: [...(targetMessage.latest_reactions ?? []), newReaction],
897
1020
  };
898
1021
 
899
1022
  act(() =>
900
1023
  dispatchReactionNewEvent(
901
1024
  chatClient,
902
1025
  newReaction,
903
- messageWithNewReaction,
1026
+ messageWithNewReaction as MessageResponse,
904
1027
  targetChannel.channel,
905
1028
  ),
906
1029
  );
@@ -910,7 +1033,7 @@ export const Generic = () => {
910
1033
  const matchingReactionsRows = reactionsRows.filter(
911
1034
  (r) =>
912
1035
  r.type === newReaction.type &&
913
- r.userId === reactionMember.user.id &&
1036
+ r.userId === reactionMember.user!.id &&
914
1037
  r.messageId === messageWithNewReaction.id,
915
1038
  );
916
1039
 
@@ -922,7 +1045,7 @@ export const Generic = () => {
922
1045
  useMockedApis(chatClient, [queryChannelsApi(channels)]);
923
1046
  renderComponent();
924
1047
  act(() => dispatchConnectionChangedEvent(chatClient));
925
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
1048
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
926
1049
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
927
1050
 
928
1051
  const targetChannel = channels[getRandomInt(0, channels.length - 1)];
@@ -931,7 +1054,7 @@ export const Generic = () => {
931
1054
  const reactionMember =
932
1055
  targetChannel.members[getRandomInt(0, targetChannel.members.length - 1)];
933
1056
  const someOtherMember = targetChannel.members.filter(
934
- (member) => reactionMember.user.id !== member.user.id,
1057
+ (member: Partial<ChannelMemberResponse>) => reactionMember.user!.id !== member.user!.id,
935
1058
  )[getRandomInt(0, targetChannel.members.length - 2)];
936
1059
 
937
1060
  const newReactions = [
@@ -953,34 +1076,37 @@ export const Generic = () => {
953
1076
  ];
954
1077
  const messageWithNewReactionBase = {
955
1078
  ...targetMessage,
956
- latest_reactions: [...targetMessage.latest_reactions],
1079
+ latest_reactions: [...(targetMessage.latest_reactions ?? [])],
957
1080
  };
958
- const newLatestReactions = [];
1081
+ const newLatestReactions: ReactionResponse[] = [];
959
1082
 
960
1083
  newReactions.forEach((newReaction) => {
961
1084
  newLatestReactions.push(newReaction);
962
1085
  const messageWithNewReaction = {
963
1086
  ...messageWithNewReactionBase,
964
- latest_reactions: [...messageWithNewReactionBase.latest_reactions, ...newLatestReactions],
1087
+ latest_reactions: [
1088
+ ...(messageWithNewReactionBase.latest_reactions ?? []),
1089
+ ...newLatestReactions,
1090
+ ],
965
1091
  };
966
1092
  act(() =>
967
1093
  dispatchReactionNewEvent(
968
1094
  chatClient,
969
1095
  newReaction,
970
- messageWithNewReaction,
1096
+ messageWithNewReaction as MessageResponse,
971
1097
  targetChannel.channel,
972
1098
  ),
973
1099
  );
974
1100
  });
975
1101
 
976
1102
  const finalReactionCount =
977
- messageWithNewReactionBase.latest_reactions.length +
1103
+ (messageWithNewReactionBase.latest_reactions ?? []).length +
978
1104
  newReactions.filter(
979
1105
  (newReaction) =>
980
- !messageWithNewReactionBase.latest_reactions.some(
981
- (initialReaction) =>
1106
+ !(messageWithNewReactionBase.latest_reactions ?? []).some(
1107
+ (initialReaction: ReactionResponse) =>
982
1108
  initialReaction.type === newReaction.type &&
983
- initialReaction.user.id === newReaction.user.id,
1109
+ initialReaction.user!.id === newReaction.user!.id,
984
1110
  ),
985
1111
  ).length;
986
1112
 
@@ -995,7 +1121,7 @@ export const Generic = () => {
995
1121
  expect(
996
1122
  matchingReactionsRows.filter(
997
1123
  (reaction) =>
998
- reaction.type === newReaction.type && reaction.userId === newReaction.user.id,
1124
+ reaction.type === newReaction.type && reaction.userId === newReaction.user!.id,
999
1125
  ).length,
1000
1126
  ).toBe(1);
1001
1127
  });
@@ -1006,7 +1132,7 @@ export const Generic = () => {
1006
1132
  useMockedApis(chatClient, [queryChannelsApi(channels)]);
1007
1133
  renderComponent();
1008
1134
  act(() => dispatchConnectionChangedEvent(chatClient));
1009
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
1135
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
1010
1136
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
1011
1137
 
1012
1138
  const targetChannel = channels[getRandomInt(0, channels.length - 1)];
@@ -1034,21 +1160,24 @@ export const Generic = () => {
1034
1160
  ];
1035
1161
  const messageWithNewReactionBase = {
1036
1162
  ...targetMessage,
1037
- latest_reactions: [...targetMessage.latest_reactions],
1163
+ latest_reactions: [...(targetMessage.latest_reactions ?? [])],
1038
1164
  };
1039
- const newLatestReactions = [];
1165
+ const newLatestReactions: ReactionResponse[] = [];
1040
1166
 
1041
1167
  newReactions.forEach((newReaction) => {
1042
1168
  newLatestReactions.push(newReaction);
1043
1169
  const messageWithNewReaction = {
1044
1170
  ...messageWithNewReactionBase,
1045
- latest_reactions: [...messageWithNewReactionBase.latest_reactions, ...newLatestReactions],
1171
+ latest_reactions: [
1172
+ ...(messageWithNewReactionBase.latest_reactions ?? []),
1173
+ ...newLatestReactions,
1174
+ ],
1046
1175
  };
1047
1176
  act(() =>
1048
1177
  dispatchReactionNewEvent(
1049
1178
  chatClient,
1050
1179
  newReaction,
1051
- messageWithNewReaction,
1180
+ messageWithNewReaction as MessageResponse,
1052
1181
  targetChannel.channel,
1053
1182
  ),
1054
1183
  );
@@ -1059,7 +1188,7 @@ export const Generic = () => {
1059
1188
  const matchingReactionsRows = reactionsRows.filter(
1060
1189
  (r) =>
1061
1190
  r.type === 'wow' &&
1062
- r.userId === reactionMember.user.id &&
1191
+ r.userId === reactionMember.user!.id &&
1063
1192
  r.messageId === messageWithNewReactionBase.id,
1064
1193
  );
1065
1194
 
@@ -1072,13 +1201,13 @@ export const Generic = () => {
1072
1201
 
1073
1202
  renderComponent();
1074
1203
  act(() => dispatchConnectionChangedEvent(chatClient));
1075
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
1204
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
1076
1205
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
1077
1206
 
1078
1207
  const targetChannel = channels[getRandomInt(0, channels.length - 1)];
1079
1208
  const targetMessage =
1080
1209
  targetChannel.messages[getRandomInt(0, targetChannel.messages.length - 1)];
1081
- const reactionsOnTargetMessage = targetMessage.latest_reactions;
1210
+ const reactionsOnTargetMessage = targetMessage.latest_reactions ?? [];
1082
1211
  const reactionToBeRemoved =
1083
1212
  reactionsOnTargetMessage[getRandomInt(0, reactionsOnTargetMessage.length - 1)];
1084
1213
 
@@ -1103,7 +1232,7 @@ export const Generic = () => {
1103
1232
  dispatchReactionDeletedEvent(
1104
1233
  chatClient,
1105
1234
  reactionToBeRemoved,
1106
- messageWithoutDeletedReaction,
1235
+ messageWithoutDeletedReaction as MessageResponse,
1107
1236
  targetChannel.channel,
1108
1237
  ),
1109
1238
  );
@@ -1126,13 +1255,13 @@ export const Generic = () => {
1126
1255
 
1127
1256
  renderComponent();
1128
1257
  act(() => dispatchConnectionChangedEvent(chatClient));
1129
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
1258
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
1130
1259
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
1131
1260
 
1132
1261
  const targetChannel = channels[getRandomInt(0, channels.length - 1)];
1133
1262
  const targetMessage =
1134
1263
  targetChannel.messages[getRandomInt(0, targetChannel.messages.length - 1)];
1135
- const reactionsOnTargetMessage = targetMessage.latest_reactions;
1264
+ const reactionsOnTargetMessage = targetMessage.latest_reactions ?? [];
1136
1265
  const reactionToBeUpdated =
1137
1266
  reactionsOnTargetMessage[getRandomInt(0, reactionsOnTargetMessage.length - 1)];
1138
1267
  reactionToBeUpdated.type = 'wow';
@@ -1141,7 +1270,7 @@ export const Generic = () => {
1141
1270
  dispatchReactionUpdatedEvent(
1142
1271
  chatClient,
1143
1272
  reactionToBeUpdated,
1144
- targetMessage,
1273
+ targetMessage as MessageResponse,
1145
1274
  targetChannel.channel,
1146
1275
  ),
1147
1276
  );
@@ -1163,7 +1292,7 @@ export const Generic = () => {
1163
1292
  useMockedApis(chatClient, [queryChannelsApi(channels)]);
1164
1293
  renderComponent();
1165
1294
  act(() => dispatchConnectionChangedEvent(chatClient));
1166
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
1295
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
1167
1296
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
1168
1297
 
1169
1298
  const targetChannel = channels[getRandomInt(0, channels.length - 1)];
@@ -1186,21 +1315,24 @@ export const Generic = () => {
1186
1315
  ];
1187
1316
  const messageWithNewReactionBase = {
1188
1317
  ...targetMessage,
1189
- latest_reactions: [...targetMessage.latest_reactions],
1318
+ latest_reactions: [...(targetMessage.latest_reactions ?? [])],
1190
1319
  };
1191
- const newLatestReactions = [];
1320
+ const newLatestReactions: ReactionResponse[] = [];
1192
1321
 
1193
1322
  newReactions.forEach((newReaction) => {
1194
1323
  newLatestReactions.push(newReaction);
1195
1324
  const messageWithNewReaction = {
1196
1325
  ...messageWithNewReactionBase,
1197
- latest_reactions: [...messageWithNewReactionBase.latest_reactions, ...newLatestReactions],
1326
+ latest_reactions: [
1327
+ ...(messageWithNewReactionBase.latest_reactions ?? []),
1328
+ ...newLatestReactions,
1329
+ ],
1198
1330
  };
1199
1331
  act(() =>
1200
1332
  dispatchReactionNewEvent(
1201
1333
  chatClient,
1202
1334
  newReaction,
1203
- messageWithNewReaction,
1335
+ messageWithNewReaction as MessageResponse,
1204
1336
  targetChannel.channel,
1205
1337
  ),
1206
1338
  );
@@ -1210,7 +1342,7 @@ export const Generic = () => {
1210
1342
  const reactionsRows = await BetterSqlite.selectFromTable('reactions');
1211
1343
  const matchingReactionsRows = reactionsRows.filter(
1212
1344
  (r) =>
1213
- r.messageId === messageWithNewReactionBase.id && r.userId === reactionMember.user.id,
1345
+ r.messageId === messageWithNewReactionBase.id && r.userId === reactionMember.user!.id,
1214
1346
  );
1215
1347
 
1216
1348
  expect(matchingReactionsRows.length).toBe(2);
@@ -1218,7 +1350,7 @@ export const Generic = () => {
1218
1350
  expect(
1219
1351
  matchingReactionsRows.filter(
1220
1352
  (reaction) =>
1221
- reaction.type === newReaction.type && reaction.userId === newReaction.user.id,
1353
+ reaction.type === newReaction.type && reaction.userId === newReaction.user!.id,
1222
1354
  ).length,
1223
1355
  ).toBe(1);
1224
1356
  });
@@ -1231,14 +1363,14 @@ export const Generic = () => {
1231
1363
  });
1232
1364
  const messageWithNewReaction = {
1233
1365
  ...targetMessage,
1234
- latest_reactions: [...targetMessage.latest_reactions, uniqueReaction],
1366
+ latest_reactions: [...(targetMessage.latest_reactions ?? []), uniqueReaction],
1235
1367
  };
1236
1368
 
1237
1369
  act(() =>
1238
1370
  dispatchReactionUpdatedEvent(
1239
1371
  chatClient,
1240
1372
  uniqueReaction,
1241
- messageWithNewReaction,
1373
+ messageWithNewReaction as MessageResponse,
1242
1374
  targetChannel.channel,
1243
1375
  ),
1244
1376
  );
@@ -1248,7 +1380,7 @@ export const Generic = () => {
1248
1380
  const matchingReactionsRows = reactionsRows.filter(
1249
1381
  (r) =>
1250
1382
  r.type === uniqueReaction.type &&
1251
- r.userId === reactionMember.user.id &&
1383
+ r.userId === reactionMember.user!.id &&
1252
1384
  r.messageId === messageWithNewReaction.id,
1253
1385
  );
1254
1386
 
@@ -1260,7 +1392,7 @@ export const Generic = () => {
1260
1392
  useMockedApis(chatClient, [queryChannelsApi(channels)]);
1261
1393
  renderComponent();
1262
1394
  act(() => dispatchConnectionChangedEvent(chatClient));
1263
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
1395
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
1264
1396
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
1265
1397
 
1266
1398
  const targetChannel = channels[getRandomInt(0, channels.length - 1)];
@@ -1279,7 +1411,7 @@ export const Generic = () => {
1279
1411
  // anything impossible given the scenarios is fine
1280
1412
  const messageWithNewReaction = {
1281
1413
  ...targetMessage,
1282
- latest_reactions: [...targetMessage.latest_reactions, newReaction],
1414
+ latest_reactions: [...(targetMessage.latest_reactions ?? []), newReaction],
1283
1415
  reaction_groups: {
1284
1416
  ...targetMessage.reaction_groups,
1285
1417
  [newReaction.type]: {
@@ -1295,7 +1427,7 @@ export const Generic = () => {
1295
1427
  dispatchReactionNewEvent(
1296
1428
  chatClient,
1297
1429
  newReaction,
1298
- messageWithNewReaction,
1430
+ messageWithNewReaction as MessageResponse,
1299
1431
  targetChannel.channel,
1300
1432
  ),
1301
1433
  );
@@ -1306,7 +1438,7 @@ export const Generic = () => {
1306
1438
  (m) => m.id === messageWithNewReaction.id,
1307
1439
  )[0];
1308
1440
 
1309
- const reactionGroups = JSON.parse(messageWithReactionRow.reactionGroups);
1441
+ const reactionGroups = JSON.parse(messageWithReactionRow.reactionGroups as string);
1310
1442
 
1311
1443
  expect(reactionGroups[newReaction.type]?.count).toBe(999);
1312
1444
  expect(reactionGroups[newReaction.type]?.sum_scores).toBe(999);
@@ -1319,7 +1451,7 @@ export const Generic = () => {
1319
1451
  useMockedApis(chatClient, [queryChannelsApi(channels)]);
1320
1452
  renderComponent();
1321
1453
  act(() => dispatchConnectionChangedEvent(chatClient));
1322
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
1454
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
1323
1455
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
1324
1456
 
1325
1457
  const targetChannel = channels[getRandomInt(0, channels.length - 1)];
@@ -1336,7 +1468,7 @@ export const Generic = () => {
1336
1468
  const newDate = new Date().toISOString();
1337
1469
  const messageWithNewReaction = {
1338
1470
  ...targetMessage,
1339
- latest_reactions: [...targetMessage.latest_reactions, newReaction],
1471
+ latest_reactions: [...(targetMessage.latest_reactions ?? []), newReaction],
1340
1472
  reaction_groups: {
1341
1473
  ...targetMessage.reaction_groups,
1342
1474
  [newReaction.type]: {
@@ -1352,7 +1484,7 @@ export const Generic = () => {
1352
1484
  dispatchReactionUpdatedEvent(
1353
1485
  chatClient,
1354
1486
  newReaction,
1355
- messageWithNewReaction,
1487
+ messageWithNewReaction as MessageResponse,
1356
1488
  targetChannel.channel,
1357
1489
  ),
1358
1490
  );
@@ -1363,7 +1495,7 @@ export const Generic = () => {
1363
1495
  (m) => m.id === messageWithNewReaction.id,
1364
1496
  )[0];
1365
1497
 
1366
- const reactionGroups = JSON.parse(messageWithReactionRow.reactionGroups);
1498
+ const reactionGroups = JSON.parse(messageWithReactionRow.reactionGroups as string);
1367
1499
 
1368
1500
  expect(reactionGroups[newReaction.type]?.count).toBe(999);
1369
1501
  expect(reactionGroups[newReaction.type]?.sum_scores).toBe(999);
@@ -1376,7 +1508,7 @@ export const Generic = () => {
1376
1508
  useMockedApis(chatClient, [queryChannelsApi(channels)]);
1377
1509
  renderComponent();
1378
1510
  act(() => dispatchConnectionChangedEvent(chatClient));
1379
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
1511
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
1380
1512
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
1381
1513
 
1382
1514
  const targetChannel = channels[getRandomInt(0, channels.length - 1)];
@@ -1393,7 +1525,7 @@ export const Generic = () => {
1393
1525
  const newDate = new Date().toISOString();
1394
1526
  const messageWithNewReaction = {
1395
1527
  ...targetMessage,
1396
- latest_reactions: [...targetMessage.latest_reactions, newReaction],
1528
+ latest_reactions: [...(targetMessage.latest_reactions ?? []), newReaction],
1397
1529
  reaction_groups: {
1398
1530
  ...targetMessage.reaction_groups,
1399
1531
  [newReaction.type]: {
@@ -1409,7 +1541,7 @@ export const Generic = () => {
1409
1541
  dispatchReactionDeletedEvent(
1410
1542
  chatClient,
1411
1543
  newReaction,
1412
- messageWithNewReaction,
1544
+ messageWithNewReaction as MessageResponse,
1413
1545
  targetChannel.channel,
1414
1546
  ),
1415
1547
  );
@@ -1420,7 +1552,7 @@ export const Generic = () => {
1420
1552
  (m) => m.id === messageWithNewReaction.id,
1421
1553
  )[0];
1422
1554
 
1423
- const reactionGroups = JSON.parse(messageWithReactionRow.reactionGroups);
1555
+ const reactionGroups = JSON.parse(messageWithReactionRow.reactionGroups as string);
1424
1556
 
1425
1557
  expect(reactionGroups[newReaction.type]?.count).toBe(999);
1426
1558
  expect(reactionGroups[newReaction.type]?.sum_scores).toBe(999);
@@ -1434,7 +1566,7 @@ export const Generic = () => {
1434
1566
  renderComponent();
1435
1567
 
1436
1568
  act(() => dispatchConnectionChangedEvent(chatClient));
1437
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
1569
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
1438
1570
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
1439
1571
  const targetChannel = channels[getRandomInt(0, channels.length - 1)];
1440
1572
 
@@ -1462,7 +1594,7 @@ export const Generic = () => {
1462
1594
 
1463
1595
  renderComponent();
1464
1596
  act(() => dispatchConnectionChangedEvent(chatClient));
1465
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
1597
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
1466
1598
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
1467
1599
 
1468
1600
  const targetChannel = channels[getRandomInt(0, channels.length - 1)];
@@ -1490,7 +1622,7 @@ export const Generic = () => {
1490
1622
 
1491
1623
  renderComponent();
1492
1624
  act(() => dispatchConnectionChangedEvent(chatClient));
1493
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
1625
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
1494
1626
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
1495
1627
 
1496
1628
  const targetChannel = channels[getRandomInt(0, channels.length - 1)];
@@ -1517,7 +1649,7 @@ export const Generic = () => {
1517
1649
 
1518
1650
  renderComponent();
1519
1651
  act(() => dispatchConnectionChangedEvent(chatClient));
1520
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
1652
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
1521
1653
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
1522
1654
 
1523
1655
  const targetChannel = channels[getRandomInt(0, channels.length - 1)];
@@ -1532,7 +1664,7 @@ export const Generic = () => {
1532
1664
 
1533
1665
  expect(matchingChannelsRows.length).toBe(1);
1534
1666
 
1535
- const extraData = JSON.parse(matchingChannelsRows[0].extraData);
1667
+ const extraData = JSON.parse(matchingChannelsRows[0].extraData as string);
1536
1668
 
1537
1669
  expect(extraData.name).toBe(targetChannel.channel.name);
1538
1670
  });
@@ -1543,7 +1675,7 @@ export const Generic = () => {
1543
1675
 
1544
1676
  renderComponent();
1545
1677
  act(() => dispatchConnectionChangedEvent(chatClient));
1546
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
1678
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
1547
1679
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
1548
1680
  const targetChannel = channels[getRandomInt(0, channels.length - 1)];
1549
1681
  const targetMember = targetChannel.members[getRandomInt(0, targetChannel.members.length - 1)];
@@ -1551,11 +1683,19 @@ export const Generic = () => {
1551
1683
  const readTimestamp = new Date().toISOString();
1552
1684
 
1553
1685
  act(() => {
1554
- dispatchMessageReadEvent(chatClient, targetMember.user, targetChannel.channel, {
1555
- first_unread_message_id: '123',
1556
- last_read: readTimestamp,
1557
- last_read_message_id: '321',
1558
- });
1686
+ // `last_read` is not on `Event` (the real field is `last_read_at`), but the test fixture
1687
+ // has historically passed `last_read`. Preserve the runtime payload shape exactly and
1688
+ // widen the type at the call site.
1689
+ dispatchMessageReadEvent(
1690
+ chatClient,
1691
+ targetMember.user as UserResponse,
1692
+ targetChannel.channel,
1693
+ {
1694
+ first_unread_message_id: '123',
1695
+ last_read: readTimestamp,
1696
+ last_read_message_id: '321',
1697
+ } as unknown as Partial<Event>,
1698
+ );
1559
1699
  });
1560
1700
 
1561
1701
  await waitFor(async () => {
@@ -1571,7 +1711,8 @@ export const Generic = () => {
1571
1711
  // expect(matchingReadRows[0].firstUnreadMessageId).toBe('123');
1572
1712
  expect(
1573
1713
  Math.abs(
1574
- new Date(matchingReadRows[0].lastRead).getTime() - new Date(readTimestamp).getTime(),
1714
+ new Date(matchingReadRows[0].lastRead as string).getTime() -
1715
+ new Date(readTimestamp).getTime(),
1575
1716
  ),
1576
1717
  ).toBeLessThanOrEqual(1);
1577
1718
  });
@@ -1582,12 +1723,12 @@ export const Generic = () => {
1582
1723
 
1583
1724
  renderComponent();
1584
1725
  act(() => dispatchConnectionChangedEvent(chatClient));
1585
- await act(async () => await chatClient.offlineDb.syncManager.invokeSyncStatusListeners(true));
1726
+ await act(async () => await getSyncManager(chatClient).invokeSyncStatusListeners(true));
1586
1727
  await waitFor(() => expect(screen.getByTestId('channel-list-view')).toBeTruthy());
1587
1728
  const targetChannel = channels[getRandomInt(0, channels.length - 1)];
1588
1729
  const targetMember = targetChannel.members[getRandomInt(0, targetChannel.members.length - 1)];
1589
1730
 
1590
- chatClient.userID = targetMember.user.id;
1731
+ chatClient.userID = targetMember.user!.id;
1591
1732
  chatClient.user = targetMember.user;
1592
1733
 
1593
1734
  const readTimestamp = new Date().toISOString();
@@ -1596,12 +1737,13 @@ export const Generic = () => {
1596
1737
  dispatchNotificationMarkUnread(
1597
1738
  chatClient,
1598
1739
  targetChannel.channel,
1740
+ // `last_read` is not on `Event`; see note above.
1599
1741
  {
1600
1742
  first_unread_message_id: '123',
1601
1743
  last_read: readTimestamp,
1602
1744
  last_read_message_id: '321',
1603
1745
  unread_messages: 5,
1604
- },
1746
+ } as unknown as Partial<Event>,
1605
1747
  targetMember.user,
1606
1748
  );
1607
1749
  });
@@ -1619,7 +1761,8 @@ export const Generic = () => {
1619
1761
  // expect(matchingReadRows[0].firstUnreadMessageId).toBe('123');
1620
1762
  expect(
1621
1763
  Math.abs(
1622
- new Date(matchingReadRows[0].lastRead).getTime() - new Date(readTimestamp).getTime(),
1764
+ new Date(matchingReadRows[0].lastRead as string).getTime() -
1765
+ new Date(readTimestamp).getTime(),
1623
1766
  ),
1624
1767
  ).toBeLessThanOrEqual(1);
1625
1768
  });