@ethora/chat-component-rn 26.8.5 → 26.8.7

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 (690) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +95 -0
  3. package/lib/commonjs/assets/emojiData.js +40 -0
  4. package/lib/commonjs/assets/emojiData.js.map +1 -0
  5. package/lib/commonjs/assets/icons.js +5 -3
  6. package/lib/commonjs/assets/icons.js.map +1 -1
  7. package/lib/commonjs/components/MainComponents/ChatHeader.js +35 -15
  8. package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
  9. package/lib/commonjs/components/MainComponents/ChatRoom.js +33 -24
  10. package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
  11. package/lib/commonjs/components/MainComponents/ChatWrapper.js +22 -16
  12. package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
  13. package/lib/commonjs/components/MainComponents/EncryptedSendNotice.js +47 -0
  14. package/lib/commonjs/components/MainComponents/EncryptedSendNotice.js.map +1 -0
  15. package/lib/commonjs/components/MainComponents/EncryptionCard.js +286 -0
  16. package/lib/commonjs/components/MainComponents/EncryptionCard.js.map +1 -0
  17. package/lib/commonjs/components/MainComponents/MediaMessage.js +7 -0
  18. package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
  19. package/lib/commonjs/components/MainComponents/MessageContainer.js +4 -12
  20. package/lib/commonjs/components/MainComponents/MessageContainer.js.map +1 -1
  21. package/lib/commonjs/components/MainComponents/MessageList.js +110 -35
  22. package/lib/commonjs/components/MainComponents/MessageList.js.map +1 -1
  23. package/lib/commonjs/components/MainComponents/ReduxWrapper.js +5 -0
  24. package/lib/commonjs/components/MainComponents/ReduxWrapper.js.map +1 -1
  25. package/lib/commonjs/components/MainComponents/RoomList.js +32 -29
  26. package/lib/commonjs/components/MainComponents/RoomList.js.map +1 -1
  27. package/lib/commonjs/components/MainComponents/RoomStack.js +133 -65
  28. package/lib/commonjs/components/MainComponents/RoomStack.js.map +1 -1
  29. package/lib/commonjs/components/MainComponents/SealedAttachment.js +231 -0
  30. package/lib/commonjs/components/MainComponents/SealedAttachment.js.map +1 -0
  31. package/lib/commonjs/components/MainComponents/SystemMessage.js +6 -2
  32. package/lib/commonjs/components/MainComponents/SystemMessage.js.map +1 -1
  33. package/lib/commonjs/components/MessageBubble/Avatar.js +5 -1
  34. package/lib/commonjs/components/MessageBubble/Avatar.js.map +1 -1
  35. package/lib/commonjs/components/MessageBubble/BottomReplyContainer.js +18 -21
  36. package/lib/commonjs/components/MessageBubble/BottomReplyContainer.js.map +1 -1
  37. package/lib/commonjs/components/MessageBubble/EmojiPickerSheet.js +447 -0
  38. package/lib/commonjs/components/MessageBubble/EmojiPickerSheet.js.map +1 -0
  39. package/lib/commonjs/components/MessageBubble/Message.js +264 -136
  40. package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
  41. package/lib/commonjs/components/MessageBubble/MessageInteractions.js +215 -13
  42. package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
  43. package/lib/commonjs/components/MessageBubble/MessageReaction.js +113 -94
  44. package/lib/commonjs/components/MessageBubble/MessageReaction.js.map +1 -1
  45. package/lib/commonjs/components/MessageBubble/MessageReply.js +66 -24
  46. package/lib/commonjs/components/MessageBubble/MessageReply.js.map +1 -1
  47. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +7 -4
  48. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  49. package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js +159 -16
  50. package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
  51. package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js +4 -0
  52. package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
  53. package/lib/commonjs/components/Modals/Modal/SwipeBackLayer.js +76 -44
  54. package/lib/commonjs/components/Modals/Modal/SwipeBackLayer.js.map +1 -1
  55. package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js +29 -6
  56. package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
  57. package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js +5 -1
  58. package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
  59. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +37 -13
  60. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
  61. package/lib/commonjs/components/RoomComponents/LastMessageItem.js +6 -0
  62. package/lib/commonjs/components/RoomComponents/LastMessageItem.js.map +1 -1
  63. package/lib/commonjs/components/RoomComponents/styled/LastAudioMessage.js +2 -2
  64. package/lib/commonjs/components/RoomComponents/styled/LastAudioMessage.js.map +1 -1
  65. package/lib/commonjs/components/RoomComponents/styled/LastMessageEmoji.js +8 -9
  66. package/lib/commonjs/components/RoomComponents/styled/LastMessageEmoji.js.map +1 -1
  67. package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js +4 -6
  68. package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
  69. package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js +2 -2
  70. package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
  71. package/lib/commonjs/components/RoomComponents/styled/LastMessageSealed.js +41 -0
  72. package/lib/commonjs/components/RoomComponents/styled/LastMessageSealed.js.map +1 -0
  73. package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js +2 -2
  74. package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
  75. package/lib/commonjs/components/Thread/ThreadWrapper.js +273 -152
  76. package/lib/commonjs/components/Thread/ThreadWrapper.js.map +1 -1
  77. package/lib/commonjs/components/UsersList/UsersList.js +2 -1
  78. package/lib/commonjs/components/UsersList/UsersList.js.map +1 -1
  79. package/lib/commonjs/components/styled/DateLabel.js +6 -3
  80. package/lib/commonjs/components/styled/DateLabel.js.map +1 -1
  81. package/lib/commonjs/components/styled/SendInput.js +4 -2
  82. package/lib/commonjs/components/styled/SendInput.js.map +1 -1
  83. package/lib/commonjs/context/MessageNotificationContext.js +188 -9
  84. package/lib/commonjs/context/MessageNotificationContext.js.map +1 -1
  85. package/lib/commonjs/context/xmppProvider.js +22 -7
  86. package/lib/commonjs/context/xmppProvider.js.map +1 -1
  87. package/lib/commonjs/e2ee/crypto.js +207 -0
  88. package/lib/commonjs/e2ee/crypto.js.map +1 -0
  89. package/lib/commonjs/e2ee/deviceStore.js +84 -0
  90. package/lib/commonjs/e2ee/deviceStore.js.map +1 -0
  91. package/lib/commonjs/e2ee/fileCipher.js +95 -0
  92. package/lib/commonjs/e2ee/fileCipher.js.map +1 -0
  93. package/lib/commonjs/e2ee/fileEnvelope.js +79 -0
  94. package/lib/commonjs/e2ee/fileEnvelope.js.map +1 -0
  95. package/lib/commonjs/e2ee/index.js +210 -0
  96. package/lib/commonjs/e2ee/index.js.map +1 -0
  97. package/lib/commonjs/e2ee/limits.js +9 -0
  98. package/lib/commonjs/e2ee/limits.js.map +1 -0
  99. package/lib/commonjs/e2ee/ns.js +8 -0
  100. package/lib/commonjs/e2ee/ns.js.map +1 -0
  101. package/lib/commonjs/e2ee/omemo.js +622 -0
  102. package/lib/commonjs/e2ee/omemo.js.map +1 -0
  103. package/lib/commonjs/e2ee/protobuf.js +149 -0
  104. package/lib/commonjs/e2ee/protobuf.js.map +1 -0
  105. package/lib/commonjs/e2ee/ratchet.js +238 -0
  106. package/lib/commonjs/e2ee/ratchet.js.map +1 -0
  107. package/lib/commonjs/e2ee/sealedBody.js +23 -0
  108. package/lib/commonjs/e2ee/sealedBody.js.map +1 -0
  109. package/lib/commonjs/e2ee/sealedFiles.js +174 -0
  110. package/lib/commonjs/e2ee/sealedFiles.js.map +1 -0
  111. package/lib/commonjs/e2ee/send.js +54 -0
  112. package/lib/commonjs/e2ee/send.js.map +1 -0
  113. package/lib/commonjs/e2ee/stanza.js +114 -0
  114. package/lib/commonjs/e2ee/stanza.js.map +1 -0
  115. package/lib/commonjs/e2ee/store.js +43 -0
  116. package/lib/commonjs/e2ee/store.js.map +1 -0
  117. package/lib/commonjs/helpers/accountName.js +23 -0
  118. package/lib/commonjs/helpers/accountName.js.map +1 -0
  119. package/lib/commonjs/helpers/createMessageFromXml.js +19 -4
  120. package/lib/commonjs/helpers/createMessageFromXml.js.map +1 -1
  121. package/lib/commonjs/helpers/createRoomFromApi.js +36 -2
  122. package/lib/commonjs/helpers/createRoomFromApi.js.map +1 -1
  123. package/lib/commonjs/helpers/createUserNameFromSetUser.js +2 -1
  124. package/lib/commonjs/helpers/createUserNameFromSetUser.js.map +1 -1
  125. package/lib/commonjs/helpers/displayName.js +16 -0
  126. package/lib/commonjs/helpers/displayName.js.map +1 -0
  127. package/lib/commonjs/helpers/emoji.js +51 -0
  128. package/lib/commonjs/helpers/emoji.js.map +1 -0
  129. package/lib/commonjs/helpers/haptics.js +29 -0
  130. package/lib/commonjs/helpers/haptics.js.map +1 -0
  131. package/lib/commonjs/helpers/historyPreloadScheduler.js +32 -66
  132. package/lib/commonjs/helpers/historyPreloadScheduler.js.map +1 -1
  133. package/lib/commonjs/helpers/insertMessageWithDelimiter.js +21 -12
  134. package/lib/commonjs/helpers/insertMessageWithDelimiter.js.map +1 -1
  135. package/lib/commonjs/helpers/mamReactions.js +57 -0
  136. package/lib/commonjs/helpers/mamReactions.js.map +1 -0
  137. package/lib/commonjs/helpers/parseMessageReference.js +42 -0
  138. package/lib/commonjs/helpers/parseMessageReference.js.map +1 -0
  139. package/lib/commonjs/helpers/persistCrypto.js +5 -0
  140. package/lib/commonjs/helpers/persistCrypto.js.map +1 -1
  141. package/lib/commonjs/helpers/reactionsConfig.js +17 -0
  142. package/lib/commonjs/helpers/reactionsConfig.js.map +1 -0
  143. package/lib/commonjs/helpers/secureKeyValue.js +20 -0
  144. package/lib/commonjs/helpers/secureKeyValue.js.map +1 -1
  145. package/lib/commonjs/helpers/updateMessagesTillLast.js +17 -2
  146. package/lib/commonjs/helpers/updateMessagesTillLast.js.map +1 -1
  147. package/lib/commonjs/helpers/videoCache.js +136 -0
  148. package/lib/commonjs/helpers/videoCache.js.map +1 -0
  149. package/lib/commonjs/hooks/useHeapSender.js +3 -1
  150. package/lib/commonjs/hooks/useHeapSender.js.map +1 -1
  151. package/lib/commonjs/hooks/useLogout.js +8 -0
  152. package/lib/commonjs/hooks/useLogout.js.map +1 -1
  153. package/lib/commonjs/hooks/useMessageHeapState.js +3 -2
  154. package/lib/commonjs/hooks/useMessageHeapState.js.map +1 -1
  155. package/lib/commonjs/hooks/useRoomInitialization.js +16 -7
  156. package/lib/commonjs/hooks/useRoomInitialization.js.map +1 -1
  157. package/lib/commonjs/hooks/useSendMessage.js +85 -15
  158. package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
  159. package/lib/commonjs/hooks/useUnreadMessagesCounter.js +1 -1
  160. package/lib/commonjs/hooks/useUnreadMessagesCounter.js.map +1 -1
  161. package/lib/commonjs/i18n/strings.js +180 -0
  162. package/lib/commonjs/i18n/strings.js.map +1 -1
  163. package/lib/commonjs/main.js +13 -0
  164. package/lib/commonjs/main.js.map +1 -1
  165. package/lib/commonjs/networking/api-requests/auth.api.js +4 -1
  166. package/lib/commonjs/networking/api-requests/auth.api.js.map +1 -1
  167. package/lib/commonjs/networking/api-requests/rooms.api.js +111 -17
  168. package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
  169. package/lib/commonjs/networking/stanzaHandlers.js +106 -50
  170. package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
  171. package/lib/commonjs/networking/xmpp/getHistory.xmpp.js +29 -74
  172. package/lib/commonjs/networking/xmpp/getHistory.xmpp.js.map +1 -1
  173. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js +44 -0
  174. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  175. package/lib/commonjs/networking/xmpp/mamRouter.js +186 -0
  176. package/lib/commonjs/networking/xmpp/mamRouter.js.map +1 -0
  177. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js +41 -4
  178. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  179. package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js +16 -3
  180. package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
  181. package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js +13 -6
  182. package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
  183. package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +14 -6
  184. package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
  185. package/lib/commonjs/networking/xmppClient.js +104 -23
  186. package/lib/commonjs/networking/xmppClient.js.map +1 -1
  187. package/lib/commonjs/roomStore/Middleware/newMessageMidlleware.js +29 -34
  188. package/lib/commonjs/roomStore/Middleware/newMessageMidlleware.js.map +1 -1
  189. package/lib/commonjs/roomStore/Middleware/perfMiddleware.js +51 -0
  190. package/lib/commonjs/roomStore/Middleware/perfMiddleware.js.map +1 -0
  191. package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js +66 -43
  192. package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
  193. package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js +88 -68
  194. package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js.map +1 -1
  195. package/lib/commonjs/roomStore/index.js +18 -14
  196. package/lib/commonjs/roomStore/index.js.map +1 -1
  197. package/lib/commonjs/roomStore/persistBackend.js +93 -0
  198. package/lib/commonjs/roomStore/persistBackend.js.map +1 -0
  199. package/lib/commonjs/roomStore/persistence.js +253 -51
  200. package/lib/commonjs/roomStore/persistence.js.map +1 -1
  201. package/lib/commonjs/roomStore/roomsSlice.js +282 -136
  202. package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
  203. package/lib/commonjs/theme/theme.js +3 -0
  204. package/lib/commonjs/theme/theme.js.map +1 -1
  205. package/lib/commonjs/utils/devLogger.js +14 -0
  206. package/lib/commonjs/utils/devLogger.js.map +1 -1
  207. package/lib/commonjs/version.js +1 -1
  208. package/lib/module/assets/emojiData.js +36 -0
  209. package/lib/module/assets/emojiData.js.map +1 -0
  210. package/lib/module/assets/icons.js +4 -2
  211. package/lib/module/assets/icons.js.map +1 -1
  212. package/lib/module/components/MainComponents/ChatHeader.js +37 -17
  213. package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
  214. package/lib/module/components/MainComponents/ChatRoom.js +34 -25
  215. package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
  216. package/lib/module/components/MainComponents/ChatWrapper.js +23 -17
  217. package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
  218. package/lib/module/components/MainComponents/EncryptedSendNotice.js +42 -0
  219. package/lib/module/components/MainComponents/EncryptedSendNotice.js.map +1 -0
  220. package/lib/module/components/MainComponents/EncryptionCard.js +281 -0
  221. package/lib/module/components/MainComponents/EncryptionCard.js.map +1 -0
  222. package/lib/module/components/MainComponents/MediaMessage.js +7 -0
  223. package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
  224. package/lib/module/components/MainComponents/MessageContainer.js +7 -14
  225. package/lib/module/components/MainComponents/MessageContainer.js.map +1 -1
  226. package/lib/module/components/MainComponents/MessageList.js +110 -35
  227. package/lib/module/components/MainComponents/MessageList.js.map +1 -1
  228. package/lib/module/components/MainComponents/ReduxWrapper.js +5 -0
  229. package/lib/module/components/MainComponents/ReduxWrapper.js.map +1 -1
  230. package/lib/module/components/MainComponents/RoomList.js +32 -29
  231. package/lib/module/components/MainComponents/RoomList.js.map +1 -1
  232. package/lib/module/components/MainComponents/RoomStack.js +131 -63
  233. package/lib/module/components/MainComponents/RoomStack.js.map +1 -1
  234. package/lib/module/components/MainComponents/SealedAttachment.js +224 -0
  235. package/lib/module/components/MainComponents/SealedAttachment.js.map +1 -0
  236. package/lib/module/components/MainComponents/SystemMessage.js +6 -2
  237. package/lib/module/components/MainComponents/SystemMessage.js.map +1 -1
  238. package/lib/module/components/MessageBubble/Avatar.js +5 -1
  239. package/lib/module/components/MessageBubble/Avatar.js.map +1 -1
  240. package/lib/module/components/MessageBubble/BottomReplyContainer.js +19 -22
  241. package/lib/module/components/MessageBubble/BottomReplyContainer.js.map +1 -1
  242. package/lib/module/components/MessageBubble/EmojiPickerSheet.js +438 -0
  243. package/lib/module/components/MessageBubble/EmojiPickerSheet.js.map +1 -0
  244. package/lib/module/components/MessageBubble/Message.js +269 -140
  245. package/lib/module/components/MessageBubble/Message.js.map +1 -1
  246. package/lib/module/components/MessageBubble/MessageInteractions.js +217 -15
  247. package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
  248. package/lib/module/components/MessageBubble/MessageReaction.js +115 -94
  249. package/lib/module/components/MessageBubble/MessageReaction.js.map +1 -1
  250. package/lib/module/components/MessageBubble/MessageReply.js +65 -24
  251. package/lib/module/components/MessageBubble/MessageReply.js.map +1 -1
  252. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +7 -4
  253. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  254. package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js +161 -18
  255. package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
  256. package/lib/module/components/Modals/FilePreviewModal/PdfView.js +4 -0
  257. package/lib/module/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
  258. package/lib/module/components/Modals/Modal/SwipeBackLayer.js +76 -44
  259. package/lib/module/components/Modals/Modal/SwipeBackLayer.js.map +1 -1
  260. package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js +32 -8
  261. package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
  262. package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js +4 -0
  263. package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
  264. package/lib/module/components/RoomComponents/ChatRoomItem.js +37 -13
  265. package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
  266. package/lib/module/components/RoomComponents/LastMessageItem.js +6 -0
  267. package/lib/module/components/RoomComponents/LastMessageItem.js.map +1 -1
  268. package/lib/module/components/RoomComponents/styled/LastAudioMessage.js +2 -2
  269. package/lib/module/components/RoomComponents/styled/LastAudioMessage.js.map +1 -1
  270. package/lib/module/components/RoomComponents/styled/LastMessageEmoji.js +8 -9
  271. package/lib/module/components/RoomComponents/styled/LastMessageEmoji.js.map +1 -1
  272. package/lib/module/components/RoomComponents/styled/LastMessageFile.js +4 -6
  273. package/lib/module/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
  274. package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js +2 -2
  275. package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
  276. package/lib/module/components/RoomComponents/styled/LastMessageSealed.js +36 -0
  277. package/lib/module/components/RoomComponents/styled/LastMessageSealed.js.map +1 -0
  278. package/lib/module/components/RoomComponents/styled/LastMessageVideo.js +2 -2
  279. package/lib/module/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
  280. package/lib/module/components/Thread/ThreadWrapper.js +273 -153
  281. package/lib/module/components/Thread/ThreadWrapper.js.map +1 -1
  282. package/lib/module/components/UsersList/UsersList.js +2 -1
  283. package/lib/module/components/UsersList/UsersList.js.map +1 -1
  284. package/lib/module/components/styled/DateLabel.js +6 -3
  285. package/lib/module/components/styled/DateLabel.js.map +1 -1
  286. package/lib/module/components/styled/SendInput.js +4 -2
  287. package/lib/module/components/styled/SendInput.js.map +1 -1
  288. package/lib/module/context/MessageNotificationContext.js +190 -11
  289. package/lib/module/context/MessageNotificationContext.js.map +1 -1
  290. package/lib/module/context/xmppProvider.js +22 -7
  291. package/lib/module/context/xmppProvider.js.map +1 -1
  292. package/lib/module/e2ee/crypto.js +170 -0
  293. package/lib/module/e2ee/crypto.js.map +1 -0
  294. package/lib/module/e2ee/deviceStore.js +77 -0
  295. package/lib/module/e2ee/deviceStore.js.map +1 -0
  296. package/lib/module/e2ee/fileCipher.js +90 -0
  297. package/lib/module/e2ee/fileCipher.js.map +1 -0
  298. package/lib/module/e2ee/fileEnvelope.js +66 -0
  299. package/lib/module/e2ee/fileEnvelope.js.map +1 -0
  300. package/lib/module/e2ee/index.js +185 -0
  301. package/lib/module/e2ee/index.js.map +1 -0
  302. package/lib/module/e2ee/limits.js +5 -0
  303. package/lib/module/e2ee/limits.js.map +1 -0
  304. package/lib/module/e2ee/ns.js +4 -0
  305. package/lib/module/e2ee/ns.js.map +1 -0
  306. package/lib/module/e2ee/omemo.js +610 -0
  307. package/lib/module/e2ee/omemo.js.map +1 -0
  308. package/lib/module/e2ee/protobuf.js +140 -0
  309. package/lib/module/e2ee/protobuf.js.map +1 -0
  310. package/lib/module/e2ee/ratchet.js +228 -0
  311. package/lib/module/e2ee/ratchet.js.map +1 -0
  312. package/lib/module/e2ee/sealedBody.js +19 -0
  313. package/lib/module/e2ee/sealedBody.js.map +1 -0
  314. package/lib/module/e2ee/sealedFiles.js +154 -0
  315. package/lib/module/e2ee/sealedFiles.js.map +1 -0
  316. package/lib/module/e2ee/send.js +48 -0
  317. package/lib/module/e2ee/send.js.map +1 -0
  318. package/lib/module/e2ee/stanza.js +107 -0
  319. package/lib/module/e2ee/stanza.js.map +1 -0
  320. package/lib/module/e2ee/store.js +35 -0
  321. package/lib/module/e2ee/store.js.map +1 -0
  322. package/lib/module/helpers/accountName.js +18 -0
  323. package/lib/module/helpers/accountName.js.map +1 -0
  324. package/lib/module/helpers/createMessageFromXml.js +19 -4
  325. package/lib/module/helpers/createMessageFromXml.js.map +1 -1
  326. package/lib/module/helpers/createRoomFromApi.js +36 -2
  327. package/lib/module/helpers/createRoomFromApi.js.map +1 -1
  328. package/lib/module/helpers/createUserNameFromSetUser.js +3 -1
  329. package/lib/module/helpers/createUserNameFromSetUser.js.map +1 -1
  330. package/lib/module/helpers/displayName.js +11 -0
  331. package/lib/module/helpers/displayName.js.map +1 -0
  332. package/lib/module/helpers/emoji.js +44 -0
  333. package/lib/module/helpers/emoji.js.map +1 -0
  334. package/lib/module/helpers/haptics.js +24 -0
  335. package/lib/module/helpers/haptics.js.map +1 -0
  336. package/lib/module/helpers/historyPreloadScheduler.js +32 -66
  337. package/lib/module/helpers/historyPreloadScheduler.js.map +1 -1
  338. package/lib/module/helpers/insertMessageWithDelimiter.js +21 -12
  339. package/lib/module/helpers/insertMessageWithDelimiter.js.map +1 -1
  340. package/lib/module/helpers/mamReactions.js +51 -0
  341. package/lib/module/helpers/mamReactions.js.map +1 -0
  342. package/lib/module/helpers/parseMessageReference.js +37 -0
  343. package/lib/module/helpers/parseMessageReference.js.map +1 -0
  344. package/lib/module/helpers/persistCrypto.js +4 -0
  345. package/lib/module/helpers/persistCrypto.js.map +1 -1
  346. package/lib/module/helpers/reactionsConfig.js +10 -0
  347. package/lib/module/helpers/reactionsConfig.js.map +1 -0
  348. package/lib/module/helpers/secureKeyValue.js +19 -0
  349. package/lib/module/helpers/secureKeyValue.js.map +1 -1
  350. package/lib/module/helpers/updateMessagesTillLast.js +17 -2
  351. package/lib/module/helpers/updateMessagesTillLast.js.map +1 -1
  352. package/lib/module/helpers/videoCache.js +125 -0
  353. package/lib/module/helpers/videoCache.js.map +1 -0
  354. package/lib/module/hooks/useHeapSender.js +3 -1
  355. package/lib/module/hooks/useHeapSender.js.map +1 -1
  356. package/lib/module/hooks/useLogout.js +8 -0
  357. package/lib/module/hooks/useLogout.js.map +1 -1
  358. package/lib/module/hooks/useMessageHeapState.js +3 -2
  359. package/lib/module/hooks/useMessageHeapState.js.map +1 -1
  360. package/lib/module/hooks/useRoomInitialization.js +17 -8
  361. package/lib/module/hooks/useRoomInitialization.js.map +1 -1
  362. package/lib/module/hooks/useSendMessage.js +85 -15
  363. package/lib/module/hooks/useSendMessage.js.map +1 -1
  364. package/lib/module/hooks/useUnreadMessagesCounter.js +1 -1
  365. package/lib/module/hooks/useUnreadMessagesCounter.js.map +1 -1
  366. package/lib/module/i18n/strings.js +180 -0
  367. package/lib/module/i18n/strings.js.map +1 -1
  368. package/lib/module/main.js +1 -0
  369. package/lib/module/main.js.map +1 -1
  370. package/lib/module/networking/api-requests/auth.api.js +4 -1
  371. package/lib/module/networking/api-requests/auth.api.js.map +1 -1
  372. package/lib/module/networking/api-requests/rooms.api.js +109 -18
  373. package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
  374. package/lib/module/networking/stanzaHandlers.js +107 -51
  375. package/lib/module/networking/stanzaHandlers.js.map +1 -1
  376. package/lib/module/networking/xmpp/getHistory.xmpp.js +29 -74
  377. package/lib/module/networking/xmpp/getHistory.xmpp.js.map +1 -1
  378. package/lib/module/networking/xmpp/handleStanzas.xmpp.js +42 -0
  379. package/lib/module/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  380. package/lib/module/networking/xmpp/mamRouter.js +175 -0
  381. package/lib/module/networking/xmpp/mamRouter.js.map +1 -0
  382. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js +38 -2
  383. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  384. package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js +16 -3
  385. package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
  386. package/lib/module/networking/xmpp/sendTextMessage.xmpp.js +13 -6
  387. package/lib/module/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
  388. package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +14 -6
  389. package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
  390. package/lib/module/networking/xmppClient.js +105 -24
  391. package/lib/module/networking/xmppClient.js.map +1 -1
  392. package/lib/module/roomStore/Middleware/newMessageMidlleware.js +29 -34
  393. package/lib/module/roomStore/Middleware/newMessageMidlleware.js.map +1 -1
  394. package/lib/module/roomStore/Middleware/perfMiddleware.js +45 -0
  395. package/lib/module/roomStore/Middleware/perfMiddleware.js.map +1 -0
  396. package/lib/module/roomStore/Middleware/reactionsMiddleware.js +66 -43
  397. package/lib/module/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
  398. package/lib/module/roomStore/Middleware/unreadMidlleware.js +89 -69
  399. package/lib/module/roomStore/Middleware/unreadMidlleware.js.map +1 -1
  400. package/lib/module/roomStore/index.js +19 -15
  401. package/lib/module/roomStore/index.js.map +1 -1
  402. package/lib/module/roomStore/persistBackend.js +86 -0
  403. package/lib/module/roomStore/persistBackend.js.map +1 -0
  404. package/lib/module/roomStore/persistence.js +253 -49
  405. package/lib/module/roomStore/persistence.js.map +1 -1
  406. package/lib/module/roomStore/roomsSlice.js +275 -134
  407. package/lib/module/roomStore/roomsSlice.js.map +1 -1
  408. package/lib/module/theme/theme.js +3 -0
  409. package/lib/module/theme/theme.js.map +1 -1
  410. package/lib/module/utils/devLogger.js +13 -0
  411. package/lib/module/utils/devLogger.js.map +1 -1
  412. package/lib/module/version.js +1 -1
  413. package/lib/typescript/assets/emojiData.d.ts +8 -0
  414. package/lib/typescript/assets/emojiData.d.ts.map +1 -0
  415. package/lib/typescript/assets/icons.d.ts +8 -0
  416. package/lib/typescript/assets/icons.d.ts.map +1 -1
  417. package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
  418. package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
  419. package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
  420. package/lib/typescript/components/MainComponents/EncryptedSendNotice.d.ts +4 -0
  421. package/lib/typescript/components/MainComponents/EncryptedSendNotice.d.ts.map +1 -0
  422. package/lib/typescript/components/MainComponents/EncryptionCard.d.ts +10 -0
  423. package/lib/typescript/components/MainComponents/EncryptionCard.d.ts.map +1 -0
  424. package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
  425. package/lib/typescript/components/MainComponents/MessageContainer.d.ts +2 -2
  426. package/lib/typescript/components/MainComponents/MessageContainer.d.ts.map +1 -1
  427. package/lib/typescript/components/MainComponents/MessageList.d.ts.map +1 -1
  428. package/lib/typescript/components/MainComponents/ReduxWrapper.d.ts.map +1 -1
  429. package/lib/typescript/components/MainComponents/RoomList.d.ts.map +1 -1
  430. package/lib/typescript/components/MainComponents/RoomStack.d.ts +7 -2
  431. package/lib/typescript/components/MainComponents/RoomStack.d.ts.map +1 -1
  432. package/lib/typescript/components/MainComponents/SealedAttachment.d.ts +13 -0
  433. package/lib/typescript/components/MainComponents/SealedAttachment.d.ts.map +1 -0
  434. package/lib/typescript/components/MainComponents/SystemMessage.d.ts.map +1 -1
  435. package/lib/typescript/components/MessageBubble/Avatar.d.ts +2 -0
  436. package/lib/typescript/components/MessageBubble/Avatar.d.ts.map +1 -1
  437. package/lib/typescript/components/MessageBubble/BottomReplyContainer.d.ts.map +1 -1
  438. package/lib/typescript/components/MessageBubble/EmojiPickerSheet.d.ts +11 -0
  439. package/lib/typescript/components/MessageBubble/EmojiPickerSheet.d.ts.map +1 -0
  440. package/lib/typescript/components/MessageBubble/Message.d.ts +2 -2
  441. package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
  442. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts +2 -0
  443. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts.map +1 -1
  444. package/lib/typescript/components/MessageBubble/MessageReaction.d.ts +1 -0
  445. package/lib/typescript/components/MessageBubble/MessageReaction.d.ts.map +1 -1
  446. package/lib/typescript/components/MessageBubble/MessageReply.d.ts +7 -7
  447. package/lib/typescript/components/MessageBubble/MessageReply.d.ts.map +1 -1
  448. package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
  449. package/lib/typescript/components/Modals/FilePreviewModal/FilePreviewModal.d.ts.map +1 -1
  450. package/lib/typescript/components/Modals/FilePreviewModal/PdfView.d.ts.map +1 -1
  451. package/lib/typescript/components/Modals/Modal/SwipeBackLayer.d.ts +2 -1
  452. package/lib/typescript/components/Modals/Modal/SwipeBackLayer.d.ts.map +1 -1
  453. package/lib/typescript/components/Modals/UserProfileModal/UserProfileModal.d.ts.map +1 -1
  454. package/lib/typescript/components/Modals/UserSettingsModal/UserSettingsModal.d.ts.map +1 -1
  455. package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts +2 -2
  456. package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
  457. package/lib/typescript/components/RoomComponents/LastMessageItem.d.ts.map +1 -1
  458. package/lib/typescript/components/RoomComponents/styled/LastAudioMessage.d.ts.map +1 -1
  459. package/lib/typescript/components/RoomComponents/styled/LastMessageEmoji.d.ts +3 -6
  460. package/lib/typescript/components/RoomComponents/styled/LastMessageEmoji.d.ts.map +1 -1
  461. package/lib/typescript/components/RoomComponents/styled/LastMessageSealed.d.ts +7 -0
  462. package/lib/typescript/components/RoomComponents/styled/LastMessageSealed.d.ts.map +1 -0
  463. package/lib/typescript/components/Thread/ThreadWrapper.d.ts +7 -1
  464. package/lib/typescript/components/Thread/ThreadWrapper.d.ts.map +1 -1
  465. package/lib/typescript/components/UsersList/UsersList.d.ts.map +1 -1
  466. package/lib/typescript/components/styled/DateLabel.d.ts +1 -0
  467. package/lib/typescript/components/styled/DateLabel.d.ts.map +1 -1
  468. package/lib/typescript/components/styled/SendInput.d.ts +1 -0
  469. package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
  470. package/lib/typescript/context/MessageNotificationContext.d.ts.map +1 -1
  471. package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
  472. package/lib/typescript/e2ee/crypto.d.ts +28 -0
  473. package/lib/typescript/e2ee/crypto.d.ts.map +1 -0
  474. package/lib/typescript/e2ee/deviceStore.d.ts +4 -0
  475. package/lib/typescript/e2ee/deviceStore.d.ts.map +1 -0
  476. package/lib/typescript/e2ee/fileCipher.d.ts +7 -0
  477. package/lib/typescript/e2ee/fileCipher.d.ts.map +1 -0
  478. package/lib/typescript/e2ee/fileEnvelope.d.ts +27 -0
  479. package/lib/typescript/e2ee/fileEnvelope.d.ts.map +1 -0
  480. package/lib/typescript/e2ee/index.d.ts +23 -0
  481. package/lib/typescript/e2ee/index.d.ts.map +1 -0
  482. package/lib/typescript/e2ee/limits.d.ts +3 -0
  483. package/lib/typescript/e2ee/limits.d.ts.map +1 -0
  484. package/lib/typescript/e2ee/ns.d.ts +2 -0
  485. package/lib/typescript/e2ee/ns.d.ts.map +1 -0
  486. package/lib/typescript/e2ee/omemo.d.ts +64 -0
  487. package/lib/typescript/e2ee/omemo.d.ts.map +1 -0
  488. package/lib/typescript/e2ee/protobuf.d.ts +25 -0
  489. package/lib/typescript/e2ee/protobuf.d.ts.map +1 -0
  490. package/lib/typescript/e2ee/ratchet.d.ts +39 -0
  491. package/lib/typescript/e2ee/ratchet.d.ts.map +1 -0
  492. package/lib/typescript/e2ee/sealedBody.d.ts +2 -0
  493. package/lib/typescript/e2ee/sealedBody.d.ts.map +1 -0
  494. package/lib/typescript/e2ee/sealedFiles.d.ts +31 -0
  495. package/lib/typescript/e2ee/sealedFiles.d.ts.map +1 -0
  496. package/lib/typescript/e2ee/send.d.ts +6 -0
  497. package/lib/typescript/e2ee/send.d.ts.map +1 -0
  498. package/lib/typescript/e2ee/stanza.d.ts +8 -0
  499. package/lib/typescript/e2ee/stanza.d.ts.map +1 -0
  500. package/lib/typescript/e2ee/store.d.ts +16 -0
  501. package/lib/typescript/e2ee/store.d.ts.map +1 -0
  502. package/lib/typescript/helpers/accountName.d.ts +7 -0
  503. package/lib/typescript/helpers/accountName.d.ts.map +1 -0
  504. package/lib/typescript/helpers/createMessageFromXml.d.ts.map +1 -1
  505. package/lib/typescript/helpers/createRoomFromApi.d.ts.map +1 -1
  506. package/lib/typescript/helpers/createUserNameFromSetUser.d.ts.map +1 -1
  507. package/lib/typescript/helpers/displayName.d.ts +2 -0
  508. package/lib/typescript/helpers/displayName.d.ts.map +1 -0
  509. package/lib/typescript/helpers/emoji.d.ts +6 -0
  510. package/lib/typescript/helpers/emoji.d.ts.map +1 -0
  511. package/lib/typescript/helpers/haptics.d.ts +3 -0
  512. package/lib/typescript/helpers/haptics.d.ts.map +1 -0
  513. package/lib/typescript/helpers/historyPreloadScheduler.d.ts +1 -0
  514. package/lib/typescript/helpers/historyPreloadScheduler.d.ts.map +1 -1
  515. package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts.map +1 -1
  516. package/lib/typescript/helpers/mamReactions.d.ts +13 -0
  517. package/lib/typescript/helpers/mamReactions.d.ts.map +1 -0
  518. package/lib/typescript/helpers/parseMessageReference.d.ts +16 -0
  519. package/lib/typescript/helpers/parseMessageReference.d.ts.map +1 -0
  520. package/lib/typescript/helpers/persistCrypto.d.ts +1 -0
  521. package/lib/typescript/helpers/persistCrypto.d.ts.map +1 -1
  522. package/lib/typescript/helpers/reactionsConfig.d.ts +5 -0
  523. package/lib/typescript/helpers/reactionsConfig.d.ts.map +1 -0
  524. package/lib/typescript/helpers/secureKeyValue.d.ts +4 -0
  525. package/lib/typescript/helpers/secureKeyValue.d.ts.map +1 -1
  526. package/lib/typescript/helpers/updateMessagesTillLast.d.ts.map +1 -1
  527. package/lib/typescript/helpers/videoCache.d.ts +19 -0
  528. package/lib/typescript/helpers/videoCache.d.ts.map +1 -0
  529. package/lib/typescript/hooks/useHeapSender.d.ts.map +1 -1
  530. package/lib/typescript/hooks/useLogout.d.ts.map +1 -1
  531. package/lib/typescript/hooks/useMessageHeapState.d.ts.map +1 -1
  532. package/lib/typescript/hooks/useRoomInitialization.d.ts +2 -2
  533. package/lib/typescript/hooks/useRoomInitialization.d.ts.map +1 -1
  534. package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
  535. package/lib/typescript/i18n/strings.d.ts.map +1 -1
  536. package/lib/typescript/main.d.ts +2 -0
  537. package/lib/typescript/main.d.ts.map +1 -1
  538. package/lib/typescript/networking/api-requests/auth.api.d.ts +4 -1
  539. package/lib/typescript/networking/api-requests/auth.api.d.ts.map +1 -1
  540. package/lib/typescript/networking/api-requests/rooms.api.d.ts +22 -1
  541. package/lib/typescript/networking/api-requests/rooms.api.d.ts.map +1 -1
  542. package/lib/typescript/networking/stanzaHandlers.d.ts +4 -2
  543. package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
  544. package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts +3 -1
  545. package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts.map +1 -1
  546. package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts +1 -0
  547. package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts.map +1 -1
  548. package/lib/typescript/networking/xmpp/mamRouter.d.ts +23 -0
  549. package/lib/typescript/networking/xmpp/mamRouter.d.ts.map +1 -0
  550. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts +1 -0
  551. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts.map +1 -1
  552. package/lib/typescript/networking/xmpp/sendMediaMessage.xmpp.d.ts.map +1 -1
  553. package/lib/typescript/networking/xmpp/sendTextMessage.xmpp.d.ts.map +1 -1
  554. package/lib/typescript/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.d.ts.map +1 -1
  555. package/lib/typescript/networking/xmppClient.d.ts +22 -1
  556. package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
  557. package/lib/typescript/roomStore/Middleware/newMessageMidlleware.d.ts.map +1 -1
  558. package/lib/typescript/roomStore/Middleware/perfMiddleware.d.ts +4 -0
  559. package/lib/typescript/roomStore/Middleware/perfMiddleware.d.ts.map +1 -0
  560. package/lib/typescript/roomStore/Middleware/reactionsMiddleware.d.ts +9 -0
  561. package/lib/typescript/roomStore/Middleware/reactionsMiddleware.d.ts.map +1 -1
  562. package/lib/typescript/roomStore/Middleware/unreadMidlleware.d.ts.map +1 -1
  563. package/lib/typescript/roomStore/index.d.ts.map +1 -1
  564. package/lib/typescript/roomStore/persistBackend.d.ts +11 -0
  565. package/lib/typescript/roomStore/persistBackend.d.ts.map +1 -0
  566. package/lib/typescript/roomStore/persistence.d.ts +5 -6
  567. package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
  568. package/lib/typescript/roomStore/roomsSlice.d.ts +41 -1
  569. package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
  570. package/lib/typescript/theme/theme.d.ts +4 -1
  571. package/lib/typescript/theme/theme.d.ts.map +1 -1
  572. package/lib/typescript/types/models/message.model.d.ts +9 -0
  573. package/lib/typescript/types/models/message.model.d.ts.map +1 -1
  574. package/lib/typescript/types/models/room.model.d.ts +21 -0
  575. package/lib/typescript/types/models/room.model.d.ts.map +1 -1
  576. package/lib/typescript/types/models/xmpp.model.d.ts +6 -1
  577. package/lib/typescript/types/models/xmpp.model.d.ts.map +1 -1
  578. package/lib/typescript/types/types.d.ts +19 -3
  579. package/lib/typescript/types/types.d.ts.map +1 -1
  580. package/lib/typescript/utils/devLogger.d.ts +8 -0
  581. package/lib/typescript/utils/devLogger.d.ts.map +1 -1
  582. package/lib/typescript/version.d.ts +1 -1
  583. package/package.json +14 -1
  584. package/src/assets/emojiData.ts +2146 -0
  585. package/src/assets/icons.tsx +32 -5
  586. package/src/components/MainComponents/ChatHeader.tsx +46 -16
  587. package/src/components/MainComponents/ChatRoom.tsx +46 -30
  588. package/src/components/MainComponents/ChatWrapper.tsx +28 -10
  589. package/src/components/MainComponents/EncryptedSendNotice.tsx +35 -0
  590. package/src/components/MainComponents/EncryptionCard.tsx +287 -0
  591. package/src/components/MainComponents/MediaMessage.tsx +5 -0
  592. package/src/components/MainComponents/MessageContainer.tsx +7 -15
  593. package/src/components/MainComponents/MessageList.tsx +96 -43
  594. package/src/components/MainComponents/ReduxWrapper.tsx +5 -0
  595. package/src/components/MainComponents/RoomList.tsx +28 -29
  596. package/src/components/MainComponents/RoomStack.tsx +156 -83
  597. package/src/components/MainComponents/SealedAttachment.tsx +251 -0
  598. package/src/components/MainComponents/SystemMessage.tsx +6 -2
  599. package/src/components/MessageBubble/Avatar.tsx +7 -1
  600. package/src/components/MessageBubble/BottomReplyContainer.tsx +20 -21
  601. package/src/components/MessageBubble/EmojiPickerSheet.tsx +468 -0
  602. package/src/components/MessageBubble/Message.tsx +242 -93
  603. package/src/components/MessageBubble/MessageInteractions.tsx +215 -15
  604. package/src/components/MessageBubble/MessageReaction.tsx +120 -96
  605. package/src/components/MessageBubble/MessageReply.tsx +65 -32
  606. package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +7 -4
  607. package/src/components/Modals/FilePreviewModal/FilePreviewModal.tsx +181 -35
  608. package/src/components/Modals/FilePreviewModal/PdfView.tsx +4 -0
  609. package/src/components/Modals/Modal/SwipeBackLayer.tsx +114 -63
  610. package/src/components/Modals/UserProfileModal/UserProfileModal.tsx +53 -8
  611. package/src/components/Modals/UserSettingsModal/UserSettingsModal.tsx +5 -0
  612. package/src/components/RoomComponents/ChatRoomItem.tsx +34 -15
  613. package/src/components/RoomComponents/LastMessageItem.tsx +5 -0
  614. package/src/components/RoomComponents/styled/LastAudioMessage.tsx +3 -1
  615. package/src/components/RoomComponents/styled/LastMessageEmoji.tsx +7 -8
  616. package/src/components/RoomComponents/styled/LastMessageFile.tsx +2 -2
  617. package/src/components/RoomComponents/styled/LastMessagePhoto.tsx +1 -1
  618. package/src/components/RoomComponents/styled/LastMessageSealed.tsx +31 -0
  619. package/src/components/RoomComponents/styled/LastMessageVideo.tsx +1 -1
  620. package/src/components/Thread/ThreadWrapper.tsx +287 -198
  621. package/src/components/UsersList/UsersList.tsx +2 -1
  622. package/src/components/styled/DateLabel.tsx +7 -3
  623. package/src/components/styled/SendInput.tsx +5 -2
  624. package/src/context/MessageNotificationContext.tsx +205 -7
  625. package/src/context/xmppProvider.tsx +29 -9
  626. package/src/e2ee/crypto.ts +194 -0
  627. package/src/e2ee/deviceStore.ts +80 -0
  628. package/src/e2ee/fileCipher.ts +86 -0
  629. package/src/e2ee/fileEnvelope.ts +115 -0
  630. package/src/e2ee/index.ts +192 -0
  631. package/src/e2ee/limits.ts +2 -0
  632. package/src/e2ee/ns.ts +1 -0
  633. package/src/e2ee/omemo.ts +802 -0
  634. package/src/e2ee/protobuf.ts +188 -0
  635. package/src/e2ee/ratchet.ts +271 -0
  636. package/src/e2ee/sealedBody.ts +17 -0
  637. package/src/e2ee/sealedFiles.ts +181 -0
  638. package/src/e2ee/send.ts +70 -0
  639. package/src/e2ee/stanza.ts +133 -0
  640. package/src/e2ee/store.ts +54 -0
  641. package/src/helpers/accountName.ts +15 -0
  642. package/src/helpers/createMessageFromXml.ts +31 -6
  643. package/src/helpers/createRoomFromApi.tsx +37 -1
  644. package/src/helpers/createUserNameFromSetUser.ts +2 -1
  645. package/src/helpers/displayName.ts +9 -0
  646. package/src/helpers/emoji.ts +39 -0
  647. package/src/helpers/haptics.ts +19 -0
  648. package/src/helpers/historyPreloadScheduler.ts +37 -69
  649. package/src/helpers/insertMessageWithDelimiter.ts +23 -16
  650. package/src/helpers/mamReactions.ts +59 -0
  651. package/src/helpers/parseMessageReference.ts +38 -0
  652. package/src/helpers/persistCrypto.ts +5 -0
  653. package/src/helpers/reactionsConfig.ts +13 -0
  654. package/src/helpers/secureKeyValue.ts +15 -0
  655. package/src/helpers/updateMessagesTillLast.tsx +14 -2
  656. package/src/helpers/videoCache.ts +138 -0
  657. package/src/hooks/useHeapSender.tsx +3 -2
  658. package/src/hooks/useLogout.tsx +9 -0
  659. package/src/hooks/useMessageHeapState.tsx +6 -2
  660. package/src/hooks/useRoomInitialization.tsx +32 -15
  661. package/src/hooks/useSendMessage.tsx +89 -16
  662. package/src/hooks/useUnreadMessagesCounter.ts +1 -1
  663. package/src/i18n/strings.ts +180 -0
  664. package/src/main.ts +2 -0
  665. package/src/networking/api-requests/auth.api.ts +9 -1
  666. package/src/networking/api-requests/rooms.api.ts +121 -18
  667. package/src/networking/stanzaHandlers.ts +116 -60
  668. package/src/networking/xmpp/getHistory.xmpp.ts +44 -106
  669. package/src/networking/xmpp/handleStanzas.xmpp.ts +51 -0
  670. package/src/networking/xmpp/mamRouter.ts +176 -0
  671. package/src/networking/xmpp/presenceInRoom.xmpp.ts +46 -3
  672. package/src/networking/xmpp/sendMediaMessage.xmpp.ts +19 -1
  673. package/src/networking/xmpp/sendTextMessage.xmpp.ts +17 -10
  674. package/src/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.ts +23 -10
  675. package/src/networking/xmppClient.ts +111 -20
  676. package/src/roomStore/Middleware/newMessageMidlleware.tsx +35 -38
  677. package/src/roomStore/Middleware/perfMiddleware.ts +50 -0
  678. package/src/roomStore/Middleware/reactionsMiddleware.tsx +53 -52
  679. package/src/roomStore/Middleware/unreadMidlleware.tsx +92 -80
  680. package/src/roomStore/index.ts +28 -27
  681. package/src/roomStore/persistBackend.ts +93 -0
  682. package/src/roomStore/persistence.ts +295 -73
  683. package/src/roomStore/roomsSlice.ts +304 -155
  684. package/src/theme/theme.ts +10 -1
  685. package/src/types/models/message.model.ts +9 -0
  686. package/src/types/models/room.model.ts +22 -0
  687. package/src/types/models/xmpp.model.ts +4 -2
  688. package/src/types/types.ts +19 -3
  689. package/src/utils/devLogger.ts +16 -0
  690. package/src/version.ts +1 -1
