@ethora/chat-component-rn 26.8.5 → 26.8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (690) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +95 -0
  3. package/lib/commonjs/assets/emojiData.js +40 -0
  4. package/lib/commonjs/assets/emojiData.js.map +1 -0
  5. package/lib/commonjs/assets/icons.js +5 -3
  6. package/lib/commonjs/assets/icons.js.map +1 -1
  7. package/lib/commonjs/components/MainComponents/ChatHeader.js +35 -15
  8. package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
  9. package/lib/commonjs/components/MainComponents/ChatRoom.js +33 -24
  10. package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
  11. package/lib/commonjs/components/MainComponents/ChatWrapper.js +22 -16
  12. package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
  13. package/lib/commonjs/components/MainComponents/EncryptedSendNotice.js +47 -0
  14. package/lib/commonjs/components/MainComponents/EncryptedSendNotice.js.map +1 -0
  15. package/lib/commonjs/components/MainComponents/EncryptionCard.js +286 -0
  16. package/lib/commonjs/components/MainComponents/EncryptionCard.js.map +1 -0
  17. package/lib/commonjs/components/MainComponents/MediaMessage.js +7 -0
  18. package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
  19. package/lib/commonjs/components/MainComponents/MessageContainer.js +4 -12
  20. package/lib/commonjs/components/MainComponents/MessageContainer.js.map +1 -1
  21. package/lib/commonjs/components/MainComponents/MessageList.js +110 -35
  22. package/lib/commonjs/components/MainComponents/MessageList.js.map +1 -1
  23. package/lib/commonjs/components/MainComponents/ReduxWrapper.js +5 -0
  24. package/lib/commonjs/components/MainComponents/ReduxWrapper.js.map +1 -1
  25. package/lib/commonjs/components/MainComponents/RoomList.js +32 -29
  26. package/lib/commonjs/components/MainComponents/RoomList.js.map +1 -1
  27. package/lib/commonjs/components/MainComponents/RoomStack.js +133 -65
  28. package/lib/commonjs/components/MainComponents/RoomStack.js.map +1 -1
  29. package/lib/commonjs/components/MainComponents/SealedAttachment.js +231 -0
  30. package/lib/commonjs/components/MainComponents/SealedAttachment.js.map +1 -0
  31. package/lib/commonjs/components/MainComponents/SystemMessage.js +6 -2
  32. package/lib/commonjs/components/MainComponents/SystemMessage.js.map +1 -1
  33. package/lib/commonjs/components/MessageBubble/Avatar.js +5 -1
  34. package/lib/commonjs/components/MessageBubble/Avatar.js.map +1 -1
  35. package/lib/commonjs/components/MessageBubble/BottomReplyContainer.js +18 -21
  36. package/lib/commonjs/components/MessageBubble/BottomReplyContainer.js.map +1 -1
  37. package/lib/commonjs/components/MessageBubble/EmojiPickerSheet.js +447 -0
  38. package/lib/commonjs/components/MessageBubble/EmojiPickerSheet.js.map +1 -0
  39. package/lib/commonjs/components/MessageBubble/Message.js +264 -136
  40. package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
  41. package/lib/commonjs/components/MessageBubble/MessageInteractions.js +215 -13
  42. package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
  43. package/lib/commonjs/components/MessageBubble/MessageReaction.js +113 -94
  44. package/lib/commonjs/components/MessageBubble/MessageReaction.js.map +1 -1
  45. package/lib/commonjs/components/MessageBubble/MessageReply.js +66 -24
  46. package/lib/commonjs/components/MessageBubble/MessageReply.js.map +1 -1
  47. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +7 -4
  48. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  49. package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js +159 -16
  50. package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
  51. package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js +4 -0
  52. package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
  53. package/lib/commonjs/components/Modals/Modal/SwipeBackLayer.js +76 -44
  54. package/lib/commonjs/components/Modals/Modal/SwipeBackLayer.js.map +1 -1
  55. package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js +29 -6
  56. package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
  57. package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js +5 -1
  58. package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
  59. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +37 -13
  60. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
  61. package/lib/commonjs/components/RoomComponents/LastMessageItem.js +6 -0
  62. package/lib/commonjs/components/RoomComponents/LastMessageItem.js.map +1 -1
  63. package/lib/commonjs/components/RoomComponents/styled/LastAudioMessage.js +2 -2
  64. package/lib/commonjs/components/RoomComponents/styled/LastAudioMessage.js.map +1 -1
  65. package/lib/commonjs/components/RoomComponents/styled/LastMessageEmoji.js +8 -9
  66. package/lib/commonjs/components/RoomComponents/styled/LastMessageEmoji.js.map +1 -1
  67. package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js +4 -6
  68. package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
  69. package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js +2 -2
  70. package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
  71. package/lib/commonjs/components/RoomComponents/styled/LastMessageSealed.js +41 -0
  72. package/lib/commonjs/components/RoomComponents/styled/LastMessageSealed.js.map +1 -0
  73. package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js +2 -2
  74. package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
  75. package/lib/commonjs/components/Thread/ThreadWrapper.js +273 -152
  76. package/lib/commonjs/components/Thread/ThreadWrapper.js.map +1 -1
  77. package/lib/commonjs/components/UsersList/UsersList.js +2 -1
  78. package/lib/commonjs/components/UsersList/UsersList.js.map +1 -1
  79. package/lib/commonjs/components/styled/DateLabel.js +6 -3
  80. package/lib/commonjs/components/styled/DateLabel.js.map +1 -1
  81. package/lib/commonjs/components/styled/SendInput.js +4 -2
  82. package/lib/commonjs/components/styled/SendInput.js.map +1 -1
  83. package/lib/commonjs/context/MessageNotificationContext.js +188 -9
  84. package/lib/commonjs/context/MessageNotificationContext.js.map +1 -1
  85. package/lib/commonjs/context/xmppProvider.js +22 -7
  86. package/lib/commonjs/context/xmppProvider.js.map +1 -1
  87. package/lib/commonjs/e2ee/crypto.js +207 -0
  88. package/lib/commonjs/e2ee/crypto.js.map +1 -0
  89. package/lib/commonjs/e2ee/deviceStore.js +84 -0
  90. package/lib/commonjs/e2ee/deviceStore.js.map +1 -0
  91. package/lib/commonjs/e2ee/fileCipher.js +95 -0
  92. package/lib/commonjs/e2ee/fileCipher.js.map +1 -0
  93. package/lib/commonjs/e2ee/fileEnvelope.js +79 -0
  94. package/lib/commonjs/e2ee/fileEnvelope.js.map +1 -0
  95. package/lib/commonjs/e2ee/index.js +210 -0
  96. package/lib/commonjs/e2ee/index.js.map +1 -0
  97. package/lib/commonjs/e2ee/limits.js +9 -0
  98. package/lib/commonjs/e2ee/limits.js.map +1 -0
  99. package/lib/commonjs/e2ee/ns.js +8 -0
  100. package/lib/commonjs/e2ee/ns.js.map +1 -0
  101. package/lib/commonjs/e2ee/omemo.js +622 -0
  102. package/lib/commonjs/e2ee/omemo.js.map +1 -0
  103. package/lib/commonjs/e2ee/protobuf.js +149 -0
  104. package/lib/commonjs/e2ee/protobuf.js.map +1 -0
  105. package/lib/commonjs/e2ee/ratchet.js +238 -0
  106. package/lib/commonjs/e2ee/ratchet.js.map +1 -0
  107. package/lib/commonjs/e2ee/sealedBody.js +23 -0
  108. package/lib/commonjs/e2ee/sealedBody.js.map +1 -0
  109. package/lib/commonjs/e2ee/sealedFiles.js +174 -0
  110. package/lib/commonjs/e2ee/sealedFiles.js.map +1 -0
  111. package/lib/commonjs/e2ee/send.js +54 -0
  112. package/lib/commonjs/e2ee/send.js.map +1 -0
  113. package/lib/commonjs/e2ee/stanza.js +114 -0
  114. package/lib/commonjs/e2ee/stanza.js.map +1 -0
  115. package/lib/commonjs/e2ee/store.js +43 -0
  116. package/lib/commonjs/e2ee/store.js.map +1 -0
  117. package/lib/commonjs/helpers/accountName.js +23 -0
  118. package/lib/commonjs/helpers/accountName.js.map +1 -0
  119. package/lib/commonjs/helpers/createMessageFromXml.js +19 -4
  120. package/lib/commonjs/helpers/createMessageFromXml.js.map +1 -1
  121. package/lib/commonjs/helpers/createRoomFromApi.js +36 -2
  122. package/lib/commonjs/helpers/createRoomFromApi.js.map +1 -1
  123. package/lib/commonjs/helpers/createUserNameFromSetUser.js +2 -1
  124. package/lib/commonjs/helpers/createUserNameFromSetUser.js.map +1 -1
  125. package/lib/commonjs/helpers/displayName.js +16 -0
  126. package/lib/commonjs/helpers/displayName.js.map +1 -0
  127. package/lib/commonjs/helpers/emoji.js +51 -0
  128. package/lib/commonjs/helpers/emoji.js.map +1 -0
  129. package/lib/commonjs/helpers/haptics.js +29 -0
  130. package/lib/commonjs/helpers/haptics.js.map +1 -0
  131. package/lib/commonjs/helpers/historyPreloadScheduler.js +32 -66
  132. package/lib/commonjs/helpers/historyPreloadScheduler.js.map +1 -1
  133. package/lib/commonjs/helpers/insertMessageWithDelimiter.js +21 -12
  134. package/lib/commonjs/helpers/insertMessageWithDelimiter.js.map +1 -1
  135. package/lib/commonjs/helpers/mamReactions.js +57 -0
  136. package/lib/commonjs/helpers/mamReactions.js.map +1 -0
  137. package/lib/commonjs/helpers/parseMessageReference.js +42 -0
  138. package/lib/commonjs/helpers/parseMessageReference.js.map +1 -0
  139. package/lib/commonjs/helpers/persistCrypto.js +5 -0
  140. package/lib/commonjs/helpers/persistCrypto.js.map +1 -1
  141. package/lib/commonjs/helpers/reactionsConfig.js +17 -0
  142. package/lib/commonjs/helpers/reactionsConfig.js.map +1 -0
  143. package/lib/commonjs/helpers/secureKeyValue.js +20 -0
  144. package/lib/commonjs/helpers/secureKeyValue.js.map +1 -1
  145. package/lib/commonjs/helpers/updateMessagesTillLast.js +17 -2
  146. package/lib/commonjs/helpers/updateMessagesTillLast.js.map +1 -1
  147. package/lib/commonjs/helpers/videoCache.js +136 -0
  148. package/lib/commonjs/helpers/videoCache.js.map +1 -0
  149. package/lib/commonjs/hooks/useHeapSender.js +3 -1
  150. package/lib/commonjs/hooks/useHeapSender.js.map +1 -1
  151. package/lib/commonjs/hooks/useLogout.js +8 -0
  152. package/lib/commonjs/hooks/useLogout.js.map +1 -1
  153. package/lib/commonjs/hooks/useMessageHeapState.js +3 -2
  154. package/lib/commonjs/hooks/useMessageHeapState.js.map +1 -1
  155. package/lib/commonjs/hooks/useRoomInitialization.js +16 -7
  156. package/lib/commonjs/hooks/useRoomInitialization.js.map +1 -1
  157. package/lib/commonjs/hooks/useSendMessage.js +85 -15
  158. package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
  159. package/lib/commonjs/hooks/useUnreadMessagesCounter.js +1 -1
  160. package/lib/commonjs/hooks/useUnreadMessagesCounter.js.map +1 -1
  161. package/lib/commonjs/i18n/strings.js +180 -0
  162. package/lib/commonjs/i18n/strings.js.map +1 -1
  163. package/lib/commonjs/main.js +13 -0
  164. package/lib/commonjs/main.js.map +1 -1
  165. package/lib/commonjs/networking/api-requests/auth.api.js +4 -1
  166. package/lib/commonjs/networking/api-requests/auth.api.js.map +1 -1
  167. package/lib/commonjs/networking/api-requests/rooms.api.js +111 -17
  168. package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
  169. package/lib/commonjs/networking/stanzaHandlers.js +106 -50
  170. package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
  171. package/lib/commonjs/networking/xmpp/getHistory.xmpp.js +29 -74
  172. package/lib/commonjs/networking/xmpp/getHistory.xmpp.js.map +1 -1
  173. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js +44 -0
  174. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  175. package/lib/commonjs/networking/xmpp/mamRouter.js +186 -0
  176. package/lib/commonjs/networking/xmpp/mamRouter.js.map +1 -0
  177. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js +41 -4
  178. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  179. package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js +16 -3
  180. package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
  181. package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js +13 -6
  182. package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
  183. package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +14 -6
  184. package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
  185. package/lib/commonjs/networking/xmppClient.js +104 -23
  186. package/lib/commonjs/networking/xmppClient.js.map +1 -1
  187. package/lib/commonjs/roomStore/Middleware/newMessageMidlleware.js +29 -34
  188. package/lib/commonjs/roomStore/Middleware/newMessageMidlleware.js.map +1 -1
  189. package/lib/commonjs/roomStore/Middleware/perfMiddleware.js +51 -0
  190. package/lib/commonjs/roomStore/Middleware/perfMiddleware.js.map +1 -0
  191. package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js +66 -43
  192. package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
  193. package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js +88 -68
  194. package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js.map +1 -1
  195. package/lib/commonjs/roomStore/index.js +18 -14
  196. package/lib/commonjs/roomStore/index.js.map +1 -1
  197. package/lib/commonjs/roomStore/persistBackend.js +93 -0
  198. package/lib/commonjs/roomStore/persistBackend.js.map +1 -0
  199. package/lib/commonjs/roomStore/persistence.js +253 -51
  200. package/lib/commonjs/roomStore/persistence.js.map +1 -1
  201. package/lib/commonjs/roomStore/roomsSlice.js +282 -136
  202. package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
  203. package/lib/commonjs/theme/theme.js +3 -0
  204. package/lib/commonjs/theme/theme.js.map +1 -1
  205. package/lib/commonjs/utils/devLogger.js +14 -0
  206. package/lib/commonjs/utils/devLogger.js.map +1 -1
  207. package/lib/commonjs/version.js +1 -1
  208. package/lib/module/assets/emojiData.js +36 -0
  209. package/lib/module/assets/emojiData.js.map +1 -0
  210. package/lib/module/assets/icons.js +4 -2
  211. package/lib/module/assets/icons.js.map +1 -1
  212. package/lib/module/components/MainComponents/ChatHeader.js +37 -17
  213. package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
  214. package/lib/module/components/MainComponents/ChatRoom.js +34 -25
  215. package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
  216. package/lib/module/components/MainComponents/ChatWrapper.js +23 -17
  217. package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
  218. package/lib/module/components/MainComponents/EncryptedSendNotice.js +42 -0
  219. package/lib/module/components/MainComponents/EncryptedSendNotice.js.map +1 -0
  220. package/lib/module/components/MainComponents/EncryptionCard.js +281 -0
  221. package/lib/module/components/MainComponents/EncryptionCard.js.map +1 -0
  222. package/lib/module/components/MainComponents/MediaMessage.js +7 -0
  223. package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
  224. package/lib/module/components/MainComponents/MessageContainer.js +7 -14
  225. package/lib/module/components/MainComponents/MessageContainer.js.map +1 -1
  226. package/lib/module/components/MainComponents/MessageList.js +110 -35
  227. package/lib/module/components/MainComponents/MessageList.js.map +1 -1
  228. package/lib/module/components/MainComponents/ReduxWrapper.js +5 -0
  229. package/lib/module/components/MainComponents/ReduxWrapper.js.map +1 -1
  230. package/lib/module/components/MainComponents/RoomList.js +32 -29
  231. package/lib/module/components/MainComponents/RoomList.js.map +1 -1
  232. package/lib/module/components/MainComponents/RoomStack.js +131 -63
  233. package/lib/module/components/MainComponents/RoomStack.js.map +1 -1
  234. package/lib/module/components/MainComponents/SealedAttachment.js +224 -0
  235. package/lib/module/components/MainComponents/SealedAttachment.js.map +1 -0
  236. package/lib/module/components/MainComponents/SystemMessage.js +6 -2
  237. package/lib/module/components/MainComponents/SystemMessage.js.map +1 -1
  238. package/lib/module/components/MessageBubble/Avatar.js +5 -1
  239. package/lib/module/components/MessageBubble/Avatar.js.map +1 -1
  240. package/lib/module/components/MessageBubble/BottomReplyContainer.js +19 -22
  241. package/lib/module/components/MessageBubble/BottomReplyContainer.js.map +1 -1
  242. package/lib/module/components/MessageBubble/EmojiPickerSheet.js +438 -0
  243. package/lib/module/components/MessageBubble/EmojiPickerSheet.js.map +1 -0
  244. package/lib/module/components/MessageBubble/Message.js +269 -140
  245. package/lib/module/components/MessageBubble/Message.js.map +1 -1
  246. package/lib/module/components/MessageBubble/MessageInteractions.js +217 -15
  247. package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
  248. package/lib/module/components/MessageBubble/MessageReaction.js +115 -94
  249. package/lib/module/components/MessageBubble/MessageReaction.js.map +1 -1
  250. package/lib/module/components/MessageBubble/MessageReply.js +65 -24
  251. package/lib/module/components/MessageBubble/MessageReply.js.map +1 -1
  252. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +7 -4
  253. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  254. package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js +161 -18
  255. package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
  256. package/lib/module/components/Modals/FilePreviewModal/PdfView.js +4 -0
  257. package/lib/module/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
  258. package/lib/module/components/Modals/Modal/SwipeBackLayer.js +76 -44
  259. package/lib/module/components/Modals/Modal/SwipeBackLayer.js.map +1 -1
  260. package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js +32 -8
  261. package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
  262. package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js +4 -0
  263. package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
  264. package/lib/module/components/RoomComponents/ChatRoomItem.js +37 -13
  265. package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
  266. package/lib/module/components/RoomComponents/LastMessageItem.js +6 -0
  267. package/lib/module/components/RoomComponents/LastMessageItem.js.map +1 -1
  268. package/lib/module/components/RoomComponents/styled/LastAudioMessage.js +2 -2
  269. package/lib/module/components/RoomComponents/styled/LastAudioMessage.js.map +1 -1
  270. package/lib/module/components/RoomComponents/styled/LastMessageEmoji.js +8 -9
  271. package/lib/module/components/RoomComponents/styled/LastMessageEmoji.js.map +1 -1
  272. package/lib/module/components/RoomComponents/styled/LastMessageFile.js +4 -6
  273. package/lib/module/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
  274. package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js +2 -2
  275. package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
  276. package/lib/module/components/RoomComponents/styled/LastMessageSealed.js +36 -0
  277. package/lib/module/components/RoomComponents/styled/LastMessageSealed.js.map +1 -0
  278. package/lib/module/components/RoomComponents/styled/LastMessageVideo.js +2 -2
  279. package/lib/module/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
  280. package/lib/module/components/Thread/ThreadWrapper.js +273 -153
  281. package/lib/module/components/Thread/ThreadWrapper.js.map +1 -1
  282. package/lib/module/components/UsersList/UsersList.js +2 -1
  283. package/lib/module/components/UsersList/UsersList.js.map +1 -1
  284. package/lib/module/components/styled/DateLabel.js +6 -3
  285. package/lib/module/components/styled/DateLabel.js.map +1 -1
  286. package/lib/module/components/styled/SendInput.js +4 -2
  287. package/lib/module/components/styled/SendInput.js.map +1 -1
  288. package/lib/module/context/MessageNotificationContext.js +190 -11
  289. package/lib/module/context/MessageNotificationContext.js.map +1 -1
  290. package/lib/module/context/xmppProvider.js +22 -7
  291. package/lib/module/context/xmppProvider.js.map +1 -1
  292. package/lib/module/e2ee/crypto.js +170 -0
  293. package/lib/module/e2ee/crypto.js.map +1 -0
  294. package/lib/module/e2ee/deviceStore.js +77 -0
  295. package/lib/module/e2ee/deviceStore.js.map +1 -0
  296. package/lib/module/e2ee/fileCipher.js +90 -0
  297. package/lib/module/e2ee/fileCipher.js.map +1 -0
  298. package/lib/module/e2ee/fileEnvelope.js +66 -0
  299. package/lib/module/e2ee/fileEnvelope.js.map +1 -0
  300. package/lib/module/e2ee/index.js +185 -0
  301. package/lib/module/e2ee/index.js.map +1 -0
  302. package/lib/module/e2ee/limits.js +5 -0
  303. package/lib/module/e2ee/limits.js.map +1 -0
  304. package/lib/module/e2ee/ns.js +4 -0
  305. package/lib/module/e2ee/ns.js.map +1 -0
  306. package/lib/module/e2ee/omemo.js +610 -0
  307. package/lib/module/e2ee/omemo.js.map +1 -0
  308. package/lib/module/e2ee/protobuf.js +140 -0
  309. package/lib/module/e2ee/protobuf.js.map +1 -0
  310. package/lib/module/e2ee/ratchet.js +228 -0
  311. package/lib/module/e2ee/ratchet.js.map +1 -0
  312. package/lib/module/e2ee/sealedBody.js +19 -0
  313. package/lib/module/e2ee/sealedBody.js.map +1 -0
  314. package/lib/module/e2ee/sealedFiles.js +154 -0
  315. package/lib/module/e2ee/sealedFiles.js.map +1 -0
  316. package/lib/module/e2ee/send.js +48 -0
  317. package/lib/module/e2ee/send.js.map +1 -0
  318. package/lib/module/e2ee/stanza.js +107 -0
  319. package/lib/module/e2ee/stanza.js.map +1 -0
  320. package/lib/module/e2ee/store.js +35 -0
  321. package/lib/module/e2ee/store.js.map +1 -0
  322. package/lib/module/helpers/accountName.js +18 -0
  323. package/lib/module/helpers/accountName.js.map +1 -0
  324. package/lib/module/helpers/createMessageFromXml.js +19 -4
  325. package/lib/module/helpers/createMessageFromXml.js.map +1 -1
  326. package/lib/module/helpers/createRoomFromApi.js +36 -2
  327. package/lib/module/helpers/createRoomFromApi.js.map +1 -1
  328. package/lib/module/helpers/createUserNameFromSetUser.js +3 -1
  329. package/lib/module/helpers/createUserNameFromSetUser.js.map +1 -1
  330. package/lib/module/helpers/displayName.js +11 -0
  331. package/lib/module/helpers/displayName.js.map +1 -0
  332. package/lib/module/helpers/emoji.js +44 -0
  333. package/lib/module/helpers/emoji.js.map +1 -0
  334. package/lib/module/helpers/haptics.js +24 -0
  335. package/lib/module/helpers/haptics.js.map +1 -0
  336. package/lib/module/helpers/historyPreloadScheduler.js +32 -66
  337. package/lib/module/helpers/historyPreloadScheduler.js.map +1 -1
  338. package/lib/module/helpers/insertMessageWithDelimiter.js +21 -12
  339. package/lib/module/helpers/insertMessageWithDelimiter.js.map +1 -1
  340. package/lib/module/helpers/mamReactions.js +51 -0
  341. package/lib/module/helpers/mamReactions.js.map +1 -0
  342. package/lib/module/helpers/parseMessageReference.js +37 -0
  343. package/lib/module/helpers/parseMessageReference.js.map +1 -0
  344. package/lib/module/helpers/persistCrypto.js +4 -0
  345. package/lib/module/helpers/persistCrypto.js.map +1 -1
  346. package/lib/module/helpers/reactionsConfig.js +10 -0
  347. package/lib/module/helpers/reactionsConfig.js.map +1 -0
  348. package/lib/module/helpers/secureKeyValue.js +19 -0
  349. package/lib/module/helpers/secureKeyValue.js.map +1 -1
  350. package/lib/module/helpers/updateMessagesTillLast.js +17 -2
  351. package/lib/module/helpers/updateMessagesTillLast.js.map +1 -1
  352. package/lib/module/helpers/videoCache.js +125 -0
  353. package/lib/module/helpers/videoCache.js.map +1 -0
  354. package/lib/module/hooks/useHeapSender.js +3 -1
  355. package/lib/module/hooks/useHeapSender.js.map +1 -1
  356. package/lib/module/hooks/useLogout.js +8 -0
  357. package/lib/module/hooks/useLogout.js.map +1 -1
  358. package/lib/module/hooks/useMessageHeapState.js +3 -2
  359. package/lib/module/hooks/useMessageHeapState.js.map +1 -1
  360. package/lib/module/hooks/useRoomInitialization.js +17 -8
  361. package/lib/module/hooks/useRoomInitialization.js.map +1 -1
  362. package/lib/module/hooks/useSendMessage.js +85 -15
  363. package/lib/module/hooks/useSendMessage.js.map +1 -1
  364. package/lib/module/hooks/useUnreadMessagesCounter.js +1 -1
  365. package/lib/module/hooks/useUnreadMessagesCounter.js.map +1 -1
  366. package/lib/module/i18n/strings.js +180 -0
  367. package/lib/module/i18n/strings.js.map +1 -1
  368. package/lib/module/main.js +1 -0
  369. package/lib/module/main.js.map +1 -1
  370. package/lib/module/networking/api-requests/auth.api.js +4 -1
  371. package/lib/module/networking/api-requests/auth.api.js.map +1 -1
  372. package/lib/module/networking/api-requests/rooms.api.js +109 -18
  373. package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
  374. package/lib/module/networking/stanzaHandlers.js +107 -51
  375. package/lib/module/networking/stanzaHandlers.js.map +1 -1
  376. package/lib/module/networking/xmpp/getHistory.xmpp.js +29 -74
  377. package/lib/module/networking/xmpp/getHistory.xmpp.js.map +1 -1
  378. package/lib/module/networking/xmpp/handleStanzas.xmpp.js +42 -0
  379. package/lib/module/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  380. package/lib/module/networking/xmpp/mamRouter.js +175 -0
  381. package/lib/module/networking/xmpp/mamRouter.js.map +1 -0
  382. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js +38 -2
  383. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  384. package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js +16 -3
  385. package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
  386. package/lib/module/networking/xmpp/sendTextMessage.xmpp.js +13 -6
  387. package/lib/module/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
  388. package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +14 -6
  389. package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
  390. package/lib/module/networking/xmppClient.js +105 -24
  391. package/lib/module/networking/xmppClient.js.map +1 -1
  392. package/lib/module/roomStore/Middleware/newMessageMidlleware.js +29 -34
  393. package/lib/module/roomStore/Middleware/newMessageMidlleware.js.map +1 -1
  394. package/lib/module/roomStore/Middleware/perfMiddleware.js +45 -0
  395. package/lib/module/roomStore/Middleware/perfMiddleware.js.map +1 -0
  396. package/lib/module/roomStore/Middleware/reactionsMiddleware.js +66 -43
  397. package/lib/module/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
  398. package/lib/module/roomStore/Middleware/unreadMidlleware.js +89 -69
  399. package/lib/module/roomStore/Middleware/unreadMidlleware.js.map +1 -1
  400. package/lib/module/roomStore/index.js +19 -15
  401. package/lib/module/roomStore/index.js.map +1 -1
  402. package/lib/module/roomStore/persistBackend.js +86 -0
  403. package/lib/module/roomStore/persistBackend.js.map +1 -0
  404. package/lib/module/roomStore/persistence.js +253 -49
  405. package/lib/module/roomStore/persistence.js.map +1 -1
  406. package/lib/module/roomStore/roomsSlice.js +275 -134
  407. package/lib/module/roomStore/roomsSlice.js.map +1 -1
  408. package/lib/module/theme/theme.js +3 -0
  409. package/lib/module/theme/theme.js.map +1 -1
  410. package/lib/module/utils/devLogger.js +13 -0
  411. package/lib/module/utils/devLogger.js.map +1 -1
  412. package/lib/module/version.js +1 -1
  413. package/lib/typescript/assets/emojiData.d.ts +8 -0
  414. package/lib/typescript/assets/emojiData.d.ts.map +1 -0
  415. package/lib/typescript/assets/icons.d.ts +8 -0
  416. package/lib/typescript/assets/icons.d.ts.map +1 -1
  417. package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
  418. package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
  419. package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
  420. package/lib/typescript/components/MainComponents/EncryptedSendNotice.d.ts +4 -0
  421. package/lib/typescript/components/MainComponents/EncryptedSendNotice.d.ts.map +1 -0
  422. package/lib/typescript/components/MainComponents/EncryptionCard.d.ts +10 -0
  423. package/lib/typescript/components/MainComponents/EncryptionCard.d.ts.map +1 -0
  424. package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
  425. package/lib/typescript/components/MainComponents/MessageContainer.d.ts +2 -2
  426. package/lib/typescript/components/MainComponents/MessageContainer.d.ts.map +1 -1
  427. package/lib/typescript/components/MainComponents/MessageList.d.ts.map +1 -1
  428. package/lib/typescript/components/MainComponents/ReduxWrapper.d.ts.map +1 -1
  429. package/lib/typescript/components/MainComponents/RoomList.d.ts.map +1 -1
  430. package/lib/typescript/components/MainComponents/RoomStack.d.ts +7 -2
  431. package/lib/typescript/components/MainComponents/RoomStack.d.ts.map +1 -1
  432. package/lib/typescript/components/MainComponents/SealedAttachment.d.ts +13 -0
  433. package/lib/typescript/components/MainComponents/SealedAttachment.d.ts.map +1 -0
  434. package/lib/typescript/components/MainComponents/SystemMessage.d.ts.map +1 -1
  435. package/lib/typescript/components/MessageBubble/Avatar.d.ts +2 -0
  436. package/lib/typescript/components/MessageBubble/Avatar.d.ts.map +1 -1
  437. package/lib/typescript/components/MessageBubble/BottomReplyContainer.d.ts.map +1 -1
  438. package/lib/typescript/components/MessageBubble/EmojiPickerSheet.d.ts +11 -0
  439. package/lib/typescript/components/MessageBubble/EmojiPickerSheet.d.ts.map +1 -0
  440. package/lib/typescript/components/MessageBubble/Message.d.ts +2 -2
  441. package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
  442. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts +2 -0
  443. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts.map +1 -1
  444. package/lib/typescript/components/MessageBubble/MessageReaction.d.ts +1 -0
  445. package/lib/typescript/components/MessageBubble/MessageReaction.d.ts.map +1 -1
  446. package/lib/typescript/components/MessageBubble/MessageReply.d.ts +7 -7
  447. package/lib/typescript/components/MessageBubble/MessageReply.d.ts.map +1 -1
  448. package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
  449. package/lib/typescript/components/Modals/FilePreviewModal/FilePreviewModal.d.ts.map +1 -1
  450. package/lib/typescript/components/Modals/FilePreviewModal/PdfView.d.ts.map +1 -1
  451. package/lib/typescript/components/Modals/Modal/SwipeBackLayer.d.ts +2 -1
  452. package/lib/typescript/components/Modals/Modal/SwipeBackLayer.d.ts.map +1 -1
  453. package/lib/typescript/components/Modals/UserProfileModal/UserProfileModal.d.ts.map +1 -1
  454. package/lib/typescript/components/Modals/UserSettingsModal/UserSettingsModal.d.ts.map +1 -1
  455. package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts +2 -2
  456. package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
  457. package/lib/typescript/components/RoomComponents/LastMessageItem.d.ts.map +1 -1
  458. package/lib/typescript/components/RoomComponents/styled/LastAudioMessage.d.ts.map +1 -1
  459. package/lib/typescript/components/RoomComponents/styled/LastMessageEmoji.d.ts +3 -6
  460. package/lib/typescript/components/RoomComponents/styled/LastMessageEmoji.d.ts.map +1 -1
  461. package/lib/typescript/components/RoomComponents/styled/LastMessageSealed.d.ts +7 -0
  462. package/lib/typescript/components/RoomComponents/styled/LastMessageSealed.d.ts.map +1 -0
  463. package/lib/typescript/components/Thread/ThreadWrapper.d.ts +7 -1
  464. package/lib/typescript/components/Thread/ThreadWrapper.d.ts.map +1 -1
  465. package/lib/typescript/components/UsersList/UsersList.d.ts.map +1 -1
  466. package/lib/typescript/components/styled/DateLabel.d.ts +1 -0
  467. package/lib/typescript/components/styled/DateLabel.d.ts.map +1 -1
  468. package/lib/typescript/components/styled/SendInput.d.ts +1 -0
  469. package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
  470. package/lib/typescript/context/MessageNotificationContext.d.ts.map +1 -1
  471. package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
  472. package/lib/typescript/e2ee/crypto.d.ts +28 -0
  473. package/lib/typescript/e2ee/crypto.d.ts.map +1 -0
  474. package/lib/typescript/e2ee/deviceStore.d.ts +4 -0
  475. package/lib/typescript/e2ee/deviceStore.d.ts.map +1 -0
  476. package/lib/typescript/e2ee/fileCipher.d.ts +7 -0
  477. package/lib/typescript/e2ee/fileCipher.d.ts.map +1 -0
  478. package/lib/typescript/e2ee/fileEnvelope.d.ts +27 -0
  479. package/lib/typescript/e2ee/fileEnvelope.d.ts.map +1 -0
  480. package/lib/typescript/e2ee/index.d.ts +23 -0
  481. package/lib/typescript/e2ee/index.d.ts.map +1 -0
  482. package/lib/typescript/e2ee/limits.d.ts +3 -0
  483. package/lib/typescript/e2ee/limits.d.ts.map +1 -0
  484. package/lib/typescript/e2ee/ns.d.ts +2 -0
  485. package/lib/typescript/e2ee/ns.d.ts.map +1 -0
  486. package/lib/typescript/e2ee/omemo.d.ts +64 -0
  487. package/lib/typescript/e2ee/omemo.d.ts.map +1 -0
  488. package/lib/typescript/e2ee/protobuf.d.ts +25 -0
  489. package/lib/typescript/e2ee/protobuf.d.ts.map +1 -0
  490. package/lib/typescript/e2ee/ratchet.d.ts +39 -0
  491. package/lib/typescript/e2ee/ratchet.d.ts.map +1 -0
  492. package/lib/typescript/e2ee/sealedBody.d.ts +2 -0
  493. package/lib/typescript/e2ee/sealedBody.d.ts.map +1 -0
  494. package/lib/typescript/e2ee/sealedFiles.d.ts +31 -0
  495. package/lib/typescript/e2ee/sealedFiles.d.ts.map +1 -0
  496. package/lib/typescript/e2ee/send.d.ts +6 -0
  497. package/lib/typescript/e2ee/send.d.ts.map +1 -0
  498. package/lib/typescript/e2ee/stanza.d.ts +8 -0
  499. package/lib/typescript/e2ee/stanza.d.ts.map +1 -0
  500. package/lib/typescript/e2ee/store.d.ts +16 -0
  501. package/lib/typescript/e2ee/store.d.ts.map +1 -0
  502. package/lib/typescript/helpers/accountName.d.ts +7 -0
  503. package/lib/typescript/helpers/accountName.d.ts.map +1 -0
  504. package/lib/typescript/helpers/createMessageFromXml.d.ts.map +1 -1
  505. package/lib/typescript/helpers/createRoomFromApi.d.ts.map +1 -1
  506. package/lib/typescript/helpers/createUserNameFromSetUser.d.ts.map +1 -1
  507. package/lib/typescript/helpers/displayName.d.ts +2 -0
  508. package/lib/typescript/helpers/displayName.d.ts.map +1 -0
  509. package/lib/typescript/helpers/emoji.d.ts +6 -0
  510. package/lib/typescript/helpers/emoji.d.ts.map +1 -0
  511. package/lib/typescript/helpers/haptics.d.ts +3 -0
  512. package/lib/typescript/helpers/haptics.d.ts.map +1 -0
  513. package/lib/typescript/helpers/historyPreloadScheduler.d.ts +1 -0
  514. package/lib/typescript/helpers/historyPreloadScheduler.d.ts.map +1 -1
  515. package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts.map +1 -1
  516. package/lib/typescript/helpers/mamReactions.d.ts +13 -0
  517. package/lib/typescript/helpers/mamReactions.d.ts.map +1 -0
  518. package/lib/typescript/helpers/parseMessageReference.d.ts +16 -0
  519. package/lib/typescript/helpers/parseMessageReference.d.ts.map +1 -0
  520. package/lib/typescript/helpers/persistCrypto.d.ts +1 -0
  521. package/lib/typescript/helpers/persistCrypto.d.ts.map +1 -1
  522. package/lib/typescript/helpers/reactionsConfig.d.ts +5 -0
  523. package/lib/typescript/helpers/reactionsConfig.d.ts.map +1 -0
  524. package/lib/typescript/helpers/secureKeyValue.d.ts +4 -0
  525. package/lib/typescript/helpers/secureKeyValue.d.ts.map +1 -1
  526. package/lib/typescript/helpers/updateMessagesTillLast.d.ts.map +1 -1
  527. package/lib/typescript/helpers/videoCache.d.ts +19 -0
  528. package/lib/typescript/helpers/videoCache.d.ts.map +1 -0
  529. package/lib/typescript/hooks/useHeapSender.d.ts.map +1 -1
  530. package/lib/typescript/hooks/useLogout.d.ts.map +1 -1
  531. package/lib/typescript/hooks/useMessageHeapState.d.ts.map +1 -1
  532. package/lib/typescript/hooks/useRoomInitialization.d.ts +2 -2
  533. package/lib/typescript/hooks/useRoomInitialization.d.ts.map +1 -1
  534. package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
  535. package/lib/typescript/i18n/strings.d.ts.map +1 -1
  536. package/lib/typescript/main.d.ts +2 -0
  537. package/lib/typescript/main.d.ts.map +1 -1
  538. package/lib/typescript/networking/api-requests/auth.api.d.ts +4 -1
  539. package/lib/typescript/networking/api-requests/auth.api.d.ts.map +1 -1
  540. package/lib/typescript/networking/api-requests/rooms.api.d.ts +22 -1
  541. package/lib/typescript/networking/api-requests/rooms.api.d.ts.map +1 -1
  542. package/lib/typescript/networking/stanzaHandlers.d.ts +4 -2
  543. package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
  544. package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts +3 -1
  545. package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts.map +1 -1
  546. package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts +1 -0
  547. package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts.map +1 -1
  548. package/lib/typescript/networking/xmpp/mamRouter.d.ts +23 -0
  549. package/lib/typescript/networking/xmpp/mamRouter.d.ts.map +1 -0
  550. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts +1 -0
  551. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts.map +1 -1
  552. package/lib/typescript/networking/xmpp/sendMediaMessage.xmpp.d.ts.map +1 -1
  553. package/lib/typescript/networking/xmpp/sendTextMessage.xmpp.d.ts.map +1 -1
  554. package/lib/typescript/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.d.ts.map +1 -1
  555. package/lib/typescript/networking/xmppClient.d.ts +22 -1
  556. package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
  557. package/lib/typescript/roomStore/Middleware/newMessageMidlleware.d.ts.map +1 -1
  558. package/lib/typescript/roomStore/Middleware/perfMiddleware.d.ts +4 -0
  559. package/lib/typescript/roomStore/Middleware/perfMiddleware.d.ts.map +1 -0
  560. package/lib/typescript/roomStore/Middleware/reactionsMiddleware.d.ts +9 -0
  561. package/lib/typescript/roomStore/Middleware/reactionsMiddleware.d.ts.map +1 -1
  562. package/lib/typescript/roomStore/Middleware/unreadMidlleware.d.ts.map +1 -1
  563. package/lib/typescript/roomStore/index.d.ts.map +1 -1
  564. package/lib/typescript/roomStore/persistBackend.d.ts +11 -0
  565. package/lib/typescript/roomStore/persistBackend.d.ts.map +1 -0
  566. package/lib/typescript/roomStore/persistence.d.ts +5 -6
  567. package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
  568. package/lib/typescript/roomStore/roomsSlice.d.ts +41 -1
  569. package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
  570. package/lib/typescript/theme/theme.d.ts +4 -1
  571. package/lib/typescript/theme/theme.d.ts.map +1 -1
  572. package/lib/typescript/types/models/message.model.d.ts +9 -0
  573. package/lib/typescript/types/models/message.model.d.ts.map +1 -1
  574. package/lib/typescript/types/models/room.model.d.ts +21 -0
  575. package/lib/typescript/types/models/room.model.d.ts.map +1 -1
  576. package/lib/typescript/types/models/xmpp.model.d.ts +6 -1
  577. package/lib/typescript/types/models/xmpp.model.d.ts.map +1 -1
  578. package/lib/typescript/types/types.d.ts +19 -3
  579. package/lib/typescript/types/types.d.ts.map +1 -1
  580. package/lib/typescript/utils/devLogger.d.ts +8 -0
  581. package/lib/typescript/utils/devLogger.d.ts.map +1 -1
  582. package/lib/typescript/version.d.ts +1 -1
  583. package/package.json +14 -1
  584. package/src/assets/emojiData.ts +2146 -0
  585. package/src/assets/icons.tsx +32 -5
  586. package/src/components/MainComponents/ChatHeader.tsx +46 -16
  587. package/src/components/MainComponents/ChatRoom.tsx +46 -30
  588. package/src/components/MainComponents/ChatWrapper.tsx +28 -10
  589. package/src/components/MainComponents/EncryptedSendNotice.tsx +35 -0
  590. package/src/components/MainComponents/EncryptionCard.tsx +287 -0
  591. package/src/components/MainComponents/MediaMessage.tsx +5 -0
  592. package/src/components/MainComponents/MessageContainer.tsx +7 -15
  593. package/src/components/MainComponents/MessageList.tsx +96 -43
  594. package/src/components/MainComponents/ReduxWrapper.tsx +5 -0
  595. package/src/components/MainComponents/RoomList.tsx +28 -29
  596. package/src/components/MainComponents/RoomStack.tsx +156 -83
  597. package/src/components/MainComponents/SealedAttachment.tsx +251 -0
  598. package/src/components/MainComponents/SystemMessage.tsx +6 -2
  599. package/src/components/MessageBubble/Avatar.tsx +7 -1
  600. package/src/components/MessageBubble/BottomReplyContainer.tsx +20 -21
  601. package/src/components/MessageBubble/EmojiPickerSheet.tsx +468 -0
  602. package/src/components/MessageBubble/Message.tsx +242 -93
  603. package/src/components/MessageBubble/MessageInteractions.tsx +215 -15
  604. package/src/components/MessageBubble/MessageReaction.tsx +120 -96
  605. package/src/components/MessageBubble/MessageReply.tsx +65 -32
  606. package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +7 -4
  607. package/src/components/Modals/FilePreviewModal/FilePreviewModal.tsx +181 -35
  608. package/src/components/Modals/FilePreviewModal/PdfView.tsx +4 -0
  609. package/src/components/Modals/Modal/SwipeBackLayer.tsx +114 -63
  610. package/src/components/Modals/UserProfileModal/UserProfileModal.tsx +53 -8
  611. package/src/components/Modals/UserSettingsModal/UserSettingsModal.tsx +5 -0
  612. package/src/components/RoomComponents/ChatRoomItem.tsx +34 -15
  613. package/src/components/RoomComponents/LastMessageItem.tsx +5 -0
  614. package/src/components/RoomComponents/styled/LastAudioMessage.tsx +3 -1
  615. package/src/components/RoomComponents/styled/LastMessageEmoji.tsx +7 -8
  616. package/src/components/RoomComponents/styled/LastMessageFile.tsx +2 -2
  617. package/src/components/RoomComponents/styled/LastMessagePhoto.tsx +1 -1
  618. package/src/components/RoomComponents/styled/LastMessageSealed.tsx +31 -0
  619. package/src/components/RoomComponents/styled/LastMessageVideo.tsx +1 -1
  620. package/src/components/Thread/ThreadWrapper.tsx +287 -198
  621. package/src/components/UsersList/UsersList.tsx +2 -1
  622. package/src/components/styled/DateLabel.tsx +7 -3
  623. package/src/components/styled/SendInput.tsx +5 -2
  624. package/src/context/MessageNotificationContext.tsx +205 -7
  625. package/src/context/xmppProvider.tsx +29 -9
  626. package/src/e2ee/crypto.ts +194 -0
  627. package/src/e2ee/deviceStore.ts +80 -0
  628. package/src/e2ee/fileCipher.ts +86 -0
  629. package/src/e2ee/fileEnvelope.ts +115 -0
  630. package/src/e2ee/index.ts +192 -0
  631. package/src/e2ee/limits.ts +2 -0
  632. package/src/e2ee/ns.ts +1 -0
  633. package/src/e2ee/omemo.ts +802 -0
  634. package/src/e2ee/protobuf.ts +188 -0
  635. package/src/e2ee/ratchet.ts +271 -0
  636. package/src/e2ee/sealedBody.ts +17 -0
  637. package/src/e2ee/sealedFiles.ts +181 -0
  638. package/src/e2ee/send.ts +70 -0
  639. package/src/e2ee/stanza.ts +133 -0
  640. package/src/e2ee/store.ts +54 -0
  641. package/src/helpers/accountName.ts +15 -0
  642. package/src/helpers/createMessageFromXml.ts +31 -6
  643. package/src/helpers/createRoomFromApi.tsx +37 -1
  644. package/src/helpers/createUserNameFromSetUser.ts +2 -1
  645. package/src/helpers/displayName.ts +9 -0
  646. package/src/helpers/emoji.ts +39 -0
  647. package/src/helpers/haptics.ts +19 -0
  648. package/src/helpers/historyPreloadScheduler.ts +37 -69
  649. package/src/helpers/insertMessageWithDelimiter.ts +23 -16
  650. package/src/helpers/mamReactions.ts +59 -0
  651. package/src/helpers/parseMessageReference.ts +38 -0
  652. package/src/helpers/persistCrypto.ts +5 -0
  653. package/src/helpers/reactionsConfig.ts +13 -0
  654. package/src/helpers/secureKeyValue.ts +15 -0
  655. package/src/helpers/updateMessagesTillLast.tsx +14 -2
  656. package/src/helpers/videoCache.ts +138 -0
  657. package/src/hooks/useHeapSender.tsx +3 -2
  658. package/src/hooks/useLogout.tsx +9 -0
  659. package/src/hooks/useMessageHeapState.tsx +6 -2
  660. package/src/hooks/useRoomInitialization.tsx +32 -15
  661. package/src/hooks/useSendMessage.tsx +89 -16
  662. package/src/hooks/useUnreadMessagesCounter.ts +1 -1
  663. package/src/i18n/strings.ts +180 -0
  664. package/src/main.ts +2 -0
  665. package/src/networking/api-requests/auth.api.ts +9 -1
  666. package/src/networking/api-requests/rooms.api.ts +121 -18
  667. package/src/networking/stanzaHandlers.ts +116 -60
  668. package/src/networking/xmpp/getHistory.xmpp.ts +44 -106
  669. package/src/networking/xmpp/handleStanzas.xmpp.ts +51 -0
  670. package/src/networking/xmpp/mamRouter.ts +176 -0
  671. package/src/networking/xmpp/presenceInRoom.xmpp.ts +46 -3
  672. package/src/networking/xmpp/sendMediaMessage.xmpp.ts +19 -1
  673. package/src/networking/xmpp/sendTextMessage.xmpp.ts +17 -10
  674. package/src/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.ts +23 -10
  675. package/src/networking/xmppClient.ts +111 -20
  676. package/src/roomStore/Middleware/newMessageMidlleware.tsx +35 -38
  677. package/src/roomStore/Middleware/perfMiddleware.ts +50 -0
  678. package/src/roomStore/Middleware/reactionsMiddleware.tsx +53 -52
  679. package/src/roomStore/Middleware/unreadMidlleware.tsx +92 -80
  680. package/src/roomStore/index.ts +28 -27
  681. package/src/roomStore/persistBackend.ts +93 -0
  682. package/src/roomStore/persistence.ts +295 -73
  683. package/src/roomStore/roomsSlice.ts +304 -155
  684. package/src/theme/theme.ts +10 -1
  685. package/src/types/models/message.model.ts +9 -0
  686. package/src/types/models/room.model.ts +22 -0
  687. package/src/types/models/xmpp.model.ts +4 -2
  688. package/src/types/types.ts +19 -3
  689. package/src/utils/devLogger.ts +16 -0
  690. package/src/version.ts +1 -1
