@ethora/chat-component-rn 26.9.1 → 26.10.0

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 (760) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +19 -0
  3. package/lib/commonjs/assets/icons.js +2 -2
  4. package/lib/commonjs/assets/icons.js.map +1 -1
  5. package/lib/commonjs/components/Header/HeaderRoomList.js +22 -6
  6. package/lib/commonjs/components/Header/HeaderRoomList.js.map +1 -1
  7. package/lib/commonjs/components/InputComponents/Search.js +38 -1
  8. package/lib/commonjs/components/InputComponents/Search.js.map +1 -1
  9. package/lib/commonjs/components/MainComponents/ArchivedMessageCard.js +166 -0
  10. package/lib/commonjs/components/MainComponents/ArchivedMessageCard.js.map +1 -0
  11. package/lib/commonjs/components/MainComponents/ChatHeader.js +22 -5
  12. package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
  13. package/lib/commonjs/components/MainComponents/ChatRoom.js +56 -25
  14. package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
  15. package/lib/commonjs/components/MainComponents/ChatWrapper.js +31 -1
  16. package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
  17. package/lib/commonjs/components/MainComponents/MediaMessage.js +18 -3
  18. package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
  19. package/lib/commonjs/components/MainComponents/MessageList.js +739 -42
  20. package/lib/commonjs/components/MainComponents/MessageList.js.map +1 -1
  21. package/lib/commonjs/components/MainComponents/MessageSearchButton.js +58 -0
  22. package/lib/commonjs/components/MainComponents/MessageSearchButton.js.map +1 -0
  23. package/lib/commonjs/components/MainComponents/ReduxWrapper.js +15 -6
  24. package/lib/commonjs/components/MainComponents/ReduxWrapper.js.map +1 -1
  25. package/lib/commonjs/components/MainComponents/RoomList.js +110 -1
  26. package/lib/commonjs/components/MainComponents/RoomList.js.map +1 -1
  27. package/lib/commonjs/components/Menu/HeaderRoomListMenu.js +14 -3
  28. package/lib/commonjs/components/Menu/HeaderRoomListMenu.js.map +1 -1
  29. package/lib/commonjs/components/MessageBubble/BubbleHighlight.js +112 -0
  30. package/lib/commonjs/components/MessageBubble/BubbleHighlight.js.map +1 -0
  31. package/lib/commonjs/components/MessageBubble/Message.js +169 -125
  32. package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
  33. package/lib/commonjs/components/MessageBubble/MessageInteractions.js +98 -78
  34. package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
  35. package/lib/commonjs/components/MessageBubble/messageMenuLayout.js +50 -0
  36. package/lib/commonjs/components/MessageBubble/messageMenuLayout.js.map +1 -0
  37. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +73 -37
  38. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  39. package/lib/commonjs/components/Modals/MessageSearchModal/MessageHitResults.js +253 -0
  40. package/lib/commonjs/components/Modals/MessageSearchModal/MessageHitResults.js.map +1 -0
  41. package/lib/commonjs/components/Modals/MessageSearchModal/MessageSearchModal.js +488 -0
  42. package/lib/commonjs/components/Modals/MessageSearchModal/MessageSearchModal.js.map +1 -0
  43. package/lib/commonjs/components/Modals/MessageSearchModal/openHit.js +51 -0
  44. package/lib/commonjs/components/Modals/MessageSearchModal/openHit.js.map +1 -0
  45. package/lib/commonjs/components/Modals/MessageSearchModal/resolveSender.js +47 -0
  46. package/lib/commonjs/components/Modals/MessageSearchModal/resolveSender.js.map +1 -0
  47. package/lib/commonjs/components/Modals/MessageSearchModal/searchFilters.js +83 -0
  48. package/lib/commonjs/components/Modals/MessageSearchModal/searchFilters.js.map +1 -0
  49. package/lib/commonjs/components/Modals/MessageSearchModal/snippet.js +61 -0
  50. package/lib/commonjs/components/Modals/MessageSearchModal/snippet.js.map +1 -0
  51. package/lib/commonjs/components/Modals/MessageSearchModal/useMessageSearch.js +136 -0
  52. package/lib/commonjs/components/Modals/MessageSearchModal/useMessageSearch.js.map +1 -0
  53. package/lib/commonjs/components/Modals/PublicChatsModal/PublicChatsModal.js +306 -0
  54. package/lib/commonjs/components/Modals/PublicChatsModal/PublicChatsModal.js.map +1 -0
  55. package/lib/commonjs/components/Modals/PublicChatsModal/publicChatsLogic.js +36 -0
  56. package/lib/commonjs/components/Modals/PublicChatsModal/publicChatsLogic.js.map +1 -0
  57. package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js +8 -1
  58. package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
  59. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +13 -2
  60. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
  61. package/lib/commonjs/components/RoomComponents/SwipeableRoomRow.js +38 -6
  62. package/lib/commonjs/components/RoomComponents/SwipeableRoomRow.js.map +1 -1
  63. package/lib/commonjs/components/Thread/ThreadHeader.js +3 -1
  64. package/lib/commonjs/components/Thread/ThreadHeader.js.map +1 -1
  65. package/lib/commonjs/components/Thread/ThreadWrapper.js +90 -10
  66. package/lib/commonjs/components/Thread/ThreadWrapper.js.map +1 -1
  67. package/lib/commonjs/components/styled/AudioDecoderHost.js +338 -0
  68. package/lib/commonjs/components/styled/AudioDecoderHost.js.map +1 -0
  69. package/lib/commonjs/components/styled/AudioMessage.js +493 -420
  70. package/lib/commonjs/components/styled/AudioMessage.js.map +1 -1
  71. package/lib/commonjs/components/styled/SendInput.js +31 -5
  72. package/lib/commonjs/components/styled/SendInput.js.map +1 -1
  73. package/lib/commonjs/context/MessageNotificationContext.js +14 -4
  74. package/lib/commonjs/context/MessageNotificationContext.js.map +1 -1
  75. package/lib/commonjs/context/xmppProvider.js +41 -77
  76. package/lib/commonjs/context/xmppProvider.js.map +1 -1
  77. package/lib/commonjs/helpers/audioWaveform.js +165 -0
  78. package/lib/commonjs/helpers/audioWaveform.js.map +1 -0
  79. package/lib/commonjs/helpers/backgroundJoinSweep.js +36 -0
  80. package/lib/commonjs/helpers/backgroundJoinSweep.js.map +1 -0
  81. package/lib/commonjs/helpers/bubbleHighlight.js +44 -0
  82. package/lib/commonjs/helpers/bubbleHighlight.js.map +1 -0
  83. package/lib/commonjs/helpers/checkUniqueUsers.js +14 -12
  84. package/lib/commonjs/helpers/checkUniqueUsers.js.map +1 -1
  85. package/lib/commonjs/helpers/constants/MODAL_COMPONENTS.js +5 -1
  86. package/lib/commonjs/helpers/constants/MODAL_COMPONENTS.js.map +1 -1
  87. package/lib/commonjs/helpers/constants/MODAL_TYPES.js +3 -1
  88. package/lib/commonjs/helpers/constants/MODAL_TYPES.js.map +1 -1
  89. package/lib/commonjs/helpers/createRoomFromApi.js +40 -3
  90. package/lib/commonjs/helpers/createRoomFromApi.js.map +1 -1
  91. package/lib/commonjs/helpers/dedupeMembers.js +34 -0
  92. package/lib/commonjs/helpers/dedupeMembers.js.map +1 -0
  93. package/lib/commonjs/helpers/ethoraLogger.js +56 -0
  94. package/lib/commonjs/helpers/ethoraLogger.js.map +1 -0
  95. package/lib/commonjs/helpers/getUnnamedUsers.js +9 -4
  96. package/lib/commonjs/helpers/getUnnamedUsers.js.map +1 -1
  97. package/lib/commonjs/helpers/historyPreloadConfig.js +44 -0
  98. package/lib/commonjs/helpers/historyPreloadConfig.js.map +1 -0
  99. package/lib/commonjs/helpers/historyPreloadScheduler.js +372 -137
  100. package/lib/commonjs/helpers/historyPreloadScheduler.js.map +1 -1
  101. package/lib/commonjs/helpers/initRoomsPresence.js +17 -5
  102. package/lib/commonjs/helpers/initRoomsPresence.js.map +1 -1
  103. package/lib/commonjs/helpers/insertMessageWithDelimiter.js +5 -0
  104. package/lib/commonjs/helpers/insertMessageWithDelimiter.js.map +1 -1
  105. package/lib/commonjs/helpers/isLikelyMucJid.js +67 -0
  106. package/lib/commonjs/helpers/isLikelyMucJid.js.map +1 -0
  107. package/lib/commonjs/helpers/isMessageSearchEnabled.js +18 -0
  108. package/lib/commonjs/helpers/isMessageSearchEnabled.js.map +1 -0
  109. package/lib/commonjs/helpers/joiningRoom.js +14 -0
  110. package/lib/commonjs/helpers/joiningRoom.js.map +1 -0
  111. package/lib/commonjs/helpers/jumpThread.js +100 -0
  112. package/lib/commonjs/helpers/jumpThread.js.map +1 -0
  113. package/lib/commonjs/helpers/jumpToMessage.js +58 -0
  114. package/lib/commonjs/helpers/jumpToMessage.js.map +1 -0
  115. package/lib/commonjs/helpers/jumpWindow.js +187 -0
  116. package/lib/commonjs/helpers/jumpWindow.js.map +1 -0
  117. package/lib/commonjs/helpers/loadRoomHistory.js +75 -0
  118. package/lib/commonjs/helpers/loadRoomHistory.js.map +1 -0
  119. package/lib/commonjs/helpers/notificationPolicy.js +77 -0
  120. package/lib/commonjs/helpers/notificationPolicy.js.map +1 -0
  121. package/lib/commonjs/helpers/openRoomAtMessage.js +47 -0
  122. package/lib/commonjs/helpers/openRoomAtMessage.js.map +1 -0
  123. package/lib/commonjs/helpers/openThreadForJump.js +72 -0
  124. package/lib/commonjs/helpers/openThreadForJump.js.map +1 -0
  125. package/lib/commonjs/helpers/parseMessageReference.js +27 -8
  126. package/lib/commonjs/helpers/parseMessageReference.js.map +1 -1
  127. package/lib/commonjs/helpers/publicChatsEntry.js +17 -0
  128. package/lib/commonjs/helpers/publicChatsEntry.js.map +1 -0
  129. package/lib/commonjs/helpers/roomActivityScore.js +37 -0
  130. package/lib/commonjs/helpers/roomActivityScore.js.map +1 -0
  131. package/lib/commonjs/helpers/roomUserCount.js +36 -0
  132. package/lib/commonjs/helpers/roomUserCount.js.map +1 -0
  133. package/lib/commonjs/helpers/runConfiguredHistoryPreload.js +68 -0
  134. package/lib/commonjs/helpers/runConfiguredHistoryPreload.js.map +1 -0
  135. package/lib/commonjs/helpers/sessionAppId.js +24 -0
  136. package/lib/commonjs/helpers/sessionAppId.js.map +1 -0
  137. package/lib/commonjs/helpers/timestamp.js +43 -0
  138. package/lib/commonjs/helpers/timestamp.js.map +1 -0
  139. package/lib/commonjs/helpers/userResolver.js +517 -0
  140. package/lib/commonjs/helpers/userResolver.js.map +1 -0
  141. package/lib/commonjs/helpers/xmppIdShape.js +52 -0
  142. package/lib/commonjs/helpers/xmppIdShape.js.map +1 -0
  143. package/lib/commonjs/hooks/useChatWrapperInit.js +27 -5
  144. package/lib/commonjs/hooks/useChatWrapperInit.js.map +1 -1
  145. package/lib/commonjs/hooks/useHeapSender.js +54 -3
  146. package/lib/commonjs/hooks/useHeapSender.js.map +1 -1
  147. package/lib/commonjs/hooks/useJumpToMessage.js +411 -0
  148. package/lib/commonjs/hooks/useJumpToMessage.js.map +1 -0
  149. package/lib/commonjs/hooks/useMessageLoaderQueue.js +32 -5
  150. package/lib/commonjs/hooks/useMessageLoaderQueue.js.map +1 -1
  151. package/lib/commonjs/hooks/useMessageQueue.js +13 -5
  152. package/lib/commonjs/hooks/useMessageQueue.js.map +1 -1
  153. package/lib/commonjs/hooks/useRoomDirectory.js +29 -0
  154. package/lib/commonjs/hooks/useRoomDirectory.js.map +1 -0
  155. package/lib/commonjs/hooks/useRoomInitialization.js +27 -5
  156. package/lib/commonjs/hooks/useRoomInitialization.js.map +1 -1
  157. package/lib/commonjs/hooks/useRoomMute.js +62 -0
  158. package/lib/commonjs/hooks/useRoomMute.js.map +1 -0
  159. package/lib/commonjs/hooks/useRoomState.js +3 -1
  160. package/lib/commonjs/hooks/useRoomState.js.map +1 -1
  161. package/lib/commonjs/hooks/useSendMessage.js +13 -3
  162. package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
  163. package/lib/commonjs/i18n/strings.js +288 -6
  164. package/lib/commonjs/i18n/strings.js.map +1 -1
  165. package/lib/commonjs/networking/api-requests/messageSearch.api.js +87 -0
  166. package/lib/commonjs/networking/api-requests/messageSearch.api.js.map +1 -0
  167. package/lib/commonjs/networking/api-requests/publicChats.api.js +48 -0
  168. package/lib/commonjs/networking/api-requests/publicChats.api.js.map +1 -0
  169. package/lib/commonjs/networking/api-requests/roomMembers.api.js +253 -4
  170. package/lib/commonjs/networking/api-requests/roomMembers.api.js.map +1 -1
  171. package/lib/commonjs/networking/api-requests/rooms.api.js +48 -12
  172. package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
  173. package/lib/commonjs/networking/api-requests/xmppToken.api.js +71 -0
  174. package/lib/commonjs/networking/api-requests/xmppToken.api.js.map +1 -0
  175. package/lib/commonjs/networking/ethoraEvents.js +227 -0
  176. package/lib/commonjs/networking/ethoraEvents.js.map +1 -0
  177. package/lib/commonjs/networking/stanzaHandlers.js +153 -16
  178. package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
  179. package/lib/commonjs/networking/xmpp/allRoomPresences.xmpp.js +124 -3
  180. package/lib/commonjs/networking/xmpp/allRoomPresences.xmpp.js.map +1 -1
  181. package/lib/commonjs/networking/xmpp/getHistory.xmpp.js +319 -35
  182. package/lib/commonjs/networking/xmpp/getHistory.xmpp.js.map +1 -1
  183. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js +7 -0
  184. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  185. package/lib/commonjs/networking/xmpp/historyCursor.js +101 -0
  186. package/lib/commonjs/networking/xmpp/historyCursor.js.map +1 -0
  187. package/lib/commonjs/networking/xmpp/mamQueryIds.js +17 -0
  188. package/lib/commonjs/networking/xmpp/mamQueryIds.js.map +1 -0
  189. package/lib/commonjs/networking/xmpp/mamRouter.js +24 -9
  190. package/lib/commonjs/networking/xmpp/mamRouter.js.map +1 -1
  191. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js +70 -65
  192. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  193. package/lib/commonjs/networking/xmpp/roomJoinSweep.js +389 -0
  194. package/lib/commonjs/networking/xmpp/roomJoinSweep.js.map +1 -0
  195. package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js +0 -1
  196. package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
  197. package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js +0 -1
  198. package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
  199. package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +0 -1
  200. package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
  201. package/lib/commonjs/networking/xmppClient.js +269 -41
  202. package/lib/commonjs/networking/xmppClient.js.map +1 -1
  203. package/lib/commonjs/networking/xmppCredentials.js +80 -0
  204. package/lib/commonjs/networking/xmppCredentials.js.map +1 -0
  205. package/lib/commonjs/roomStore/Middleware/jumpThreadMiddleware.js +158 -0
  206. package/lib/commonjs/roomStore/Middleware/jumpThreadMiddleware.js.map +1 -0
  207. package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js +6 -0
  208. package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
  209. package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js +45 -7
  210. package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js.map +1 -1
  211. package/lib/commonjs/roomStore/chatSettingsSlice.js +15 -1
  212. package/lib/commonjs/roomStore/chatSettingsSlice.js.map +1 -1
  213. package/lib/commonjs/roomStore/index.js +13 -3
  214. package/lib/commonjs/roomStore/index.js.map +1 -1
  215. package/lib/commonjs/roomStore/persistence.js +48 -1
  216. package/lib/commonjs/roomStore/persistence.js.map +1 -1
  217. package/lib/commonjs/roomStore/roomsSlice.js +474 -60
  218. package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
  219. package/lib/commonjs/roomStore/safeKey.js +44 -0
  220. package/lib/commonjs/roomStore/safeKey.js.map +1 -0
  221. package/lib/commonjs/roomStore/usersSetCap.js +37 -0
  222. package/lib/commonjs/roomStore/usersSetCap.js.map +1 -0
  223. package/lib/commonjs/version.js +1 -1
  224. package/lib/commonjs/version.js.map +1 -1
  225. package/lib/module/assets/icons.js +1 -1
  226. package/lib/module/assets/icons.js.map +1 -1
  227. package/lib/module/components/Header/HeaderRoomList.js +23 -7
  228. package/lib/module/components/Header/HeaderRoomList.js.map +1 -1
  229. package/lib/module/components/InputComponents/Search.js +39 -2
  230. package/lib/module/components/InputComponents/Search.js.map +1 -1
  231. package/lib/module/components/MainComponents/ArchivedMessageCard.js +161 -0
  232. package/lib/module/components/MainComponents/ArchivedMessageCard.js.map +1 -0
  233. package/lib/module/components/MainComponents/ChatHeader.js +22 -5
  234. package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
  235. package/lib/module/components/MainComponents/ChatRoom.js +57 -26
  236. package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
  237. package/lib/module/components/MainComponents/ChatWrapper.js +31 -1
  238. package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
  239. package/lib/module/components/MainComponents/MediaMessage.js +18 -3
  240. package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
  241. package/lib/module/components/MainComponents/MessageList.js +740 -42
  242. package/lib/module/components/MainComponents/MessageList.js.map +1 -1
  243. package/lib/module/components/MainComponents/MessageSearchButton.js +48 -0
  244. package/lib/module/components/MainComponents/MessageSearchButton.js.map +1 -0
  245. package/lib/module/components/MainComponents/ReduxWrapper.js +15 -7
  246. package/lib/module/components/MainComponents/ReduxWrapper.js.map +1 -1
  247. package/lib/module/components/MainComponents/RoomList.js +111 -2
  248. package/lib/module/components/MainComponents/RoomList.js.map +1 -1
  249. package/lib/module/components/Menu/HeaderRoomListMenu.js +15 -4
  250. package/lib/module/components/Menu/HeaderRoomListMenu.js.map +1 -1
  251. package/lib/module/components/MessageBubble/BubbleHighlight.js +106 -0
  252. package/lib/module/components/MessageBubble/BubbleHighlight.js.map +1 -0
  253. package/lib/module/components/MessageBubble/Message.js +172 -127
  254. package/lib/module/components/MessageBubble/Message.js.map +1 -1
  255. package/lib/module/components/MessageBubble/MessageInteractions.js +98 -78
  256. package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
  257. package/lib/module/components/MessageBubble/messageMenuLayout.js +45 -0
  258. package/lib/module/components/MessageBubble/messageMenuLayout.js.map +1 -0
  259. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +74 -38
  260. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  261. package/lib/module/components/Modals/MessageSearchModal/MessageHitResults.js +243 -0
  262. package/lib/module/components/Modals/MessageSearchModal/MessageHitResults.js.map +1 -0
  263. package/lib/module/components/Modals/MessageSearchModal/MessageSearchModal.js +482 -0
  264. package/lib/module/components/Modals/MessageSearchModal/MessageSearchModal.js.map +1 -0
  265. package/lib/module/components/Modals/MessageSearchModal/openHit.js +45 -0
  266. package/lib/module/components/Modals/MessageSearchModal/openHit.js.map +1 -0
  267. package/lib/module/components/Modals/MessageSearchModal/resolveSender.js +41 -0
  268. package/lib/module/components/Modals/MessageSearchModal/resolveSender.js.map +1 -0
  269. package/lib/module/components/Modals/MessageSearchModal/searchFilters.js +74 -0
  270. package/lib/module/components/Modals/MessageSearchModal/searchFilters.js.map +1 -0
  271. package/lib/module/components/Modals/MessageSearchModal/snippet.js +57 -0
  272. package/lib/module/components/Modals/MessageSearchModal/snippet.js.map +1 -0
  273. package/lib/module/components/Modals/MessageSearchModal/useMessageSearch.js +131 -0
  274. package/lib/module/components/Modals/MessageSearchModal/useMessageSearch.js.map +1 -0
  275. package/lib/module/components/Modals/PublicChatsModal/PublicChatsModal.js +300 -0
  276. package/lib/module/components/Modals/PublicChatsModal/PublicChatsModal.js.map +1 -0
  277. package/lib/module/components/Modals/PublicChatsModal/publicChatsLogic.js +30 -0
  278. package/lib/module/components/Modals/PublicChatsModal/publicChatsLogic.js.map +1 -0
  279. package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js +8 -1
  280. package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
  281. package/lib/module/components/RoomComponents/ChatRoomItem.js +14 -3
  282. package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
  283. package/lib/module/components/RoomComponents/SwipeableRoomRow.js +39 -7
  284. package/lib/module/components/RoomComponents/SwipeableRoomRow.js.map +1 -1
  285. package/lib/module/components/Thread/ThreadHeader.js +3 -1
  286. package/lib/module/components/Thread/ThreadHeader.js.map +1 -1
  287. package/lib/module/components/Thread/ThreadWrapper.js +89 -9
  288. package/lib/module/components/Thread/ThreadWrapper.js.map +1 -1
  289. package/lib/module/components/styled/AudioDecoderHost.js +332 -0
  290. package/lib/module/components/styled/AudioDecoderHost.js.map +1 -0
  291. package/lib/module/components/styled/AudioMessage.js +495 -422
  292. package/lib/module/components/styled/AudioMessage.js.map +1 -1
  293. package/lib/module/components/styled/SendInput.js +32 -6
  294. package/lib/module/components/styled/SendInput.js.map +1 -1
  295. package/lib/module/context/MessageNotificationContext.js +15 -5
  296. package/lib/module/context/MessageNotificationContext.js.map +1 -1
  297. package/lib/module/context/xmppProvider.js +42 -78
  298. package/lib/module/context/xmppProvider.js.map +1 -1
  299. package/lib/module/helpers/audioWaveform.js +153 -0
  300. package/lib/module/helpers/audioWaveform.js.map +1 -0
  301. package/lib/module/helpers/backgroundJoinSweep.js +30 -0
  302. package/lib/module/helpers/backgroundJoinSweep.js.map +1 -0
  303. package/lib/module/helpers/bubbleHighlight.js +38 -0
  304. package/lib/module/helpers/bubbleHighlight.js.map +1 -0
  305. package/lib/module/helpers/checkUniqueUsers.js +15 -13
  306. package/lib/module/helpers/checkUniqueUsers.js.map +1 -1
  307. package/lib/module/helpers/constants/MODAL_COMPONENTS.js +5 -1
  308. package/lib/module/helpers/constants/MODAL_COMPONENTS.js.map +1 -1
  309. package/lib/module/helpers/constants/MODAL_TYPES.js +3 -1
  310. package/lib/module/helpers/constants/MODAL_TYPES.js.map +1 -1
  311. package/lib/module/helpers/createRoomFromApi.js +37 -3
  312. package/lib/module/helpers/createRoomFromApi.js.map +1 -1
  313. package/lib/module/helpers/dedupeMembers.js +28 -0
  314. package/lib/module/helpers/dedupeMembers.js.map +1 -0
  315. package/lib/module/helpers/ethoraLogger.js +52 -0
  316. package/lib/module/helpers/ethoraLogger.js.map +1 -0
  317. package/lib/module/helpers/getUnnamedUsers.js +9 -4
  318. package/lib/module/helpers/getUnnamedUsers.js.map +1 -1
  319. package/lib/module/helpers/historyPreloadConfig.js +39 -0
  320. package/lib/module/helpers/historyPreloadConfig.js.map +1 -0
  321. package/lib/module/helpers/historyPreloadScheduler.js +368 -134
  322. package/lib/module/helpers/historyPreloadScheduler.js.map +1 -1
  323. package/lib/module/helpers/initRoomsPresence.js +18 -5
  324. package/lib/module/helpers/initRoomsPresence.js.map +1 -1
  325. package/lib/module/helpers/insertMessageWithDelimiter.js +5 -0
  326. package/lib/module/helpers/insertMessageWithDelimiter.js.map +1 -1
  327. package/lib/module/helpers/isLikelyMucJid.js +60 -0
  328. package/lib/module/helpers/isLikelyMucJid.js.map +1 -0
  329. package/lib/module/helpers/isMessageSearchEnabled.js +13 -0
  330. package/lib/module/helpers/isMessageSearchEnabled.js.map +1 -0
  331. package/lib/module/helpers/joiningRoom.js +9 -0
  332. package/lib/module/helpers/joiningRoom.js.map +1 -0
  333. package/lib/module/helpers/jumpThread.js +83 -0
  334. package/lib/module/helpers/jumpThread.js.map +1 -0
  335. package/lib/module/helpers/jumpToMessage.js +52 -0
  336. package/lib/module/helpers/jumpToMessage.js.map +1 -0
  337. package/lib/module/helpers/jumpWindow.js +177 -0
  338. package/lib/module/helpers/jumpWindow.js.map +1 -0
  339. package/lib/module/helpers/loadRoomHistory.js +69 -0
  340. package/lib/module/helpers/loadRoomHistory.js.map +1 -0
  341. package/lib/module/helpers/notificationPolicy.js +70 -0
  342. package/lib/module/helpers/notificationPolicy.js.map +1 -0
  343. package/lib/module/helpers/openRoomAtMessage.js +41 -0
  344. package/lib/module/helpers/openRoomAtMessage.js.map +1 -0
  345. package/lib/module/helpers/openThreadForJump.js +68 -0
  346. package/lib/module/helpers/openThreadForJump.js.map +1 -0
  347. package/lib/module/helpers/parseMessageReference.js +26 -6
  348. package/lib/module/helpers/parseMessageReference.js.map +1 -1
  349. package/lib/module/helpers/publicChatsEntry.js +12 -0
  350. package/lib/module/helpers/publicChatsEntry.js.map +1 -0
  351. package/lib/module/helpers/roomActivityScore.js +30 -0
  352. package/lib/module/helpers/roomActivityScore.js.map +1 -0
  353. package/lib/module/helpers/roomUserCount.js +29 -0
  354. package/lib/module/helpers/roomUserCount.js.map +1 -0
  355. package/lib/module/helpers/runConfiguredHistoryPreload.js +63 -0
  356. package/lib/module/helpers/runConfiguredHistoryPreload.js.map +1 -0
  357. package/lib/module/helpers/sessionAppId.js +20 -0
  358. package/lib/module/helpers/sessionAppId.js.map +1 -0
  359. package/lib/module/helpers/timestamp.js +37 -0
  360. package/lib/module/helpers/timestamp.js.map +1 -0
  361. package/lib/module/helpers/userResolver.js +503 -0
  362. package/lib/module/helpers/userResolver.js.map +1 -0
  363. package/lib/module/helpers/xmppIdShape.js +46 -0
  364. package/lib/module/helpers/xmppIdShape.js.map +1 -0
  365. package/lib/module/hooks/useChatWrapperInit.js +16 -5
  366. package/lib/module/hooks/useChatWrapperInit.js.map +1 -1
  367. package/lib/module/hooks/useHeapSender.js +54 -3
  368. package/lib/module/hooks/useHeapSender.js.map +1 -1
  369. package/lib/module/hooks/useJumpToMessage.js +389 -0
  370. package/lib/module/hooks/useJumpToMessage.js.map +1 -0
  371. package/lib/module/hooks/useMessageLoaderQueue.js +32 -5
  372. package/lib/module/hooks/useMessageLoaderQueue.js.map +1 -1
  373. package/lib/module/hooks/useMessageQueue.js +13 -5
  374. package/lib/module/hooks/useMessageQueue.js.map +1 -1
  375. package/lib/module/hooks/useRoomDirectory.js +24 -0
  376. package/lib/module/hooks/useRoomDirectory.js.map +1 -0
  377. package/lib/module/hooks/useRoomInitialization.js +29 -7
  378. package/lib/module/hooks/useRoomInitialization.js.map +1 -1
  379. package/lib/module/hooks/useRoomMute.js +58 -0
  380. package/lib/module/hooks/useRoomMute.js.map +1 -0
  381. package/lib/module/hooks/useRoomState.js +3 -1
  382. package/lib/module/hooks/useRoomState.js.map +1 -1
  383. package/lib/module/hooks/useSendMessage.js +13 -3
  384. package/lib/module/hooks/useSendMessage.js.map +1 -1
  385. package/lib/module/i18n/strings.js +288 -6
  386. package/lib/module/i18n/strings.js.map +1 -1
  387. package/lib/module/networking/api-requests/messageSearch.api.js +81 -0
  388. package/lib/module/networking/api-requests/messageSearch.api.js.map +1 -0
  389. package/lib/module/networking/api-requests/publicChats.api.js +43 -0
  390. package/lib/module/networking/api-requests/publicChats.api.js.map +1 -0
  391. package/lib/module/networking/api-requests/roomMembers.api.js +248 -4
  392. package/lib/module/networking/api-requests/roomMembers.api.js.map +1 -1
  393. package/lib/module/networking/api-requests/rooms.api.js +48 -12
  394. package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
  395. package/lib/module/networking/api-requests/xmppToken.api.js +66 -0
  396. package/lib/module/networking/api-requests/xmppToken.api.js.map +1 -0
  397. package/lib/module/networking/ethoraEvents.js +220 -0
  398. package/lib/module/networking/ethoraEvents.js.map +1 -0
  399. package/lib/module/networking/stanzaHandlers.js +155 -18
  400. package/lib/module/networking/stanzaHandlers.js.map +1 -1
  401. package/lib/module/networking/xmpp/allRoomPresences.xmpp.js +125 -3
  402. package/lib/module/networking/xmpp/allRoomPresences.xmpp.js.map +1 -1
  403. package/lib/module/networking/xmpp/getHistory.xmpp.js +318 -35
  404. package/lib/module/networking/xmpp/getHistory.xmpp.js.map +1 -1
  405. package/lib/module/networking/xmpp/handleStanzas.xmpp.js +7 -0
  406. package/lib/module/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  407. package/lib/module/networking/xmpp/historyCursor.js +95 -0
  408. package/lib/module/networking/xmpp/historyCursor.js.map +1 -0
  409. package/lib/module/networking/xmpp/mamQueryIds.js +12 -0
  410. package/lib/module/networking/xmpp/mamQueryIds.js.map +1 -0
  411. package/lib/module/networking/xmpp/mamRouter.js +22 -8
  412. package/lib/module/networking/xmpp/mamRouter.js.map +1 -1
  413. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js +68 -62
  414. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  415. package/lib/module/networking/xmpp/roomJoinSweep.js +385 -0
  416. package/lib/module/networking/xmpp/roomJoinSweep.js.map +1 -0
  417. package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js +0 -1
  418. package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
  419. package/lib/module/networking/xmpp/sendTextMessage.xmpp.js +0 -1
  420. package/lib/module/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
  421. package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +0 -1
  422. package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
  423. package/lib/module/networking/xmppClient.js +269 -41
  424. package/lib/module/networking/xmppClient.js.map +1 -1
  425. package/lib/module/networking/xmppCredentials.js +76 -0
  426. package/lib/module/networking/xmppCredentials.js.map +1 -0
  427. package/lib/module/roomStore/Middleware/jumpThreadMiddleware.js +153 -0
  428. package/lib/module/roomStore/Middleware/jumpThreadMiddleware.js.map +1 -0
  429. package/lib/module/roomStore/Middleware/reactionsMiddleware.js +6 -0
  430. package/lib/module/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
  431. package/lib/module/roomStore/Middleware/unreadMidlleware.js +46 -7
  432. package/lib/module/roomStore/Middleware/unreadMidlleware.js.map +1 -1
  433. package/lib/module/roomStore/chatSettingsSlice.js +13 -0
  434. package/lib/module/roomStore/chatSettingsSlice.js.map +1 -1
  435. package/lib/module/roomStore/index.js +7 -3
  436. package/lib/module/roomStore/index.js.map +1 -1
  437. package/lib/module/roomStore/persistence.js +46 -1
  438. package/lib/module/roomStore/persistence.js.map +1 -1
  439. package/lib/module/roomStore/roomsSlice.js +459 -58
  440. package/lib/module/roomStore/roomsSlice.js.map +1 -1
  441. package/lib/module/roomStore/safeKey.js +37 -0
  442. package/lib/module/roomStore/safeKey.js.map +1 -0
  443. package/lib/module/roomStore/usersSetCap.js +32 -0
  444. package/lib/module/roomStore/usersSetCap.js.map +1 -0
  445. package/lib/module/version.js +1 -1
  446. package/lib/module/version.js.map +1 -1
  447. package/lib/typescript/assets/icons.d.ts +4 -0
  448. package/lib/typescript/assets/icons.d.ts.map +1 -1
  449. package/lib/typescript/components/Header/HeaderRoomList.d.ts.map +1 -1
  450. package/lib/typescript/components/InputComponents/Search.d.ts.map +1 -1
  451. package/lib/typescript/components/MainComponents/ArchivedMessageCard.d.ts +12 -0
  452. package/lib/typescript/components/MainComponents/ArchivedMessageCard.d.ts.map +1 -0
  453. package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
  454. package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
  455. package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
  456. package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
  457. package/lib/typescript/components/MainComponents/MessageList.d.ts +22 -1
  458. package/lib/typescript/components/MainComponents/MessageList.d.ts.map +1 -1
  459. package/lib/typescript/components/MainComponents/MessageSearchButton.d.ts +7 -0
  460. package/lib/typescript/components/MainComponents/MessageSearchButton.d.ts.map +1 -0
  461. package/lib/typescript/components/MainComponents/ReduxWrapper.d.ts.map +1 -1
  462. package/lib/typescript/components/MainComponents/RoomList.d.ts.map +1 -1
  463. package/lib/typescript/components/Menu/HeaderRoomListMenu.d.ts.map +1 -1
  464. package/lib/typescript/components/MessageBubble/BubbleHighlight.d.ts +12 -0
  465. package/lib/typescript/components/MessageBubble/BubbleHighlight.d.ts.map +1 -0
  466. package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
  467. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts +5 -0
  468. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts.map +1 -1
  469. package/lib/typescript/components/MessageBubble/messageMenuLayout.d.ts +29 -0
  470. package/lib/typescript/components/MessageBubble/messageMenuLayout.d.ts.map +1 -0
  471. package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts +2 -0
  472. package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
  473. package/lib/typescript/components/Modals/MessageSearchModal/MessageHitResults.d.ts +44 -0
  474. package/lib/typescript/components/Modals/MessageSearchModal/MessageHitResults.d.ts.map +1 -0
  475. package/lib/typescript/components/Modals/MessageSearchModal/MessageSearchModal.d.ts +12 -0
  476. package/lib/typescript/components/Modals/MessageSearchModal/MessageSearchModal.d.ts.map +1 -0
  477. package/lib/typescript/components/Modals/MessageSearchModal/openHit.d.ts +15 -0
  478. package/lib/typescript/components/Modals/MessageSearchModal/openHit.d.ts.map +1 -0
  479. package/lib/typescript/components/Modals/MessageSearchModal/resolveSender.d.ts +34 -0
  480. package/lib/typescript/components/Modals/MessageSearchModal/resolveSender.d.ts.map +1 -0
  481. package/lib/typescript/components/Modals/MessageSearchModal/searchFilters.d.ts +41 -0
  482. package/lib/typescript/components/Modals/MessageSearchModal/searchFilters.d.ts.map +1 -0
  483. package/lib/typescript/components/Modals/MessageSearchModal/snippet.d.ts +15 -0
  484. package/lib/typescript/components/Modals/MessageSearchModal/snippet.d.ts.map +1 -0
  485. package/lib/typescript/components/Modals/MessageSearchModal/useMessageSearch.d.ts +23 -0
  486. package/lib/typescript/components/Modals/MessageSearchModal/useMessageSearch.d.ts.map +1 -0
  487. package/lib/typescript/components/Modals/PublicChatsModal/PublicChatsModal.d.ts +16 -0
  488. package/lib/typescript/components/Modals/PublicChatsModal/PublicChatsModal.d.ts.map +1 -0
  489. package/lib/typescript/components/Modals/PublicChatsModal/publicChatsLogic.d.ts +14 -0
  490. package/lib/typescript/components/Modals/PublicChatsModal/publicChatsLogic.d.ts.map +1 -0
  491. package/lib/typescript/components/Modals/SelectUsersModal/SelectUsersModal.d.ts.map +1 -1
  492. package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
  493. package/lib/typescript/components/RoomComponents/SwipeableRoomRow.d.ts +5 -1
  494. package/lib/typescript/components/RoomComponents/SwipeableRoomRow.d.ts.map +1 -1
  495. package/lib/typescript/components/Thread/ThreadHeader.d.ts.map +1 -1
  496. package/lib/typescript/components/Thread/ThreadWrapper.d.ts +1 -0
  497. package/lib/typescript/components/Thread/ThreadWrapper.d.ts.map +1 -1
  498. package/lib/typescript/components/styled/AudioDecoderHost.d.ts +39 -0
  499. package/lib/typescript/components/styled/AudioDecoderHost.d.ts.map +1 -0
  500. package/lib/typescript/components/styled/AudioMessage.d.ts +14 -1
  501. package/lib/typescript/components/styled/AudioMessage.d.ts.map +1 -1
  502. package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
  503. package/lib/typescript/context/MessageNotificationContext.d.ts.map +1 -1
  504. package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
  505. package/lib/typescript/helpers/audioWaveform.d.ts +54 -0
  506. package/lib/typescript/helpers/audioWaveform.d.ts.map +1 -0
  507. package/lib/typescript/helpers/backgroundJoinSweep.d.ts +14 -0
  508. package/lib/typescript/helpers/backgroundJoinSweep.d.ts.map +1 -0
  509. package/lib/typescript/helpers/bubbleHighlight.d.ts +17 -0
  510. package/lib/typescript/helpers/bubbleHighlight.d.ts.map +1 -0
  511. package/lib/typescript/helpers/checkUniqueUsers.d.ts +2 -2
  512. package/lib/typescript/helpers/checkUniqueUsers.d.ts.map +1 -1
  513. package/lib/typescript/helpers/constants/MODAL_COMPONENTS.d.ts.map +1 -1
  514. package/lib/typescript/helpers/constants/MODAL_TYPES.d.ts +2 -0
  515. package/lib/typescript/helpers/constants/MODAL_TYPES.d.ts.map +1 -1
  516. package/lib/typescript/helpers/createRoomFromApi.d.ts +25 -0
  517. package/lib/typescript/helpers/createRoomFromApi.d.ts.map +1 -1
  518. package/lib/typescript/helpers/dedupeMembers.d.ts +11 -0
  519. package/lib/typescript/helpers/dedupeMembers.d.ts.map +1 -0
  520. package/lib/typescript/helpers/ethoraLogger.d.ts +13 -0
  521. package/lib/typescript/helpers/ethoraLogger.d.ts.map +1 -0
  522. package/lib/typescript/helpers/getUnnamedUsers.d.ts.map +1 -1
  523. package/lib/typescript/helpers/historyPreloadConfig.d.ts +26 -0
  524. package/lib/typescript/helpers/historyPreloadConfig.d.ts.map +1 -0
  525. package/lib/typescript/helpers/historyPreloadScheduler.d.ts +8 -4
  526. package/lib/typescript/helpers/historyPreloadScheduler.d.ts.map +1 -1
  527. package/lib/typescript/helpers/initRoomsPresence.d.ts +7 -0
  528. package/lib/typescript/helpers/initRoomsPresence.d.ts.map +1 -1
  529. package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts.map +1 -1
  530. package/lib/typescript/helpers/isLikelyMucJid.d.ts +19 -0
  531. package/lib/typescript/helpers/isLikelyMucJid.d.ts.map +1 -0
  532. package/lib/typescript/helpers/isMessageSearchEnabled.d.ts +12 -0
  533. package/lib/typescript/helpers/isMessageSearchEnabled.d.ts.map +1 -0
  534. package/lib/typescript/helpers/joiningRoom.d.ts +7 -0
  535. package/lib/typescript/helpers/joiningRoom.d.ts.map +1 -0
  536. package/lib/typescript/helpers/jumpThread.d.ts +48 -0
  537. package/lib/typescript/helpers/jumpThread.d.ts.map +1 -0
  538. package/lib/typescript/helpers/jumpToMessage.d.ts +26 -0
  539. package/lib/typescript/helpers/jumpToMessage.d.ts.map +1 -0
  540. package/lib/typescript/helpers/jumpWindow.d.ts +74 -0
  541. package/lib/typescript/helpers/jumpWindow.d.ts.map +1 -0
  542. package/lib/typescript/helpers/loadRoomHistory.d.ts +34 -0
  543. package/lib/typescript/helpers/loadRoomHistory.d.ts.map +1 -0
  544. package/lib/typescript/helpers/notificationPolicy.d.ts +42 -0
  545. package/lib/typescript/helpers/notificationPolicy.d.ts.map +1 -0
  546. package/lib/typescript/helpers/openRoomAtMessage.d.ts +17 -0
  547. package/lib/typescript/helpers/openRoomAtMessage.d.ts.map +1 -0
  548. package/lib/typescript/helpers/openThreadForJump.d.ts +27 -0
  549. package/lib/typescript/helpers/openThreadForJump.d.ts.map +1 -0
  550. package/lib/typescript/helpers/parseMessageReference.d.ts +18 -5
  551. package/lib/typescript/helpers/parseMessageReference.d.ts.map +1 -1
  552. package/lib/typescript/helpers/publicChatsEntry.d.ts +11 -0
  553. package/lib/typescript/helpers/publicChatsEntry.d.ts.map +1 -0
  554. package/lib/typescript/helpers/roomActivityScore.d.ts +5 -0
  555. package/lib/typescript/helpers/roomActivityScore.d.ts.map +1 -0
  556. package/lib/typescript/helpers/roomUserCount.d.ts +20 -0
  557. package/lib/typescript/helpers/roomUserCount.d.ts.map +1 -0
  558. package/lib/typescript/helpers/runConfiguredHistoryPreload.d.ts +21 -0
  559. package/lib/typescript/helpers/runConfiguredHistoryPreload.d.ts.map +1 -0
  560. package/lib/typescript/helpers/sessionAppId.d.ts +8 -0
  561. package/lib/typescript/helpers/sessionAppId.d.ts.map +1 -0
  562. package/lib/typescript/helpers/timestamp.d.ts +3 -0
  563. package/lib/typescript/helpers/timestamp.d.ts.map +1 -0
  564. package/lib/typescript/helpers/userResolver.d.ts +58 -0
  565. package/lib/typescript/helpers/userResolver.d.ts.map +1 -0
  566. package/lib/typescript/helpers/xmppIdShape.d.ts +10 -0
  567. package/lib/typescript/helpers/xmppIdShape.d.ts.map +1 -0
  568. package/lib/typescript/hooks/useChatWrapperInit.d.ts +2 -0
  569. package/lib/typescript/hooks/useChatWrapperInit.d.ts.map +1 -1
  570. package/lib/typescript/hooks/useHeapSender.d.ts.map +1 -1
  571. package/lib/typescript/hooks/useJumpToMessage.d.ts +116 -0
  572. package/lib/typescript/hooks/useJumpToMessage.d.ts.map +1 -0
  573. package/lib/typescript/hooks/useMessageLoaderQueue.d.ts.map +1 -1
  574. package/lib/typescript/hooks/useMessageQueue.d.ts.map +1 -1
  575. package/lib/typescript/hooks/useRoomDirectory.d.ts +12 -0
  576. package/lib/typescript/hooks/useRoomDirectory.d.ts.map +1 -0
  577. package/lib/typescript/hooks/useRoomInitialization.d.ts.map +1 -1
  578. package/lib/typescript/hooks/useRoomMute.d.ts +8 -0
  579. package/lib/typescript/hooks/useRoomMute.d.ts.map +1 -0
  580. package/lib/typescript/hooks/useRoomState.d.ts +1 -0
  581. package/lib/typescript/hooks/useRoomState.d.ts.map +1 -1
  582. package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
  583. package/lib/typescript/i18n/strings.d.ts.map +1 -1
  584. package/lib/typescript/networking/api-requests/messageSearch.api.d.ts +57 -0
  585. package/lib/typescript/networking/api-requests/messageSearch.api.d.ts.map +1 -0
  586. package/lib/typescript/networking/api-requests/publicChats.api.d.ts +24 -0
  587. package/lib/typescript/networking/api-requests/publicChats.api.d.ts.map +1 -0
  588. package/lib/typescript/networking/api-requests/roomMembers.api.d.ts +19 -1
  589. package/lib/typescript/networking/api-requests/roomMembers.api.d.ts.map +1 -1
  590. package/lib/typescript/networking/api-requests/rooms.api.d.ts.map +1 -1
  591. package/lib/typescript/networking/api-requests/xmppToken.api.d.ts +2 -0
  592. package/lib/typescript/networking/api-requests/xmppToken.api.d.ts.map +1 -0
  593. package/lib/typescript/networking/ethoraEvents.d.ts +45 -0
  594. package/lib/typescript/networking/ethoraEvents.d.ts.map +1 -0
  595. package/lib/typescript/networking/stanzaHandlers.d.ts +1 -1
  596. package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
  597. package/lib/typescript/networking/xmpp/allRoomPresences.xmpp.d.ts +32 -1
  598. package/lib/typescript/networking/xmpp/allRoomPresences.xmpp.d.ts.map +1 -1
  599. package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts +64 -0
  600. package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts.map +1 -1
  601. package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts.map +1 -1
  602. package/lib/typescript/networking/xmpp/historyCursor.d.ts +35 -0
  603. package/lib/typescript/networking/xmpp/historyCursor.d.ts.map +1 -0
  604. package/lib/typescript/networking/xmpp/mamQueryIds.d.ts +10 -0
  605. package/lib/typescript/networking/xmpp/mamQueryIds.d.ts.map +1 -0
  606. package/lib/typescript/networking/xmpp/mamRouter.d.ts +7 -0
  607. package/lib/typescript/networking/xmpp/mamRouter.d.ts.map +1 -1
  608. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts +13 -2
  609. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts.map +1 -1
  610. package/lib/typescript/networking/xmpp/roomJoinSweep.d.ts +82 -0
  611. package/lib/typescript/networking/xmpp/roomJoinSweep.d.ts.map +1 -0
  612. package/lib/typescript/networking/xmpp/sendMediaMessage.xmpp.d.ts.map +1 -1
  613. package/lib/typescript/networking/xmpp/sendTextMessage.xmpp.d.ts.map +1 -1
  614. package/lib/typescript/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.d.ts.map +1 -1
  615. package/lib/typescript/networking/xmppClient.d.ts +90 -4
  616. package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
  617. package/lib/typescript/networking/xmppCredentials.d.ts +12 -0
  618. package/lib/typescript/networking/xmppCredentials.d.ts.map +1 -0
  619. package/lib/typescript/roomStore/Middleware/jumpThreadMiddleware.d.ts +3 -0
  620. package/lib/typescript/roomStore/Middleware/jumpThreadMiddleware.d.ts.map +1 -0
  621. package/lib/typescript/roomStore/Middleware/reactionsMiddleware.d.ts.map +1 -1
  622. package/lib/typescript/roomStore/Middleware/unreadMidlleware.d.ts.map +1 -1
  623. package/lib/typescript/roomStore/chatSettingsSlice.d.ts +8 -1
  624. package/lib/typescript/roomStore/chatSettingsSlice.d.ts.map +1 -1
  625. package/lib/typescript/roomStore/index.d.ts +2 -1
  626. package/lib/typescript/roomStore/index.d.ts.map +1 -1
  627. package/lib/typescript/roomStore/persistence.d.ts +8 -0
  628. package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
  629. package/lib/typescript/roomStore/roomsSlice.d.ts +138 -2
  630. package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
  631. package/lib/typescript/roomStore/safeKey.d.ts +13 -0
  632. package/lib/typescript/roomStore/safeKey.d.ts.map +1 -0
  633. package/lib/typescript/roomStore/usersSetCap.d.ts +16 -0
  634. package/lib/typescript/roomStore/usersSetCap.d.ts.map +1 -0
  635. package/lib/typescript/types/models/media.model.d.ts +2 -0
  636. package/lib/typescript/types/models/media.model.d.ts.map +1 -1
  637. package/lib/typescript/types/models/room.model.d.ts +18 -5
  638. package/lib/typescript/types/models/room.model.d.ts.map +1 -1
  639. package/lib/typescript/types/models/xmpp.model.d.ts +8 -1
  640. package/lib/typescript/types/models/xmpp.model.d.ts.map +1 -1
  641. package/lib/typescript/types/types.d.ts +88 -5
  642. package/lib/typescript/types/types.d.ts.map +1 -1
  643. package/lib/typescript/version.d.ts +1 -1
  644. package/lib/typescript/version.d.ts.map +1 -1
  645. package/package.json +1 -1
  646. package/src/assets/icons.tsx +13 -0
  647. package/src/components/Header/HeaderRoomList.tsx +21 -4
  648. package/src/components/InputComponents/Search.tsx +33 -0
  649. package/src/components/MainComponents/ArchivedMessageCard.tsx +139 -0
  650. package/src/components/MainComponents/ChatHeader.tsx +19 -3
  651. package/src/components/MainComponents/ChatRoom.tsx +60 -23
  652. package/src/components/MainComponents/ChatWrapper.tsx +23 -4
  653. package/src/components/MainComponents/MediaMessage.tsx +17 -0
  654. package/src/components/MainComponents/MessageList.tsx +823 -84
  655. package/src/components/MainComponents/MessageSearchButton.tsx +48 -0
  656. package/src/components/MainComponents/ReduxWrapper.tsx +16 -5
  657. package/src/components/MainComponents/RoomList.tsx +125 -0
  658. package/src/components/Menu/HeaderRoomListMenu.tsx +26 -2
  659. package/src/components/MessageBubble/BubbleHighlight.tsx +106 -0
  660. package/src/components/MessageBubble/Message.tsx +265 -177
  661. package/src/components/MessageBubble/MessageInteractions.tsx +109 -86
  662. package/src/components/MessageBubble/messageMenuLayout.ts +59 -0
  663. package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +92 -21
  664. package/src/components/Modals/MessageSearchModal/MessageHitResults.tsx +271 -0
  665. package/src/components/Modals/MessageSearchModal/MessageSearchModal.tsx +487 -0
  666. package/src/components/Modals/MessageSearchModal/openHit.ts +50 -0
  667. package/src/components/Modals/MessageSearchModal/resolveSender.ts +57 -0
  668. package/src/components/Modals/MessageSearchModal/searchFilters.ts +109 -0
  669. package/src/components/Modals/MessageSearchModal/snippet.ts +58 -0
  670. package/src/components/Modals/MessageSearchModal/useMessageSearch.ts +151 -0
  671. package/src/components/Modals/PublicChatsModal/PublicChatsModal.tsx +288 -0
  672. package/src/components/Modals/PublicChatsModal/publicChatsLogic.ts +36 -0
  673. package/src/components/Modals/SelectUsersModal/SelectUsersModal.tsx +8 -1
  674. package/src/components/RoomComponents/ChatRoomItem.tsx +16 -3
  675. package/src/components/RoomComponents/SwipeableRoomRow.tsx +39 -6
  676. package/src/components/Thread/ThreadHeader.tsx +3 -1
  677. package/src/components/Thread/ThreadWrapper.tsx +96 -10
  678. package/src/components/styled/AudioDecoderHost.tsx +351 -0
  679. package/src/components/styled/AudioMessage.tsx +482 -425
  680. package/src/components/styled/SendInput.tsx +42 -4
  681. package/src/context/MessageNotificationContext.tsx +19 -5
  682. package/src/context/xmppProvider.tsx +44 -91
  683. package/src/helpers/audioWaveform.ts +142 -0
  684. package/src/helpers/backgroundJoinSweep.ts +35 -0
  685. package/src/helpers/bubbleHighlight.ts +47 -0
  686. package/src/helpers/checkUniqueUsers.tsx +15 -17
  687. package/src/helpers/constants/MODAL_COMPONENTS.tsx +4 -0
  688. package/src/helpers/constants/MODAL_TYPES.ts +3 -0
  689. package/src/helpers/createRoomFromApi.tsx +45 -4
  690. package/src/helpers/dedupeMembers.ts +29 -0
  691. package/src/helpers/ethoraLogger.ts +50 -0
  692. package/src/helpers/getUnnamedUsers.ts +7 -4
  693. package/src/helpers/historyPreloadConfig.ts +68 -0
  694. package/src/helpers/historyPreloadScheduler.ts +437 -199
  695. package/src/helpers/initRoomsPresence.ts +20 -7
  696. package/src/helpers/insertMessageWithDelimiter.ts +3 -0
  697. package/src/helpers/isLikelyMucJid.ts +72 -0
  698. package/src/helpers/isMessageSearchEnabled.ts +18 -0
  699. package/src/helpers/joiningRoom.ts +13 -0
  700. package/src/helpers/jumpThread.ts +102 -0
  701. package/src/helpers/jumpToMessage.ts +57 -0
  702. package/src/helpers/jumpWindow.ts +212 -0
  703. package/src/helpers/loadRoomHistory.ts +83 -0
  704. package/src/helpers/notificationPolicy.ts +82 -0
  705. package/src/helpers/openRoomAtMessage.ts +38 -0
  706. package/src/helpers/openThreadForJump.ts +96 -0
  707. package/src/helpers/parseMessageReference.ts +37 -8
  708. package/src/helpers/publicChatsEntry.ts +15 -0
  709. package/src/helpers/roomActivityScore.ts +45 -0
  710. package/src/helpers/roomUserCount.ts +44 -0
  711. package/src/helpers/runConfiguredHistoryPreload.ts +76 -0
  712. package/src/helpers/sessionAppId.ts +17 -0
  713. package/src/helpers/timestamp.ts +44 -0
  714. package/src/helpers/userResolver.ts +542 -0
  715. package/src/helpers/xmppIdShape.ts +46 -0
  716. package/src/hooks/useChatWrapperInit.ts +22 -4
  717. package/src/hooks/useHeapSender.tsx +54 -3
  718. package/src/hooks/useJumpToMessage.ts +538 -0
  719. package/src/hooks/useMessageLoaderQueue.tsx +40 -4
  720. package/src/hooks/useMessageQueue.ts +9 -5
  721. package/src/hooks/useRoomDirectory.ts +39 -0
  722. package/src/hooks/useRoomInitialization.tsx +33 -7
  723. package/src/hooks/useRoomMute.ts +42 -0
  724. package/src/hooks/useRoomState.tsx +6 -0
  725. package/src/hooks/useSendMessage.tsx +14 -2
  726. package/src/i18n/strings.ts +282 -0
  727. package/src/networking/api-requests/messageSearch.api.ts +130 -0
  728. package/src/networking/api-requests/publicChats.api.ts +71 -0
  729. package/src/networking/api-requests/roomMembers.api.ts +263 -11
  730. package/src/networking/api-requests/rooms.api.ts +52 -12
  731. package/src/networking/api-requests/xmppToken.api.ts +62 -0
  732. package/src/networking/ethoraEvents.ts +262 -0
  733. package/src/networking/stanzaHandlers.ts +145 -19
  734. package/src/networking/xmpp/allRoomPresences.xmpp.ts +155 -5
  735. package/src/networking/xmpp/getHistory.xmpp.ts +433 -47
  736. package/src/networking/xmpp/handleStanzas.xmpp.ts +8 -0
  737. package/src/networking/xmpp/historyCursor.ts +124 -0
  738. package/src/networking/xmpp/mamQueryIds.ts +11 -0
  739. package/src/networking/xmpp/mamRouter.ts +24 -10
  740. package/src/networking/xmpp/presenceInRoom.xmpp.ts +91 -68
  741. package/src/networking/xmpp/roomJoinSweep.ts +412 -0
  742. package/src/networking/xmpp/sendMediaMessage.xmpp.ts +0 -1
  743. package/src/networking/xmpp/sendTextMessage.xmpp.ts +0 -1
  744. package/src/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.ts +0 -1
  745. package/src/networking/xmppClient.ts +323 -47
  746. package/src/networking/xmppCredentials.ts +87 -0
  747. package/src/roomStore/Middleware/jumpThreadMiddleware.ts +163 -0
  748. package/src/roomStore/Middleware/reactionsMiddleware.tsx +4 -0
  749. package/src/roomStore/Middleware/unreadMidlleware.tsx +59 -11
  750. package/src/roomStore/chatSettingsSlice.ts +11 -0
  751. package/src/roomStore/index.ts +10 -3
  752. package/src/roomStore/persistence.ts +54 -0
  753. package/src/roomStore/roomsSlice.ts +547 -65
  754. package/src/roomStore/safeKey.ts +49 -0
  755. package/src/roomStore/usersSetCap.ts +37 -0
  756. package/src/types/models/media.model.ts +4 -0
  757. package/src/types/models/room.model.ts +18 -5
  758. package/src/types/models/xmpp.model.ts +15 -1
  759. package/src/types/types.ts +93 -5
  760. package/src/version.ts +1 -1