@@ -10,6 +10,7 @@ import { sendTypingRequest } from './xmpp/sendTypingRequest.xmpp';
10
10
  import { sendPing } from './xmpp/sendPing.xmpp';
11
11
  import { getHistory } from './xmpp/getHistory.xmpp';
12
12
  import { sendTextMessage } from './xmpp/sendTextMessage.xmpp';
13
+ import { sendMessageReaction } from './xmpp/sendMessageReaction.xmpp';
13
14
  import { sendTextMessageWithTranslateTag } from './xmpp/sendTextMessageWithTranslateTag.xmpp';
14
15
  import { deleteMessage } from './xmpp/deleteMessage.xmpp';
15
16
  import { presenceInRoom } from './xmpp/presenceInRoom.xmpp';
@@ -23,7 +24,8 @@ import { editMessage } from './xmpp/editMessage.xmpp';
23
24
  import { inviteRoomRequest } from './xmpp/inviteRoomRequest.xmpp';
24
25
  import { getRooms } from './xmpp/getRooms.xmpp';
25
26
  import { handleStanza } from './xmpp/handleStanzas.xmpp';
26
- import { pushLog as devPushLog } from '../utils/devLogger';
27
+ import { onOnline as e2eeOnOnline } from '../e2ee';
28
+ import { pushLog as devPushLog, isDevLogActive } from '../utils/devLogger';
27
29
  import { normalizeRoomJid } from '../helpers/normalizeRoomJid';
