stream-chat-react-native-core 5.5.1 → 5.6.0-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 (321) hide show
  1. package/lib/commonjs/components/Attachment/Gallery.js +21 -16
  2. package/lib/commonjs/components/Attachment/Gallery.js.map +1 -1
  3. package/lib/commonjs/components/Attachment/GalleryImage.js +19 -3
  4. package/lib/commonjs/components/Attachment/GalleryImage.js.map +1 -1
  5. package/lib/commonjs/components/Channel/Channel.js +535 -149
  6. package/lib/commonjs/components/Channel/Channel.js.map +1 -1
  7. package/lib/commonjs/components/Channel/hooks/useCreateMessagesContext.js +6 -0
  8. package/lib/commonjs/components/Channel/hooks/useCreateMessagesContext.js.map +1 -1
  9. package/lib/commonjs/components/ChannelList/ChannelList.js +4 -15
  10. package/lib/commonjs/components/ChannelList/ChannelList.js.map +1 -1
  11. package/lib/commonjs/components/ChannelList/hooks/usePaginatedChannels.js +112 -38
  12. package/lib/commonjs/components/ChannelList/hooks/usePaginatedChannels.js.map +1 -1
  13. package/lib/commonjs/components/Chat/Chat.js +16 -20
  14. package/lib/commonjs/components/Chat/Chat.js.map +1 -1
  15. package/lib/commonjs/components/Chat/hooks/useCreateChatContext.js +2 -4
  16. package/lib/commonjs/components/Chat/hooks/useCreateChatContext.js.map +1 -1
  17. package/lib/commonjs/components/Message/Message.js +21 -10
  18. package/lib/commonjs/components/Message/Message.js.map +1 -1
  19. package/lib/commonjs/components/Message/MessageSimple/MessageFooter.js +14 -12
  20. package/lib/commonjs/components/Message/MessageSimple/MessageFooter.js.map +1 -1
  21. package/lib/commonjs/components/Message/hooks/useMessageActionHandlers.js +9 -30
  22. package/lib/commonjs/components/Message/hooks/useMessageActionHandlers.js.map +1 -1
  23. package/lib/commonjs/components/Message/hooks/useMessageActions.js +21 -19
  24. package/lib/commonjs/components/Message/hooks/useMessageActions.js.map +1 -1
  25. package/lib/commonjs/components/MessageInput/FileUploadPreview.js +28 -21
  26. package/lib/commonjs/components/MessageInput/FileUploadPreview.js.map +1 -1
  27. package/lib/commonjs/components/MessageInput/ImageUploadPreview.js +23 -16
  28. package/lib/commonjs/components/MessageInput/ImageUploadPreview.js.map +1 -1
  29. package/lib/commonjs/components/MessageInput/MessageInput.js +39 -27
  30. package/lib/commonjs/components/MessageInput/MessageInput.js.map +1 -1
  31. package/lib/commonjs/components/MessageInput/SendButton.js +1 -1
  32. package/lib/commonjs/components/MessageInput/SendButton.js.map +1 -1
  33. package/lib/commonjs/components/index.js +1 -14
  34. package/lib/commonjs/components/index.js.map +1 -1
  35. package/lib/commonjs/contexts/chatContext/ChatContext.js +2 -2
  36. package/lib/commonjs/contexts/chatContext/ChatContext.js.map +1 -1
  37. package/lib/commonjs/contexts/messageInputContext/MessageInputContext.js +134 -86
  38. package/lib/commonjs/contexts/messageInputContext/MessageInputContext.js.map +1 -1
  39. package/lib/commonjs/contexts/messageInputContext/hooks/useMessageDetailsForState.js +1 -0
  40. package/lib/commonjs/contexts/messageInputContext/hooks/useMessageDetailsForState.js.map +1 -1
  41. package/lib/commonjs/contexts/messagesContext/MessagesContext.js +2 -2
  42. package/lib/commonjs/contexts/messagesContext/MessagesContext.js.map +1 -1
  43. package/lib/commonjs/hooks/useTranslatedMessage.js +1 -1
  44. package/lib/commonjs/hooks/useTranslatedMessage.js.map +1 -1
  45. package/lib/commonjs/mock-builders/DB/mock.js +2 -2
  46. package/lib/commonjs/mock-builders/DB/mock.js.map +1 -1
  47. package/lib/commonjs/mock-builders/api/deleteMessage.js +20 -0
  48. package/lib/commonjs/mock-builders/api/deleteMessage.js.map +1 -0
  49. package/lib/commonjs/mock-builders/api/deleteReaction.js +21 -0
  50. package/lib/commonjs/mock-builders/api/deleteReaction.js.map +1 -0
  51. package/lib/commonjs/mock-builders/api/sendReaction.js +21 -0
  52. package/lib/commonjs/mock-builders/api/sendReaction.js.map +1 -0
  53. package/lib/commonjs/mock-builders/event/connectionChanged.js +2 -0
  54. package/lib/commonjs/mock-builders/event/connectionChanged.js.map +1 -1
  55. package/lib/commonjs/store/QuickSqliteClient.js +40 -51
  56. package/lib/commonjs/store/QuickSqliteClient.js.map +1 -1
  57. package/lib/commonjs/store/apis/addPendingTask.js +37 -0
  58. package/lib/commonjs/store/apis/addPendingTask.js.map +1 -0
  59. package/lib/commonjs/store/apis/deleteMessage.js +26 -0
  60. package/lib/commonjs/store/apis/deleteMessage.js.map +1 -0
  61. package/lib/commonjs/store/apis/deletePendingTask.js +22 -0
  62. package/lib/commonjs/store/apis/deletePendingTask.js.map +1 -0
  63. package/lib/commonjs/store/apis/deleteReaction.js +30 -0
  64. package/lib/commonjs/store/apis/deleteReaction.js.map +1 -0
  65. package/lib/commonjs/store/apis/getChannelMessages.js +3 -3
  66. package/lib/commonjs/store/apis/getChannelMessages.js.map +1 -1
  67. package/lib/commonjs/store/apis/getChannels.js +1 -1
  68. package/lib/commonjs/store/apis/getChannels.js.map +1 -1
  69. package/lib/commonjs/store/apis/getPendingTasks.js +26 -0
  70. package/lib/commonjs/store/apis/getPendingTasks.js.map +1 -0
  71. package/lib/commonjs/store/apis/index.js +13 -0
  72. package/lib/commonjs/store/apis/index.js.map +1 -1
  73. package/lib/commonjs/store/apis/insertReaction.js +28 -0
  74. package/lib/commonjs/store/apis/insertReaction.js.map +1 -0
  75. package/lib/commonjs/store/apis/updateMessage.js.map +1 -1
  76. package/lib/commonjs/store/apis/updateReaction.js.map +1 -1
  77. package/lib/commonjs/store/mappers/mapDateTimeToStorable.js.map +1 -1
  78. package/lib/commonjs/store/mappers/mapMessageToStorable.js +3 -1
  79. package/lib/commonjs/store/mappers/mapMessageToStorable.js.map +1 -1
  80. package/lib/commonjs/store/mappers/mapStorableToTask.js +23 -0
  81. package/lib/commonjs/store/mappers/mapStorableToTask.js.map +1 -0
  82. package/lib/commonjs/store/mappers/mapTaskToStorable.js +18 -0
  83. package/lib/commonjs/store/mappers/mapTaskToStorable.js.map +1 -0
  84. package/lib/commonjs/store/schema.js +11 -0
  85. package/lib/commonjs/store/schema.js.map +1 -1
  86. package/lib/commonjs/store/sqlite-utils/appendOrderByClause.js +24 -0
  87. package/lib/commonjs/store/sqlite-utils/appendOrderByClause.js.map +1 -0
  88. package/lib/commonjs/store/sqlite-utils/createCreateTableQuery.js +1 -1
  89. package/lib/commonjs/store/sqlite-utils/createCreateTableQuery.js.map +1 -1
  90. package/lib/commonjs/store/sqlite-utils/createSelectQuery.js +8 -1
  91. package/lib/commonjs/store/sqlite-utils/createSelectQuery.js.map +1 -1
  92. package/lib/commonjs/store/sqlite-utils/createUpdateQuery.js +2 -2
  93. package/lib/commonjs/store/sqlite-utils/createUpdateQuery.js.map +1 -1
  94. package/lib/commonjs/store/sqlite-utils/createUpsertQuery.js +1 -1
  95. package/lib/commonjs/store/sqlite-utils/createUpsertQuery.js.map +1 -1
  96. package/lib/commonjs/utils/DBSyncManager.js +436 -0
  97. package/lib/commonjs/utils/DBSyncManager.js.map +1 -0
  98. package/lib/commonjs/utils/addReactionToLocalState.js +92 -0
  99. package/lib/commonjs/utils/addReactionToLocalState.js.map +1 -0
  100. package/lib/commonjs/utils/removeReactionFromLocalState.js +39 -0
  101. package/lib/commonjs/utils/removeReactionFromLocalState.js.map +1 -0
  102. package/lib/{module/components/Message → commonjs}/utils/removeReservedFields.js +1 -1
  103. package/lib/commonjs/utils/removeReservedFields.js.map +1 -0
  104. package/lib/commonjs/utils/utils.js +9 -3
  105. package/lib/commonjs/utils/utils.js.map +1 -1
  106. package/lib/commonjs/version.json +1 -1
  107. package/lib/module/components/Attachment/Gallery.js +21 -16
  108. package/lib/module/components/Attachment/Gallery.js.map +1 -1
  109. package/lib/module/components/Attachment/GalleryImage.js +19 -3
  110. package/lib/module/components/Attachment/GalleryImage.js.map +1 -1
  111. package/lib/module/components/Channel/Channel.js +535 -149
  112. package/lib/module/components/Channel/Channel.js.map +1 -1
  113. package/lib/module/components/Channel/hooks/useCreateMessagesContext.js +6 -0
  114. package/lib/module/components/Channel/hooks/useCreateMessagesContext.js.map +1 -1
  115. package/lib/module/components/ChannelList/ChannelList.js +4 -15
  116. package/lib/module/components/ChannelList/ChannelList.js.map +1 -1
  117. package/lib/module/components/ChannelList/hooks/usePaginatedChannels.js +112 -38
  118. package/lib/module/components/ChannelList/hooks/usePaginatedChannels.js.map +1 -1
  119. package/lib/module/components/Chat/Chat.js +16 -20
  120. package/lib/module/components/Chat/Chat.js.map +1 -1
  121. package/lib/module/components/Chat/hooks/useCreateChatContext.js +2 -4
  122. package/lib/module/components/Chat/hooks/useCreateChatContext.js.map +1 -1
  123. package/lib/module/components/Message/Message.js +21 -10
  124. package/lib/module/components/Message/Message.js.map +1 -1
  125. package/lib/module/components/Message/MessageSimple/MessageFooter.js +14 -12
  126. package/lib/module/components/Message/MessageSimple/MessageFooter.js.map +1 -1
  127. package/lib/module/components/Message/hooks/useMessageActionHandlers.js +9 -30
  128. package/lib/module/components/Message/hooks/useMessageActionHandlers.js.map +1 -1
  129. package/lib/module/components/Message/hooks/useMessageActions.js +21 -19
  130. package/lib/module/components/Message/hooks/useMessageActions.js.map +1 -1
  131. package/lib/module/components/MessageInput/FileUploadPreview.js +28 -21
  132. package/lib/module/components/MessageInput/FileUploadPreview.js.map +1 -1
  133. package/lib/module/components/MessageInput/ImageUploadPreview.js +23 -16
  134. package/lib/module/components/MessageInput/ImageUploadPreview.js.map +1 -1
  135. package/lib/module/components/MessageInput/MessageInput.js +39 -27
  136. package/lib/module/components/MessageInput/MessageInput.js.map +1 -1
  137. package/lib/module/components/MessageInput/SendButton.js +1 -1
  138. package/lib/module/components/MessageInput/SendButton.js.map +1 -1
  139. package/lib/module/components/index.js +1 -14
  140. package/lib/module/components/index.js.map +1 -1
  141. package/lib/module/contexts/chatContext/ChatContext.js +2 -2
  142. package/lib/module/contexts/chatContext/ChatContext.js.map +1 -1
  143. package/lib/module/contexts/messageInputContext/MessageInputContext.js +134 -86
  144. package/lib/module/contexts/messageInputContext/MessageInputContext.js.map +1 -1
  145. package/lib/module/contexts/messageInputContext/hooks/useMessageDetailsForState.js +1 -0
  146. package/lib/module/contexts/messageInputContext/hooks/useMessageDetailsForState.js.map +1 -1
  147. package/lib/module/contexts/messagesContext/MessagesContext.js +2 -2
  148. package/lib/module/contexts/messagesContext/MessagesContext.js.map +1 -1
  149. package/lib/module/hooks/useTranslatedMessage.js +1 -1
  150. package/lib/module/hooks/useTranslatedMessage.js.map +1 -1
  151. package/lib/module/mock-builders/DB/mock.js +2 -2
  152. package/lib/module/mock-builders/DB/mock.js.map +1 -1
  153. package/lib/module/mock-builders/api/deleteMessage.js +20 -0
  154. package/lib/module/mock-builders/api/deleteMessage.js.map +1 -0
  155. package/lib/module/mock-builders/api/deleteReaction.js +21 -0
  156. package/lib/module/mock-builders/api/deleteReaction.js.map +1 -0
  157. package/lib/module/mock-builders/api/sendReaction.js +21 -0
  158. package/lib/module/mock-builders/api/sendReaction.js.map +1 -0
  159. package/lib/module/mock-builders/event/connectionChanged.js +2 -0
  160. package/lib/module/mock-builders/event/connectionChanged.js.map +1 -1
  161. package/lib/module/store/QuickSqliteClient.js +40 -51
  162. package/lib/module/store/QuickSqliteClient.js.map +1 -1
  163. package/lib/module/store/apis/addPendingTask.js +37 -0
  164. package/lib/module/store/apis/addPendingTask.js.map +1 -0
  165. package/lib/module/store/apis/deleteMessage.js +26 -0
  166. package/lib/module/store/apis/deleteMessage.js.map +1 -0
  167. package/lib/module/store/apis/deletePendingTask.js +22 -0
  168. package/lib/module/store/apis/deletePendingTask.js.map +1 -0
  169. package/lib/module/store/apis/deleteReaction.js +30 -0
  170. package/lib/module/store/apis/deleteReaction.js.map +1 -0
  171. package/lib/module/store/apis/getChannelMessages.js +3 -3
  172. package/lib/module/store/apis/getChannelMessages.js.map +1 -1
  173. package/lib/module/store/apis/getChannels.js +1 -1
  174. package/lib/module/store/apis/getChannels.js.map +1 -1
  175. package/lib/module/store/apis/getPendingTasks.js +26 -0
  176. package/lib/module/store/apis/getPendingTasks.js.map +1 -0
  177. package/lib/module/store/apis/index.js +13 -0
  178. package/lib/module/store/apis/index.js.map +1 -1
  179. package/lib/module/store/apis/insertReaction.js +28 -0
  180. package/lib/module/store/apis/insertReaction.js.map +1 -0
  181. package/lib/module/store/apis/updateMessage.js.map +1 -1
  182. package/lib/module/store/apis/updateReaction.js.map +1 -1
  183. package/lib/module/store/mappers/mapDateTimeToStorable.js.map +1 -1
  184. package/lib/module/store/mappers/mapMessageToStorable.js +3 -1
  185. package/lib/module/store/mappers/mapMessageToStorable.js.map +1 -1
  186. package/lib/module/store/mappers/mapStorableToTask.js +23 -0
  187. package/lib/module/store/mappers/mapStorableToTask.js.map +1 -0
  188. package/lib/module/store/mappers/mapTaskToStorable.js +18 -0
  189. package/lib/module/store/mappers/mapTaskToStorable.js.map +1 -0
  190. package/lib/module/store/schema.js +11 -0
  191. package/lib/module/store/schema.js.map +1 -1
  192. package/lib/module/store/sqlite-utils/appendOrderByClause.js +24 -0
  193. package/lib/module/store/sqlite-utils/appendOrderByClause.js.map +1 -0
  194. package/lib/module/store/sqlite-utils/createCreateTableQuery.js +1 -1
  195. package/lib/module/store/sqlite-utils/createCreateTableQuery.js.map +1 -1
  196. package/lib/module/store/sqlite-utils/createSelectQuery.js +8 -1
  197. package/lib/module/store/sqlite-utils/createSelectQuery.js.map +1 -1
  198. package/lib/module/store/sqlite-utils/createUpdateQuery.js +2 -2
  199. package/lib/module/store/sqlite-utils/createUpdateQuery.js.map +1 -1
  200. package/lib/module/store/sqlite-utils/createUpsertQuery.js +1 -1
  201. package/lib/module/store/sqlite-utils/createUpsertQuery.js.map +1 -1
  202. package/lib/module/utils/DBSyncManager.js +436 -0
  203. package/lib/module/utils/DBSyncManager.js.map +1 -0
  204. package/lib/module/utils/addReactionToLocalState.js +92 -0
  205. package/lib/module/utils/addReactionToLocalState.js.map +1 -0
  206. package/lib/module/utils/removeReactionFromLocalState.js +39 -0
  207. package/lib/module/utils/removeReactionFromLocalState.js.map +1 -0
  208. package/lib/{commonjs/components/Message → module}/utils/removeReservedFields.js +1 -1
  209. package/lib/module/utils/removeReservedFields.js.map +1 -0
  210. package/lib/module/utils/utils.js +9 -3
  211. package/lib/module/utils/utils.js.map +1 -1
  212. package/lib/module/version.json +1 -1
  213. package/lib/typescript/components/Channel/Channel.d.ts +1 -1
  214. package/lib/typescript/components/Channel/hooks/useCreateMessagesContext.d.ts +1 -1
  215. package/lib/typescript/components/ChannelList/hooks/usePaginatedChannels.d.ts +2 -1
  216. package/lib/typescript/components/Chat/hooks/useCreateChatContext.d.ts +1 -1
  217. package/lib/typescript/components/Message/Message.d.ts +1 -1
  218. package/lib/typescript/components/Message/hooks/useMessageActionHandlers.d.ts +1 -1
  219. package/lib/typescript/components/Message/hooks/useMessageActions.d.ts +1 -1
  220. package/lib/typescript/components/MessageInput/FileUploadPreview.d.ts +2 -1
  221. package/lib/typescript/components/MessageInput/ImageUploadPreview.d.ts +2 -1
  222. package/lib/typescript/components/MessageInput/MessageInput.d.ts +2 -1
  223. package/lib/typescript/components/index.d.ts +1 -2
  224. package/lib/typescript/contexts/chatContext/ChatContext.d.ts +1 -2
  225. package/lib/typescript/contexts/messageContext/MessageContext.d.ts +1 -1
  226. package/lib/typescript/contexts/messagesContext/MessagesContext.d.ts +3 -0
  227. package/lib/typescript/store/apis/addPendingTask.d.ts +2 -0
  228. package/lib/typescript/store/apis/deleteMessage.d.ts +4 -0
  229. package/lib/typescript/store/apis/deletePendingTask.d.ts +3 -0
  230. package/lib/typescript/store/apis/deleteReaction.d.ts +6 -0
  231. package/lib/typescript/store/apis/getChannelMessages.d.ts +1 -1
  232. package/lib/typescript/store/apis/getPendingTasks.d.ts +3 -0
  233. package/lib/typescript/store/apis/index.d.ts +1 -0
  234. package/lib/typescript/store/apis/insertReaction.d.ts +6 -0
  235. package/lib/typescript/store/apis/updateMessage.d.ts +2 -2
  236. package/lib/typescript/store/apis/updateReaction.d.ts +2 -2
  237. package/lib/typescript/store/mappers/mapDateTimeToStorable.d.ts +1 -1
  238. package/lib/typescript/store/mappers/mapMessageToStorable.d.ts +2 -2
  239. package/lib/typescript/store/mappers/mapStorableToTask.d.ts +2 -0
  240. package/lib/typescript/store/mappers/mapTaskToStorable.d.ts +26 -0
  241. package/lib/typescript/store/schema.d.ts +12 -1
  242. package/lib/typescript/store/sqlite-utils/appendOrderByClause.d.ts +3 -0
  243. package/lib/typescript/store/sqlite-utils/createSelectQuery.d.ts +1 -1
  244. package/lib/typescript/store/types.d.ts +21 -0
  245. package/lib/typescript/types/types.d.ts +3 -1
  246. package/lib/typescript/utils/DBSyncManager.d.ts +47 -0
  247. package/lib/typescript/utils/addReactionToLocalState.d.ts +9 -0
  248. package/lib/typescript/utils/removeReactionFromLocalState.d.ts +8 -0
  249. package/lib/typescript/{components/Message/utils → utils}/removeReservedFields.d.ts +2 -2
  250. package/lib/typescript/utils/utils.d.ts +3 -3
  251. package/package.json +4 -3
  252. package/src/__tests__/offline-feature.test.js +19 -2
  253. package/src/__tests__/optimistic-update.test.js +368 -0
  254. package/src/components/Attachment/Gallery.tsx +5 -1
  255. package/src/components/Attachment/GalleryImage.tsx +16 -2
  256. package/src/components/Channel/Channel.tsx +266 -57
  257. package/src/components/Channel/hooks/useCreateMessagesContext.ts +6 -0
  258. package/src/components/ChannelList/ChannelList.tsx +2 -10
  259. package/src/components/ChannelList/hooks/listeners/__tests__/useChannelUpdated.test.tsx +0 -1
  260. package/src/components/ChannelList/hooks/usePaginatedChannels.ts +76 -26
  261. package/src/components/Chat/Chat.tsx +5 -9
  262. package/src/components/Chat/__tests__/Chat.test.js +1 -1
  263. package/src/components/Chat/hooks/useCreateChatContext.ts +0 -2
  264. package/src/components/Message/Message.tsx +18 -2
  265. package/src/components/Message/MessageSimple/MessageFooter.tsx +2 -1
  266. package/src/components/Message/hooks/useMessageActionHandlers.ts +10 -21
  267. package/src/components/Message/hooks/useMessageActions.tsx +10 -5
  268. package/src/components/MessageInput/FileUploadPreview.tsx +7 -2
  269. package/src/components/MessageInput/ImageUploadPreview.tsx +7 -3
  270. package/src/components/MessageInput/MessageInput.tsx +17 -3
  271. package/src/components/MessageInput/SendButton.tsx +1 -1
  272. package/src/components/index.ts +1 -2
  273. package/src/contexts/chatContext/ChatContext.tsx +1 -2
  274. package/src/contexts/messageInputContext/MessageInputContext.tsx +95 -57
  275. package/src/contexts/messageInputContext/__tests__/__snapshots__/sendMessage.test.tsx.snap +29 -3
  276. package/src/contexts/messageInputContext/hooks/useMessageDetailsForState.ts +1 -0
  277. package/src/contexts/messagesContext/MessagesContext.tsx +4 -1
  278. package/src/hooks/useTranslatedMessage.ts +1 -1
  279. package/src/mock-builders/DB/mock.ts +2 -2
  280. package/src/mock-builders/api/deleteMessage.js +18 -0
  281. package/src/mock-builders/api/deleteReaction.js +19 -0
  282. package/src/mock-builders/api/sendReaction.tsx +19 -0
  283. package/src/mock-builders/event/connectionChanged.js +2 -1
  284. package/src/store/QuickSqliteClient.ts +39 -37
  285. package/src/store/apis/addPendingTask.ts +24 -0
  286. package/src/store/apis/deleteMessage.ts +13 -0
  287. package/src/store/apis/deletePendingTask.ts +12 -0
  288. package/src/store/apis/deleteReaction.ts +26 -0
  289. package/src/store/apis/getChannelMessages.ts +1 -1
  290. package/src/store/apis/getChannels.ts +2 -2
  291. package/src/store/apis/getPendingTasks.ts +13 -0
  292. package/src/store/apis/index.ts +1 -0
  293. package/src/store/apis/insertReaction.ts +29 -0
  294. package/src/store/apis/updateMessage.ts +2 -2
  295. package/src/store/apis/updateReaction.ts +2 -2
  296. package/src/store/mappers/mapDateTimeToStorable.ts +1 -1
  297. package/src/store/mappers/mapMessageToStorable.ts +8 -2
  298. package/src/store/mappers/mapStorableToTask.ts +13 -0
  299. package/src/store/mappers/mapTaskToStorable.ts +7 -0
  300. package/src/store/schema.ts +25 -1
  301. package/src/store/sqlite-utils/appendOrderByClause.ts +24 -0
  302. package/src/store/sqlite-utils/createCreateTableQuery.ts +2 -2
  303. package/src/store/sqlite-utils/createSelectQuery.ts +4 -1
  304. package/src/store/sqlite-utils/createUpdateQuery.ts +3 -2
  305. package/src/store/sqlite-utils/createUpsertQuery.ts +1 -1
  306. package/src/store/types.ts +28 -0
  307. package/src/types/types.ts +4 -1
  308. package/src/utils/DBSyncManager.ts +222 -0
  309. package/src/utils/addReactionToLocalState.ts +87 -0
  310. package/src/utils/removeReactionFromLocalState.ts +39 -0
  311. package/src/{components/Message/utils → utils}/removeReservedFields.ts +7 -3
  312. package/src/utils/utils.ts +14 -5
  313. package/src/version.json +1 -1
  314. package/lib/commonjs/components/Chat/hooks/useConnectionRecovered.js +0 -171
  315. package/lib/commonjs/components/Chat/hooks/useConnectionRecovered.js.map +0 -1
  316. package/lib/commonjs/components/Message/utils/removeReservedFields.js.map +0 -1
  317. package/lib/module/components/Chat/hooks/useConnectionRecovered.js +0 -171
  318. package/lib/module/components/Chat/hooks/useConnectionRecovered.js.map +0 -1
  319. package/lib/module/components/Message/utils/removeReservedFields.js.map +0 -1
  320. package/lib/typescript/components/Chat/hooks/useConnectionRecovered.d.ts +0 -10
  321. package/src/components/Chat/hooks/useConnectionRecovered.ts +0 -92