@@ -0,0 +1,262 @@
1
+ import type { Element } from 'ltx';
2
+ import { store } from '../roomStore';
3
+ import { updateRoom } from '../roomStore/roomsSlice';
4
+ import { isSafeKey, hasSafeIdSegments } from '../roomStore/safeKey';
5
+ import { getRoomByName } from './api-requests/rooms.api';
6
+ import { createRoomFromApi } from '../helpers/createRoomFromApi';
7
+ import { getRoomUserCount } from '../helpers/roomUserCount';
8
+ import { refreshUser } from '../helpers/userResolver';
9
+ import { ethoraLogger } from '../helpers/ethoraLogger';
10
+ import { getSessionAppId } from '../helpers/sessionAppId';
11
+ import type { IRoom } from '../types/types';
12
+
13
+ /**
14
+ * Server push `<ethora-event xmlns="urn:ethora:events:1" .../>` inside a
15
+ * `type="headline"` message from the server's admin account:
16
+ *
17
+ * user-profile-updated xmppUsername="<appId>_<userId>" uuid appId
18
+ * chat-meta-updated chatName="<appId>_<roomId>" appId
19
+ *
20
+ * The payload is a pointer only. The client re-reads the user or the room
21
+ * through the normal API, so nothing in the stanza is ever shown or stored.
22
+ * Everything in the stanza is untrusted input until proven otherwise.
23
+ */
24
+ export const ETHORA_EVENT_XMLNS = 'urn:ethora:events:1';
25
+ export const ETHORA_EVENT_USER_PROFILE = 'user-profile-updated';
26
+ export const ETHORA_EVENT_CHAT_META = 'chat-meta-updated';
27
+
28
+ const MUCSUB_EVENT_NS = 'http://jabber.org/protocol/pubsub#event';
29
+ const ROOM_DEBOUNCE_MS = 500;
30
+ const MAX_KEY_LENGTH = 128;
31
+ const KEY_SHAPE = /^[A-Za-z0-9_-]+$/;
32
+ const ROOM_BACKOFF_MS = [5_000, 30_000, 120_000];
33
+
34
+ type HostLike = { host?: string; client?: { jid?: { getDomain?: () => string } } };
35
+
36
+ const lower = (v: unknown): string => String(v ?? '').trim().toLowerCase();
37
+
38
+ /** Server domain of this session: our own JID's domain, else the configured host. */
39
+ const sessionDomain = (xmppWs: HostLike | undefined): string =>
40
+ lower(xmppWs?.client?.jid?.getDomain?.()) || lower(xmppWs?.host);
41
+
42
+ /**
43
+ * True when a headline came from the server and not from a user or a room.
44
+ * - from must be a BARE jid (a user's c2s stanza or a MUC occupant always
45
+ * carries a resource, and the server stamps it, so it cannot be spoofed)
46
+ * - its domain must be the session's own XMPP domain (not conference.*, not
47
+ * another server)
48
+ * - when config.trustedEventSenders is set, the sender must be listed
49
+ * The server's admin local part is deployment config (XMPP_ADMIN), so it
50
+ * cannot be hard-coded here.
51
+ */
52
+ export const isTrustedEventSender = (
53
+ stanza: Element,
54
+ xmppWs: HostLike | undefined
55
+ ): boolean => {
56
+ const from = String(stanza?.attrs?.from ?? '').trim();
57
+ if (!from || from.includes('/')) return false;
58
+ const at = from.indexOf('@');
59
+ if (at <= 0 || from.indexOf('@', at + 1) !== -1) return false;
60
+ const local = lower(from.slice(0, at));
61
+ const domain = lower(from.slice(at + 1));
62
+ if (!local || !domain) return false;
63
+ const own = sessionDomain(xmppWs);
64
+ if (!own || domain !== own) return false;
65
+
66
+ const pinned = (store.getState().chatSettingStore?.config as any)
67
+ ?.trustedEventSenders;
68
+ if (Array.isArray(pinned) && pinned.length) {
69
+ return pinned.some((entry: unknown) => {
70
+ const e = lower(entry);
71
+ return e === `${local}@${domain}` || e === local;
72
+ });
73
+ }
74
+ return true;
75
+ };
76
+
77
+ const sessionAppId = (): string =>
78
+ getSessionAppId();
79
+
80
+ /**
81
+ * `<appId>_<id>` shape for an attribute that is about to become a URL
82
+ * segment or a store key: charset, length cap, no unsafe key, and the
83
+ * session's appId as prefix when the session has one.
84
+ */
85
+ const isSafeEventKey = (value: unknown): value is string => {
86
+ if (!isSafeKey(value)) return false;
87
+ if (value.length > MAX_KEY_LENGTH || !KEY_SHAPE.test(value)) return false;
88
+ if (!value.includes('_')) return false;
89
+ if (!hasSafeIdSegments(value)) return false;
90
+ const appId = sessionAppId();
91
+ if (appId && !value.startsWith(`${appId}_`)) return false;
92
+ return true;
93
+ };
94
+
95
+ // --- chat-meta-updated -----------------------------------------------------
96
+
97
+ const roomTimers = new Map<string, ReturnType<typeof setTimeout>>();
98
+ const roomInflight = new Set<string>();
99
+ const roomAgain = new Set<string>();
100
+ const roomFailures = new Map<string, { count: number; until: number }>();
101
+
102
+ const findRoomJid = (chatName: string): string | null => {
103
+ const rooms = (store.getState().rooms?.rooms || {}) as Record<string, IRoom>;
104
+ for (const jid of Object.keys(rooms)) {
105
+ if (jid.split('@')[0] === chatName) return jid;
106
+ }
107
+ return null;
108
+ };
109
+
110
+ const runRoomRefresh = async (chatName: string): Promise<void> => {
111
+ if (roomInflight.has(chatName)) {
112
+ roomAgain.add(chatName);
113
+ return;
114
+ }
115
+ const failure = roomFailures.get(chatName);
116
+ if (failure && failure.until > Date.now()) return;
117
+ const jid = findRoomJid(chatName);
118
+ if (!jid || !store.getState().chatSettingStore?.user?.token) return;
119
+
120
+ roomInflight.add(chatName);
121
+ try {
122
+ const apiRoom = await getRoomByName(chatName);
123
+ roomFailures.delete(chatName);
124
+ const current = (store.getState().rooms?.rooms || {})[jid] as
125
+ | IRoom
126
+ | undefined;
127
+ if (!current || !apiRoom) return;
128
+ const service = jid.split('@')[1] || '';
129
+ // createRoomFromApi applies the title rules (private chats derive the
130
+ // peer name, sentinel titles are refused) and the usersCnt rules
131
+ const fresh = createRoomFromApi(
132
+ { ...apiRoom, name: chatName },
133
+ service,
134
+ getRoomUserCount(current)
135
+ );
136
+ if (!fresh) return;
137
+
138
+ // Metadata only. members, messages, lastMessage and the unread fields
139
+ // stay as they are: the response carries the whole member list (a big
140
+ // room is tens of KB) and the loaded one may be a different, larger set.
141
+ const updates: Partial<IRoom> & { picture?: string } = {
142
+ title: fresh.title,
143
+ name: fresh.name,
144
+ description: fresh.description,
145
+ icon: fresh.icon,
146
+ // the API calls the room image `picture`; RN renders it from `icon`
147
+ picture: (fresh as any).picture,
148
+ // never lower the known total
149
+ usersCnt: Math.max(
150
+ Number(fresh.usersCnt) || 0,
151
+ getRoomUserCount(current)
152
+ ),
153
+ };
154
+ if (
155
+ apiRoom.type === 'public' ||
156
+ apiRoom.type === 'group' ||
157
+ apiRoom.type === 'private'
158
+ ) {
159
+ updates.type = apiRoom.type;
160
+ }
161
+ // A missing field in the answer must not blank the one we have
162
+ (Object.keys(updates) as Array<keyof IRoom>).forEach((k) => {
163
+ if ((updates as any)[k] === undefined) delete (updates as any)[k];
164
+ });
165
+ store.dispatch(updateRoom({ jid, updates }));
166
+ } catch (error) {
167
+ const count = (roomFailures.get(chatName)?.count ?? 0) + 1;
168
+ roomFailures.set(chatName, {
169
+ count,
170
+ until:
171
+ Date.now() +
172
+ ROOM_BACKOFF_MS[Math.min(count - 1, ROOM_BACKOFF_MS.length - 1)],
173
+ });
174
+ ethoraLogger.log('[EthoraEvent] room refresh failed', chatName, error);
175
+ } finally {
176
+ roomInflight.delete(chatName);
177
+ if (roomAgain.delete(chatName)) scheduleRoomRefresh(chatName);
178
+ }
179
+ };
180
+
181
+ const scheduleRoomRefresh = (chatName: string): void => {
182
+ const prior = roomTimers.get(chatName);
183
+ if (prior) clearTimeout(prior);
184
+ roomTimers.set(
185
+ chatName,
186
+ setTimeout(() => {
187
+ roomTimers.delete(chatName);
188
+ runRoomRefresh(chatName);
189
+ }, ROOM_DEBOUNCE_MS)
190
+ );
191
+ };
192
+
193
+ // --- entry point ------------------------------------------------------------
194
+
195
+ const findCarrier = (stanza: Element): Element | null => {
196
+ const candidates: Element[] = [stanza];
197
+ const inner = (stanza as any)
198
+ ?.getChild?.('event', MUCSUB_EVENT_NS)
199
+ ?.getChild?.('items')
200
+ ?.getChild?.('item')
201
+ ?.getChild?.('message');
202
+ if (inner) candidates.push(inner as Element);
203
+ return (
204
+ candidates.find(
205
+ (c) =>
206
+ c?.attrs?.type === 'headline' &&
207
+ (c as any).getChild?.('ethora-event', ETHORA_EVENT_XMLNS)
208
+ ) ?? null
209
+ );
210
+ };
211
+
212
+ /**
213
+ * Handles `<ethora-event>` headlines. Returns true when the stanza carried
214
+ * one (trusted or not), so the caller can stop routing it. Unknown types,
215
+ * malformed attributes and untrusted senders are ignored silently. Never
216
+ * throws.
217
+ */
218
+ export function onEthoraEvent(
219
+ stanza: Element,
220
+ xmppWs?: HostLike
221
+ ): boolean {
222
+ try {
223
+ const carrier = findCarrier(stanza);
224
+ if (!carrier) return false;
225
+ if (!isTrustedEventSender(carrier, xmppWs)) {
226
+ ethoraLogger.log('[EthoraEvent] ignored: untrusted sender');
227
+ return true;
228
+ }
229
+ const event = (carrier as any).getChild('ethora-event', ETHORA_EVENT_XMLNS);
230
+ const type = String(event?.attrs?.type ?? '');
231
+ const appIdAttr = event?.attrs?.appId;
232
+ const appId = sessionAppId();
233
+ if (appIdAttr !== undefined && appId && String(appIdAttr) !== appId) {
234
+ return true;
235
+ }
236
+
237
+ if (type === ETHORA_EVENT_USER_PROFILE) {
238
+ const id = event?.attrs?.xmppUsername;
239
+ if (isSafeEventKey(id)) refreshUser(id);
240
+ } else if (type === ETHORA_EVENT_CHAT_META) {
241
+ const chatName = event?.attrs?.chatName;
242
+ // a room we do not hold (a brand-new room we were just added to) is
243
+ // the invite/membership flow's job
244
+ if (isSafeEventKey(chatName) && findRoomJid(chatName)) {
245
+ scheduleRoomRefresh(chatName);
246
+ }
247
+ }
248
+ return true;
249
+ } catch (error) {
250
+ ethoraLogger.log('[EthoraEvent] failed to handle event', error);
251
+ return true;
252
+ }
253
+ }
254
+
255
+ /** Drops timers and per-room state (tests, logout). */
256
+ export function resetEthoraEvents(): void {
257
+ roomTimers.forEach((t) => clearTimeout(t));
258
+ roomTimers.clear();
259
+ roomInflight.clear();
260
+ roomAgain.clear();
261
+ roomFailures.clear();
262
+ }
@@ -4,6 +4,7 @@ import {
4
4
  claimMamResult,
5
5
  collectMamMessage,
6
6
  collectMamReaction,
7
+ replayArchivedReaction,
7
8
  } from './xmpp/mamRouter';
