@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
@@ -11,6 +11,7 @@ var _Avatar = require("./Avatar");
11
11
  var _MessageInteractions = _interopRequireDefault(require("./MessageInteractions"));
12
12
  var _BottomReplyContainer = require("./BottomReplyContainer");
13
13
  var _MessageReply = require("./MessageReply");
14
+ var _parseMessageReference = require("../../helpers/parseMessageReference");
14
15
  var _DeletedMessage = require("./DeletedMessage");
15
16
  var _chatSettingsSlice = require("../../roomStore/chatSettingsSlice");
16
17
  var _MODAL_TYPES = require("../../helpers/constants/MODAL_TYPES");
@@ -27,10 +28,18 @@ var _parseMessageBody = require("../../helpers/parseMessageBody");
27
28
  var _typography = require("../../helpers/typography");
28
29
  var _useMessageHeapState = require("../../hooks/useMessageHeapState");
29
30
  var _icons = require("../../assets/icons");
31
+ var _useT = require("../../i18n/useT");
32
+ var _displayName = require("../../helpers/displayName");
33
+ var _useFileToken = require("../../hooks/useFileToken");
34
+ var _secureFileUrl = require("../../helpers/secureFileUrl");
35
+ var _stanza = require("../../e2ee/stanza");
30
36
  var _xmppProvider = require("../../context/xmppProvider");
31
37
  var _useSendMessage = require("../../hooks/useSendMessage");
32
38
  var _MessageReaction = require("./MessageReaction");
33
- var _StyledComponents = require("../styled/StyledComponents");
39
+ var _EmojiPickerSheet = require("./EmojiPickerSheet");
40
+ var _reactionsConfig = require("../../helpers/reactionsConfig");
41
+ var _reactNativeGestureHandler = require("react-native-gesture-handler");
42
+ var _haptics = require("../../helpers/haptics");
34
43
  var _useTheme = require("../../hooks/useTheme");
35
44
  var _jsxRuntime = require("react/jsx-runtime");
36
45
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -144,6 +153,21 @@ const CustomTimestampRow = _native.default.View`
144
153
  media
145
154
  }) => media ? '10px' : 0};
146
155
  `;