@@ -0,0 +1,368 @@
1
+ /* eslint-disable no-underscore-dangle */
2
+ import React, { useContext, useEffect, useState } from 'react';
3
+ import { View } from 'react-native';
4
+
5
+ import { act, cleanup, render, waitFor } from '@testing-library/react-native';
6
+
7
+ import { v4 as uuidv4 } from 'uuid';
8
+
9
+ import { Channel } from '../components/Channel/Channel';
10
+ import { Chat } from '../components/Chat/Chat';
11
+ import { MessagesContext } from '../contexts';
12
+ import { deleteMessageApi } from '../mock-builders/api/deleteMessage';
13
+ import { deleteReactionApi } from '../mock-builders/api/deleteReaction';
14
+ import { erroredDeleteApi, erroredPostApi } from '../mock-builders/api/error';
15
+ import { getOrCreateChannelApi } from '../mock-builders/api/getOrCreateChannel';
16
+ import { sendReactionApi } from '../mock-builders/api/sendReaction';
17
+ import { useMockedApis } from '../mock-builders/api/useMockedApis';
18
+ import dispatchConnectionChangedEvent from '../mock-builders/event/connectionChanged';
19
+ import { generateChannelResponse } from '../mock-builders/generator/channel';
20
+ import { generateMember } from '../mock-builders/generator/member';
21
+ import { generateMessage } from '../mock-builders/generator/message';
22
+ import { generateReaction } from '../mock-builders/generator/reaction';
23
+ import { generateUser } from '../mock-builders/generator/user';
24
+ import { getTestClientWithUser } from '../mock-builders/mock';
25
+ import { upsertChannels } from '../store/apis';
26
+ import { QuickSqliteClient } from '../store/QuickSqliteClient';
27
+ import { BetterSqlite } from '../test-utils/BetterSqlite';
28
+
29
+ describe('Optimistic Updates', () => {
30
+ let chatClient;
31
+
32
+ const getRandomInt = (lower, upper) => Math.floor(lower + Math.random() * (upper - lower + 1));
33
+ const createChannel = () => {
34
+ const allUsers = Array(20).fill(1).map(generateUser);
35
+ const allMessages = [];
36
+ const allMembers = [];
37
+ const allReactions = [];
38
+ const allReads = [];
39
+ const id = uuidv4();
40
+ const cid = `messaging:${id}`;
41
+ const begin = getRandomInt(0, allUsers.length - 2); // begin shouldn't be the end of users.length
42
+ const end = getRandomInt(begin + 1, allUsers.length - 1);
43
+ const usersForMembers = allUsers.slice(begin, end);
44
+ const members = usersForMembers.map((user) =>
45
+ generateMember({
46
+ cid,
47
+ user,
48
+ }),
49
+ );
50
+ const messages = Array(10)
51
+ .fill(1)
52
+ .map(() => {
53
+ const id = uuidv4();
54
+ const user = usersForMembers[getRandomInt(0, usersForMembers.length - 1)];
55
+
56
+ const begin = getRandomInt(0, usersForMembers.length - 2); // begin shouldn't be the end of users.length
57
+ const end = getRandomInt(begin + 1, usersForMembers.length - 1);
58
+
59
+ const usersForReactions = usersForMembers.slice(begin, end);
60
+ const reactions = usersForReactions.map((user) =>
61
+ generateReaction({
62
+ message_id: id,
63
+ user,
64
+ }),
65
+ );
66
+ allReactions.push(...reactions);
67
+ return generateMessage({
68
+ cid,
69
+ id,
70
+ latest_reactions: reactions,
71
+ user,
72
+ userId: user.id,
73
+ });
74
+ });
75
+
76
+ const reads = members.map((member) => ({
77
+ last_read: new Date(new Date().setDate(new Date().getDate() - getRandomInt(0, 20))),
78
+ unread_messages: getRandomInt(0, messages.length),
79
+ user: member.user,
80
+ }));
81
+
82
+ allMessages.push(...messages);
83
+ allMembers.push(...members);
84
+ allReads.push(...reads);
85
+
86
+ return generateChannelResponse({
87
+ cid,
88
+ id,
89
+ members,
90
+ messages,
91
+ });
92
+ };
93
+
94
+ beforeEach(async () => {
95
+ jest.clearAllMocks();
96
+
97
+ chatClient = await getTestClientWithUser({ id: 'dan' });
98
+ const channelResponse = createChannel();
99
+ useMockedApis(chatClient, [getOrCreateChannelApi(channelResponse)]);
100
+ channel = chatClient.channel('messaging', channelResponse.id);
101
+ await channel.watch();
102
+
103
+ channel.cid = channelResponse.channel.cid;
104
+ channel.id = channelResponse.channel.id;
105
+
106
+ // Populate the DB with channel
107
+ QuickSqliteClient.initializeDatabase();
108
+ upsertChannels({
109
+ channels: [channelResponse],
110
+ isLatestMessagesSet: true,
111
+ });
112
+ });
113
+
114
+ afterEach(() => {
115
+ BetterSqlite.dropAllTables();
116
+ cleanup();
117
+ });
118
+
119
+ let channel;
120
+ // This component is used for performing effects in a component that consumes ChannelContext,
121
+ // i.e. making use of the callbacks & values provided by the Channel component.
122
+ // the effect is called every time channelContext changes
123
+ const CallbackEffectWithContext = ({ callback, children, context }) => {
124
+ const ctx = useContext(context);
125
+ const [ready, setReady] = useState(false);
126
+ useEffect(() => {
127
+ const call = async () => {
128
+ await callback(ctx);
129
+ setReady(true);
130
+ };
131
+
132
+ call();
133
+ }, []);
134
+
135
+ if (!ready) return null;
136
+
137
+ return children;
138
+ };
139
+
140
+ describe('delete message', () => {
141
+ it('pending task should exist if deleteMessage request fails', async () => {
142
+ const message = generateMessage();
143
+
144
+ const { getByTestId } = render(
145
+ <Chat client={chatClient} enableOfflineSupport>
146
+ <Channel channel={channel} initialValue={message.text}>
147
+ <CallbackEffectWithContext
148
+ callback={async ({ deleteMessage }) => {
149
+ useMockedApis(chatClient, [erroredPostApi()]);
150
+ try {
151
+ await deleteMessage(message);
152
+ } catch (e) {
153
+ // do nothing
154
+ }
155
+ }}
156
+ context={MessagesContext}
157
+ >
158
+ <View testID='children' />
159
+ </CallbackEffectWithContext>
160
+ </Channel>
161
+ </Chat>,
162
+ );
163
+ await waitFor(() => expect(getByTestId('children')).toBeTruthy());
164
+ await waitFor(() => {
165
+ const pendingTasksRows = BetterSqlite.selectFromTable('pendingTasks');
166
+ const pendingTaskType = pendingTasksRows?.[0]?.type;
167
+ const pendingTaskPayload = JSON.parse(pendingTasksRows?.[0]?.payload || '{}');
168
+ expect(pendingTaskType).toBe('delete-message');
169
+ expect(pendingTaskPayload[0]).toBe(message.id);
170
+ });
171
+ });
172
+
173
+ it('pending task should be cleared if deleteMessage request is succesful', async () => {
174
+ const message = generateMessage();
175
+ const { getByTestId } = render(
176
+ <Chat client={chatClient} enableOfflineSupport>
177
+ <Channel channel={channel} initialValue={message.text}>
178
+ <CallbackEffectWithContext
179
+ callback={({ deleteMessage }) => {
180
+ useMockedApis(chatClient, [deleteMessageApi(message)]);
181
+ deleteMessage(message);
182
+ }}
183
+ context={MessagesContext}
184
+ >
185
+ <View testID='children' />
186
+ </CallbackEffectWithContext>
187
+ </Channel>
188
+ </Chat>,
189
+ );
190
+ await waitFor(() => expect(getByTestId('children')).toBeTruthy());
191
+ await waitFor(() => {
192
+ const pendingTasksRows = BetterSqlite.selectFromTable('pendingTasks');
193
+ expect(pendingTasksRows.length).toBe(0);
194
+ });
195
+ });
196
+ });
197
+
198
+ describe('send reaction', () => {
199
+ it('pending task should exist if sendReaction request fails', async () => {
200
+ const reaction = generateReaction();
201
+ const targetMessage = channel.state.messages[0];
202
+
203
+ const { getByTestId } = render(
204
+ <Chat client={chatClient} enableOfflineSupport>
205
+ <Channel channel={channel}>
206
+ <CallbackEffectWithContext
207
+ callback={async ({ sendReaction }) => {
208
+ useMockedApis(chatClient, [erroredPostApi()]);
209
+ try {
210
+ await sendReaction(reaction.type, targetMessage.id);
211
+ } catch (e) {
212
+ // do nothing
213
+ }
214
+ }}
215
+ context={MessagesContext}
216
+ >
217
+ <View testID='children' />
218
+ </CallbackEffectWithContext>
219
+ </Channel>
220
+ </Chat>,
221
+ );
222
+ await waitFor(() => expect(getByTestId('children')).toBeTruthy());
223
+ await waitFor(() => {
224
+ const pendingTasksRows = BetterSqlite.selectFromTable('pendingTasks');
225
+ const pendingTaskType = pendingTasksRows?.[0]?.type;
226
+ const pendingTaskPayload = JSON.parse(pendingTasksRows?.[0]?.payload || '{}');
227
+ expect(pendingTaskType).toBe('send-reaction');
228
+ expect(pendingTaskPayload[0]).toBe(targetMessage.id);
229
+ });
230
+ });
231
+
232
+ it('pending task should be cleared if sendReaction request is succesful', async () => {
233
+ const reaction = generateReaction();
234
+ const targetMessage = channel.state.messages[0];
235
+
236
+ const { getByTestId } = render(
237
+ <Chat client={chatClient} enableOfflineSupport>
238
+ <Channel channel={channel}>
239
+ <CallbackEffectWithContext
240
+ callback={({ sendReaction }) => {
241
+ useMockedApis(chatClient, [sendReactionApi(targetMessage, reaction)]);
242
+ sendReaction(reaction.type, targetMessage.id);
243
+ }}
244
+ context={MessagesContext}
245
+ >
246
+ <View testID='children' />
247
+ </CallbackEffectWithContext>
248
+ </Channel>
249
+ </Chat>,
250
+ );
251
+ await waitFor(() => expect(getByTestId('children')).toBeTruthy());
252
+ await waitFor(() => {
253
+ const pendingTasksRows = BetterSqlite.selectFromTable('pendingTasks');
254
+ expect(pendingTasksRows.length).toBe(0);
255
+ });
256
+ });
257
+ });
258
+
259
+ describe('delete reaction', () => {
260
+ it('pending task should exist if deleteReaction request fails', async () => {
261
+ const reaction = generateReaction();
262
+ const targetMessage = channel.state.messages[0];
263
+
264
+ const { getByTestId } = render(
265
+ <Chat client={chatClient} enableOfflineSupport>
266
+ <Channel channel={channel}>
267
+ <CallbackEffectWithContext
268
+ callback={async ({ deleteReaction }) => {
269
+ useMockedApis(chatClient, [erroredPostApi()]);
270
+ try {
271
+ await deleteReaction(reaction.type, targetMessage.id);
272
+ } catch (e) {
273
+ // do nothing
274
+ }
275
+ }}
276
+ context={MessagesContext}
277
+ >
278
+ <View testID='children' />
279
+ </CallbackEffectWithContext>
280
+ </Channel>
281
+ </Chat>,
282
+ );
283
+ await waitFor(() => expect(getByTestId('children')).toBeTruthy());
284
+ await waitFor(() => {
285
+ const pendingTasksRows = BetterSqlite.selectFromTable('pendingTasks');
286
+ const pendingTaskType = pendingTasksRows?.[0]?.type;
287
+ const pendingTaskPayload = JSON.parse(pendingTasksRows?.[0]?.payload || '{}');
288
+ expect(pendingTaskType).toBe('delete-reaction');
289
+ expect(pendingTaskPayload[0]).toBe(targetMessage.id);
290
+ });
291
+ });
292
+
293
+ it('pending task should be cleared if deleteReaction request is succesful', async () => {
294
+ const reaction = generateReaction();
295
+ const targetMessage = channel.state.messages[0];
296
+
297
+ const { getByTestId } = render(
298
+ <Chat client={chatClient} enableOfflineSupport>
299
+ <Channel channel={channel}>
300
+ <CallbackEffectWithContext
301
+ callback={async ({ deleteReaction }) => {
302
+ useMockedApis(chatClient, [deleteReactionApi(targetMessage, reaction)]);
303
+ await deleteReaction(reaction.type, targetMessage.id);
304
+ }}
305
+ context={MessagesContext}
306
+ >
307
+ <View testID='children' />
308
+ </CallbackEffectWithContext>
309
+ </Channel>
310
+ </Chat>,
311
+ );
312
+ await waitFor(() => expect(getByTestId('children')).toBeTruthy());
313
+
314
+ await waitFor(() => {
315
+ const pendingTasksRows = BetterSqlite.selectFromTable('pendingTasks');
316
+ expect(pendingTasksRows.length).toBe(0);
317
+ });
318
+ });
319
+ });
320
+
321
+ it('pending task should be executed after connection is recovered', async () => {
322
+ const message = channel.state.messages[0];
323
+ const reaction = generateReaction();
324
+
325
+ const { getByTestId } = render(
326
+ <Chat client={chatClient} enableOfflineSupport>
327
+ <Channel channel={channel} initialValue={message.text}>
328
+ <CallbackEffectWithContext
329
+ callback={async ({ deleteMessage, sendReaction }) => {
330
+ useMockedApis(chatClient, [erroredDeleteApi()]);
331
+ try {
332
+ await deleteMessage(reaction);
333
+ } catch (e) {
334
+ // do nothing
335
+ }
336
+
337
+ useMockedApis(chatClient, [erroredPostApi()]);
338
+ try {
339
+ await sendReaction(reaction.type, message.id);
340
+ } catch (e) {
341
+ // do nothing
342
+ }
343
+ }}
344
+ context={MessagesContext}
345
+ >
346
+ <View testID='children' />
347
+ </CallbackEffectWithContext>
348
+ </Channel>
349
+ </Chat>,
350
+ );
351
+ await waitFor(() => expect(getByTestId('children')).toBeTruthy());
352
+
353
+ await waitFor(() => {
354
+ const pendingTasksRows = BetterSqlite.selectFromTable('pendingTasks');
355
+ expect(pendingTasksRows.length).toBe(2);
356
+ });
357
+
358
+ chatClient.deleteMessage = jest.fn();
359
+ channel.sendReaction = jest.fn();
360
+
361
+ act(() => dispatchConnectionChangedEvent(chatClient, true));
362
+
363
+ await waitFor(() => {
364
+ expect(chatClient.deleteMessage).toHaveBeenCalled();
365
+ expect(channel.sendReaction).toHaveBeenCalled();
366
+ });
367
+ });
368
+ });
@@ -170,13 +170,17 @@ const GalleryWithContext = <
170
170
  };