@@ -1,18 +1,19 @@
1
- import React, { ReactNode, useCallback, useEffect, useRef } from 'react';
1
+ import React, {
2
+ ReactNode,
3
+ useCallback,
4
+ useEffect,
5
+ useMemo,
6
+ useRef,
7
+ useState,
8
+ } from 'react';
2
9
  import {
10
+ Animated,
3
11
  BackHandler,
4
12
  Keyboard,
5
13
  StyleSheet,
6
14
  useWindowDimensions,
7
15
  View,
8
16
  } from 'react-native';
9
- import Animated, {
10
- interpolate,
11
- runOnJS,
12
- useAnimatedStyle,
13
- useSharedValue,
14
- withTiming,
15
- } from 'react-native-reanimated';
16
17
  import { Gesture, GestureDetector } from 'react-native-gesture-handler';
17
18
  import {
18
19
  COMPLETE_DISTANCE,
@@ -33,37 +34,76 @@ interface SwipeBackLayerProps {
33
34
  /**
34
35
  * Full-screen modal layer with the same navigation feel as RoomStack: it
35
36
  * slides in from the right, and a swipe from the left edge drags it back
36
- * out over whatever is underneath (the room or the list).
37
+ * out over whatever is underneath (the room or the list). Like RoomStack it
38
+ * runs on RN's own `Animated`, one value driving every layer.
37
39
  */
38
40
  export const SwipeBackLayer: React.FC<SwipeBackLayerProps> = ({
39
41
  onClose,
40
42
  children,
41
43
  }) => {
42
44
  const { width: windowWidth } = useWindowDimensions();
43
- const width = useSharedValue(windowWidth);
44
- const x = useSharedValue(windowWidth);
45
- const closing = useSharedValue(false);
45
+ const [width, setWidth] = useState(windowWidth);
46
+ const widthRef = useRef(width);
47
+ widthRef.current = width;
48
+ const x = useRef(new Animated.Value(windowWidth)).current;
49
+ const closing = useRef(false);
50
+
51
+ const slideTo = useCallback(
52
+ (
53
+ toValue: number,
54
+ config: typeof PUSH,
55
+ done?: (finished: boolean) => void
56
+ ) => {
57
+ Animated.timing(x, {
58
+ toValue,
59
+ ...config,
60
+ useNativeDriver: true,
61
+ }).start(({ finished }) => done?.(finished));
62
+ },
63
+ [x]
64
+ );
46
65
 
47
66
  useEffect(() => {
48
- x.value = withTiming(0, PUSH);
67
+ slideTo(0, PUSH);
49
68
  }, []); // eslint-disable-line react-hooks/exhaustive-deps
50
69
 
51
70
  const onCloseRef = useRef(onClose);
52
71
  onCloseRef.current = onClose;
53
- const finish = useCallback(() => onCloseRef.current(), []);
72
+ const [closeCount, setCloseCount] = useState(0);
73
+ const finish = useCallback(() => {
74
+ onCloseRef.current();
75
+ setCloseCount(count => count + 1);
76
+ }, []);
54
77
 
55
- const close = useCallback(() => {
56
- if (closing.value) {
78
+ // `onClose` normally unmounts this layer. If it is still here afterwards
79
+ // (the modal did not close), slide the screen back rather than leave it
80
+ // parked off-screen.
81
+ useEffect(() => {
82
+ if (closeCount === 0) {
57
83
  return;
58
84
  }
59
- closing.value = true;
60
- Keyboard.dismiss();
61
- x.value = withTiming(width.value, POP, finished => {
85
+ closing.current = false;
86
+ slideTo(0, POP);
87
+ }, [closeCount]); // eslint-disable-line react-hooks/exhaustive-deps
88
+
89
+ const slideOut = useCallback(() => {
90
+ closing.current = true;
91
+ slideTo(widthRef.current, POP, finished => {
62
92
  if (finished) {
63
- runOnJS(finish)();
93
+ finish();
94
+ } else {
95
+ closing.current = false;
64
96
  }
65
97
  });
66
- }, [finish]); // eslint-disable-line react-hooks/exhaustive-deps
98
+ }, [finish, slideTo]);
99
+
100
+ const close = useCallback(() => {
101
+ if (closing.current) {
102
+ return;
103
+ }
104
+ Keyboard.dismiss();
105
+ slideOut();
106
+ }, [slideOut]);
67
107
 
68
108
  useEffect(() => {
69
109
  const sub = BackHandler.addEventListener('hardwareBackPress', () => {
@@ -73,46 +113,51 @@ export const SwipeBackLayer: React.FC<SwipeBackLayerProps> = ({
73
113
  return () => sub.remove();
74
114
  }, [close]);
75
115
 
76
- const dismissKeyboard = useCallback(() => Keyboard.dismiss(), []);
77
-
78
- const swipeBack = Gesture.Pan()
79
- .hitSlop({ left: 0, width: EDGE_WIDTH })
80
- .activeOffsetX(12)
81
- .failOffsetY([-16, 16])
82
- .onStart(() => {
83
- runOnJS(dismissKeyboard)();
84
- })
85
- .onUpdate(e => {
86
- if (closing.value) {
87
- return;
88
- }
89
- x.value = Math.min(Math.max(e.translationX, 0), width.value);
90
- })
91
- .onEnd(e => {
92
- if (closing.value) {
93
- return;
94
- }
95
- const complete =
96
- x.value > width.value * COMPLETE_DISTANCE ||
97
- e.velocityX > COMPLETE_VELOCITY;
98
- if (complete) {
99
- closing.value = true;
100
- x.value = withTiming(width.value, POP, finished => {
101
- if (finished) {
102
- runOnJS(finish)();
116
+ const swipeBack = useMemo(
117
+ () =>
118
+ Gesture.Pan()
119
+ .runOnJS(true)
120
+ .hitSlop({ left: 0, width: EDGE_WIDTH })
121
+ .activeOffsetX(12)
122
+ .failOffsetY([-16, 16])
123
+ .onStart(() => {
124
+ if (closing.current) {
125
+ return;
103
126
  }
104
- });
105
- } else {
106
- x.value = withTiming(0, POP);
107
- }
108
- });
127
+ Keyboard.dismiss();
128
+ x.stopAnimation();
129
+ })
130
+ .onUpdate(e => {
131
+ if (closing.current) {
132
+ return;
133
+ }
134
+ x.setValue(Math.min(Math.max(e.translationX, 0), widthRef.current));
135
+ })
136
+ .onEnd(e => {
137
+ if (closing.current) {
138
+ return;
139
+ }
140
+ const complete =
141
+ e.translationX > widthRef.current * COMPLETE_DISTANCE ||
142
+ e.velocityX > COMPLETE_VELOCITY;
143
+ if (complete) {
144
+ slideOut();
145
+ } else {
146
+ slideTo(0, POP);
147
+ }
148
+ }),
149
+ [slideOut, slideTo, x]
150
+ );
109
151
 
110
- const screenStyle = useAnimatedStyle(() => ({
111
- transform: [{ translateX: x.value }],
112
- }));
113
- const dimStyle = useAnimatedStyle(() => ({
114
- opacity: interpolate(x.value, [0, width.value], [LIST_DIM, 0]),
115
- }));
152
+ const dimOpacity = useMemo(
153
+ () =>
154
+ x.interpolate({
155
+ inputRange: [0, width],
156
+ outputRange: [LIST_DIM, 0],
157
+ extrapolate: 'clamp',
158
+ }),
159
+ [x, width]
160
+ );
116
161
 
117
162
  return (
118
163
  <View
@@ -120,17 +165,23 @@ export const SwipeBackLayer: React.FC<SwipeBackLayerProps> = ({
120
165
  style={styles.host}
121
166
  onLayout={e => {
122
167
  const next = e.nativeEvent.layout.width;
123
- if (next > 0) {
124
- width.value = next;
168
+ if (next > 0 && next !== widthRef.current) {
169
+ setWidth(next);
125
170
  }
126
171
  }}
127
172
  >
128
173
  <Animated.View
129
174
  pointerEvents="none"
130
- style={[styles.fill, styles.dim, dimStyle]}
175
+ style={[styles.fill, styles.dim, { opacity: dimOpacity }]}
131
176
  />
132
177
  <GestureDetector gesture={swipeBack}>
133
- <Animated.View style={[styles.fill, styles.screen, screenStyle]}>
178
+ <Animated.View
179
+ style={[
180
+ styles.fill,
181
+ styles.screen,
182
+ { transform: [{ translateX: x }] },
183
+ ]}
184
+ >
134
185
  {children(close)}
135
186
  </Animated.View>
136
187
  </GestureDetector>
@@ -17,6 +17,7 @@ import {
17
17
  EditIcon,
18
18
  IconDoc,
19
19
  LeaveIcon,
20
+ LockIcon,
20
21
  LogoutIcon,
21
22
  ProfileIcon,
22
23
  ShareIcon,
@@ -43,7 +44,21 @@ import {
43
44
  import { addRoomViaApi, setCurrentRoom } from '../../../roomStore/roomsSlice';
44
45
  import { runLogoutFlow } from '../../Menu/HeaderRoomListMenu';
45
46
  import { useLogout } from '../../../hooks/useLogout';
46
- import { ApiRoom, postPrivateRoom } from '../../../networking/api-requests/rooms.api';
47
+ import {
48
+ ApiRoom,
49
+ ownAppId,
50
+ postPrivateRoom,
51
+ } from '../../../networking/api-requests/rooms.api';
52
+ import EncryptionCard from '../../MainComponents/EncryptionCard';
53
+ import { accountNameOf } from '../../../helpers/accountName';
54
+ import { composeName } from '../../../helpers/displayName';
55
+ import { isUnresolvedSenderId } from '../../../helpers/isUnresolvedSenderId';
56
+
57
+ /** A name, unless it is only the account's id standing in for one. */
58
+ const nameOrNothing = (name?: string | null): string => {
59
+ const trimmed = String(name ?? '').trim();
60
+ return isUnresolvedSenderId(trimmed) ? '' : trimmed;
61
+ };
47
62
  import {
48
63
  getUserFiles,
49
64
  isMediaFile,
@@ -196,8 +211,8 @@ const UserProfileModal: React.FC<UserProfileModalProps> = ({
196
211
 
197
212
  const handleShare = useCallback(async () => {
198
213
  const name =
199
- profileUser?.name ||
200
- `${profileUser?.firstName ?? ''} ${profileUser?.lastName ?? ''}`.trim();
214
+ nameOrNothing(profileUser?.name) ||
215
+ composeName(profileUser?.firstName, profileUser?.lastName);
201
216
  const id =
202
217
  profileUser?.userJID ||
203
218
  profileUser?.defaultWallet?.walletAddress ||
@@ -238,7 +253,7 @@ const UserProfileModal: React.FC<UserProfileModalProps> = ({
238
253
  }
239
254
  };
240
255
 
241
- const handlePrivateMessage = useCallback(async () => {
256
+ const openPrivateRoom = useCallback(async (e2ee: boolean) => {
242
257
  showToast({
243
258
  id: Date.now().toString(),
244
259
  title: 'Room creation',
@@ -248,7 +263,8 @@ const UserProfileModal: React.FC<UserProfileModalProps> = ({
248
263
  });
249
264
  if (config?.newArch) {
250
265
  const newRoom = await postPrivateRoom(
251
- selectedUser?.userJID ?? (selectedUser?.id || '')
266
+ selectedUser?.userJID ?? (selectedUser?.id || ''),
267
+ e2ee
252
268
  );
253
269
  handleRoomCreation(newRoom, 2);
254
270
  } else {
@@ -283,6 +299,17 @@ const UserProfileModal: React.FC<UserProfileModalProps> = ({
283
299
  dispatch(setActiveModal(undefined));
284
300
  }, [selectedUser]); // eslint-disable-line react-hooks/exhaustive-deps
285
301
 
302
+ const handlePrivateMessage = useCallback(
303
+ () => openPrivateRoom(false),
304
+ [openPrivateRoom]
305
+ );
306
+ const handleEncryptedPrivateMessage = useCallback(
307
+ () => openPrivateRoom(true),
308
+ [openPrivateRoom]
309
+ );
310
+ const canStartEncrypted =
311
+ config?.e2ee?.enabled === true && !!config?.newArch;
312
+
286
313
  const openFile = (file: UserFile) => {
287
314
  dispatch(
288
315
  setActiveFile({
@@ -333,6 +360,16 @@ const UserProfileModal: React.FC<UserProfileModalProps> = ({
333
360
  icon: (color: string) => <ChatIcon color={color} />,
334
361
  onPress: handlePrivateMessage,
335
362
  },
363
+ ...(canStartEncrypted
364
+ ? [
365
+ {
366
+ key: 'encrypted-message',
367
+ label: t('action.encryptedMessage'),
368
+ icon: (color: string) => <LockIcon color={color} />,
369
+ onPress: handleEncryptedPrivateMessage,
370
+ },
371
+ ]
372
+ : []),
336
373
  ]),
337
374
  {
338
375
  key: 'share',
@@ -341,7 +378,7 @@ const UserProfileModal: React.FC<UserProfileModalProps> = ({
341
378
  onPress: handleShare,
342
379
  },
343
380
  ],
344
- [isOwnProfile, t, handleShare, handlePrivateMessage, handleLogout] // eslint-disable-line react-hooks/exhaustive-deps
381
+ [isOwnProfile, t, handleShare, handlePrivateMessage, handleEncryptedPrivateMessage, canStartEncrypted, handleLogout] // eslint-disable-line react-hooks/exhaustive-deps
345
382
  );
346
383
 
347
384
  // Collapsed, the hero's round buttons are gone — the "…" menu carries
@@ -373,8 +410,8 @@ const UserProfileModal: React.FC<UserProfileModalProps> = ({
373
410
  }
374
411
 
375
412
  const displayName =
376
- profileUser?.name ||
377
- `${profileUser?.firstName ?? ''} ${profileUser?.lastName ?? ''}`.trim() ||
413
+ nameOrNothing(profileUser?.name) ||
414
+ composeName(profileUser?.firstName, profileUser?.lastName) ||
378
415
  t('modal.profile.title');
379
416
  const heroImage =
380
417
  appendFileToken(profileUser?.profileImage, fileToken) || null;
@@ -529,6 +566,14 @@ const UserProfileModal: React.FC<UserProfileModalProps> = ({
529
566
  </Text>
530
567
  </View>
531
568
 
569
+ {!isOwnProfile && config?.e2ee?.enabled === true && (
570
+ <EncryptionCard
571
+ account={accountNameOf(profileUser, ownAppId())}
572
+ style={styles.card}
573
+ testID="user-profile-e2ee"
574
+ />
575
+ )}
576
+
532
577
  {tabs.length > 0 && (
533
578
  <View style={styles.card}>
534
579
  <View style={styles.tabsRow}>
@@ -1,5 +1,6 @@
1
1
  /** @format */
2
2
 
3
+ import EncryptionCard from '../../MainComponents/EncryptionCard';
3
4
  import React, { useCallback, useMemo } from 'react';
4
5
  import {
5
6
  StyleSheet,
@@ -159,6 +160,10 @@ const UserSettingsModal: React.FC<UserSettingsModalProps> = ({
159
160
  </View>
160
161
  ) : null}
161
162
 
163
+ {config?.e2ee?.enabled === true ? (
164
+ <EncryptionCard style={styles.card} testID="settings-e2ee" />
165
+ ) : null}
166
+
162
167
  {options.map((option) => (
163
168
  <TouchableOpacity
164
169
  key={option.key}
@@ -1,4 +1,5 @@
1
1
  import React, { useCallback, useMemo } from 'react';
2
+ import { UNREAD_CAP_PAGE } from '../../roomStore/roomsSlice';
2
3
  import { useSelector } from 'react-redux';
3
4
  import { RootState } from '../../roomStore';
4
5
  import { IMessage } from '../../types/types';
@@ -19,6 +20,10 @@ import LastMessageItem from './LastMessageItem';
19
20
  import { LastRoomMessageText } from './styled/StyledRoomComponents';
20
21
  import { useTheme } from '../../hooks/useTheme';
21
22
  import { resolveTheme } from '../../theme/theme';
23
+ import { LockIcon } from '../../assets/icons';
24
+ import { useT } from '../../i18n/useT';
25
+ import { composeName } from '../../helpers/displayName';
26
+ import { isUnresolvedSenderId } from '../../helpers/isUnresolvedSenderId';
22
27
 
23
28
  interface ChatRoomItemProps {
24
29
  chat: IRoom;
@@ -36,6 +41,7 @@ const ChatRoomItem: React.FC<ChatRoomItemProps> = ({
36
41
  // Rows can be rendered with an explicit `config` prop (tests, hosts
37
42
  // composing their own list); honour its colours over the store's.
38
43
  const storeTheme = useTheme();
44
+ const t = useT();
39
45
  const theme = useMemo(
40
46
  () => (config ? resolveTheme(config) : storeTheme),
41
47
  [config, storeTheme]
@@ -60,19 +66,12 @@ const ChatRoomItem: React.FC<ChatRoomItemProps> = ({
60
66
  const localId = rawUserId.split('@')[0];
61
67
  const entry = usersSet?.[localId] ?? usersSet?.[rawUserId];
62
68
  const fromUsersSet = entry
63
- ? `${entry.firstName ?? ''} ${entry.lastName ?? ''}`.trim()
69
+ ? composeName(entry.firstName, entry.lastName)
64
70
  : '';
65
71
 
66
- // usersSet first, exactly like Message.tsx: it's the live store, so
67
- // a renamed user updates here too. The message's own `name` is the
68
- // fallback that carries broadcast/system senders ("Ethora"), which
69
- // never appear in usersSet.
72
+ const ownName = String(message?.user?.name || '').trim();
70
73
  const safeName =
71
- fromUsersSet ||
72
- String(message?.user?.name || '').trim() ||
73
- localId ||
74
- rawUserId ||
75
- 'Unknown';
74
+ fromUsersSet || (isUnresolvedSenderId(ownName) ? '' : ownName);
76
75
 
77
76
  return {
78
77
  ...message,
@@ -86,7 +85,11 @@ const ChatRoomItem: React.FC<ChatRoomItemProps> = ({
86
85
  );
87
86
 
88
87
  const lastMessage = useMemo(() => {
89
- if (!chat?.messages || chat.messages.length === 0) {return undefined;}
88
+ if (!chat?.messages || chat.messages.length === 0) {
89
+ return chat?.lastMessage?.body
90
+ ? withAuthorFallback(chat.lastMessage as IMessage)
91
+ : undefined;
92
+ }
90
93
 
91
94
  for (let i = chat.messages.length - 1; i >= 0; i--) {
92
95
  const msg = chat.messages[i];
@@ -95,7 +98,7 @@ const ChatRoomItem: React.FC<ChatRoomItemProps> = ({
95
98
  }
96
99
  }
97
100
  return undefined;
98
- }, [chat?.messages, withAuthorFallback]);
101
+ }, [chat?.messages, chat?.lastMessage, withAuthorFallback]);
99
102
 
100
103
  // Mirrors web's formatter: tolerates undefined/garbage inputs (returns
101
104
  // undefined instead of "NaN:NaN"), and uses HH:MM today / MM/DD this
@@ -171,7 +174,21 @@ const ChatRoomItem: React.FC<ChatRoomItemProps> = ({
171
174
  }}
172
175
  >
173
176
  <ChatInfo>
174
- <ChatName text={displayName} />
177
+ <View style={{ flexDirection: 'row', alignItems: 'center', gap: 5 }}>
178
+ <View style={{ flexShrink: 1 }}>
179
+ <ChatName text={displayName} />
180
+ </View>
181
+ {chat?.e2ee && (
182
+ <View
183
+ accessible
184
+ accessibilityRole="image"
185
+ accessibilityLabel={t('e2ee.roomEncrypted')}
186
+ testID="room-e2ee-lock"
187
+ >
188
+ <LockIcon width={13} height={13} color={theme.textSecondary} />
189
+ </View>
190
+ )}
191
+ </View>
175
192
  </ChatInfo>
176
193
  {stamp ? (
177
194
  <UserCount
@@ -266,7 +283,9 @@ const ChatRoomItem: React.FC<ChatRoomItemProps> = ({
266
283
  fontWeight: '600',
267
284
  }}
268
285
  >
269
- {chat.unreadMessages || ''}
286
+ {chat.unreadCapped && (chat.unreadMessages || 0) >= UNREAD_CAP_PAGE
287
+ ? `${chat.unreadMessages}+`
288
+ : chat.unreadMessages || ''}
270
289
  </Text>
271
290
  </View>
272
291
  ) : null}
@@ -284,4 +303,4 @@ const ChatRoomItem: React.FC<ChatRoomItemProps> = ({
284
303
  );
285
304
  };
286
305
 
287
- export default ChatRoomItem;
306
+ export default React.memo(ChatRoomItem);
@@ -6,6 +6,7 @@ import LastMessagePhoto from './styled/LastMessagePhoto';
6
6
  import LastMessageEmoji from './styled/LastMessageEmoji';
7
7
  import LastMessageFile from './styled/LastMessageFile';
8
8
  import LastAudioMessage from './styled/LastAudioMessage';
9
+ import LastMessageSealed from './styled/LastMessageSealed';
9
10
 
10
11
  interface LastMessageItemProps {
11
12
  lastMessage: LastMessage;
@@ -14,6 +15,10 @@ interface LastMessageItemProps {
14
15
  const LastMessageItem: FC<LastMessageItemProps> = ({ lastMessage }) => {
15
16
  const { body, emoji, mimetype } = lastMessage;
16
17
 
18
+ if (lastMessage?.clientEncrypted === 'true') {
19
+ return <LastMessageSealed {...lastMessage} />;
20
+ }
21
+
17
22
  if (mimetype) {
18
23
  if (mimetype.startsWith('image/')) {
19
24
  return <LastMessagePhoto {...lastMessage} />;
@@ -33,7 +33,9 @@ const LastAudioMessage: FC<LastMessageEmojiProps> = ({ user, body }) => {
33
33
  const theme = useTheme();
34
34
  return (
35
35
  <LastRoomMessageContainer>
36
- <LastRoomMessageName numberOfLines={1}>{user?.name ?? ''}</LastRoomMessageName>
36
+ {!!user?.name && (
37
+ <LastRoomMessageName numberOfLines={1}>{user.name}</LastRoomMessageName>
38
+ )}
37
39
  <AudioRow>
38
40
  <PlayButton>
39
41
  <PlayIcon width={10} height={10} color={theme.dark ? theme.text : '#1F2937'} />
@@ -5,22 +5,21 @@ import {
5
5
  LastRoomMessageText,
6
6
  } from './StyledRoomComponents';
7
7
  import { LastMessage } from '../../../types/types';
8
+ import { getEmojiNativeById } from '../../../helpers/emoji';
8
9
 
9
10
  interface LastMessageEmojiProps extends Pick<LastMessage, 'user' | 'emoji'> {}
10
11
 
11
12
  /**
12
- * Renders the per-room last-message preview when the latest message
13
- * is a reaction (emoji). The `emoji` field is expected to already be
14
- * a unicode glyph (the reaction stanza carries the rendered character,
15
- * not an `:id:`) so we just render it as-is — no emoji-id resolution
16
- * library needed. If a legacy payload still ships an `:id:`, it
17
- * renders verbatim instead of crashing.
13
+ * The room-list preview when the latest event in a room is a reaction.
14
+ * The stanza carries the emoji's short name (`joy`, `+1`), as on web — it
15
+ * is resolved to the glyph here; a glyph or unknown id renders as is.
18
16
  */
19
17
  const LastMessageEmoji: FC<LastMessageEmojiProps> = ({ user, emoji }) => {
18
+ const name = (user?.name || '').trim();
20
19
  return (
21
20
  <LastRoomMessageContainer>
22
- <LastRoomMessageName>{user?.name || ''}:</LastRoomMessageName>
23
- <LastRoomMessageText>{emoji || ''}</LastRoomMessageText>
21
+ {!!name && <LastRoomMessageName>{name}:</LastRoomMessageName>}
22
+ <LastRoomMessageText>{emoji ? getEmojiNativeById(emoji) : ''}</LastRoomMessageText>
24
23
  </LastRoomMessageContainer>
25
24
  );
26
25
  };
@@ -43,7 +43,7 @@ const LastMessageFile: FC<LastMessageFileProps> = ({
43
43
 
44
44
  return (
45
45
  <LastRoomMessageContainer>
46
- <LastRoomMessageName>{user?.name || ''}:</LastRoomMessageName>
46
+ {!!user?.name && <LastRoomMessageName>{user.name}:</LastRoomMessageName>}
47
47
  <View
48
48
  style={{
49
49
  display: 'flex',
@@ -67,7 +67,7 @@ const LastMessageFile: FC<LastMessageFileProps> = ({
67
67
  }}
68
68
  />
69
69
  ) : (
70
- <FileIcon style={{ width: '20px', height: '20px' }} />
70
+ <FileIcon width={20} height={20} />
71
71
  )}
72
72
  <LastRoomMessageText>{displayName}</LastRoomMessageText>
73
73
  </View>
@@ -47,7 +47,7 @@ const LastMessagePhoto: FC<LastMessagePhotoProps> = ({
47
47
  : 'file';
48
48
  return (
49
49
  <LastRoomMessageContainer>
50
- <LastRoomMessageName>{user?.name || ''}:</LastRoomMessageName>
50
+ {!!user?.name && <LastRoomMessageName>{user.name}:</LastRoomMessageName>}
51
51
  <View
52
52
  style={{
53
53
  display: 'flex',
@@ -0,0 +1,31 @@
1
+ import React, { FC } from 'react';
2
+ import { View } from 'react-native';
3
+ import { LastMessage } from '../../../types/types';
4
+ import {
5
+ LastRoomMessageContainer,
6
+ LastRoomMessageName,
7
+ LastRoomMessageText,
8
+ } from './StyledRoomComponents';
9
+ import { LockIcon } from '../../../assets/icons';
10
+ import { useTheme } from '../../../hooks/useTheme';
11
+ import { useT } from '../../../i18n/useT';
12
+
13
+ interface LastMessageSealedProps extends Pick<LastMessage, 'user'> {}
14
+
15
+ const LastMessageSealed: FC<LastMessageSealedProps> = ({ user }) => {
16
+ const t = useT();
17
+ const theme = useTheme();
18
+ const name = user?.name;
19
+
20
+ return (
21
+ <LastRoomMessageContainer>
22
+ {!!name && <LastRoomMessageName>{name}:</LastRoomMessageName>}
23
+ <View style={{ flexDirection: 'row', alignItems: 'center', gap: 4 }}>
24
+ <LockIcon width={14} height={14} color={theme.textSecondary} />
25
+ <LastRoomMessageText>{t('media.sealedFile')}</LastRoomMessageText>
26
+ </View>
27
+ </LastRoomMessageContainer>
28
+ );
29
+ };
30
+
31
+ export default LastMessageSealed;
@@ -62,7 +62,7 @@ const LastMessageVideo: FC<LastMessageVideoProps> = ({
62
62
  : 'file';
63
63
  return (
64
64
  <LastRoomMessageContainer>
65
- <LastRoomMessageName>{user?.name || ''}:</LastRoomMessageName>
65
+ {!!user?.name && <LastRoomMessageName>{user.name}:</LastRoomMessageName>}
66
66
  <View
67
67
  style={{
68
68
  display: 'flex',