@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
@@ -1,6 +1,6 @@
1
1
  import { ApiRoom, DeleteRoomMember, PostAddRoomMember, PostReportRoom, PostRoom, RoomMember } from '../../types/models/room.model';
2
2
  import { store } from '../../roomStore';
3
- import { addRoom, mergeUsersSet } from '../../roomStore/roomsSlice';
3
+ import { addRoom, mergeUsersSet, updateRoom } from '../../roomStore/roomsSlice';
4
4
  import { IRoom } from '../../types/types';
5
5
  import http from '../apiClient';
6
6
 
@@ -19,6 +19,11 @@ import http from '../apiClient';
19
19
  * - `_id` (fallback)
20
20
  * - `xmppUsername` (raw + localpart) when the API does return one
21
21
  */
22
+ const usableImage = (value: unknown): string => {
23
+ const url = typeof value === 'string' ? value.trim() : '';
24
+ return url && url !== 'none' ? url : '';
25
+ };
26
+
22
27
  function dispatchUsersSetFromRestItems(items: ApiRoom[]): void {
23
28
  if (!items?.length) {return;}
24
29
  const ownXmpp = String(
@@ -26,16 +31,24 @@ function dispatchUsersSetFromRestItems(items: ApiRoom[]): void {
26
31
  );
27
32
  const appId = ownXmpp.includes('_') ? ownXmpp.split('_')[0] : '';
28
33
 
34
+ const known = (store.getState().rooms?.usersSet || {}) as Record<string, RoomMember>;
29
35
  const members: Record<string, RoomMember> = {};
30
36
  for (const item of items) {
31
37
  const list = Array.isArray((item as any)?.members) ? (item as any).members : [];
32
38
  for (const m of list) {
33
39
  if (!m) {continue;}
40
+ const before: RoomMember | undefined =
41
+ (m._id && (members[m._id] || known[m._id])) || undefined;
34
42
  const entry: RoomMember = {
35
- firstName: m.firstName || '',
36
- lastName: m.lastName || '',
43
+ firstName: m.firstName ?? before?.firstName ?? '',
44
+ lastName: m.lastName ?? before?.lastName ?? '',
37
45
  xmppUsername: m.xmppUsername || (appId && m._id ? `${appId}_${m._id}` : m._id || ''),
38
46
  _id: m._id || '',
47
+ profileImage:
48
+ m.profileImage !== undefined
49
+ ? usableImage(m.profileImage)
50
+ : before?.profileImage ?? '',
51
+ description: m.description ?? before?.description,
39
52
  role: m.role,
40
53
  ban_status: m.ban_status,
41
54
  last_active: m.last_active,
@@ -85,9 +98,53 @@ interface ApiRoomMember {
85
98
  * manifested as a phantom "ethora" room stub on third-party servers,
86
99
  * customer-reported #23)
87
100
  */
101
+ export function memberAccount(member: any, appId: string): string {
102
+ const explicit = String(member?.xmppUsername || '').split('@')[0];
103
+ if (explicit) {return explicit;}
104
+ return appId && member?._id ? `${appId}_${member._id}` : '';
105
+ }
106
+
107
+ export function ownAppId(): string {
108
+ const ownXmpp = String(
109
+ store.getState().chatSettingStore?.user?.xmppUsername || ''
110
+ );
111
+ return ownXmpp.includes('_') ? ownXmpp.split('_')[0]! : '';
112
+ }
113
+
114
+ const toRoomMembers = (members: any[] | undefined): RoomMember[] => {
115
+ const known = (store.getState().rooms?.usersSet || {}) as Record<string, RoomMember>;
116
+ return (members || []).map((m: any) => ({
117
+ firstName: m.firstName,
118
+ lastName: m.lastName,
119
+ profileImage:
120
+ m.profileImage !== undefined
121
+ ? usableImage(m.profileImage)
122
+ : known[m._id]?.profileImage ?? '',
123
+ xmppUsername: m._id || '',
124
+ role: m.role,
125
+ ban_status: m.ban_status,
126
+ last_active: m.last_active,
127
+ jid: m.jid || '',
128
+ })) as any;
129
+ };
130
+
131
+ const toE2eeMembers = (members: any[] | undefined, appId: string): RoomMember[] =>
132
+ (members || [])
133
+ .map((m: any) => ({
134
+ _id: m._id || '',
135
+ firstName: m.firstName || '',
136
+ lastName: m.lastName || '',
137
+ xmppUsername: memberAccount(m, appId),
138
+ }))
139
+ .filter((m) => m.xmppUsername) as RoomMember[];
140
+
141
+ const memberCount = (item: ApiRoom): number =>
142
+ item.usersCnt ?? item.participants ?? item.members?.length ?? 0;
143
+
88
144
  function dispatchRoomsFromRestItems(items: ApiRoom[]): void {
89
145
  if (!items?.length) return;
90
146
  const config = store.getState().chatSettingStore?.config as any;
147
+ const appId = ownAppId();
91
148
  // Best: explicit xmpp settings.
92
149
  let host: string | undefined =
93
150
  config?.xmppSettings?.host ||
@@ -118,12 +175,16 @@ function dispatchRoomsFromRestItems(items: ApiRoom[]): void {
118
175
  jid = `${item.name}@${conference}`;
119
176
  }
120
177
  if (!jid.includes('@')) continue;
178
+ const known = store.getState().rooms.rooms?.[jid];
179
+ const preview = (item.members?.length ?? 0) < memberCount(item);
180
+ const keep = <T,>(fresh: T[], existing: T[] | undefined): T[] =>
181
+ preview && (existing?.length ?? 0) > fresh.length ? existing! : fresh;
121
182
  const room: IRoom = {
122
183
  id: item._id || jid,
123
184
  jid,
124
185
  name: item.name,
125
186
  title: item.title || item.name,
126
- usersCnt: item.participants ?? item.members?.length ?? 0,
187
+ usersCnt: memberCount(item),
127
188
  messages: [],
128
189
  isLoading: false,
129
190
  roomBg: '',
@@ -133,18 +194,14 @@ function dispatchRoomsFromRestItems(items: ApiRoom[]): void {
133
194
  muted: item.muted === true,
134
195
  description: (item as any).description,
135
196
  type: (item as any).type,
136
- // ChatProfileModal renders this list under the description/type
137
- // fields. The REST API returns `members` (an array of {_id,
138
- // firstName?, lastName?}); map to the shape RoomMember expects.
139
- roomMembers: (item.members || []).map((m: any) => ({
140
- firstName: m.firstName,
141
- lastName: m.lastName,
142
- xmppUsername: m._id || '',
143
- role: m.role,
144
- ban_status: m.ban_status,
145
- last_active: m.last_active,
146
- jid: m.jid || '',
147
- })) as any,
197
+
198
+ ...(item.e2ee === true
199
+ ? {
200
+ e2ee: true,
201
+ members: keep(toE2eeMembers(item.members, appId), known?.members),
202
+ }
203
+ : {}),
204
+ roomMembers: keep(toRoomMembers(item.members), known?.roomMembers),
148
205
  };
149
206
  store.dispatch(addRoom({ roomData: room }));
150
207
  }
@@ -152,6 +209,51 @@ function dispatchRoomsFromRestItems(items: ApiRoom[]): void {
152
209
  dispatchUsersSetFromRestItems(items);
153
210
  }
154
211
 
212
+ const ROOM_MEMBERS_TTL_MS = 5 * 60_000;
213
+ const roomMembersLoads = new Map<string, { at: number; done: Promise<boolean> }>();
214
+
215
+ export function loadRoomMembers(roomJid: string): Promise<boolean> {
216
+ const jid = String(roomJid || '').split('/')[0]!;
217
+ const room = store.getState().rooms.rooms?.[jid];
218
+ if (!room) {return Promise.resolve(false);}
219
+ if ((room.roomMembers?.length ?? 0) >= Number(room.usersCnt || 0)) {
220
+ return Promise.resolve(false);
221
+ }
222
+ const running = roomMembersLoads.get(jid);
223
+ if (running && Date.now() - running.at < ROOM_MEMBERS_TTL_MS) {return running.done;}
224
+
225
+ const done = (async () => {
226
+ try {
227
+ const response: any = await getRoomByName(jid.split('@')[0]!);
228
+ const item: ApiRoom = response?.result ?? response;
229
+ const members = Array.isArray(item?.members) ? item.members : [];
230
+ if (members.length === 0) {return false;}
231
+ dispatchUsersSetFromRestItems([item]);
232
+ const current = store.getState().rooms.rooms?.[jid];
233
+ if (!current) {return false;}
234
+ store.dispatch(
235
+ updateRoom({
236
+ jid,
237
+ updates: {
238
+ roomMembers: toRoomMembers(members),
239
+ usersCnt: Math.max(memberCount(item), members.length),
240
+ ...(current.e2ee
241
+ ? { members: toE2eeMembers(members, ownAppId()) }
242
+ : {}),
243
+ },
244
+ })
245
+ );
246
+ return true;
247
+ } catch (error) {
248
+ roomMembersLoads.delete(jid);
249
+ console.warn('[ethora-rn] rooms.api: could not load room members', jid, error);
250
+ return false;
251
+ }
252
+ })();
253
+ roomMembersLoads.set(jid, { at: Date.now(), done });
254
+ return done;
255
+ }
256
+
155
257
  const GET_ROOMS_CACHE_MS = 60_000;
156
258
  let getRoomsInFlight: Promise<{ items: ApiRoom[] }> | null = null;
157
259
  let getRoomsInFlightToken = '';
@@ -235,14 +337,14 @@ export async function postRoom(data: PostRoom) {
235
337
 
236
338
  export async function postPrivateRoom(
237
339
  username: string,
238
- title: string = 'Private chat'
340
+ e2ee: boolean = false
239
341
  ): Promise<ApiRoom> {
240
342
  const token = store.getState().chatSettingStore.user.token || '';
241
343
 
242
344
  try {
243
345
  const response = await http.post(
244
346
  '/v1/chats/private',
245
- { username },
347
+ e2ee === true ? { username, e2ee: true } : { username },
246
348
  {
247
349
  headers: {
248
350
  Authorization: token,
@@ -391,6 +493,7 @@ export async function createChatCall(
391
493
  }
392
494
 
393
495
  export function clearRoomsRestCache() {
496
+ roomMembersLoads.clear();
394
497
  lastGetRoomsResponse = null;
395
498
  lastGetRoomsResponseAt = 0;
396
499
  lastGetRoomsResponseToken = '';
@@ -1,15 +1,22 @@
1
1
  import { Element } from 'ltx';
2
2
  import { store } from '../roomStore';
3
3
  import {
4
- addRoom,
4
+ claimMamResult,
5
+ collectMamMessage,
6
+ collectMamReaction,
7
+ } from './xmpp/mamRouter';
8
+ import { extractReaction } from '../helpers/mamReactions';
9
+ import {
10
+ addRooms,
5
11
  addRoomMessage,
6
12
  deleteRoomMessage,
7
13
  editRoomMessage,
8
14
  setComposing,
9
15
  setCurrentRoom,
10
16
  setRoomRole,
17
+ setReactions,
11
18
  } from '../roomStore/roomsSlice';
12
- import { IRoom } from '../types/types';
19
+ import { IMessage, IRoom } from '../types/types';
13
20
  import { createMessageFromXml } from '../helpers/createMessageFromXml';
14
21
  import { getDataFromXml } from '../helpers/getDataFromXml';
15
22
  import { setDeleteModal } from '../roomStore/chatSettingsSlice';
@@ -33,7 +40,8 @@ const onRealtimeMessage = async (stanza: Element) => {
33
40
  !stanza.getChild('paused') &&
34
41
  !stanza.getChild('subject') &&
35
42
  !stanza.is('iq') &&
36
- stanza.attrs.id !== 'deleteMessageStanza'
43
+ stanza.attrs.id !== 'deleteMessageStanza' &&
44
+ !stanza.getChild('reactions')
37
45
  ) {
38
46
  const body = stanza?.getChild('body');
39
47
  const archived = stanza?.getChild('archived');
@@ -47,8 +55,6 @@ const onRealtimeMessage = async (stanza: Element) => {
47
55
  ?.getChild('deleted');
48
56
 
49
57
  if (!data) {
50
- console.log(stanza.toString());
51
- console.log('Missing data elements in real-time message.');
52
58
  return;
53
59
  }
54
60
 
@@ -66,8 +72,6 @@ const onRealtimeMessage = async (stanza: Element) => {
66
72
  // to the same tolerance.
67
73
  const senderJID = data.attrs.senderJID || stanza.attrs.from;
68
74
  if (!senderJID) {
69
- console.log(stanza.toString());
70
- console.log('Missing sender information in real-time message.');
71
75
  return;
72
76
  }
73
77
 
@@ -189,11 +193,36 @@ const onEditMessage = async (stanza: Element) => {
189
193
  }
190
194
  };
191
195
 
192
- const onMessageHistory = async (stanza: any) => {
193
- if (
194
- stanza.is('message') &&
195
- stanza.children[0].attrs.xmlns === 'urn:xmpp:mam:2'
196
- ) {
196
+ const isMamResult = (stanza: any): boolean =>
197
+ !!stanza?.is?.('message') &&
198
+ stanza.children?.[0]?.attrs?.xmlns === 'urn:xmpp:mam:2';
199
+
200
+ const parseMamResult = async (stanza: any): Promise<IMessage | undefined> => {
201
+ {
202
+ const forwardedMsg = stanza
203
+ .getChild('result')
204
+ ?.getChild('forwarded')
205
+ ?.getChild('message');
206
+ if (forwardedMsg?.getChild?.('reactions')) {
207
+ const reaction = extractReaction(
208
+ forwardedMsg,
209
+ stanza.attrs?.from,
210
+ stanza.getChild('result')?.attrs?.id
211
+ );
212
+ if (reaction && !collectMamReaction(stanza, reaction)) {
213
+ store.dispatch(
214
+ setReactions({
215
+ roomJID: reaction.roomJID,
216
+ messageId: reaction.messageId,
217
+ from: reaction.from,
218
+ reactions: reaction.emoji,
219
+ data: reaction.data,
220
+ latestReactionTimestamp: reaction.ts,
221
+ })
222
+ );
223
+ }
224
+ return undefined;
225
+ }
197
226
  // console.log("stanza -->", stanza.toString());
198
227
  const body = stanza
199
228
  .getChild('result')
@@ -218,11 +247,9 @@ const onMessageHistory = async (stanza: any) => {
218
247
  const id = stanza.getChild('result')?.attrs.id;
219
248
  if (!delay) {
220
249
  if (stanza.getChild('subject')) {
221
- console.log('Subject.');
222
250
  return;
223
251
  }
224
252
  if (!data || !body || !id) {
225
- console.log('Missing required elements in message history.');
226
253
  return;
227
254
  }
228
255
  }
@@ -295,6 +322,22 @@ const onMessageHistory = async (stanza: any) => {
295
322
  rawMessage,
296
323
  store.getState().chatSettingStore.user?.xmppUsername || ''
297
324
  );
325
+ return message;
326
+ }
327
+ };
328
+
329
+ const onMessageHistory = async (stanza: any) => {
330
+ if (!isMamResult(stanza)) {return;}
331
+ const claimed = claimMamResult(stanza);
332
+ let message: IMessage | undefined;
333
+ try {
334
+ message = await parseMamResult(stanza);
335
+ } finally {
336
+ if (claimed) {
337
+ collectMamMessage(stanza, message);
338
+ }
339
+ }
340
+ if (!claimed && message) {
298
341
  store.dispatch(
299
342
  addRoomMessage({
300
343
  roomJID: stanza.attrs.from,
@@ -360,7 +403,9 @@ const onPresenceInRoom = (stanza: Element | any) => {
360
403
  ) {
361
404
  const roomJID: string = stanza.attrs.from.split('/')[0];
362
405
  const role: string = stanza?.children[1]?.children[0]?.attrs.role;
363
- store.dispatch(setRoomRole({ chatJID: roomJID, role: role }));
406
+ if (role && store.getState().rooms.rooms?.[roomJID]?.role !== role) {
407
+ store.dispatch(setRoomRole({ chatJID: roomJID, role: role }));
408
+ }
364
409
  }
365
410
  };
366
411
 
@@ -423,53 +468,47 @@ const onGetChatRooms = (stanza: Element, xmpp: any) => {
423
468
  Array.isArray(stanza.getChild('query')?.children)
424
469
  ) {
425
470
  const children = stanza.getChild('query')?.children || [];
426
- children.forEach(async (result: any) => {
427
- const currentChatRooms = store.getState().rooms.rooms;
428
-
429
- const isRoomAlreadyAdded = Object.values(currentChatRooms).some(
430
- (element) => element.jid === result?.attrs?.jid
431
- );
432
-
471
+ const known = store.getState().rooms.rooms;
472
+ const fresh: IRoom[] = [];
473
+ const jids: string[] = [];
474
+ for (const result of children as any[]) {
433
475
  const jid = result?.attrs?.jid;
434
-
435
- if (!isRoomAlreadyAdded) {
436
- try {
437
- const roomData: IRoom = {
438
- jid: jid || '',
439
- name: result?.attrs?.name || '',
440
- id: '',
441
- title: result?.attrs?.name || '',
442
- usersCnt: Number(result?.attrs?.users_cnt || 0),
443
- messages: [],
444
- isLoading: false,
445
- roomBg:
446
- result?.attrs?.room_background !== 'none'
447
- ? result?.attrs?.room_background
448
- : null,
449
- icon:
450
- result?.attrs?.room_thumbnail !== 'none'
451
- ? result?.attrs?.room_thumbnail
452
- : null,
453
- unreadMessages: 0,
454
- lastViewedTimestamp: 0,
455
- };
456
-
457
- store.dispatch(addRoom({ roomData: { ...roomData } }));
458
-
459
- if (!store.getState().rooms.activeRoomJID) {
460
- store.dispatch(setCurrentRoom({ roomJID: roomData.jid }));
461
- }
462
- } catch (error) {}
476
+ if (!jid) {continue;}
477
+ jids.push(jid);
478
+ if (known[jid]) {continue;}
479
+ fresh.push({
480
+ jid,
481
+ name: result?.attrs?.name || '',
482
+ id: '',
483
+ title: result?.attrs?.name || '',
484
+ usersCnt: Number(result?.attrs?.users_cnt || 0),
485
+ messages: [],
486
+ isLoading: false,
487
+ roomBg:
488
+ result?.attrs?.room_background !== 'none'
489
+ ? result?.attrs?.room_background
490
+ : null,
491
+ icon:
492
+ result?.attrs?.room_thumbnail !== 'none'
493
+ ? result?.attrs?.room_thumbnail
494
+ : null,
495
+ unreadMessages: 0,
496
+ lastViewedTimestamp: 0,
497
+ });
498
+ }
499
+ if (fresh.length) {
500
+ store.dispatch(addRooms({ rooms: fresh }));
501
+ if (!store.getState().rooms.activeRoomJID) {
502
+ store.dispatch(setCurrentRoom({ roomJID: fresh[0].jid }));
463
503
  }
464
-
465
- if (jid) {
466
- try {
467
- xmpp.presenceInRoomStanza(jid);
468
- } catch (e) {
469
- console.warn('presenceInRoomStanza failed', jid, e);
470
- }
504
+ }
505
+ for (const jid of jids) {
506
+ try {
507
+ xmpp.presenceInRoomStanza(jid);
508
+ } catch (e) {
509
+ console.warn('presenceInRoomStanza failed', jid, e);
471
510
  }
472
- });
511
+ }
473
512
  }
474
513
  };
475
514
 
@@ -477,7 +516,24 @@ const onGetChatRooms = (stanza: Element, xmpp: any) => {
477
516
  // RN side hasn't ported yet. Without these the bundle compiles but
478
517
  // require() returns undefined at runtime → "X is not a function".
479
518
  const onMessageError = (_stanza: Element, _xmpp?: any) => {};
480
- const onReactionMessage = (_stanza: Element) => {};
519
+ /** A live reaction: the reactor's full current list on one message. */
520
+ const onReactionMessage = (stanza: Element) => {
521
+ if (!stanza?.is?.('message') || stanza.getChild('result')) {return;}
522
+ if (!stanza.getChild('reactions')) {return;}
523
+ const reaction = extractReaction(stanza, stanza.attrs?.from);
524
+ if (!reaction) {return;}
525
+ store.dispatch(
526
+ setReactions({
527
+ roomJID: reaction.roomJID,
528
+ messageId: reaction.messageId,
529
+ latestReactionTimestamp: reaction.ts,
530
+ reactions: reaction.emoji,
531
+ from: reaction.from,
532
+ data: reaction.data,
533
+ })
534
+ );
535
+ };
536
+ // Archived reactions are handled by parseMamResult + the MAM router.
481
537
  const onReactionHistory = (_stanza: Element) => {};
482
538
  const onRoomKicked = (_stanza: Element) => {};
483
539
 
@@ -1,16 +1,19 @@
1
1
  import { Client, xml } from '@xmpp/client';
2
2
  import { createTimeoutPromise } from './createTimeoutPromise.xmpp';
3
- import { Element } from 'ltx';
4
3
  import { IMessage } from '../../types/types';
5
- import { getDataFromXml } from '../../helpers/getDataFromXml';
6
- import { createMessageFromXml } from '../../helpers/createMessageFromXml';
4
+ import { beginMamQuery, cancelMamQuery } from './mamRouter';
5
+
6
+ declare const __DEV__: boolean | undefined;
7
+
8
+ let historyIdCounter = 0;
7
9
 
8
10
  export const getHistory = async (
9
11
  client: Client,
10
12
  chatJID: string,
11
13
  max: number,
12
14
  before?: number,
13
- otherId?: string
15
+ otherId?: string,
16
+ options?: { selfApplied?: boolean }
14
17
  ): Promise<IMessage[] | undefined> => {
15
18
  if (typeof chatJID !== 'string') {return;}
16
19
  // If a caller passes a bare local-part (no `@host`), pick a default
@@ -25,121 +28,56 @@ export const getHistory = async (
25
28
  return `${chatJID}@conference.${host}`;
26
29
  })();
27
30
 
28
- const id = otherId ?? `get-history:${Date.now().toString()}`;
29
-
30
- let stanzaHdlrPointer: {
31
- (el: Element): void;
32
- (stanza: any): void;
33
- };
34
-
35
- const unsubscribe = () => {
36
- client.off('stanza', stanzaHdlrPointer);
37
- };
38
-
39
- const responsePromise = new Promise((resolve, reject) => {
40
- let messages: Element[] = [];
41
-
42
- stanzaHdlrPointer = async (stanza) => {
43
- const result = stanza.getChild('result');
44
-
45
- if (
46
- stanza.is('message') &&
47
- stanza.attrs.from &&
48
- stanza.attrs.from.startsWith(fixedChatJid) &&
49
- result
50
- ) {
51
- const messageEl = result.getChild('forwarded')?.getChild('message');
52
-
53
- messages.push(messageEl);
54
- }
55
-
56
- if (
57
- stanza.is('iq') &&
58
- stanza.attrs.id === id &&
59
- stanza.attrs.type === 'result'
60
- ) {
61
- let mainMessages: IMessage[] = [];
62
31
 
63
- for (const msg of messages) {
64
- const reactions = msg?.getChild('reactions');
65
- const text = msg.getChild('body')?.getText();
32
+ const id = otherId ?? `get-history:${Date.now().toString(36)}-${(++historyIdCounter).toString(36)}`;
66
33
 
67
- if (text || reactions) {
68
- const result = await getDataFromXml(msg);
69
- if (!result) {
70
- return;
71
- }
72
- const { data, id, body, ...rest } = result;
34
+ const page = beginMamQuery(id, fixedChatJid, !options?.selfApplied);
73
35
 
74
- if (!data) {
75
- console.log('No data in stanza');
76
- return;
77
- }
78
-
79
- const message = await createMessageFromXml({
80
- data,
81
- id,
82
- body: body || '',
83
- ...rest,
84
- } as any);
85
-
86
- mainMessages.push(message);
87
- }
88
- }
89
- resolve(mainMessages);
90
- }
91
-
92
- if (
93
- stanza.is('iq') &&
94
- stanza.attrs.id === id &&
95
- stanza.attrs.type === 'error'
96
- ) {
97
- reject();
98
- }
99
- };
100
-
101
- client?.on('stanza', stanzaHdlrPointer);
102
-
103
- const message = xml(
104
- 'iq',
105
- {
106
- type: 'set',
107
- to: fixedChatJid,
108
- id: id,
109
- },
36
+ const message = xml(
37
+ 'iq',
38
+ {
39
+ type: 'set',
40
+ to: fixedChatJid,
41
+ id: id,
42
+ },
43
+ xml(
44
+ 'query',
45
+ { xmlns: 'urn:xmpp:mam:2', queryid: id },
110
46
  xml(
111
- 'query',
112
- { xmlns: 'urn:xmpp:mam:2' },
113
- xml(
114
- 'set',
115
- { xmlns: 'http://jabber.org/protocol/rsm' },
116
- xml('max', {}, max.toString()),
117
- before ? xml('before', {}, before.toString()) : xml('before')
118
- )
47
+ 'set',
48
+ { xmlns: 'http://jabber.org/protocol/rsm' },
49
+ xml('max', {}, max.toString()),
50
+ before ? xml('before', {}, before.toString()) : xml('before')
119
51
  )
120
- );
52
+ )
53
+ );
121
54
 
122
- client?.send(message).catch((err: any) => console.log('err on load', err));
123
- });
55
+ client?.send(message).catch((err: any) => console.log('err on load', err));
124
56
 
125
57
  const timeoutPromise = createTimeoutPromise(10000);
126
58
 
127
59
  try {
128
- // @ts-ignore
129
- const res: IMessage[] | null = await Promise.race<[IMessage[] | null]>([
130
- responsePromise as Promise<IMessage[] | null>,
60
+ const res = await Promise.race<IMessage[] | null>([
61
+ page,
131
62
  timeoutPromise as Promise<null>,
132
63
  ]);
133
- return res === null ? [] : res;
64
+ if (res === null) {
65
+ const partial = cancelMamQuery(id);
66
+ if (typeof __DEV__ !== 'undefined' && __DEV__) {
67
+ console.log(
68
+ `[mam] history request for ${fixedChatJid} timed out after 10s (${partial.length} results arrived)`
69
+ );
70
+ }
71
+ return partial;
72
+ }
73
+ return res;
134
74
  } catch (e) {
135
- // MAM rejects with no value when an iq error returns; the timeout
136
- // path resolves with null instead of throwing. Either is expected
137
- // for a room with no history yet — only log if `e` is meaningful.
138
- if (e !== undefined) {
139
- console.log('=-> error in', fixedChatJid, e);
75
+ const partial = cancelMamQuery(id);
76
+ if (typeof __DEV__ !== 'undefined' && __DEV__ && e === undefined) {
77
+ console.log(
78
+ `[mam] history request for ${fixedChatJid} got no closing iq within 10s (${partial.length} results arrived)`
79
+ );
140
80
  }
141
- return [];
142
- } finally {
143
- unsubscribe();
81
+ return partial;
144
82
  }
145
83
  };