28
30
  import { store } from '../roomStore';
29
31
  import { applyPrivateStoreMarkers } from '../roomStore/roomsSlice';
@@ -69,6 +71,11 @@ function withTimeout(promise: Promise<unknown>, ms: number): Promise<void> {
69
71
  // where it fails — XMPPError on stream:error, SASLError on SASL bind, or
70
72
  // a generic Error whose message contains "not-authorized". Match all of
71
73
  // them so we trigger the credentials refresh path consistently.
74
+ // Failed XMPP-password recoveries in a row before the session is ended.
75
+ const AUTH_RECOVERY_MAX_FAILURES = 2;
76
+ // Rejections (each with a fresh password) before the password counts as lost.
77
+ const AUTH_REJECTIONS_LIMIT = 3;
78
+
72
79
  function isNotAuthorizedError(err: any): boolean {
73
80
  if (!err) {return false;}
74
81
  const condition =
@@ -90,6 +97,10 @@ interface HistoryOptions {
90
97
  coalesceRoom?: boolean;
91
98
  skipIfPreloaded?: boolean;
92
99
  source?: HistorySource;
100
+ /** The caller merges the returned page into the store itself (the
101
+ * preload scheduler and the catch-up pass do, to detect gaps); the MAM
102
+ * router then does not apply it. Default: applied by the router. */
103
+ selfApplied?: boolean;
93
104
  }
94
105
 
95
106
  interface MamInFlightEntry {
@@ -185,6 +196,42 @@ export class XmppClient {
185
196
  * (REST JWT, /users/client, etc.) and returning the resulting
186
197
  * username + password.
187
198
  */
199
+ /**
200
+ * Called once when the session's XMPP password is lost for good: the
201
+ * server rejected it (SASL not-authorized) and the refresh chain could
202
+ * not produce a working one — the refresh request failed, came back
203
+ * without a new password, or the new one was rejected too. Network
204
+ * outages never get here (no rejection without a reachable server).
205
+ */
206
+ private authLostHandler: (() => void) | null = null;
207
+ private authRecoveryFailures = 0;
208
+ private authLostFired = false;
209
+ // Rejections since the stream was last online — catches a refresh that
210
+ // keeps returning NEW passwords the server still rejects.
211
+ private authRejectionsSinceOnline = 0;
212
+
213
+ setAuthLostHandler(handler: (() => void) | null) {
214
+ this.authLostHandler = handler;
215
+ }
216
+
217
+ private markAuthRecoveryFailed(reason: string) {
218
+ this.authRecoveryFailures += 1;
219
+ console.warn(
220
+ `[xmpp] XMPP password recovery failed (${reason}), attempt ${this.authRecoveryFailures}`
221
+ );
222
+ // One retry before giving up, so a single REST hiccup does not end the
223
+ // session; a second failure in a row means the password is gone.
224
+ if (this.authRecoveryFailures >= AUTH_RECOVERY_MAX_FAILURES && !this.authLostFired) {
225
+ this.authLostFired = true;
226
+ this.suppressReconnect = true;
227
+ try {
228
+ this.authLostHandler?.();
229
+ } catch (e) {
230
+ console.warn('[xmpp] auth-lost handler threw', e);
231
+ }
232
+ }
233
+ }
234
+
188
235
  setCredentialsProvider(provider: XmppCredentialsProvider | null) {
189
236
  this.credentialsProvider = provider;
190
237
  }
@@ -286,8 +333,9 @@ export class XmppClient {
286
333
  before?: number;
287
334
  id?: string;
288
335
  source?: HistorySource;
336
+ selfApplied?: boolean;
289
337
  }): Promise<any> {
290
- const { chatJID, max, before, id, source = 'default' } = params;
338
+ const { chatJID, max, before, id, source = 'default', selfApplied } = params;
291
339
 
292
340
  // Coalesce — if a fetch for the same room is in-flight, reuse it
293
341
  // unless the new request is higher priority.
@@ -315,7 +363,9 @@ export class XmppClient {
315
363
  const handle: { p?: Promise<any> } = {};
316
364
  handle.p = (async () => {
317
365
  try {
318
- return await getHistory(this.client, chatJID, max, before, id);
366
+ return await getHistory(this.client, chatJID, max, before, id, {
367
+ selfApplied,
368
+ });
319
369
  } finally {
320
370
  const cur = this.mamInFlightByRoom.get(chatJID);
321
371
  if (cur && cur.promise === handle.p) {
@@ -383,7 +433,7 @@ export class XmppClient {
383
433
  // Raising the cap silences the warning without masking real leaks
384
434
  // — true leaks would still grow unboundedly past this number.
385
435
  try {
386
- (this.client as any)?.setMaxListeners?.(50);
436
+ (this.client as any)?.setMaxListeners?.(120);
387
437
  } catch {}
388
438
 
389
439
  // Wrap `send` so the dev logger sees outgoing stanzas too.
@@ -395,7 +445,7 @@ export class XmppClient {
395
445
  const origSend = this.client.send?.bind(this.client);
396
446
  if (origSend) {
397
447
  const wrapped = (stanza: any) => {
398
- try {
448
+ if (isDevLogActive()) {try {
399
449
  const tag = stanza?.name || 'stanza';
400
450
  const id = stanza?.attrs?.id || '';
401
451
  const to = stanza?.attrs?.to || '';
@@ -404,7 +454,7 @@ export class XmppClient {
404
454
  `→ ${tag}${id ? ` id=${id}` : ''}${to ? ` to=${to.split('/')[0]}` : ''}`,
405
455
  stanza?.toString ? stanza.toString() : undefined
406
456
  );
407
- } catch {}
457
+ } catch {}}
408
458
  const result = origSend(stanza);
409
459
  // Most stanza helpers fire-and-forget `client.send(...)`
410
460
  // without awaiting/catching. On @xmpp/client builds where
@@ -438,6 +488,7 @@ export class XmppClient {
438
488
  console.error('Error starting xmpp client:', error);
439
489
  if (isNotAuthorizedError(error)) {
440
490
  this.lastAuthError = 'not-authorized';
491
+ this.authRejectionsSinceOnline += 1;
441
492
  }
442
493
  this.status = 'error';
443
494
  // A connect-time failure lands in 'error', which — unlike a
@@ -497,6 +548,8 @@ export class XmppClient {
497
548
  this.onOnline = () => {
498
549
  console.log('XMPP online.', new Date());
499
550
  this.status = 'online';
551
+ this.authRecoveryFailures = 0;
552
+ this.authRejectionsSinceOnline = 0;
500
553
  this.presencesReady = true;
501
554
  this.reconnectAttempts = 0;
502
555
  try {
@@ -517,6 +570,11 @@ export class XmppClient {
517
570
  } catch (err) {
518
571
  console.warn('onOnline callback failed', err);
519
572
  }
573
+ try {
574
+ e2eeOnOnline(this.client);
575
+ } catch (err) {
576
+ console.warn('e2ee onOnline failed', err);
577
+ }
520
578
  // Drain any sends that were buffered while the stream was down. The
521
579
  // presence stanzas from onOnlineCallback above were written to the
522
580
  // socket synchronously (allRoomPresences → presenceInRoom send the
@@ -534,6 +592,7 @@ export class XmppClient {
534
592
  console.error('XMPP client error:', error);
535
593
  if (isNotAuthorizedError(error)) {
536
594
  this.lastAuthError = 'not-authorized';
595
+ this.authRejectionsSinceOnline += 1;
537
596
  }
538
597
  try {
539
598
  devPushLog(
@@ -545,7 +604,7 @@ export class XmppClient {
545
604
  };
546
605
 
547
606
  this.onStanza = (stanza: any) => {
548
- try {
607
+ if (isDevLogActive()) {try {
549
608
  const tag = stanza?.name || 'stanza';
550
609
  const id = stanza?.attrs?.id || '';
551
610
  const from = stanza?.attrs?.from || '';
@@ -555,7 +614,7 @@ export class XmppClient {
555
614
  `← ${tag}${id ? ` id=${id}` : ''}${type ? ` type=${type}` : ''}${from ? ` from=${from.split('/')[0]}` : ''}`,
556
615
  stanza?.toString ? stanza.toString() : undefined
557
616
  );
558
- } catch {}
617
+ } catch {}}
559
618
  handleStanza.bind(this, stanza, this)();
560
619
  };
561
620
 
@@ -739,16 +798,29 @@ export class XmppClient {
739
798
  CREDENTIALS_REFRESH_MIN_INTERVAL_MS;
740
799
 
741
800
  if (this.credentialsProvider && (authFailed || staleCreds)) {
801
+ const rejectedPassword = authFailed ? this.password : null;
742
802
  try {
743
803
  await this.refreshCredentialsOnce();
804
+ // The server said this password is wrong and the refresh handed
805
+ // back nothing new: there is no working password to connect with.
806
+ if (rejectedPassword !== null && (!this.password || this.password === rejectedPassword)) {
807
+ this.markAuthRecoveryFailed('no new XMPP password after refresh');
808
+ } else if (this.authRejectionsSinceOnline >= AUTH_REJECTIONS_LIMIT) {
809
+ this.markAuthRecoveryFailed('refreshed XMPP password rejected again');
810
+ }
744
811
  } catch (err) {
745
- // Offline is the common case here — reconnect with what we
746
- // have and let the next attempt try again.
747
- console.warn(
748
- 'XMPP credential refresh failed; reconnecting with cached creds',
749
- err
750
- );
812
+ if (rejectedPassword !== null) {
813
+ this.markAuthRecoveryFailed('refresh request failed');
814
+ } else {
815
+ // Offline is the common case here — reconnect with what we
816
+ // have and let the next attempt try again.
817
+ console.warn(
818
+ 'XMPP credential refresh failed; reconnecting with cached creds',
819
+ err
820
+ );
821
+ }
751
822
  }
823
+ if (this.suppressReconnect) {return;}
752
824
  }
753
825
 
754
826
  // Tear the OLD underlying client down FULLY before spinning up a new
@@ -903,6 +975,16 @@ export class XmppClient {
903
975
  }
904
976
 
905
977
  getRoomsStanza = async () => {
978
+ // Asked while the socket is down (mid-reconnect) this used to throw
979
+ // "Cannot read property 'write' of null". Wait for the stream instead;
980
+ // if it does not come back, skip — the reconnect hook re-syncs rooms.
981
+ if (this.status !== 'online') {
982
+ try {
983
+ await this.waitForOnline(15000);
984
+ } catch {
985
+ return;
986
+ }
987
+ }
906
988
  await getRooms(this.client);
907
989
  };
908
990
 
@@ -938,9 +1020,12 @@ export class XmppClient {
938
1020
  before,
939
1021
  id,
940
1022
  source: options?.source || 'default',
1023
+ selfApplied: options?.selfApplied,
941
1024
  });
942
1025
  }
943
- return await getHistory(this.client, chatJID, max, before, id);
1026
+ return await getHistory(this.client, chatJID, max, before, id, {
1027
+ selfApplied: options?.selfApplied,
1028
+ });
944
1029
  };
945
1030
 
946
1031
  getLastMessageArchiveStanza(roomJID: string) {
@@ -1194,12 +1279,18 @@ export class XmppClient {
1194
1279
  }
1195
1280
 
1196
1281
  sendMessageReactionStanza(
1197
- _messageId: string,
1198
- _roomJid: string,
1199
- _reactionsList: string[],
1200
- _reactionSymbol?: string
1282
+ messageId: string,
1283
+ roomJid: string,
1284
+ reactionsList: string[],
1285
+ data?: { firstName?: string; lastName?: string }
1201
1286
  ) {
1202
- console.warn('sendMessageReactionStanza: not implemented in RN xmpp client');
1287
+ sendMessageReaction(
1288
+ this.client,
1289
+ messageId,
1290
+ normalizeRoomJid(roomJid, this.conference),
1291
+ reactionsList,
1292
+ data || {}
1293
+ );
1203
1294
  }
1204
1295
 
1205
1296
  // Sends a groupchat message carrying a `<translate source="xx"/>` tag so
@@ -1,8 +1,7 @@
1
1
  import { Middleware } from '@reduxjs/toolkit';
2
- import { updateRoom } from '../roomsSlice';
3
2
  import { clearMessageFailure } from '../roomHeapSlice';
4
3
  import { removeOutboundSend } from '../../networking/outboundQueue';
5
- import { IRoom } from '../../types/types';
4
+ import { IMessage } from '../../types/types';
6
5
 
7
6
  export const newMessageMidlleware: Middleware =
8
7
  (storeAPI) => (next) => (action: any) => {
@@ -11,7 +10,9 @@ export const newMessageMidlleware: Middleware =
11
10
  return next(action);
12
11
  }
13
12
 
14
- if (action.type !== 'roomMessages/addRoomMessage') {
13
+ const isSingle = action.type === 'roomMessages/addRoomMessage';
14
+ const isBatch = action.type === 'roomMessages/addRoomMessages';
15
+ if (!isSingle && !isBatch) {
15
16
  return next(action);
16
17
  }
17
18
 
@@ -22,48 +23,44 @@ export const newMessageMidlleware: Middleware =
22
23
 
23
24
  const result = next(action);
24
25
  const state = storeAPI.getState();
25
- const rooms: { [jid: string]: IRoom } = state.rooms.rooms;
26
-
27
- const { roomJID, message } = action.payload;
28
-
29
- // Un-fail on confirmed delivery. A server-confirmed copy (echo or MAM
30
- // history, never `pending`) arriving for a message we'd flagged failed
31
- // means the send actually went through — e.g. a slow send that completed
32
- // just after the 5s watchdog window, or a queued auto-resend landing on
33
- // reconnect. The failed flag is keyed by our optimistic/stanza id, which
34
- // the echo carries back as `id`/`xmppId`, so clear it here and let the
35
- // bubble flip to delivered instead of staying stuck on "Failed".
36
- if (message && !message.pending) {
37
- // The confirmed copy carries our optimistic/stanza id back as id/xmppId.
38
- // Drop any still-buffered replay for it so a later reconnect flush can't
39
- // re-send an already-delivered message.
40
- removeOutboundSend(message.id);
41
- removeOutboundSend(message.xmppId);
42
-
43
- const failedMap = state.roomHeapSlice?.failedMessages || {};
44
- const failedKey = [message.id, message.xmppId].find(
45
- (k: string | undefined) => k && failedMap[k]
46
- );
47
- if (failedKey) {
48
- storeAPI.dispatch(clearMessageFailure(failedKey as string));
49
- }
50
- }
51
26
 
52
- if ((rooms[roomJID]?.lastMessageTimestamp ?? 0) <= Number(message.id)) {
53
- storeAPI.dispatch(
54
- updateRoom({
55
- jid: roomJID,
56
- updates: { lastMessageTimestamp: Number(message.id) ?? 0 },
57
- })
58
- );
27
+ // `lastMessageTimestamp` is now bumped inside the reducer itself (no
28
+ // second `updateRoom` pass per message). What is left here are the
29
+ // side effects outside the rooms slice.
30
+ const messages: IMessage[] = isBatch
31
+ ? action.payload.messages || []
32
+ : [action.payload.message];
33
+ const failedMap = state.roomHeapSlice?.failedMessages || {};
34
+
35
+ for (const message of messages) {
36
+ // Un-fail on confirmed delivery. A server-confirmed copy (echo or MAM
37
+ // history, never `pending`) arriving for a message we'd flagged failed
38
+ // means the send actually went through — e.g. a slow send that completed
39
+ // just after the 5s watchdog window, or a queued auto-resend landing on
40
+ // reconnect. The failed flag is keyed by our optimistic/stanza id, which
41
+ // the echo carries back as `id`/`xmppId`, so clear it here and let the
42
+ // bubble flip to delivered instead of staying stuck on "Failed".
43
+ if (message && !message.pending) {
44
+ // The confirmed copy carries our optimistic/stanza id back as id/xmppId.
45
+ // Drop any still-buffered replay for it so a later reconnect flush can't
46
+ // re-send an already-delivered message.
47
+ removeOutboundSend(message.id);
48
+ if (message.xmppId) {removeOutboundSend(message.xmppId);}
49
+
50
+ const failedKey = [message.id, message.xmppId].find(
51
+ (k: string | undefined) => k && failedMap[k]
52
+ );
53
+ if (failedKey) {
54
+ storeAPI.dispatch(clearMessageFailure(failedKey as string));
55
+ }
56
+ }
59
57
  }
60
58
 
61
59
  return result;
62
60
  };
63
61
 
64
62
  // import { Middleware, PayloadAction } from '@reduxjs/toolkit';
65
- // import { updateRoom } from '../roomsSlice';
66
- // import { AddRoomMessageAction, IRoom } from '../../types/types';
63
+ // // import { AddRoomMessageAction, IRoom } from '../../types/types';
67
64
  // import { nanoToMs } from '../../helpers/nanoToMs';
68
65
 
69
66
  // export const newMessageMidlleware: Middleware =
@@ -0,0 +1,50 @@
1
+ import { Middleware } from '@reduxjs/toolkit';
2
+
3
+ declare const __DEV__: boolean | undefined;
4
+
5
+ /**
6
+ * Dev-only store profiler: counts dispatches and the time the reducer +
7
+ * middleware chain spent on them, and prints a one-line summary every
8
+ * 10 s while there was activity. Reads as
9
+ * [perf] 10s: 143 actions, 212ms in store, top: roomMessages/addRoomMessages×12 (90ms) …
10
+ * No-op (and not even installed) in release builds.
11
+ */
12
+ const WINDOW_MS = 10000;
13
+
14
+ let count = 0;
15
+ let totalMs = 0;
16
+ let byType: Record<string, { n: number; ms: number }> = {};
17
+ let timer: ReturnType<typeof setTimeout> | null = null;
18
+
19
+ const flush = () => {
20
+ timer = null;
21
+ if (count === 0) {return;}
22
+ const top = Object.entries(byType)
23
+ .sort((a, b) => b[1].ms - a[1].ms)
24
+ .slice(0, 4)
25
+ .map(([type, v]) => `${type}×${v.n} (${v.ms.toFixed(0)}ms)`)
26
+ .join(', ');
27
+ console.log(
28
+ `[perf] ${WINDOW_MS / 1000}s: ${count} actions, ${totalMs.toFixed(0)}ms in store, top: ${top}`
29
+ );
30
+ count = 0;
31
+ totalMs = 0;
32
+ byType = {};
33
+ };
34
+
35
+ export const perfMiddleware: Middleware = () => (next) => (action: any) => {
36
+ const start = Date.now();
37
+ const result = next(action);
38
+ const ms = Date.now() - start;
39
+ count += 1;
40
+ totalMs += ms;
41
+ const type = action?.type || '?';
42
+ const entry = byType[type] || (byType[type] = { n: 0, ms: 0 });
43
+ entry.n += 1;
44
+ entry.ms += ms;
45
+ if (!timer) {timer = setTimeout(flush, WINDOW_MS);}
46
+ return result;
47
+ };
48
+
49
+ export const isPerfProfilingEnabled = () =>
50
+ typeof __DEV__ !== 'undefined' && __DEV__ === true;
@@ -1,77 +1,78 @@
1
- import { Middleware, PayloadAction } from '@reduxjs/toolkit';
1
+ import { Middleware } from '@reduxjs/toolkit';
2
2
  import { updateRoom } from '../roomsSlice';
3
- import { IRoom, ReactionAction } from '../../types/types';
4
- import { nanoToMs } from '../../helpers/nanoToMs';
3
+ import { IMessage, IRoom } from '../../types/types';
5
4
 
5
+ /**
6
+ * Keeps the room-list preview in step with reactions (as on web): the
7
+ * newest event in a room being a reaction shows "Ann: 👍"; a reactor
8
+ * clearing theirs puts the last real message back.
9
+ *
10
+ * Timestamps here are the server's stanza ids, the same unit as
11
+ * `lastMessageTimestamp` (set from message ids in the reducer), so a
12
+ * reaction older than the room's latest message never takes the preview.
13
+ */
6
14
  export const reactionsMiddleware: Middleware =
7
15
  (storeAPI) => (next) => (action: any) => {
8
- if (action.type !== 'roomMessages/setReactions') {
16
+ if (action?.type !== 'roomMessages/setReactions') {
9
17
  return next(action);
10
18
  }
11
-
12
19
  if (!action.payload || typeof action.payload !== 'object') {
13
20
  console.error('Invalid action payload for setReactions:', action);
14
21
  return next(action);
15
22
  }
16
-
17
23
  const result = next(action);
18
- const state = storeAPI.getState();
19
- const rooms: { [jid: string]: IRoom } = state.rooms.rooms;
20
- const { roomJID, reactions, latestReactionTimestamp, data, ...rest } =
21
- action.payload;
24
+ try {
25
+ const payload = action.payload || {};
26
+ const { roomJID, reactions, latestReactionTimestamp, data } = payload;
27
+ const room: IRoom | undefined = storeAPI.getState().rooms?.rooms?.[roomJID];
28
+ if (!room) {return result;}
22
29
 
23
- const updLastMessage = () => {
24
- if (!reactions?.[0]) {
25
- const newLastMessage =
26
- rooms[roomJID].messages[rooms[roomJID].messages.length - 1];
30
+ const ts = Number(latestReactionTimestamp) || 0;
31
+ const roomTs = Number(room.lastMessageTimestamp) || 0;
27
32
 
33
+ if (Array.isArray(reactions) && reactions[0]) {
34
+ // Only the newest event in the room may become the preview.
35
+ if (!ts || ts < roomTs) {return result;}
36
+ const name = `${data?.senderFirstName || ''} ${data?.senderLastName || ''}`.trim();
28
37
  storeAPI.dispatch(
29
38
  updateRoom({
30
39
  jid: roomJID,
31
40
  updates: {
32
- lastMessageTimestamp: nanoToMs(
33
- rooms[roomJID].messages[rooms[roomJID].messages.length - 1].id
34
- ) ?? 0,
35
- lastMessage: newLastMessage as any,
41
+ lastMessageTimestamp: ts,
42
+ lastMessage: {
43
+ id: `reaction-${ts}`,
44
+ body: reactions[0],
45
+ emoji: reactions[0],
46
+ user: { id: `emoji-${ts}`, name },
47
+ date: new Date(Math.floor(ts / 1000)).toISOString(),
48
+ } as any,
36
49
  },
37
50
  })
38
51
  );
39
- } else {
40
- const updates = {
41
- lastMessageTimestamp: nanoToMs(latestReactionTimestamp) ?? 0,
42
- lastMessage: {
43
- ...rest,
44
- body: reactions[0],
45
- emoji: reactions[0],
46
- user: {
47
- name: `${data.senderFirstName} ${data.senderLastName}`,
48
- id: `emoji-${new Date().toString()}`,
49
- },
50
- date: new Date(nanoToMs(latestReactionTimestamp) ?? 0).toISOString(),
51
- },
52
- };
53
-
54
- storeAPI.dispatch(
55
- updateRoom({
56
- jid: roomJID,
57
- updates: updates as any,
58
- })
59
- );
52
+ return result;
60
53
  }
61
- };
62
-
63
- if (!rooms[roomJID]) {
64
- console.warn(`Room ${roomJID} not found in reactions middleware`);
65
- return result;
66
- }
67
54
 
68
- if (
69
- (rooms[roomJID]?.lastMessageTimestamp ?? 0) <= (nanoToMs(latestReactionTimestamp) ?? 0)
70
- ) {
71
- updLastMessage();
72
- } else if (!rooms[roomJID]?.lastMessageTimestamp) {
73
- updLastMessage();
55
+ // A reaction was cleared: if the preview was a reaction, fall back to
56
+ // the newest real message (the room may have none loaded yet).
57
+ if (!(room.lastMessage as any)?.emoji) {return result;}
58
+ const messages: IMessage[] = room.messages || [];
59
+ let last: IMessage | undefined;
60
+ for (let i = messages.length - 1; i >= 0; i--) {
61
+ const m = messages[i];
62
+ if (m && m.id !== 'delimiter-new' && !m.isDeleted) {
63
+ last = m;
64
+ break;
65
+ }
66
+ }
67
+ storeAPI.dispatch(
68
+ updateRoom({
69
+ jid: roomJID,
70
+ updates: { lastMessage: (last as any) ?? undefined },
71
+ })
72
+ );
73
+ } catch (e) {
74
+ // A preview update must never break the action that carried it.
75
+ console.warn('reactionsMiddleware: preview update failed', e);
74
76
  }
75
-
76
77
  return result;
77
78
  };