8
9
  import { extractReaction } from '../helpers/mamReactions';
9
10
  import {
@@ -15,14 +16,19 @@ import {
15
16
  setCurrentRoom,
16
17
  setRoomRole,
17
18
  setReactions,
19
+ updateRoom,
18
20
  } from '../roomStore/roomsSlice';
19
- import { IMessage, IRoom } from '../types/types';
21
+ import { IMessage, IRoom, RoomMember } from '../types/types';
22
+ import { adjustUsersCnt, isRoomMembersTruncated } from '../helpers/roomUserCount';
23
+ import { requestSendersOf } from '../helpers/userResolver';
20
24
  import { createMessageFromXml } from '../helpers/createMessageFromXml';
21
25
  import { getDataFromXml } from '../helpers/getDataFromXml';
22
26
  import { setDeleteModal } from '../roomStore/chatSettingsSlice';
23
27
  import { messageNotificationManager } from '../utils/messageNotificationManager';
28
+ import { isOwnIncomingMessage } from '../helpers/notificationPolicy';
24
29
  import { transformCallLogMessage } from '../helpers/callLogMessage';
25
30
  import { translateKey } from '../i18n/strings';
31
+ import { isWindowQueryId } from './xmpp/mamQueryIds';
26
32
  import { loadRoomMembers } from './api-requests/rooms.api';
27
33
  import { subscribeRoomForPush } from '../services/pushSubscriptionService';
28
34
 
@@ -114,15 +120,28 @@ const onRealtimeMessage = async (stanza: Element) => {
114
120
  message,
115
121
  })
