@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
@@ -0,0 +1,70 @@
1
+ import type { Client } from '@xmpp/client';
2
+ import type { Element } from 'ltx';
3
+ import {
4
+ accountDomain,
5
+ isE2eeEnabled,
6
+ isE2eeRoom,
7
+ omemoReady,
8
+ resolveRecipients,
9
+ } from './index';
10
+
11
+ export function shouldEncrypt(roomJID: string): boolean {
12
+ return isE2eeEnabled() && isE2eeRoom(roomJID);
13
+ }
14
+
15
+ let queue: Promise<void> = Promise.resolve();
16
+
17
+ export function sendEncrypted(
18
+ client: Client,
19
+ roomJID: string,
20
+ id: string,
21
+ data: Element,
22
+ body: Element,
23
+ plain: Element
24
+ ): void {
25
+ queue = queue.then(async () => {
26
+ let stanza = plain;
27
+ try {
28
+ const crypto = await omemoReady();
29
+ if (!crypto) {throw new Error('omemo_not_ready');}
30
+ const recipients = await resolveRecipients(roomJID, accountDomain(client));
31
+ stanza = await crypto.encryptGroupMessage(roomJID, recipients, [body], id, [data]);
32
+ } catch (error) {
33
+ const reason = String((error as Error)?.message || error);
34
+ if (reason.startsWith('omemo_members_unknown')) {
35
+ console.warn(`OMEMO: not sending to ${roomJID} - ${reason}`);
36
+ return;
37
+ }
38
+ console.warn(`OMEMO: sending to ${roomJID} in clear - ${reason}`);
39
+ }
40
+ try {
41
+ await client.send(stanza);
42
+ } catch (error) {
43
+ console.error('An error occurred while sending message:', error);
44
+ }
45
+ });
46
+ }
47
+
48
+ export function sendSealedMedia(
49
+ client: Client,
50
+ roomJID: string,
51
+ id: string,
52
+ body: Element,
53
+ cleartext: Element[]
54
+ ): void {
55
+ queue = queue.then(async () => {
56
+ try {
57
+ const crypto = await omemoReady();
58
+ if (!crypto) {throw new Error('omemo_not_ready');}
59
+ const recipients = await resolveRecipients(roomJID, accountDomain(client));
60
+ const stanza = await crypto.encryptGroupMessage(roomJID, recipients, [body], id, cleartext);
61
+ await client.send(stanza);
62
+ } catch (error) {
63
+ console.error(
64
+ `OMEMO: refusing to send sealed attachment to ${roomJID} - ${String(
65
+ (error as Error)?.message || error
66
+ )}`
67
+ );
68
+ }
69
+ });
70
+ }
@@ -0,0 +1,133 @@
1
+ import { Element, parse } from 'ltx';
2
+ import { store } from '../roomStore';
3
+ import { translateKey } from '../i18n/strings';
4
+ import { NS_OMEMO } from './ns';
5
+ import { omemoReady, senderJidFromMuc } from './index';
6
+
7
+ export type DecryptOutcome =
8
+ | 'not-encrypted'
9
+ | 'decrypted'
10
+ | 'undecryptable'
11
+ | 'drop';
12
+
13
+ export type E2eeError =
14
+ | 'unsupported'
15
+ | 'other-device'
16
+ | 'failed';
17
+
18
+ const READY_TIMEOUT_MS = 8000;
19
+
20
+ export function encryptedCarrier(
21
+ stanza: Element,
22
+ depth = 0
23
+ ): Element | undefined {
24
+ if (depth > 4 || !stanza?.getChild) {return undefined;}
25
+ if (stanza.name === 'message' && stanza.getChild('encrypted', NS_OMEMO)) {
26
+ return stanza;
27
+ }
28
+ for (const child of stanza.children ?? []) {
29
+ if (typeof child === 'string') {continue;}
30
+ const found = encryptedCarrier(child as Element, depth + 1);
31
+ if (found) {return found;}
32
+ }
33
+ return undefined;
34
+ }
35
+
36
+ const PLACEHOLDER_KEY: Record<E2eeError, string> = {
37
+ unsupported: 'e2ee.unsupportedMessage',
38
+ 'other-device': 'e2ee.otherDevice',
39
+ failed: 'e2ee.undecryptable',
40
+ };
41
+
42
+ export function placeholderKey(error?: string): string {
43
+ return PLACEHOLDER_KEY[error as E2eeError] ?? PLACEHOLDER_KEY.failed;
44
+ }
45
+
46
+ function placeholder(error: E2eeError): Element {
47
+ const settings = store.getState()?.chatSettingStore;
48
+ return new Element('body', {}).t(
49
+ translateKey(
50
+ placeholderKey(error),
51
+ settings?.config?.i18n?.locale || settings?.langSource,
52
+ settings?.config?.i18n?.strings
53
+ )
54
+ );
55
+ }
56
+
57
+ function mark(carrier: Element, error?: E2eeError): void {
58
+ let data = carrier.getChild('data');
59
+ if (!data) {
60
+ data = new Element('data', {});
61
+ carrier.append(data);
62
+ }
63
+ data.attrs.omemoEncrypted = 'true';
64
+ if (error) {
65
+ data.attrs.undecryptable = 'true';
66
+ data.attrs.e2eeError = error;
67
+ }
68
+ }
69
+
70
+ function strip(carrier: Element): void {
71
+ carrier.remove('encrypted', NS_OMEMO);
72
+ carrier.remove('encryption', 'urn:xmpp:eme:0');
73
+ carrier.remove('body');
74
+ }
75
+
76
+ function close(carrier: Element, error: E2eeError): DecryptOutcome {
77
+ strip(carrier);
78
+ carrier.append(placeholder(error));
79
+ mark(carrier, error);
80
+ return 'undecryptable';
81
+ }
82
+
83
+ export function rewriteEncryptedStanza(stanza: Element): DecryptOutcome {
84
+ const carrier = encryptedCarrier(stanza);
85
+ if (!carrier) {return 'not-encrypted';}
86
+ const encrypted = carrier.getChild('encrypted', NS_OMEMO);
87
+ if (!encrypted?.getChild('payload')) {return 'drop';}
88
+ return close(carrier, 'unsupported');
89
+ }
90
+
91
+ const waitForDevice = () => {
92
+ let timer: ReturnType<typeof setTimeout> | undefined;
93
+ const timeout = new Promise<undefined>((resolve) => {
94
+ timer = setTimeout(() => resolve(undefined), READY_TIMEOUT_MS);
95
+ });
96
+ return Promise.race([omemoReady(), timeout]).finally(() => {
97
+ if (timer) {clearTimeout(timer);}
98
+ });
99
+ };
100
+
101
+ export async function decryptStanzaInPlace(
102
+ stanza: Element,
103
+ domain: string
104
+ ): Promise<DecryptOutcome> {
105
+ const carrier = encryptedCarrier(stanza);
106
+ if (!carrier) {return 'not-encrypted';}
107
+
108
+ const encrypted = carrier.getChild('encrypted', NS_OMEMO);
109
+ if (!encrypted?.getChild('payload')) {return 'drop';}
110
+
111
+ const from = String(carrier.attrs?.from || '');
112
+ const roomJid = from.split('/')[0]!;
113
+ const sender = senderJidFromMuc(from, domain);
114
+ const crypto = await waitForDevice();
115
+ const decrypted = sender
116
+ ? await crypto?.decrypt(carrier, sender, roomJid)
117
+ : undefined;
118
+
119
+ if (!decrypted?.content) {
120
+ return close(
121
+ carrier,
122
+ decrypted?.error === 'omemo_not_encrypted_for_this_device'
123
+ ? 'other-device'
124
+ : 'failed'
125
+ );
126
+ }
127
+
128
+ strip(carrier);
129
+ const wrapper = parse(`<omemo-content>${decrypted.content}</omemo-content>`);
130
+ carrier.append(...wrapper.children);
131
+ mark(carrier);
132
+ return 'decrypted';
133
+ }
@@ -0,0 +1,54 @@
1
+ import { fromBase64, toBase64 } from './crypto';
2
+
3
+ export interface OmemoStore {
4
+ get<T>(key: string): Promise<T | undefined>;
5
+ set(key: string, value: unknown): Promise<void>;
6
+ delete(key: string): Promise<void>;
7
+ }
8
+
9
+ const BYTES_TAG = '$bytes';
10
+
11
+ export function encodeValue(value: unknown): string {
12
+ return JSON.stringify(value, (_key, item) =>
13
+ item instanceof Uint8Array ? { [BYTES_TAG]: toBase64(item) } : item
14
+ );
15
+ }
16
+
17
+ export function decodeValue<T>(text: string): T {
18
+ return JSON.parse(text, (_key, item) =>
19
+ item && typeof item === 'object' && typeof item[BYTES_TAG] === 'string'
20
+ ? fromBase64(item[BYTES_TAG])
21
+ : item
22
+ ) as T;
23
+ }
24
+
25
+ export interface StringBackend {
26
+ getItem(key: string): Promise<string | null>;
27
+ setItem(key: string, value: string): Promise<void>;
28
+ removeItem(key: string): Promise<void>;
29
+ }
30
+
31
+ export function createStore(backend: StringBackend, jid: string): OmemoStore {
32
+ const prefix = `${jid.toLowerCase()}|`;
33
+ return {
34
+ get: async <T>(key: string) => {
35
+ const raw = await backend.getItem(prefix + key);
36
+ return raw === null ? undefined : decodeValue<T>(raw);
37
+ },
38
+ set: (key, value) => backend.setItem(prefix + key, encodeValue(value)),
39
+ delete: (key) => backend.removeItem(prefix + key),
40
+ };
41
+ }
42
+
43
+ export function createMemoryBackend(): StringBackend {
44
+ const data = new Map<string, string>();
45
+ return {
46
+ getItem: async (key) => data.get(key) ?? null,
47
+ setItem: async (key, value) => void data.set(key, value),
48
+ removeItem: async (key) => void data.delete(key),
49
+ };
50
+ }
51
+
52
+ export function createMemoryStore(jid = 'memory'): OmemoStore {
53
+ return createStore(createMemoryBackend(), jid);
54
+ }
@@ -0,0 +1,15 @@
1
+ export const accountNameOf = (
2
+ user:
3
+ | { xmppUsername?: string; userJID?: string; id?: string; _id?: string }
4
+ | null
5
+ | undefined,
6
+ appId: string
7
+ ): string => {
8
+ for (const raw of [user?.xmppUsername, user?.userJID, user?.id, user?._id]) {
9
+ const value = String(raw || '').split('@')[0]!.trim();
10
+ if (!value) {continue;}
11
+ if (value.includes('_')) {return value;}
12
+ if (appId) {return `${appId}_${value}`;}
13
+ }
14
+ return '';
15
+ };
@@ -1,4 +1,7 @@
1
1
  import { IMessage } from '../types/types';