171
171
 
172
172
  const imagesAndVideos = [...(images || []), ...(videos || [])];
173
+ const imagesAndVideosValue = `${images?.length}${videos?.length}${images
174
+ ?.map((i) => `${i.image_url}${i.thumb_url}`)
175
+ .join('')}${videos?.map((i) => `${i.image_url}${i.thumb_url}`).join('')}`;
176
+
173
177
  const { height, invertedDirections, thumbnailGrid, width } = useMemo(
174
178
  () =>
175
179
  buildGallery({
176
180
  images: imagesAndVideos,
177
181
  sizeConfig,
178
182
  }),
179
- [imagesAndVideos.length],
183
+ [imagesAndVideosValue],
180
184
  );
181
185
 
182
186
  if (!imagesAndVideos?.length) return null;
@@ -4,7 +4,7 @@ import { Image, ImageProps } from 'react-native';
4
4
  import { ChatContextValue, useChatContext } from '../../contexts/chatContext/ChatContext';
5
5
 
6
6
  import type { DefaultStreamChatGenerics } from '../../types/types';
7
- import { getUrlWithoutParams, makeImageCompatibleUrl } from '../../utils/utils';
7
+ import { getUrlWithoutParams, isLocalUrl, makeImageCompatibleUrl } from '../../utils/utils';
8
8
 
9
9
  export type GalleryImageWithContextProps<
10
10
  StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
@@ -13,8 +13,22 @@ export type GalleryImageWithContextProps<
13
13
  export const GalleryImageWithContext: React.FC<GalleryImageWithContextProps> = (props) => {
14
14
  const { ImageComponent = Image, uri, ...rest } = props;
15
15
 
16
+ // Caching image components such as FastImage will not work with local images.
17
+ // This for the case of local uris, we use the default Image component.
18
+ if (!isLocalUrl(uri)) {
19
+ return (
20
+ <ImageComponent
21
+ {...rest}
22
+ accessibilityLabel='Gallery Image'
23
+ source={{
24
+ uri: makeImageCompatibleUrl(uri),
25
+ }}
26
+ />
27
+ );
28
+ }
29
+
16
30
  return (
17
- <ImageComponent
31
+ <Image
18
32
  {...rest}
19
33
  accessibilityLabel='Gallery Image'
20
34
  source={{