116
122
  );
123
+ // A sender missing from usersSet (a big room only carries 30 members)
124
+ // is resolved lazily; known and recently failed ids are dropped inside.
125
+ try {
126
+ requestSendersOf([message]);
127
+ } catch {
128
+ // name resolution must never break message delivery
129
+ }
117
130
 
118
- // Trigger in-app notification (manager dedupes + drops own messages
119
- // for empty bodies). Self-messages are filtered by sender check.
131
+ // Trigger in-app notification (the manager dedupes and drops empty
132
+ // bodies; the provider drops the open chat, muted chats and a
133
+ // backgrounded app). The reader's own messages never toast.
120
134
  try {
121
135
  const state = store.getState();
122
- const currentUserWallet = (state.chatSettingStore.user?.walletAddress || '').toLowerCase();
123
- const senderJIDLower = String(senderJID || '').toLowerCase();
124
- if (currentUserWallet && senderJIDLower.includes(currentUserWallet)) {
125
- return message; // own message, skip toast
136
+ if (
137
+ isOwnIncomingMessage({
138
+ message,
139
+ stanzaFrom: stanza.attrs.from,
140
+ senderJID,
141
+ user: state.chatSettingStore.user,
142
+ })
143
+ ) {
144
+ return message;
126
145
  }
127
146
  const room = state.rooms.rooms[roomJID];
128
147
  const roomName = room?.title || room?.name || '';
@@ -198,7 +217,7 @@ const onEditMessage = async (stanza: Element) => {
198
217
 
199
218
  const isMamResult = (stanza: any): boolean =>
200
219
  !!stanza?.is?.('message') &&
201
- stanza.children?.[0]?.attrs?.xmlns === 'urn:xmpp:mam:2';
220
+ stanza.getChild?.('result')?.attrs?.xmlns === 'urn:xmpp:mam:2';
202
221
 
203
222
  const parseMamResult = async (stanza: any): Promise<IMessage | undefined> => {
204
223
  {
@@ -213,16 +232,9 @@ const parseMamResult = async (stanza: any): Promise<IMessage | undefined> => {
213
232
  stanza.getChild('result')?.attrs?.id
214
233
  );
215
234
  if (reaction && !collectMamReaction(stanza, reaction)) {
216
- store.dispatch(
217
- setReactions({
218
- roomJID: reaction.roomJID,
219
- messageId: reaction.messageId,
220
- from: reaction.from,
221
- reactions: reaction.emoji,
222
- data: reaction.data,
223
- latestReactionTimestamp: reaction.ts,
224
- })
225
- );
235
+ // No page is waiting for it: replay it by hand. Flagged fromHistory
236
+ // so the room preview is not turned into an emoji.
237
+ replayArchivedReaction(reaction);
226
238
  }
227
239
  return undefined;
228
240
  }
@@ -331,6 +343,10 @@ const parseMamResult = async (stanza: any): Promise<IMessage | undefined> => {
331
343
 
332
344
  const onMessageHistory = async (stanza: any) => {
333
345
  if (!isMamResult(stanza)) {return;}
346
+ // A windowed query (a jump target's neighbourhood, a time lookup) belongs
347
+ // to the caller that asked: its rows are collected and returned there and
348
+ // must never be claimed by the router or merged into the live list.
349
+ if (isWindowQueryId(stanza.getChild('result')?.attrs?.queryid)) {return;}
334
350
  const claimed = claimMamResult(stanza);
335
351
  let message: IMessage | undefined;
336
352
  try {
@@ -398,7 +414,70 @@ const handleComposing = async (stanza: Element, currentUser: string) => {
398
414
  }
399
415
  };
400
416
 
417
+ // Server-driven membership change: when someone is added to or removed from
418
+ // a MUC the room broadcasts <message><x xmlns="muc#user"><item jid=...
419
+ // affiliation="member|none|outcast"/></x></message> to the occupants. It is
420
+ // the ONLY thing that counts as a join or leave: usersCnt is adjusted by
421
+ // +1/-1 from its CURRENT value, because a big room carries a truncated
422
+ // members[] (the real total is usersCnt) and recomputing from its length
423
+ // would collapse the count to the page size.
424
+ const MUC_USER_NS = 'http://jabber.org/protocol/muc#user';
425
+
426
+ const onRoomMembershipChange = (stanza: Element | any): void => {
427
+ if (typeof stanza?.is !== 'function' || !stanza.is('message')) {return;}
428
+ const roomJid = String(stanza.attrs?.from || '').split('/')[0];
429
+ const room = roomJid ? store.getState().rooms.rooms[roomJid] : undefined;
430
+ if (!room) {return;}
431
+
432
+ const x = (stanza.getChildren?.('x') || []).find(
433
+ (e: Element) => e?.attrs?.xmlns === MUC_USER_NS
434
+ );
435
+ if (!x || x.getChild('invite')) {return;}
436
+ const item = x.getChild('item');
437
+ const memberJid = String(item?.attrs?.jid || '');
438
+ if (!memberJid) {return;}
439
+
440
+ const xmppUsername = memberJid.split('@')[0];
441
+ const affiliation = String(item?.attrs?.affiliation || '');
442
+ const leaving = affiliation === 'none' || affiliation === 'outcast';
443
+ const members = Array.isArray(room.members) ? room.members : [];
444
+ const idx = members.findIndex((m) => m.xmppUsername === xmppUsername);
445
+
446
+ let next: RoomMember[];
447
+ if (leaving) {
448
+ if (idx < 0) {
449
+ // The leaver may exist only in the directory of a truncated room.
450
+ if (!isRoomMembersTruncated(room)) {return;}
451
+ store.dispatch(
452
+ updateRoom({
453
+ jid: roomJid,
454
+ updates: { usersCnt: adjustUsersCnt(room, -1, members.length) },
455
+ })
456
+ );
457
+ return;
458
+ }
459
+ next = members.filter((_, i) => i !== idx);
460
+ } else {
461
+ if (idx >= 0) {return;}
462
+ next = [
463
+ ...members,
464
+ { _id: '', firstName: '', lastName: '', xmppUsername, jid: memberJid },
465
+ ];
466
+ }
467
+
468
+ store.dispatch(
469
+ updateRoom({
470
+ jid: roomJid,
471
+ updates: {
472
+ members: next,
473
+ usersCnt: adjustUsersCnt(room, leaving ? -1 : 1, next.length),
474
+ },
475
+ })
476
+ );
477
+ };
478
+
401
479
  const onPresenceInRoom = (stanza: Element | any) => {
480
+ onRoomMembershipChange(stanza);
402
481
  if (
403
482
  typeof stanza.attrs.id === 'string' &&
404
483
  stanza.attrs.id.startsWith('presenceInRoom') &&
@@ -546,8 +625,55 @@ const onReactionMessage = (stanza: Element) => {
546
625
  };
547
626
  // Archived reactions are handled by parseMamResult + the MAM router.
548
627
  const onReactionHistory = (_stanza: Element) => {};
549
- const onRoomKicked = (_stanza: Element) => {};
628
+ // Presence that removes a member: unavailable + affiliation none/outcast.
629
+ // A presence is never a join (an unlisted occupant of a truncated big room
630
+ // is indistinguishable from a new member), so it only ever adjusts -1; the
631
+ // affiliation message (onRoomMembershipChange) is what counts joins.
632
+ const onRoomKicked = (stanza: Element | any) => {
633
+ try {
634
+ if (stanza?.attrs?.type !== 'unavailable') {return;}
635
+ const from = String(stanza.attrs?.from || '');
636
+ const slash = from.indexOf('/');
637
+ const roomJID = slash >= 0 ? from.slice(0, slash) : from;
638
+ const nickname = slash >= 0 ? from.slice(slash + 1) : '';
639
+ const state = store.getState();
640
+ const room = roomJID ? state.rooms.rooms[roomJID] : undefined;
641
+ if (!room || !nickname) {return;}
642
+ if (nickname === (state.chatSettingStore.user?.xmppUsername || '')) {return;}
550
643
 
644
+ const x = (stanza.getChildren?.('x') || []).find(
645
+ (e: Element) => e?.attrs?.xmlns === MUC_USER_NS
646
+ );
647
+ const item = x?.getChild?.('item');
648
+ const affiliation = String(item?.attrs?.affiliation || '');
649
+ if (!item || (affiliation !== 'none' && affiliation !== 'outcast')) {return;}
650
+
651
+ const members = Array.isArray(room.members) ? room.members : [];
652
+ const idx = members.findIndex((m) => m.xmppUsername === nickname);
653
+ if (idx < 0) {
654
+ if (!isRoomMembersTruncated(room)) {return;}
655
+ store.dispatch(
656
+ updateRoom({
657
+ jid: roomJID,
658
+ updates: { usersCnt: adjustUsersCnt(room, -1, members.length) },
659
+ })
660
+ );
661
+ return;
662
+ }
663
+ const next = members.filter((_, i) => i !== idx);
664
+ store.dispatch(
665
+ updateRoom({
666
+ jid: roomJID,
667
+ updates: {
668
+ members: next,
669
+ usersCnt: adjustUsersCnt(room, -1, next.length),
670
+ },
671
+ })
672
+ );
673
+ } catch (error) {
674
+ console.warn('onRoomKicked failed', error);
675
+ }
676
+ };
551
677
  export {
552
678
  onRealtimeMessage,
553
679
  onMessageHistory,
@@ -1,10 +1,160 @@
1
- import { Client, xml } from '@xmpp/client';
1
+ import { Client } from '@xmpp/client';
2
2
  import { store } from '../../roomStore';
3
3
  import { presenceInRoom } from './presenceInRoom.xmpp';
4
+ import { isLikelyMucJid } from '../../helpers/isLikelyMucJid';
4
5
 
5
- export async function allRoomPresences(client: Client) {
6
- const rooms = store.getState().rooms.rooms;
7
- await Promise.all(
8
- Object.keys(rooms).map((roomJid) => presenceInRoom(client, roomJid))
6
+ export interface AllRoomPresenceSummary {
7
+ total: number;
8
+ success: number;
9
+ failed: number;
10
+ failedRooms: string[];
11
+ // Every JID this sweep sent a presence for (snapshot taken at start).
12
+ sweptRooms: string[];
13
+ failures?: Array<{ roomJid: string; reason: string }>;
14
+ }
15
+
16
+ // `join` lets the owner route each room through its dedup layer
17
+ // (RoomJoinManager.ensureRoomPresence) so the sweep shares an in-flight join
18
+ // with other callers instead of sending a second <presence> for the same
19
+ // room: the server answers a duplicate join once, one waiter would time out
20
+ // and the room got a failure backoff while actually being joined.
21
+ export type RoomJoiner = (roomJid: string) => Promise<boolean>;
22
+
23
+ export interface AllRoomPresencesOptions {
24
+ /** Parallel joins. Default 5. */
25
+ concurrency?: number;
26
+ /** Pause after each join, per worker. Default 30 ms. */
27
+ pacingMs?: number;
28
+ /** Rooms the connection already joined: skipped, no round trip. */
29
+ isJoined?: (roomJid: string) => boolean;
30
+ /** The room the user has open: always joined next, ahead of the queue. */
31
+ getActiveRoomJid?: () => string | null | undefined;
32
+ /** Higher = joined earlier (recent activity). Default: store order. */
33
+ rank?: (roomJid: string) => number;
34
+ /** True once this sweep is obsolete (connection dropped and replaced). */
35
+ isCancelled?: () => boolean;
36
+ /** Fired once the first wave (the active room plus one pool-width of the
37
+ * most recent rooms) has settled, long before the rest of the sweep. */
38
+ onPriorityDone?: () => void;
39
+ /** Which store keys are joinable rooms. Default: isLikelyMucJid. */
40
+ isRoomJid?: (jid: string) => boolean;
41
+ }
42
+
43
+ // Joins every room in the store in the background. Order: the active room
44
+ // first (re-read before every pick, so a room the user opens while it is
45
+ // still queued jumps the queue), then by recent activity. Rooms discovered
46
+ // while the sweep runs are picked up before it ends.
47
+ export async function allRoomPresences(
48
+ client: Client,
49
+ join?: RoomJoiner,
50
+ options: AllRoomPresencesOptions = {}
51
+ ): Promise<AllRoomPresenceSummary> {
52
+ const concurrency = Math.max(1, Math.floor(options.concurrency || 5));
53
+ const pacingMs = options.pacingMs ?? 30;
54
+ const isJoined = options.isJoined || (() => false);
55
+ const rank = options.rank || (() => 0);
56
+ const isRoomJid = options.isRoomJid || isLikelyMucJid;
57
+
58
+ const seen = new Set<string>();
59
+ const queue: string[] = [];
60
+ const collect = () => {
61
+ const rooms = store.getState().rooms.rooms;
62
+ const keys = rooms && typeof rooms === 'object' ? Object.keys(rooms) : [];
63
+ const fresh = keys.filter(
64
+ (jid) => isRoomJid(jid) && !seen.has(jid) && !isJoined(jid)
65
+ );
66
+ fresh.forEach((jid) => seen.add(jid));
67
+ // Stable sort: equal scores keep store order.
68
+ fresh.sort((a, b) => rank(b) - rank(a));
69
+ queue.push(...fresh);
70
+ };
71
+ collect();
72
+
73
+ const sweptRooms: string[] = [];
74
+ const settledByJid = new Map<string, PromiseSettledResult<any>>();
75
+ const firstWave = Math.min(concurrency, queue.length);
76
+ let started = 0;
77
+ let waveSettled = 0;
78
+ let priorityFired = false;
79
+ const firePriority = () => {
80
+ if (priorityFired) {return;}
81
+ priorityFired = true;
82
+ options.onPriorityDone?.();
83
+ };
84
+ if (firstWave === 0) {firePriority();}
85
+
86
+ const pickNext = (): string | undefined => {
87
+ const active = options.getActiveRoomJid?.();
88
+ if (active) {
89
+ const at = queue.indexOf(active);
90
+ if (at >= 0) {return queue.splice(at, 1)[0];}
91
+ }
92
+ return queue.shift();
93
+ };
94
+
95
+ const worker = async () => {
96
+ while (!options.isCancelled?.()) {
97
+ if (queue.length === 0) {collect();}
98
+ const roomJid = pickNext();
99
+ if (!roomJid) {return;}
100
+ // Opened (and joined) by someone else while this one waited.
101
+ if (isJoined(roomJid)) {continue;}
102
+ const inFirstWave = started < firstWave;
103
+ started += 1;
104
+ sweptRooms.push(roomJid);
105
+ const result = await Promise.allSettled([
106
+ join
107
+ ? join(roomJid).then((joined) => {
108
+ if (!joined) {throw new Error(`presence_failed:${roomJid}`);}
109
+ return joined;
110
+ })
111
+ : presenceInRoom(client, roomJid, 0, 5000),
112
+ ]);
113
+ settledByJid.set(roomJid, result[0]);
114
+ if (inFirstWave) {
115
+ waveSettled += 1;
116
+ if (waveSettled >= firstWave) {firePriority();}
117
+ }
118
+ if (pacingMs > 0) {
119
+ await new Promise((resolve) => setTimeout(resolve, pacingMs));
120
+ }
121
+ }
122
+ };
123
+
124
+ await Promise.all(Array.from({ length: concurrency }, () => worker()));
125
+ firePriority();
126
+ const roomJids = sweptRooms;
127
+ const settled = roomJids.map(
128
+ (jid) =>
129
+ settledByJid.get(jid) ||
130
+ ({ status: 'rejected', reason: 'cancelled' } as PromiseRejectedResult)
9
131
  );
132
+ const failedRooms: string[] = [];
133
+ const failures: Array<{ roomJid: string; reason: string }> = [];
134
+ let success = 0;
135
+
136
+ settled.forEach((result, index) => {
137
+ if (result.status === 'fulfilled') {
138
+ success += 1;
139
+ return;
140
+ }
141
+ const roomJid = roomJids[index];
142
+ failedRooms.push(roomJid);
143
+ const reason =
144
+ result.reason instanceof Error
145
+ ? result.reason.message
146
+ : typeof result.reason === 'string'
147
+ ? result.reason
148
+ : JSON.stringify(result.reason ?? { error: 'unknown' });
149
+ failures.push({ roomJid, reason });
150
+ });
151
+
152
+ return {
153
+ total: roomJids.length,
154
+ success,
155
+ failed: failedRooms.length,
156
+ failedRooms,
157
+ sweptRooms: roomJids,
158
+ failures,
159
+ };
10
160
  }