2
+ import { isE2eeRoom } from '../e2ee';
3
+ import { composeName } from './displayName';
4
+ import { parseSealedMediaBody } from '../e2ee/sealedBody';
2
5
 
3
6
  interface IMessageWithNewData extends IMessage {
4
7
  [x: string]: any;
@@ -86,13 +89,25 @@ export const createMessageFromXml = async (
86
89
  // Synthesize user.name from sender attrs (web reads usersSet from
87
90
  // redux in <Message>; we fix it once at the source so Avatar /
88
91
  // MessageHeader render the actual sender instead of "??").
89
- const firstName = (merged.senderFirstName || '').toString().trim();
90
- const lastName = (merged.senderLastName || '').toString().trim();
92
+ const firstName = (merged.senderFirstName || merged.firstName || '')
93
+ .toString()
94
+ .trim();
95
+ const lastName = (merged.senderLastName || merged.lastName || '')
96
+ .toString()
97
+ .trim();
91
98
  const fullName = (merged.fullName || '').toString().trim();
92
99
  const senderJID = (merged.senderJID || '').toString();
93
- const senderLocal = senderJID.includes('@')
94
- ? senderJID.split('@')[0]
95
- : senderJID;
100
+ const senderBare = senderJID.split('/')[0] || '';
101
+ const senderResource = senderJID.includes('/') ? senderJID.split('/')[1] || '' : '';
102
+ const senderIsOccupant =
103
+ !!senderResource &&
104
+ (senderBare === String(merged.roomJid || '') ||
105
+ /@conference\./i.test(senderBare));
106
+ const senderLocal = senderIsOccupant
107
+ ? senderResource
108
+ : senderBare.includes('@')
109
+ ? senderBare.split('@')[0]
110
+ : senderBare;
96
111
 
97
112
  // Bug #41 root cause: the resource of the MUC `from` (room@conference/
98
113
  // occupant-id) is the SAME field getDataFromXml uses to derive
@@ -112,7 +127,7 @@ export const createMessageFromXml = async (
112
127
  const xmppFrom = (merged.xmppFrom || '').toString();
113
128
  const fromResource = xmppFrom.includes('/') ? xmppFrom.split('/')[1] : '';
114
129
 
115
- const composed = [firstName, lastName].filter(Boolean).join(' ').trim();
130
+ const composed = composeName(firstName, lastName);
116
131
  const existingName = String(merged?.user?.name || '').trim();
117
132
  const resolvedName =
118
133
  existingName ||
@@ -122,8 +137,18 @@ export const createMessageFromXml = async (
122
137
  merged?.user?.id ||
123
138
  '';
124
139
 
140
+ const unencrypted =
141
+ merged.omemoEncrypted !== 'true' && isE2eeRoom(String(merged.roomJid || ''));
142
+
143
+ const sealedKeys =
144
+ merged.clientEncrypted === 'true'
145
+ ? parseSealedMediaBody(merged.body)
146
+ : undefined;
147
+
125
148
  const message: IMessage = {
126
149
  ...merged,
150
+ ...(unencrypted ? { unencrypted: true } : {}),
151
+ ...(sealedKeys ? { e2eeKeys: sealedKeys, body: 'media' } : {}),
127
152
  user: {
128
153
  ...(merged.user || {}),
129
154
  id: merged?.user?.id || fromResource || senderLocal,
@@ -1,4 +1,36 @@
1
1
  import { ApiRoom, IRoom } from '../types/types';
2
+ import type { LastMessage } from '../types/models/message.model';
3
+
4
+ const mapApiLastMessage = (
5
+ apiLastMessage: ApiRoom['lastMessage'],
6
+ roomJid: string
7
+ ): LastMessage | undefined => {
8
+ const body = String(apiLastMessage?.body || '').trim();
9
+ if (!apiLastMessage || !body) {return undefined;}
10
+ const senderName = `${apiLastMessage.senderFirstName || ''} ${
11
+ apiLastMessage.senderLastName || ''
12
+ }`.trim();
13
+ return {
14
+ id: apiLastMessage.messageId || apiLastMessage.stanzaId || '',
15
+ xmppId: apiLastMessage.stanzaId,
16
+ roomJid,
17
+ body,
18
+ date: apiLastMessage.createdAt,
19
+ isDeleted: false,
20
+ user: {
21
+ id: apiLastMessage.fromUserId || apiLastMessage.from || '',
22
+ name: senderName,
23
+ },
24
+ } as LastMessage;
25
+ };
26
+
27
+ const seedTimestamp = (seed: LastMessage | undefined): number | undefined => {
28
+ if (!seed) {return undefined;}
29
+ const id = Number(seed.id);
30
+ if (Number.isFinite(id) && id > 0) {return id;}
31
+ const ms = seed.date ? new Date(seed.date).getTime() : NaN;
32
+ return Number.isFinite(ms) && ms > 0 ? ms * 1000 : undefined;
33
+ };
2
34
 
3
35
  export const createRoomFromApi = (
4
36
  room: ApiRoom,
@@ -6,10 +38,12 @@ export const createRoomFromApi = (
6
38
  usersArrayLength: number = 0
7
39
  ): IRoom | null => {
8
40
  try {
41
+ const jid = `${room?.name}@${service}` || '';
42
+ const lastMessage = mapApiLastMessage(room?.lastMessage, jid);
9
43
  const roomData: IRoom = {
10
44
  ...room,
11
45
  id: (room as any)?._id || '',
12
- jid: `${room?.name}@${service}` || '',
46
+ jid,
13
47
  name: room?.title || '',
14
48
  title: room?.title || '',
15
49
  usersCnt: Number(room?.members?.length || usersArrayLength + 1),
@@ -19,6 +53,8 @@ export const createRoomFromApi = (
19
53
  icon: room?.picture !== 'none' ? room?.picture : null,
20
54
  unreadMessages: 0,
21
55
  lastViewedTimestamp: 0,
56
+ lastMessage,
57
+ lastMessageTimestamp: seedTimestamp(lastMessage),
22
58
  };
23
59
  return roomData;
24
60
  } catch (error) {
@@ -1,4 +1,5 @@
1
1
  import { IMessage, RoomMember } from '../types/types';
2
+ import { composeName } from './displayName';
2
3
 
3
4
  /**
4
5
  * Cache-only lookup. Returns the literal "Deleted User" as a MISS sentinel
@@ -21,7 +22,7 @@ export const createUserNameFromSetUser = (
21
22
  // fall back to that before giving up and returning the raw id.
22
23
  const bareName = user.name?.trim() || '';
23
24
 
24
- return `${firstName} ${lastName}`.trim() || bareName || userId;
25
+ return composeName(firstName, lastName) || bareName || userId;
25
26
  };
26
27
 
27
28
  /**
@@ -0,0 +1,9 @@
1
+ export const composeName = (
2
+ first?: string | null,
3
+ last?: string | null
4
+ ): string => {
5
+ const f = String(first ?? '').trim();
6
+ const l = String(last ?? '').trim();
7
+ if (f && f.includes('@') && f.toLowerCase() === l.toLowerCase()) {return f;}
8
+ return `${f} ${l}`.trim();
9
+ };
@@ -0,0 +1,39 @@
1
+ import { EMOJI_CATEGORIES, type EmojiEntry } from '../assets/emojiData';
2
+
3
+ let byId: Map<string, EmojiEntry> | null = null;
4
+ const index = (): Map<string, EmojiEntry> => {
5
+ if (!byId) {
6
+ byId = new Map();
7
+ for (const category of EMOJI_CATEGORIES) {
8
+ for (const entry of category.emojis) {byId.set(entry[0], entry);}
9
+ }
10
+ }
11
+ return byId;
12
+ };
13
+
14
+ export const getEmojiNativeById = (id: string): string =>
15
+ index().get(id)?.[1] ?? id;
16
+
17
+ export const getEmojiIdByNative = (native: string): string | undefined => {
18
+ for (const [id, entry] of index()) {
19
+ if (entry[1] === native) {return id;}
20
+ }
21
+ return undefined;
22
+ };
23
+
24
+ export const DEFAULT_QUICK_REACTIONS = ['+1', 'heart', 'joy', 'open_mouth', 'cry', 'pray'];
25
+
26
+ export const searchEmojis = (query: string, limit = 60): EmojiEntry[] => {
27
+ const q = query.trim().toLowerCase();
28
+ if (!q) {return [];}
29
+ const out: EmojiEntry[] = [];
30
+ for (const category of EMOJI_CATEGORIES) {
31
+ for (const entry of category.emojis) {
32
+ if (entry[0].includes(q) || entry[2].includes(q)) {
33
+ out.push(entry);
34
+ if (out.length >= limit) {return out;}
35
+ }
36
+ }
37
+ }
38
+ return out;
39
+ };
@@ -0,0 +1,19 @@
1
+ // expo-haptics is an OPTIONAL peer, probed the same way as expo-blur: the JS
2
+ // package alone is not enough, the native module has to be in the binary,
3
+ // otherwise the call throws. Without it the gesture simply has no feedback.
4
+ let Haptics: any = null;
5
+ try {
6
+ const { requireNativeModule } = require('expo-modules-core');
7
+ requireNativeModule('ExpoHaptics');
8
+ Haptics = require('expo-haptics');
9
+ } catch {
10
+ Haptics = null;
11
+ }
12
+
13
+ /** Short tap, the messenger "I got your long-press" feedback. Never throws. */
14
+ export const hapticTap = () => {
15
+ if (!Haptics) {
16
+ return;
17
+ }
18
+ Haptics.impactAsync?.(Haptics.ImpactFeedbackStyle?.Medium).catch?.(() => {});
19
+ };
@@ -15,6 +15,7 @@ interface HistoryPreloadSchedulerOptions {
15
15
  pageSize?: number;
16
16
  retryLimit?: number;
17
17
  roomLimit?: number;
18
+ firstWave?: number;
18
19
  selectedRoomJid?: string | null;
19
20
  defaultRoomJids?: string[];
20
21
  forceReload?: boolean;
@@ -29,21 +30,15 @@ interface QueueItem {
29
30
  }
30
31
 
31
32
  const DEFAULT_CONCURRENCY = 3;
32
- // Fetch the most recent ~20 on re-entry (mirrors web). A larger first page
33
- // also means more id-overlap with cache, so the merge in
34
- // `mergeHistoryIntoCache` rarely has to fall back to clear-and-replace.
35
- const DEFAULT_PAGE_SIZE = 20;
33
+ const DEFAULT_PAGE_SIZE = 10;
36
34
  const DEFAULT_RETRY_LIMIT = 2;
37
- // When the first page is entirely unread (every fetched message is newer
38
- // than `lastViewedTimestamp`), the true unread count could be far bigger
39
- // than `pageSize` — `useUnread()` only ever sees what's been loaded. Page
40
- // further back, up to this many extra fetches, until we either find the
41
- // boundary or give up (`unreadCapped` then stays true so callers at least
42
- // know the count is a floor, not exact). Customer-reported #34.
43
- const MAX_UNREAD_CATCHUP_PAGES = 8;
35
+ const DEFAULT_FIRST_WAVE = 30;
36
+ const BACKGROUND_BATCH_PAUSE_MS = 400;
44
37
 
45
38
  const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
46
39
 
40
+ declare const __DEV__: boolean | undefined;
41
+
47
42
  const messageTimestamp = (m: IMessage): number => {
48
43
  if (!m) {return 0;}
49
44
  const t = (m as any).timestamp;
@@ -54,8 +49,12 @@ const messageTimestamp = (m: IMessage): number => {
54
49
  };
55
50
 
56
51
  const getRoomLastActivityScore = (room: IRoom): number => {
57
- if (!room?.messages?.length) {return 0;}
58
- return room.messages.reduce((max, m) => Math.max(max, messageTimestamp(m)), 0);
52
+ const fromMessages = room?.messages?.length
53
+ ? room.messages.reduce((max, m) => Math.max(max, messageTimestamp(m)), 0)
54
+ : 0;
55
+ const fromStamp = Number(room?.lastMessageTimestamp) || 0;
56
+ const fromSeed = Number(room?.lastMessage?.id) || 0;
57
+ return Math.max(fromMessages, fromStamp, fromSeed);
59
58
  };
60
59
 
61
60
  const computeUnreadCapped = (
@@ -73,7 +72,10 @@ const computeUnreadCapped = (
73
72
  if (countable.length < pageSize) {return false;}
74
73
 
75
74
  const lastViewed = Number(room.lastViewedTimestamp) || 0;
76
- if (lastViewed <= 0) {return true;}
75
+ // No read marker yet (the private-store markers often land after the
76
+ // first preload page): the count is unknown, not "more than a page".
77
+ // Claiming capped here showed "10+" on rooms with a single unread.
78
+ if (lastViewed <= 0) {return false;}
77
79
 
78
80
  const oldestTs = countable.reduce<number>((minTs, m) => {
79
81
  const ts = messageTimestamp(m);
@@ -116,6 +118,7 @@ export const runHistoryPreloadScheduler = async (
116
118
  pageSize = DEFAULT_PAGE_SIZE,
117
119
  retryLimit = DEFAULT_RETRY_LIMIT,
118
120
  roomLimit,
121
+ firstWave = DEFAULT_FIRST_WAVE,
119
122
  selectedRoomJid = null,
120
123
  defaultRoomJids = [],
121
124
  forceReload = false,
@@ -123,6 +126,12 @@ export const runHistoryPreloadScheduler = async (
123
126
 
124
127
  if (signal?.aborted) {return;}
125
128
 
129
+ const startedAt = Date.now();
130
+ let firstWaveLogged = false;
131
+ const devLog = (msg: string) => {
132
+ if (typeof __DEV__ !== 'undefined' && __DEV__) {console.log(msg);}
133
+ };
134
+
126
135
  store.dispatch(setUnreadSyncing(true));
127
136
  try {
128
137
 
@@ -153,6 +162,10 @@ export const runHistoryPreloadScheduler = async (
153
162
 
154
163
  const inFlightByRoom = new Map<string, Promise<void>>();
155
164
  let consecutiveErrorCount = 0;
165
+ let started = 0;
166
+ devLog(
167
+ `[preload] ${queue.length} rooms queued, first wave ${Math.min(firstWave, queue.length)}, page ${pageSize}`
168
+ );
156
169
 
157
170
  while (queue.length > 0) {
158
171
  if (signal?.aborted) {return;}
@@ -176,6 +189,12 @@ export const runHistoryPreloadScheduler = async (
176
189
  }
177
190
 
178
191
  const batch = readyItems.slice(0, Math.max(1, concurrency));
192
+ const inBackgroundWave = started >= firstWave;
193
+ if (inBackgroundWave && !firstWaveLogged) {
194
+ firstWaveLogged = true;
195
+ devLog(`[preload] first wave done in ${Date.now() - startedAt}ms`);
196
+ }
197
+ started += batch.length;
179
198
 
180
199
  // Snapshot each room's historyPreloadState BEFORE marking the
181
200
  // batch as 'loading'. Without this snapshot the per-task
@@ -229,6 +248,7 @@ export const runHistoryPreloadScheduler = async (
229
248
  coalesceRoom: true,
230
249
  skipIfPreloaded: !forceReload,
231
250
  source: 'background',
251
+ selfApplied: true,
232
252
  }
233
253
  );
234
254
  if (signal?.aborted) {return;}
@@ -237,59 +257,7 @@ export const runHistoryPreloadScheduler = async (
237
257
  }
238
258
 
239
259
  const nextRoom = store.getState().rooms.rooms[item.jid];
240
- let combined: IMessage[] = fetchedMessages || [];
241
- const lastViewed = Number(nextRoom?.lastViewedTimestamp) || 0;
242
-
243
- // The first page was entirely unread — keep paging older until
244
- // we find a message at/before `lastViewedTimestamp` (the true
245
- // boundary) or run out of catch-up budget, so the count isn't
246
- // silently truncated at `pageSize`.
247
- if (lastViewed > 0 && computeUnreadCapped(nextRoom, combined, pageSize)) {
248
- let lastPageLen = combined.length;
249
- let extraPages = 0;
250
- while (
251
- extraPages < MAX_UNREAD_CATCHUP_PAGES &&
252
- lastPageLen >= pageSize &&
253
- !signal?.aborted
254
- ) {
255
- const oldestId = combined.reduce<number | null>((min, m) => {
256
- const idNum = Number((m as any)?.id);
257
- if (!Number.isFinite(idNum)) {return min;}
258
- return min === null || idNum < min ? idNum : min;
259
- }, null);
260
- if (oldestId === null) {break;}
261
-
262
- let older: IMessage[] | undefined;
263
- try {
264
- older = await client.getHistoryStanza(
265
- item.jid,
266
- pageSize,
267
- oldestId,
268
- undefined,
269
- {
270
- coalesceRoom: true,
271
- skipIfPreloaded: !forceReload,
272
- source: 'background',
273
- }
274
- );
275
- } catch {
276
- break;
277
- }
278
- if (!older || !older.length) {break;}
279
-
280
- combined = [...older, ...combined];
281
- lastPageLen = older.length;
282
- extraPages++;
283
-
284
- const oldestTs = combined.reduce<number>((minTs, m) => {
285
- const ts = messageTimestamp(m);
286
- return ts > 0 ? Math.min(minTs, ts) : minTs;
287
- }, Number.MAX_SAFE_INTEGER);
288
- if (oldestTs !== Number.MAX_SAFE_INTEGER && oldestTs <= lastViewed) {
289
- break;
290
- }
291
- }
292
- }
260
+ const combined: IMessage[] = fetchedMessages || [];
293
261
 
294
262
  // `mergeHistoryIntoCache` (roomsSlice) caps whatever we dispatch
295
263
  // here to the newest RUNTIME_MESSAGE_LIMIT messages before it
@@ -353,10 +321,10 @@ export const runHistoryPreloadScheduler = async (
353
321
  })
354
322
  );
355
323
 
356
- // Yield to JS event loop (no requestIdleCallback in RN).
357
- await new Promise((r) => setTimeout(r, 0));
324
+ await sleep(inBackgroundWave ? BACKGROUND_BATCH_PAUSE_MS : 0);
358
325
  }
359
326
  } finally {
327
+ devLog(`[preload] finished in ${Date.now() - startedAt}ms`);
360
328
  store.dispatch(setUnreadSyncing(false));
361
329
  }
362
330
  };