156
+ const clockCache = new Map();
157
+ const formatClock = date => {
158
+ const key = String(date);
159
+ const cached = clockCache.get(key);
160
+ if (cached !== undefined) {
161
+ return cached;
162
+ }
163
+ const d = new Date(date);
164
+ const label = Number.isNaN(d.getTime()) ? '' : `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`;
165
+ if (clockCache.size > 5000) {
166
+ clockCache.clear();
167
+ }
168
+ clockCache.set(key, label);
169
+ return label;
170
+ };
147
171
  const Message = ({
148
172
  message,
149
173
  isUser,
@@ -163,6 +187,7 @@ const Message = ({
163
187
  // only per-render allocations added for theming (memoized on the theme
164
188
  // object, which useTheme keeps stable across renders).
165
189
  const theme = (0, _useTheme.useTheme)();
190
+ const t = (0, _useT.useT)();
166
191
  const themedStyles = (0, _react.useMemo)(() => ({
167
192
  muted: {
168
193
  color: theme.textMuted
@@ -208,13 +233,16 @@ const Message = ({
208
233
  // REST roster populates the cache. Falls back to the message's own name
209
234
  // (which may carry senderFirstName/senderLastName from the wire) only when
210
235
  // usersSet has never seen this sender.
211
- const senderDisplayName = senderEntry ? `${senderEntry.firstName ?? ''} ${senderEntry.lastName ?? ''}`.trim() || senderEntry.name || senderLocal : message.user?.name || senderLocal || 'Unknown';
236
+ const senderDisplayName = senderEntry ? (0, _displayName.composeName)(senderEntry.firstName, senderEntry.lastName) || senderEntry.name || senderLocal : message.user?.name || senderLocal || 'Unknown';
212
237
  // A broadcast posted by the app itself arrives with the ROOM's own id as
213
238
  // its occupant resource, so no roster ever resolves it and the name chain
214
239
  // ends at 50 characters of hex. Captioning a bubble with that tells the
215
240
  // reader strictly less than showing nothing.
216
241
  const hasRealSenderName = !(0, _isUnresolvedSenderId.isUnresolvedSenderId)(senderDisplayName);
217
- const senderProfileImage = senderEntry?.profileImage || message.user?.profileImage || '';
242
+ const fileToken = (0, _useFileToken.useFileToken)();
243
+ const [avatarFailed, setAvatarFailed] = (0, _react.useState)(null);
244
+ const rawProfileImage = String(senderEntry?.profileImage || message.user?.profileImage || message.user?.photoURL || '').trim();
245
+ const senderProfileImage = rawProfileImage && rawProfileImage !== 'none' && rawProfileImage !== avatarFailed ? (0, _secureFileUrl.appendFileToken)(rawProfileImage, fileToken) : '';
218
246
  const {
219
247
  idSet,
220
248
  failedIdSet
@@ -223,9 +251,7 @@ const Message = ({
223
251
  retryMessage
224
252
  } = (0, _useSendMessage.useSendMessage)();
225
253
  const [isPressed, setIsPressed] = (0, _react.useState)(false);
226
- if (__DEV__ && message.id && !globalThis.__loggedMsg?.[message.id]) {
227
- (globalThis.__loggedMsg ||= {})[message.id] = true;
228
- }
254
+ const [emojiPickerOpen, setEmojiPickerOpen] = (0, _react.useState)(false);
229
255
  const [contextMenuPosition, setContextMenuPosition] = (0, _react.useState)(null);
230
256
  const timerRef = (0, _react.useRef)(null);
231
257
  const messageRef = (0, _react.useRef)(null);
@@ -234,15 +260,18 @@ const Message = ({
234
260
  dispatch((0, _chatSettingsSlice.setActiveModal)(_MODAL_TYPES.MODAL_TYPES.PROFILE));
235
261
  dispatch((0, _chatSettingsSlice.setSelectedUser)(user));
236
262
  };
263
+ const replyRef = (0, _parseMessageReference.parseMessageReference)(message);
237
264
  const handleReplyMessage = () => {
238
265
  dispatch((0, _roomsSlice.setEditAction)({
239
266
  isEdit: false
240
267
  }));
241
- if (!isReply && message.mainMessage) {
242
- const messageCore = JSON.parse(message.mainMessage);
268
+
269
+ // An in-channel reply opens its PARENT's thread.
270
+ const parent = !isReply ? (0, _parseMessageReference.parseMessageReference)(message) : null;
271
+ if (parent) {
243
272
  dispatch((0, _roomsSlice.setActiveMessage)({
244
- id: messageCore.id,
245
- chatJID: messageCore.roomJid
273
+ id: parent.id,
274
+ chatJID: parent.roomJid || message.roomJid
246
275
  }));
247
276
  return setIsPressed(false);
248
277
  }
@@ -276,14 +305,16 @@ const Message = ({
276
305
  // };
277
306
 
278
307
  const handleReactionMessage = emoji => {
279
- if (!message.reaction) {
280
- return client?.sendMessageReactionStanza(message.id, message.roomJid, [emoji], `${user.firstName} ${user.lastName}`);
281
- }
282
- if (message.reaction && message.reaction[user.xmppUsername || ''] && message.reaction[user.xmppUsername || '']?.emoji.includes(emoji)) {
283
- const filterEmoji = message.reaction[user.xmppUsername || '']?.emoji.filter(reaction => reaction !== emoji);
284
- return client?.sendMessageReactionStanza(message.id, message.roomJid, filterEmoji, `${user.firstName} ${user.lastName}`);
308
+ if (!(0, _reactionsConfig.reactionsEnabled)(config) || config?.disableInteractions) {
309
+ return;
285
310
  }
286
- client?.sendMessageReactionStanza(message.id, message.roomJid, [...(message.reaction[user.xmppUsername || '']?.emoji || []), emoji], `${user.firstName} ${user.lastName}`);
311
+ const sender = {
312
+ firstName: user.firstName,
313
+ lastName: user.lastName
314
+ };
315
+ const own = message.reaction?.[user.xmppUsername || '']?.emoji || [];
316
+ const next = own.includes(emoji) ? own.filter(reaction => reaction !== emoji) : [...own, emoji];
317
+ client?.sendMessageReactionStanza(message.id, message.roomJid, next, sender);
287
318
  };
288
319
 
289
320
  // Long-press → capture the bubble's on-screen bounding box. The actual
@@ -324,6 +355,30 @@ const Message = ({
324
355
  setIsPressed(true);
325
356
  };
326
357
 
358
+ // Long-press is a NATIVE recognizer over the whole bubble column, not the
359
+ // Pressable's JS timer: the timer was lost whenever an inner responder
360
+ // (link text, media, reply quote, reactions) took the touch first, or the
361
+ // list stole it on the slightest drift — "works every other time". The
362
+ // recognizer fires wherever the finger lands, and once it does the touch
363
+ // is cancelled for everything underneath, so no tap handler fires on top.
364
+ const longPress = (0, _react.useMemo)(() => _reactNativeGestureHandler.Gesture.LongPress().runOnJS(true).minDuration(350).maxDistance(12).enabled(!config?.disableInteractions).onStart(() => {
365
+ (0, _haptics.hapticTap)();
366
+ handleLongPress();
367
+ }),
368
+ // eslint-disable-next-line react-hooks/exhaustive-deps
369
+ [config?.disableInteractions]);
370
+
371
+ // The bubble lifts a touch while its menu is open, and settles back.
372
+ const lift = (0, _react.useRef)(new _reactNative.Animated.Value(1)).current;
373
+ (0, _react.useEffect)(() => {
374
+ _reactNative.Animated.spring(lift, {
375
+ toValue: isPressed ? 1.03 : 1,
376
+ useNativeDriver: true,
377
+ speed: 30,
378
+ bounciness: 6
379
+ }).start();
380
+ }, [isPressed, lift]);
381
+
327
382
  // Body text size/weight is set on the parser's leaf <Text>s — the markdown
328
383
  // wraps content in <View>s which break Text-style inheritance, so the bubble
329
384
  // wrapper's fontSize alone never reached the actual text.
@@ -336,9 +391,12 @@ const Message = ({
336
391
  }), [config?.typography?.messageText, isUser, theme]);
337
392
  // In auto mode, render the translation as the primary body — but NEVER for
338
393
  // the reader's own messages (they wrote it; no point translating it back).
339
- const showInlineTranslation = isAutoTranslate && translationDisplay.hasTranslation && !isUser;
394
+ const isUndecryptable = message.undecryptable === 'true' && !message.isDeleted;
395
+ const showInlineTranslation = isAutoTranslate && translationDisplay.hasTranslation && !isUser && !isUndecryptable;
340
396
  const bodyToRender = showInlineTranslation ? translationDisplay.displayText : message.body;
341
- const messageText = config?.messageTextFilter?.enabled ? (0, _parseMessageBody.parseMessageBody)(config?.messageTextFilter.filterFunction(bodyToRender), bodyTextStyle, theme) : (0, _parseMessageBody.parseMessageBody)(bodyToRender, bodyTextStyle, theme);
397
+ const textFilter = config?.messageTextFilter;
398
+ const messageText = (0, _react.useMemo)(() => textFilter?.enabled ? (0, _parseMessageBody.parseMessageBody)(textFilter.filterFunction(bodyToRender), bodyTextStyle, theme) : (0, _parseMessageBody.parseMessageBody)(bodyToRender, bodyTextStyle, theme), [textFilter, bodyToRender, bodyTextStyle, theme]);
399
+ const timeLabel = (0, _react.useMemo)(() => formatClock(message.date), [message.date]);
342
400
  const isFailed = failedIdSet.has(message.id);
343
401
  const isPending = !isFailed && (idSet.has(message.id) || message?.pending || false);
344
402
  const onRetryPress = () => {
@@ -353,13 +411,8 @@ const Message = ({
353
411
  ref: messageRef,
354
412
  style: [styles.customMessageContainer, {
355
413
  justifyContent: isUser ? 'flex-end' : 'flex-start',
356
- marginBottom: !!message?.reply?.length || message?.reaction && !!Object.keys(message?.reaction)?.length ? 20 : 0
357
- }, isPressed ? {
358
- transform: [{
359
- scale: 1.05
360
- }],
361
- paddingRight: 16
362
- } : undefined
414
+ marginBottom: 0
415
+ }
363
416
  // justify-content: ${({ isUser }) => (isUser ? "flex-end" : "flex-start")},
364
417
  // margin-bottom: ${(props) => !!props.reply && "20px"},
365
418
  ],
@@ -371,126 +424,170 @@ const Message = ({
371
424
  // affordance) — consumers who want it gone entirely can return
372
425
  // null from a custom message component.
373
426
  , {
374
- onPress: config?.disableProfilesInteractions ? undefined : () => handleUserAvatarClick(message.user),
427
+ onPress: config?.disableProfilesInteractions ? undefined : () => handleUserAvatarClick({
428
+ ...message.user,
429
+ ...(senderEntry ? {
430
+ firstName: senderEntry.firstName,
431
+ lastName: senderEntry.lastName,
432
+ profileImage: senderEntry.profileImage,
433
+ description: senderEntry.description
434
+ } : {}),
435
+ name: hasRealSenderName ? senderDisplayName : ''
436
+ }),
375
437
  disabled: !!config?.disableProfilesInteractions,
376
438
  accessible: !config?.disableProfilesInteractions,
377
439
  children: senderProfileImage ? /*#__PURE__*/(0, _jsxRuntime.jsx)(CustomMessagePhoto, {
440
+ testID: "message-sender-avatar",
378
441
  source: {
379
442
  uri: senderProfileImage
443
+ },
444
+ onError: () => {
445
+ if ((0, _secureFileUrl.isSecureFileUrl)(rawProfileImage)) {
446
+ (0, _secureFileUrl.requestFileTokenRecovery)();
447
+ }
448
+ setAvatarFailed(rawProfileImage);
380
449
  }
381
450
  }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_Avatar.Avatar, {
382
451
  username: senderDisplayName
383
452
  })
384
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable
385
- // The Pressable fills the row's content area, so the bubble
386
- // inside must be aligned to the sender's side — otherwise it
387
- // hugs the left and own media bubbles sit with a right-side
388
- // gap (text bubbles only looked right because they're narrow).
389
- // flex-end for own, flex-start for others.
390
- , {
391
- style: {
392
- flex: 1,
393
- alignItems: isUser ? 'flex-end' : 'flex-start'
394
- }
395
- // A plain tap anywhere on a message bubble dismisses the
396
- // keyboard. The FlatList's keyboardShouldPersistTaps="handled"
397
- // already dismisses taps on the empty GAPS between bubbles, but
398
- // the bubble Pressable itself is a touch responder, so taps that
399
- // landed on a message were "handled" and the keyboard stayed —
400
- // which is exactly the "closes only every other time" symptom
401
- // (hit a gap → close, hit a bubble → stay). Explicitly dismissing
402
- // here makes it reliable across the whole list. onPress does NOT
403
- // fire when onLongPress fires, so opening MessageInteractions via
404
- // long-press never triggers this dismiss.
405
- ,
406
- onPress: () => _reactNative.Keyboard.dismiss()
407
- // disableInteractions hides the long-press → context menu
408
- // (delete / edit / reply / react). Mirrors web's config gate.
409
- ,
410
- onLongPress: config?.disableInteractions ? undefined : handleLongPress,
411
- delayLongPress: 500,
412
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(CustomMessageBubble, {
413
- ref: bubbleRef,
414
- collapsable: false,
415
- isUser: isUser,
416
- deleted: message.isDeleted,
417
- isMedia: message?.isMediafile === 'true' && !message?.isDeleted,
418
- children: [!isUser && hasRealSenderName && /*#__PURE__*/(0, _jsxRuntime.jsx)(CustomUserName
419
- // Historically `config.colors.primary` with a plain-text
420
- // fallback; theme.primary carries the same value in light
421
- // mode and the dark accent in dark mode.
422
- , {
423
- color: config?.colors?.primary ? theme.primary : undefined,
424
- media: message?.isMediafile === 'true',
425
- fontSize: config?.typography?.senderName?.fontSize,
426
- fontWeight: config?.typography?.senderName?.fontWeight,
427
- children: senderDisplayName
428
- }), !isReply && message.mainMessage && /*#__PURE__*/(0, _jsxRuntime.jsx)(_MessageReply.MessageReply, {
429
- handleReplyMessage: handleReplyMessage,
430
- isUser: isUser,
431
- text: JSON.parse(message.mainMessage).text,
432
- color: theme.primary
433
- }), message?.isMediafile === 'true' && !message?.isDeleted ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_MediaMessage.default, {
434
- mimeType: message.mimetype,
435
- messageText: message.locationPreview,
436
- location: message?.location,
437
- message: message,
438
- isUser: isUser
439
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
440
- children: message.isDeleted && message.id !== 'delimiter-new' ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_DeletedMessage.DeletedMessage, {}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(CustomMessageText, {
453
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeGestureHandler.GestureDetector, {
454
+ gesture: longPress,
455
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable
456
+ // The Pressable fills the row's content area, so the bubble
457
+ // inside must be aligned to the sender's side — otherwise it
458
+ // hugs the left and own media bubbles sit with a right-side
459
+ // gap (text bubbles only looked right because they're narrow).
460
+ // flex-end for own, flex-start for others.
461
+ , {
462
+ style: {
463
+ flex: 1,
464
+ alignItems: isUser ? 'flex-end' : 'flex-start'
465
+ }
466
+ // A plain tap anywhere on a message bubble dismisses the
467
+ // keyboard. The FlatList's keyboardShouldPersistTaps="handled"
468
+ // already dismisses taps on the empty GAPS between bubbles, but
469
+ // the bubble Pressable itself is a touch responder, so taps that
470
+ // landed on a message were "handled" and the keyboard stayed —
471
+ // which is exactly the "closes only every other time" symptom
472
+ // (hit a gap → close, hit a bubble → stay). Explicitly dismissing
473
+ // here makes it reliable across the whole list. onPress does NOT
474
+ // fire when onLongPress fires, so opening MessageInteractions via
475
+ // long-press never triggers this dismiss.
476
+ ,
477
+ onPress: () => _reactNative.Keyboard.dismiss(),
478
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Animated.View, {
479
+ style: {
480
+ transform: [{
481
+ scale: lift
482
+ }]
483
+ },
484
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(CustomMessageBubble, {
485
+ ref: bubbleRef,
486
+ collapsable: false,
441
487
  isUser: isUser,
442
- fontSize: config?.typography?.messageText?.fontSize,
443
- fontWeight: config?.typography?.messageText?.fontWeight,
444
- children: showInlineTranslation ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_TranslatedMessageBody.default, {
488
+ deleted: message.isDeleted,
489
+ isMedia: message?.isMediafile === 'true' && !message?.isDeleted,
490
+ children: [!isUser && hasRealSenderName && /*#__PURE__*/(0, _jsxRuntime.jsx)(CustomUserName
491
+ // Historically `config.colors.primary` with a plain-text
492
+ // fallback; theme.primary carries the same value in light
493
+ // mode and the dark accent in dark mode.
494
+ , {
495
+ color: config?.colors?.primary ? theme.primary : undefined,
496
+ media: message?.isMediafile === 'true',
497
+ fontSize: config?.typography?.senderName?.fontSize,
498
+ fontWeight: config?.typography?.senderName?.fontWeight,
499
+ children: senderDisplayName
500
+ }), !isReply && !!replyRef?.text && /*#__PURE__*/(0, _jsxRuntime.jsx)(_MessageReply.MessageReply, {
501
+ handleReplyMessage: handleReplyMessage,
445
502
  isUser: isUser,
446
- originalText: translationDisplay.originalText,
447
- accentColor: theme.primary,
448
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
449
- children: messageText
503
+ text: replyRef.text,
504
+ userName: replyRef.userName,
505
+ color: theme.primary
506
+ }), message?.isMediafile === 'true' && !message?.isDeleted ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_MediaMessage.default, {
507
+ mimeType: message.mimetype,
508
+ messageText: message.locationPreview,
509
+ location: message?.location,
510
+ message: message,
511
+ isUser: isUser
512
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
513
+ children: message.isDeleted && message.id !== 'delimiter-new' ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_DeletedMessage.DeletedMessage, {}) : isUndecryptable ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
514
+ style: styles.undecryptable,
515
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.LockIcon, {
516
+ width: 15,
517
+ height: 15,
518
+ color: theme.textSecondary
519
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
520
+ style: [styles.undecryptableText, themedStyles.muted, {
521
+ fontSize: config?.typography?.messageText?.fontSize ?? 15
522
+ }],
523
+ children: t((0, _stanza.placeholderKey)(message.e2eeError))
524
+ })]
525
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(CustomMessageText, {
526
+ isUser: isUser,
527
+ fontSize: config?.typography?.messageText?.fontSize,
528
+ fontWeight: config?.typography?.messageText?.fontWeight,
529
+ children: showInlineTranslation ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_TranslatedMessageBody.default, {
530
+ isUser: isUser,
531
+ originalText: translationDisplay.originalText,
532
+ accentColor: theme.primary,
533
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
534
+ children: messageText
535
+ })
536
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
537
+ children: messageText
538
+ })
450
539
  })
451
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
452
- children: messageText
453
- })
454
- })
455
- }), !isUser && isTranslatesEnabled && effectiveTranslateMode === 'manual' && /*#__PURE__*/(0, _jsxRuntime.jsx)(_MessageTranslate.default, {
456
- message: message,
457
- config: config,
458
- isUser: isUser,
459
- readerLocale: readerLocale
460
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(CustomTimestampRow, {
461
- media: message?.isMediafile === 'true',
462
- children: [!config?.disableSentLogic && isUser && isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
463
- style: [styles.timestampText, themedStyles.muted],
464
- children: "sending..."
465
- }), !config?.disableSentLogic && isUser && isFailed && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
466
- onPress: onRetryPress,
467
- style: [styles.failedText, themedStyles.failed],
468
- accessibilityRole: "button",
469
- accessibilityLabel: "Retry sending message",
470
- children: "! Failed \u2014 tap to retry"
471
- }), message?.isEdited && !message?.isDeleted && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
472
- style: [styles.editedText, themedStyles.muted],
473
- children: "edited"
474
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
475
- style: [styles.timestampText, themedStyles.muted],
476
- children: new Date(message.date).toLocaleTimeString([], {
477
- hour: '2-digit',
478
- minute: '2-digit'
479
- })
480
- }), !config?.disableSentLogic && isUser && !isPending && !isFailed && /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.DoubleTick, {})]
481
- }), message?.reply?.length && message?.reply?.length > 0 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_BottomReplyContainer.BottomReplyContainer, {
482
- isUser: isUser,
483
- onClick: handleReplyMessage,
484
- reply: message?.reply
485
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_StyledComponents.MessageFooter, {
486
- isUser: isUser,
487
- children: message.reaction && !config?.disableReactions && /*#__PURE__*/(0, _jsxRuntime.jsx)(_MessageReaction.MessageReaction, {
488
- reaction: message.reaction,
489
- changeReaction: handleReactionMessage,
490
- color: theme.primary,
491
- userName: `${user.firstName} ${user.lastName}`
492
- })
493
- })]
540
+ }), !isUser && !isUndecryptable && isTranslatesEnabled && effectiveTranslateMode === 'manual' && /*#__PURE__*/(0, _jsxRuntime.jsx)(_MessageTranslate.default, {
541
+ message: message,
542
+ config: config,
543
+ isUser: isUser,
544
+ readerLocale: readerLocale
545
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(CustomTimestampRow, {
546
+ media: message?.isMediafile === 'true',
547
+ children: [!config?.disableSentLogic && isUser && isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
548
+ style: [styles.timestampText, themedStyles.muted],
549
+ children: "sending..."
550
+ }), !config?.disableSentLogic && isUser && isFailed && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
551
+ onPress: onRetryPress,
552
+ style: [styles.failedText, themedStyles.failed],
553
+ accessibilityRole: "button",
554
+ accessibilityLabel: "Retry sending message",
555
+ children: "! Failed \u2014 tap to retry"
556
+ }), message?.isEdited && !message?.isDeleted && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
557
+ style: [styles.editedText, themedStyles.muted],
558
+ children: "edited"
559
+ }), message?.unencrypted && !message?.isDeleted && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
560
+ hitSlop: 10,
561
+ accessibilityRole: "button",
562
+ accessibilityLabel: t('e2ee.notEncrypted'),
563
+ accessibilityHint: t('e2ee.notEncryptedHint'),
564
+ testID: "message-not-encrypted",
565
+ onPress: () => _reactNative.Alert.alert(t('e2ee.notEncrypted'), t('e2ee.notEncryptedHint')),
566
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.LockOffIcon, {
567
+ width: 13,
568
+ height: 13,
569
+ color: theme.danger
570
+ })
571
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
572
+ style: [styles.timestampText, themedStyles.muted],
573
+ children: timeLabel
574
+ }), !config?.disableSentLogic && isUser && !isPending && !isFailed && /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.DoubleTick, {})]
575
+ })]
576
+ }), (!isReply && (message?.reply?.length || 0) > 0 || !!message.reaction && (0, _reactionsConfig.reactionsEnabled)(config)) && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
577
+ style: [styles.reactionRow, isUser ? styles.reactionRowUser : styles.reactionRowOther],
578
+ children: [!isReply && (message?.reply?.length || 0) > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_BottomReplyContainer.BottomReplyContainer, {
579
+ isUser: isUser,
580
+ onClick: handleReplyMessage,
581
+ reply: message.reply
582
+ }), message.reaction && (0, _reactionsConfig.reactionsEnabled)(config) && /*#__PURE__*/(0, _jsxRuntime.jsx)(_MessageReaction.MessageReaction, {
583
+ reaction: message.reaction,
584
+ changeReaction: handleReactionMessage,
585
+ color: theme.primary,
586
+ userName: `${user.firstName || ''} ${user.lastName || ''}`.trim(),
587
+ interactive: !config?.disableInteractions
588
+ })]
589
+ })]
590
+ })
494
591
  })
495
592
  })]
496
593
  }), !config?.disableInteractions && isPressed && /*#__PURE__*/(0, _jsxRuntime.jsx)(_MessageInteractions.default, {
@@ -502,11 +599,16 @@ const Message = ({
502
599
  handleReplyMessage: handleReplyMessage,
503
600
  handleDeleteMessage: handleDeleteMessage,
504
601
  handleEditMessage: handleEditMessage,
505
- handleReactionMessage: handleReactionMessage
602
+ handleReactionMessage: handleReactionMessage,
603
+ onOpenEmojiPicker: () => setEmojiPickerOpen(true)
604
+ }), emojiPickerOpen && /*#__PURE__*/(0, _jsxRuntime.jsx)(_EmojiPickerSheet.EmojiPickerSheet, {
605
+ visible: true,
606
+ onClose: () => setEmojiPickerOpen(false),
607
+ onPick: handleReactionMessage
506
608
  })]
507
609
  });
508
610
  };
509
- exports.Message = Message;
611
+ const MemoMessage = exports.Message = /*#__PURE__*/_react.default.memo(Message);
510
612
  const styles = _reactNative.StyleSheet.create({
511
613
  customMessageContainer: {
512
614
  flexDirection: 'row',
@@ -514,6 +616,22 @@ const styles = _reactNative.StyleSheet.create({
514
616
  alignItems: 'flex-end',
515
617
  position: 'relative'
516
618
  },
619
+ reactionRow: {
620
+ marginTop: -10,
621
+ zIndex: 1,
622
+ flexDirection: 'row',
623
+ flexWrap: 'wrap',
624
+ alignItems: 'center',
625
+ gap: 6
626
+ },
627
+ reactionRowUser: {
628
+ alignSelf: 'flex-end',
629
+ marginRight: 8
630
+ },
631
+ reactionRowOther: {
632
+ alignSelf: 'flex-start',
633
+ marginLeft: 8
634
+ },
517
635
  overlay: {
518
636
  ..._reactNative.StyleSheet.absoluteFill,
519
637
  position: 'absolute',
@@ -546,6 +664,16 @@ const styles = _reactNative.StyleSheet.create({
546
664
  marginTop: 4,
547
665
  gap: 4
548
666
  },
667
+ undecryptable: {
668
+ flexDirection: 'row',
669
+ alignItems: 'flex-start',
670
+ gap: 6,
671
+ maxWidth: 260
672
+ },
673
+ undecryptableText: {
674
+ flexShrink: 1,
675
+ fontStyle: 'italic'
676
+ },
549
677
  timestampText: {
550
678
  fontSize: 12,
551
679
  lineHeight: 16,