@ethora/chat-component-rn 26.9.0 → 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 (761) hide show
  1. package/CHANGELOG.md +34 -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 +53 -4
  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 +54 -79
  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 +318 -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 +54 -5
  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 +54 -79
  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 +318 -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 +2 -0
  505. package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
  506. package/lib/typescript/helpers/audioWaveform.d.ts +54 -0
  507. package/lib/typescript/helpers/audioWaveform.d.ts.map +1 -0
  508. package/lib/typescript/helpers/backgroundJoinSweep.d.ts +14 -0
  509. package/lib/typescript/helpers/backgroundJoinSweep.d.ts.map +1 -0
  510. package/lib/typescript/helpers/bubbleHighlight.d.ts +17 -0
  511. package/lib/typescript/helpers/bubbleHighlight.d.ts.map +1 -0
  512. package/lib/typescript/helpers/checkUniqueUsers.d.ts +2 -2
  513. package/lib/typescript/helpers/checkUniqueUsers.d.ts.map +1 -1
  514. package/lib/typescript/helpers/constants/MODAL_COMPONENTS.d.ts.map +1 -1
  515. package/lib/typescript/helpers/constants/MODAL_TYPES.d.ts +2 -0
  516. package/lib/typescript/helpers/constants/MODAL_TYPES.d.ts.map +1 -1
  517. package/lib/typescript/helpers/createRoomFromApi.d.ts +25 -0
  518. package/lib/typescript/helpers/createRoomFromApi.d.ts.map +1 -1
  519. package/lib/typescript/helpers/dedupeMembers.d.ts +11 -0
  520. package/lib/typescript/helpers/dedupeMembers.d.ts.map +1 -0
  521. package/lib/typescript/helpers/ethoraLogger.d.ts +13 -0
  522. package/lib/typescript/helpers/ethoraLogger.d.ts.map +1 -0
  523. package/lib/typescript/helpers/getUnnamedUsers.d.ts.map +1 -1
  524. package/lib/typescript/helpers/historyPreloadConfig.d.ts +26 -0
  525. package/lib/typescript/helpers/historyPreloadConfig.d.ts.map +1 -0
  526. package/lib/typescript/helpers/historyPreloadScheduler.d.ts +8 -4
  527. package/lib/typescript/helpers/historyPreloadScheduler.d.ts.map +1 -1
  528. package/lib/typescript/helpers/initRoomsPresence.d.ts +7 -0
  529. package/lib/typescript/helpers/initRoomsPresence.d.ts.map +1 -1
  530. package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts.map +1 -1
  531. package/lib/typescript/helpers/isLikelyMucJid.d.ts +19 -0
  532. package/lib/typescript/helpers/isLikelyMucJid.d.ts.map +1 -0
  533. package/lib/typescript/helpers/isMessageSearchEnabled.d.ts +12 -0
  534. package/lib/typescript/helpers/isMessageSearchEnabled.d.ts.map +1 -0
  535. package/lib/typescript/helpers/joiningRoom.d.ts +7 -0
  536. package/lib/typescript/helpers/joiningRoom.d.ts.map +1 -0
  537. package/lib/typescript/helpers/jumpThread.d.ts +48 -0
  538. package/lib/typescript/helpers/jumpThread.d.ts.map +1 -0
  539. package/lib/typescript/helpers/jumpToMessage.d.ts +26 -0
  540. package/lib/typescript/helpers/jumpToMessage.d.ts.map +1 -0
  541. package/lib/typescript/helpers/jumpWindow.d.ts +74 -0
  542. package/lib/typescript/helpers/jumpWindow.d.ts.map +1 -0
  543. package/lib/typescript/helpers/loadRoomHistory.d.ts +34 -0
  544. package/lib/typescript/helpers/loadRoomHistory.d.ts.map +1 -0
  545. package/lib/typescript/helpers/notificationPolicy.d.ts +42 -0
  546. package/lib/typescript/helpers/notificationPolicy.d.ts.map +1 -0
  547. package/lib/typescript/helpers/openRoomAtMessage.d.ts +17 -0
  548. package/lib/typescript/helpers/openRoomAtMessage.d.ts.map +1 -0
  549. package/lib/typescript/helpers/openThreadForJump.d.ts +27 -0
  550. package/lib/typescript/helpers/openThreadForJump.d.ts.map +1 -0
  551. package/lib/typescript/helpers/parseMessageReference.d.ts +18 -5
  552. package/lib/typescript/helpers/parseMessageReference.d.ts.map +1 -1
  553. package/lib/typescript/helpers/publicChatsEntry.d.ts +11 -0
  554. package/lib/typescript/helpers/publicChatsEntry.d.ts.map +1 -0
  555. package/lib/typescript/helpers/roomActivityScore.d.ts +5 -0
  556. package/lib/typescript/helpers/roomActivityScore.d.ts.map +1 -0
  557. package/lib/typescript/helpers/roomUserCount.d.ts +20 -0
  558. package/lib/typescript/helpers/roomUserCount.d.ts.map +1 -0
  559. package/lib/typescript/helpers/runConfiguredHistoryPreload.d.ts +21 -0
  560. package/lib/typescript/helpers/runConfiguredHistoryPreload.d.ts.map +1 -0
  561. package/lib/typescript/helpers/sessionAppId.d.ts +8 -0
  562. package/lib/typescript/helpers/sessionAppId.d.ts.map +1 -0
  563. package/lib/typescript/helpers/timestamp.d.ts +3 -0
  564. package/lib/typescript/helpers/timestamp.d.ts.map +1 -0
  565. package/lib/typescript/helpers/userResolver.d.ts +58 -0
  566. package/lib/typescript/helpers/userResolver.d.ts.map +1 -0
  567. package/lib/typescript/helpers/xmppIdShape.d.ts +10 -0
  568. package/lib/typescript/helpers/xmppIdShape.d.ts.map +1 -0
  569. package/lib/typescript/hooks/useChatWrapperInit.d.ts +2 -0
  570. package/lib/typescript/hooks/useChatWrapperInit.d.ts.map +1 -1
  571. package/lib/typescript/hooks/useHeapSender.d.ts.map +1 -1
  572. package/lib/typescript/hooks/useJumpToMessage.d.ts +116 -0
  573. package/lib/typescript/hooks/useJumpToMessage.d.ts.map +1 -0
  574. package/lib/typescript/hooks/useMessageLoaderQueue.d.ts.map +1 -1
  575. package/lib/typescript/hooks/useMessageQueue.d.ts.map +1 -1
  576. package/lib/typescript/hooks/useRoomDirectory.d.ts +12 -0
  577. package/lib/typescript/hooks/useRoomDirectory.d.ts.map +1 -0
  578. package/lib/typescript/hooks/useRoomInitialization.d.ts.map +1 -1
  579. package/lib/typescript/hooks/useRoomMute.d.ts +8 -0
  580. package/lib/typescript/hooks/useRoomMute.d.ts.map +1 -0
  581. package/lib/typescript/hooks/useRoomState.d.ts +1 -0
  582. package/lib/typescript/hooks/useRoomState.d.ts.map +1 -1
  583. package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
  584. package/lib/typescript/i18n/strings.d.ts.map +1 -1
  585. package/lib/typescript/networking/api-requests/messageSearch.api.d.ts +57 -0
  586. package/lib/typescript/networking/api-requests/messageSearch.api.d.ts.map +1 -0
  587. package/lib/typescript/networking/api-requests/publicChats.api.d.ts +24 -0
  588. package/lib/typescript/networking/api-requests/publicChats.api.d.ts.map +1 -0
  589. package/lib/typescript/networking/api-requests/roomMembers.api.d.ts +19 -1
  590. package/lib/typescript/networking/api-requests/roomMembers.api.d.ts.map +1 -1
  591. package/lib/typescript/networking/api-requests/rooms.api.d.ts.map +1 -1
  592. package/lib/typescript/networking/api-requests/xmppToken.api.d.ts +2 -0
  593. package/lib/typescript/networking/api-requests/xmppToken.api.d.ts.map +1 -0
  594. package/lib/typescript/networking/ethoraEvents.d.ts +45 -0
  595. package/lib/typescript/networking/ethoraEvents.d.ts.map +1 -0
  596. package/lib/typescript/networking/stanzaHandlers.d.ts +1 -1
  597. package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
  598. package/lib/typescript/networking/xmpp/allRoomPresences.xmpp.d.ts +32 -1
  599. package/lib/typescript/networking/xmpp/allRoomPresences.xmpp.d.ts.map +1 -1
  600. package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts +64 -0
  601. package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts.map +1 -1
  602. package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts.map +1 -1
  603. package/lib/typescript/networking/xmpp/historyCursor.d.ts +35 -0
  604. package/lib/typescript/networking/xmpp/historyCursor.d.ts.map +1 -0
  605. package/lib/typescript/networking/xmpp/mamQueryIds.d.ts +10 -0
  606. package/lib/typescript/networking/xmpp/mamQueryIds.d.ts.map +1 -0
  607. package/lib/typescript/networking/xmpp/mamRouter.d.ts +7 -0
  608. package/lib/typescript/networking/xmpp/mamRouter.d.ts.map +1 -1
  609. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts +13 -2
  610. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts.map +1 -1
  611. package/lib/typescript/networking/xmpp/roomJoinSweep.d.ts +82 -0
  612. package/lib/typescript/networking/xmpp/roomJoinSweep.d.ts.map +1 -0
  613. package/lib/typescript/networking/xmpp/sendMediaMessage.xmpp.d.ts.map +1 -1
  614. package/lib/typescript/networking/xmpp/sendTextMessage.xmpp.d.ts.map +1 -1
  615. package/lib/typescript/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.d.ts.map +1 -1
  616. package/lib/typescript/networking/xmppClient.d.ts +90 -4
  617. package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
  618. package/lib/typescript/networking/xmppCredentials.d.ts +12 -0
  619. package/lib/typescript/networking/xmppCredentials.d.ts.map +1 -0
  620. package/lib/typescript/roomStore/Middleware/jumpThreadMiddleware.d.ts +3 -0
  621. package/lib/typescript/roomStore/Middleware/jumpThreadMiddleware.d.ts.map +1 -0
  622. package/lib/typescript/roomStore/Middleware/reactionsMiddleware.d.ts.map +1 -1
  623. package/lib/typescript/roomStore/Middleware/unreadMidlleware.d.ts.map +1 -1
  624. package/lib/typescript/roomStore/chatSettingsSlice.d.ts +8 -1
  625. package/lib/typescript/roomStore/chatSettingsSlice.d.ts.map +1 -1
  626. package/lib/typescript/roomStore/index.d.ts +2 -1
  627. package/lib/typescript/roomStore/index.d.ts.map +1 -1
  628. package/lib/typescript/roomStore/persistence.d.ts +8 -0
  629. package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
  630. package/lib/typescript/roomStore/roomsSlice.d.ts +138 -2
  631. package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
  632. package/lib/typescript/roomStore/safeKey.d.ts +13 -0
  633. package/lib/typescript/roomStore/safeKey.d.ts.map +1 -0
  634. package/lib/typescript/roomStore/usersSetCap.d.ts +16 -0
  635. package/lib/typescript/roomStore/usersSetCap.d.ts.map +1 -0
  636. package/lib/typescript/types/models/media.model.d.ts +2 -0
  637. package/lib/typescript/types/models/media.model.d.ts.map +1 -1
  638. package/lib/typescript/types/models/room.model.d.ts +18 -5
  639. package/lib/typescript/types/models/room.model.d.ts.map +1 -1
  640. package/lib/typescript/types/models/xmpp.model.d.ts +8 -1
  641. package/lib/typescript/types/models/xmpp.model.d.ts.map +1 -1
  642. package/lib/typescript/types/types.d.ts +90 -5
  643. package/lib/typescript/types/types.d.ts.map +1 -1
  644. package/lib/typescript/version.d.ts +1 -1
  645. package/lib/typescript/version.d.ts.map +1 -1
  646. package/package.json +1 -1
  647. package/src/assets/icons.tsx +13 -0
  648. package/src/components/Header/HeaderRoomList.tsx +21 -4
  649. package/src/components/InputComponents/Search.tsx +33 -0
  650. package/src/components/MainComponents/ArchivedMessageCard.tsx +139 -0
  651. package/src/components/MainComponents/ChatHeader.tsx +19 -3
  652. package/src/components/MainComponents/ChatRoom.tsx +60 -23
  653. package/src/components/MainComponents/ChatWrapper.tsx +50 -9
  654. package/src/components/MainComponents/MediaMessage.tsx +17 -0
  655. package/src/components/MainComponents/MessageList.tsx +823 -84
  656. package/src/components/MainComponents/MessageSearchButton.tsx +48 -0
  657. package/src/components/MainComponents/ReduxWrapper.tsx +16 -5
  658. package/src/components/MainComponents/RoomList.tsx +125 -0
  659. package/src/components/Menu/HeaderRoomListMenu.tsx +26 -2
  660. package/src/components/MessageBubble/BubbleHighlight.tsx +106 -0
  661. package/src/components/MessageBubble/Message.tsx +265 -177
  662. package/src/components/MessageBubble/MessageInteractions.tsx +109 -86
  663. package/src/components/MessageBubble/messageMenuLayout.ts +59 -0
  664. package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +92 -21
  665. package/src/components/Modals/MessageSearchModal/MessageHitResults.tsx +271 -0
  666. package/src/components/Modals/MessageSearchModal/MessageSearchModal.tsx +487 -0
  667. package/src/components/Modals/MessageSearchModal/openHit.ts +50 -0
  668. package/src/components/Modals/MessageSearchModal/resolveSender.ts +57 -0
  669. package/src/components/Modals/MessageSearchModal/searchFilters.ts +109 -0
  670. package/src/components/Modals/MessageSearchModal/snippet.ts +58 -0
  671. package/src/components/Modals/MessageSearchModal/useMessageSearch.ts +151 -0
  672. package/src/components/Modals/PublicChatsModal/PublicChatsModal.tsx +288 -0
  673. package/src/components/Modals/PublicChatsModal/publicChatsLogic.ts +36 -0
  674. package/src/components/Modals/SelectUsersModal/SelectUsersModal.tsx +8 -1
  675. package/src/components/RoomComponents/ChatRoomItem.tsx +16 -3
  676. package/src/components/RoomComponents/SwipeableRoomRow.tsx +39 -6
  677. package/src/components/Thread/ThreadHeader.tsx +3 -1
  678. package/src/components/Thread/ThreadWrapper.tsx +96 -10
  679. package/src/components/styled/AudioDecoderHost.tsx +351 -0
  680. package/src/components/styled/AudioMessage.tsx +482 -425
  681. package/src/components/styled/SendInput.tsx +42 -4
  682. package/src/context/MessageNotificationContext.tsx +19 -5
  683. package/src/context/xmppProvider.tsx +56 -91
  684. package/src/helpers/audioWaveform.ts +142 -0
  685. package/src/helpers/backgroundJoinSweep.ts +35 -0
  686. package/src/helpers/bubbleHighlight.ts +47 -0
  687. package/src/helpers/checkUniqueUsers.tsx +15 -17
  688. package/src/helpers/constants/MODAL_COMPONENTS.tsx +4 -0
  689. package/src/helpers/constants/MODAL_TYPES.ts +3 -0
  690. package/src/helpers/createRoomFromApi.tsx +45 -4
  691. package/src/helpers/dedupeMembers.ts +29 -0
  692. package/src/helpers/ethoraLogger.ts +50 -0
  693. package/src/helpers/getUnnamedUsers.ts +7 -4
  694. package/src/helpers/historyPreloadConfig.ts +68 -0
  695. package/src/helpers/historyPreloadScheduler.ts +437 -199
  696. package/src/helpers/initRoomsPresence.ts +20 -7
  697. package/src/helpers/insertMessageWithDelimiter.ts +3 -0
  698. package/src/helpers/isLikelyMucJid.ts +72 -0
  699. package/src/helpers/isMessageSearchEnabled.ts +18 -0
  700. package/src/helpers/joiningRoom.ts +13 -0
  701. package/src/helpers/jumpThread.ts +102 -0
  702. package/src/helpers/jumpToMessage.ts +57 -0
  703. package/src/helpers/jumpWindow.ts +212 -0
  704. package/src/helpers/loadRoomHistory.ts +83 -0
  705. package/src/helpers/notificationPolicy.ts +82 -0
  706. package/src/helpers/openRoomAtMessage.ts +38 -0
  707. package/src/helpers/openThreadForJump.ts +96 -0
  708. package/src/helpers/parseMessageReference.ts +37 -8
  709. package/src/helpers/publicChatsEntry.ts +15 -0
  710. package/src/helpers/roomActivityScore.ts +45 -0
  711. package/src/helpers/roomUserCount.ts +44 -0
  712. package/src/helpers/runConfiguredHistoryPreload.ts +76 -0
  713. package/src/helpers/sessionAppId.ts +17 -0
  714. package/src/helpers/timestamp.ts +44 -0
  715. package/src/helpers/userResolver.ts +542 -0
  716. package/src/helpers/xmppIdShape.ts +46 -0
  717. package/src/hooks/useChatWrapperInit.ts +22 -4
  718. package/src/hooks/useHeapSender.tsx +54 -3
  719. package/src/hooks/useJumpToMessage.ts +538 -0
  720. package/src/hooks/useMessageLoaderQueue.tsx +40 -4
  721. package/src/hooks/useMessageQueue.ts +9 -5
  722. package/src/hooks/useRoomDirectory.ts +39 -0
  723. package/src/hooks/useRoomInitialization.tsx +33 -7
  724. package/src/hooks/useRoomMute.ts +42 -0
  725. package/src/hooks/useRoomState.tsx +6 -0
  726. package/src/hooks/useSendMessage.tsx +14 -2
  727. package/src/i18n/strings.ts +312 -0
  728. package/src/networking/api-requests/messageSearch.api.ts +130 -0
  729. package/src/networking/api-requests/publicChats.api.ts +71 -0
  730. package/src/networking/api-requests/roomMembers.api.ts +263 -11
  731. package/src/networking/api-requests/rooms.api.ts +52 -12
  732. package/src/networking/api-requests/xmppToken.api.ts +62 -0
  733. package/src/networking/ethoraEvents.ts +262 -0
  734. package/src/networking/stanzaHandlers.ts +145 -19
  735. package/src/networking/xmpp/allRoomPresences.xmpp.ts +155 -5
  736. package/src/networking/xmpp/getHistory.xmpp.ts +433 -47
  737. package/src/networking/xmpp/handleStanzas.xmpp.ts +8 -0
  738. package/src/networking/xmpp/historyCursor.ts +124 -0
  739. package/src/networking/xmpp/mamQueryIds.ts +11 -0
  740. package/src/networking/xmpp/mamRouter.ts +24 -10
  741. package/src/networking/xmpp/presenceInRoom.xmpp.ts +91 -68
  742. package/src/networking/xmpp/roomJoinSweep.ts +412 -0
  743. package/src/networking/xmpp/sendMediaMessage.xmpp.ts +0 -1
  744. package/src/networking/xmpp/sendTextMessage.xmpp.ts +0 -1
  745. package/src/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.ts +0 -1
  746. package/src/networking/xmppClient.ts +323 -47
  747. package/src/networking/xmppCredentials.ts +87 -0
  748. package/src/roomStore/Middleware/jumpThreadMiddleware.ts +163 -0
  749. package/src/roomStore/Middleware/reactionsMiddleware.tsx +4 -0
  750. package/src/roomStore/Middleware/unreadMidlleware.tsx +59 -11
  751. package/src/roomStore/chatSettingsSlice.ts +11 -0
  752. package/src/roomStore/index.ts +10 -3
  753. package/src/roomStore/persistence.ts +54 -0
  754. package/src/roomStore/roomsSlice.ts +547 -65
  755. package/src/roomStore/safeKey.ts +49 -0
  756. package/src/roomStore/usersSetCap.ts +37 -0
  757. package/src/types/models/media.model.ts +4 -0
  758. package/src/types/models/room.model.ts +18 -5
  759. package/src/types/models/xmpp.model.ts +15 -1
  760. package/src/types/types.ts +95 -5
  761. package/src/version.ts +1 -1
@@ -14,6 +14,29 @@ interface PendingQuery {
14
14
  reject: (error: Error) => void;
15
15
  }
16
16
 
17
+ /**
18
+ * Replay an archived reaction into the store. Flagged `fromHistory` so
19
+ * reactionsMiddleware leaves the room preview alone: a replay must not turn
20
+ * the last real message into an emoji. (setReactions has no prepare(), so
21
+ * the flag is added by hand.)
22
+ */
23
+ export const replayArchivedReaction = (
24
+ reaction: ExtractedReaction,
25
+ fallbackRoomJID = ''
26
+ ) => {
27
+ store.dispatch({
28
+ ...setReactions({
29
+ roomJID: reaction.roomJID || fallbackRoomJID,
30
+ messageId: reaction.messageId,
31
+ from: reaction.from,
32
+ reactions: reaction.emoji,
33
+ data: reaction.data,
34
+ latestReactionTimestamp: reaction.ts,
35
+ }),
36
+ meta: { fromHistory: true },
37
+ });
38
+ };
39
+
17
40
  const pending = new Map<string, PendingQuery>();
18
41
 
19
42
  const flush = (query: PendingQuery) => {
@@ -39,16 +62,7 @@ const flush = (query: PendingQuery) => {
39
62
  }
40
63
  for (const reaction of deferred) {
41
64
  try {
42
- store.dispatch(
43
- setReactions({
44
- roomJID: reaction.roomJID || query.roomJID,
45
- messageId: reaction.messageId,
46
- from: reaction.from,
47
- reactions: reaction.emoji,
48
- data: reaction.data,
49
- latestReactionTimestamp: reaction.ts,
50
- })
51
- );
65
+ replayArchivedReaction(reaction, query.roomJID);
52
66
  } catch (e) {
53
67
  console.warn('[mam] applying a reaction failed', e);
54
68
  }
@@ -1,67 +1,66 @@
1
1
  import { Client, xml } from '@xmpp/client';
2
- import { createTimeoutPromise } from './createTimeoutPromise.xmpp';
3
2
  import { Element } from '@xmpp/xml';
4
3
 
4
+ // A bare `local@domain.tld`. The conference prefix is NOT required here (a
5
+ // host may run its MUC service on a custom domain, xmppSettings.conference);
6
+ // callers that fan out over the room list filter with isLikelyMucJid first.
7
+ const isValidRoomJid = (jid: unknown): jid is string => {
8
+ if (typeof jid !== 'string') {return false;}
9
+ const at = jid.indexOf('@');
10
+ if (at <= 0) {return false;}
11
+ const domain = jid.slice(at + 1).split('/')[0];
12
+ return !!domain;
13
+ };
14
+
5
15
  let presenceIdCounter = 0;
6
16
  const nextPresenceId = () =>
7
17
  `presenceInRoom-${Date.now().toString(36)}-${(++presenceIdCounter).toString(36)}`;
8
18
 
9
- const joinedByClient = new WeakMap<Client, Map<string, Promise<Element>>>();
10
-
11
- const joinedRooms = (client: Client): Map<string, Promise<Element>> => {
12
- let map = joinedByClient.get(client);
13
- if (!map) {
14
- map = new Map();
15
- joinedByClient.set(client, map);
16
- const forget = () => joinedByClient.get(client)?.clear();
17
- client.on('disconnect', forget);
18
- client.on('offline', forget);
19
- }
20
- return map;
21
- };
22
-
23
- export const __forgetJoinedRooms = (client: Client) =>
24
- joinedByClient.get(client)?.clear();
25
-
26
- export const presenceInRoom = (
27
- client: Client,
28
- roomJID: string,
29
- delay = 0
30
- ): Promise<Element> => {
31
- const joined = joinedRooms(client);
32
- const existing = joined.get(roomJID);
33
- if (existing) {return existing;}
34
- const join = joinRoom(client, roomJID, delay);
35
- joined.set(roomJID, join);
36
- // A failed join is not a join: let the next caller try again.
37
- join.catch(() => {
38
- if (joined.get(roomJID) === join) {joined.delete(roomJID);}
39
- });
40
- return join;
41
- };
42
-
43
- const joinRoom = async (
19
+ /**
20
+ * Sends the MUC join presence for `roomJID` and resolves with the room's
21
+ * answer. Rejects with `presence_error:<code>:<jid>` on an error presence,
22
+ * `presence_timeout:<jid>` when nothing answers within `timeoutMs`, and
23
+ * `presence_send_failed:<jid>:...` when the stanza could not be written.
24
+ *
25
+ * `delay` is an optional extra wait after the answer. It used to be a fixed
26
+ * 2 s: the join answer arrives BEFORE the server's replay of the room history
27
+ * (default up to 20 stanzas), and callers waited for that replay to settle.
28
+ * The join now asks for `historyStanzas` (default 0) so nothing is replayed
29
+ * (history comes from MAM), and the default settle delay is 0.
30
+ */
31
+ export const presenceInRoom = async (
44
32
  client: Client,
45
33
  roomJID: string,
46
- delay: number
34
+ delay = 0,
35
+ timeoutMs = 2000,
36
+ // How many of the room's recent messages the MUC service replays on join
37
+ // (XEP-0045 <history maxstanzas/>). Default 0: history comes from MAM only.
38
+ // Without the element the server replays its default (ejabberd: up to 20
39
+ // stanzas) for EVERY room joined: N rooms * 20 messages of wire traffic
40
+ // that MAM then fetches again.
41
+ historyStanzas = 0
47
42
  ): Promise<Element> => {
43
+ if (!isValidRoomJid(roomJID)) {
44
+ return Promise.reject(
45
+ new Error(`presence_invalid_jid:${String(roomJID)}`)
46
+ );
47
+ }
48
48
  let stanzaHandler: (stanza: Element) => void;
49
- const unsubscribe = () => client.off('stanza', stanzaHandler);
49
+
50
+ const unsubscribe = () => client?.off?.('stanza', stanzaHandler);
50
51
  const stanzaId = nextPresenceId();
51
52
 
52
- // Avoid `new Promise(async (resolve, reject) => …)` — the async
53
- // executor's own thrown errors / unhandled rejections inside it can
54
- // escape the constructed promise depending on the order of catch
55
- // attachment vs rejection. Use a regular Promise + a separate async
56
- // wrapper that funnels every failure path through reject().
57
53
  return new Promise<Element>((resolve, reject) => {
58
54
  let settled = false;
55
+ // Cleared as soon as the promise settles by any other path, so the
56
+ // timeout timer doesn't linger after we already know the outcome.
57
+ let cancelTimeout: (() => void) | null = null;
59
58
 
60
59
  const finish = (cb: (value?: any) => void, value?: any) => {
61
60
  if (settled) {return;}
62
61
  settled = true;
63
-
64
- if (delay <= 0) {
62
+ cancelTimeout?.();
63
+ if (!(delay > 0)) {
65
64
  unsubscribe();
66
65
  cb(value);
67
66
  return;
@@ -78,6 +77,26 @@ const joinRoom = async (
78
77
  stanza.attrs.id === stanzaId &&
79
78
  stanza.attrs.from?.startsWith(roomJID)
80
79
  ) {
80
+ if (stanza.attrs.type === 'error') {
81
+ const errEl = stanza.getChild('error');
82
+ const code =
83
+ (errEl &&
84
+ (errEl.getChild('forbidden')
85
+ ? 'forbidden'
86
+ : errEl.getChild('remote-server-not-found')
87
+ ? 'remote-server-not-found'
88
+ : errEl.getChild('not-allowed')
89
+ ? 'not-allowed'
90
+ : errEl.getChild('item-not-found')
91
+ ? 'item-not-found'
92
+ : errEl.attrs?.type || 'unknown')) ||
93
+ 'unknown';
94
+ settled = true;
95
+ cancelTimeout?.();
96
+ unsubscribe();
97
+ reject(new Error(`presence_error:${code}:${roomJID}`));
98
+ return;
99
+ }
81
100
  finish(resolve, stanza);
82
101
  }
83
102
  };
@@ -94,32 +113,36 @@ const joinRoom = async (
94
113
  xml(
95
114
  'x',
96
115
  { xmlns: 'http://jabber.org/protocol/muc' },
97
- xml('history', { maxstanzas: '0' })
116
+ xml('history', {
117
+ maxstanzas: String(
118
+ Number.isFinite(historyStanzas) && historyStanzas > 0
119
+ ? Math.floor(historyStanzas)
120
+ : 0
121
+ ),
122
+ })
98
123
  )
99
124
  );
100
125
 
101
- // Side-effects sequence: send the presence (handles its own
102
- // failure → reject), then wait the timeout (also handles its own
103
- // failure → reject). Each chain attaches its rejection handler
104
- // synchronously, so no race with the outer Promise's catch.
105
- (async () => {
106
- try {
107
- await client.send(presence);
108
- } catch (err) {
126
+ Promise.resolve(client.send(presence))
127
+ .then(() => {
128
+ // The answer may already have arrived while send() was settling.
129
+ if (settled) {return;}
130
+ const timer = setTimeout(() => {
131
+ if (settled) {return;}
132
+ settled = true;
133
+ unsubscribe();
134
+ reject(new Error(`presence_timeout:${roomJID}`));
135
+ }, timeoutMs);
136
+ cancelTimeout = () => clearTimeout(timer);
137
+ })
138
+ .catch((err) => {
109
139
  unsubscribe();
110
- reject(err);
111
- return;
112
- }
113
- try {
114
- await createTimeoutPromise(2000, unsubscribe);
115
- } catch (err) {
116
- // The room's reply schedules resolve() `delay` ms later (2000 by
117
- // default) — the same length as this timeout, so the timeout used
118
- // to win the race and reject a join that had actually succeeded
119
- // (allRoomPresences "failed" with undefined on every bootstrap).
120
- // Only a join that never got an answer is a failure.
121
- if (!settled) {reject(err);}
122
- }
123
- })();
140
+ settled = true;
141
+ reject(
142
+ new Error(
143
+ `presence_send_failed:${roomJID}:${err instanceof Error ? err.message : String(err)}`
144
+ )
145
+ );
146
+ });
124
147
  });
125
148
  };
@@ -0,0 +1,412 @@
1
+ import type { Client } from '@xmpp/client';
2
+ import { store } from '../../roomStore';
3
+ import { presenceInRoom } from './presenceInRoom.xmpp';
4
+ import {
5
+ allRoomPresences,
6
+ AllRoomPresenceSummary,
7
+ } from './allRoomPresences.xmpp';
8
+ import { isLikelyMucJid } from '../../helpers/isLikelyMucJid';
9
+ import { getRoomLastActivityScore } from '../../helpers/roomActivityScore';
10
+ import type { HistoryQoSConfig } from '../../types/types';
11
+
12
+ /**
13
+ * The slice of XmppClient the join manager needs. Keeping it an interface
14
+ * keeps this file free of an import cycle with xmppClient.ts.
15
+ */
16
+ export interface RoomJoinHost {
17
+ /** The underlying @xmpp/client (changes on every reconnect). */
18
+ getClient: () => Client | undefined;
19
+ /** Bumped on every disconnect / reconnect / close. */
20
+ getConnectionEpoch: () => number;
21
+ /** True while the stream is online (join then needs no wait). */
22
+ isOnline?: () => boolean;
23
+ /** Resolves when the stream is online, rejects on timeout. */
24
+ waitForOnline: (timeoutMs?: number) => Promise<void>;
25
+ /** MUC conference domain of this server (custom domains allowed). */
26
+ getConference?: () => string;
27
+ getHistoryQoS: () => HistoryQoSConfig | undefined;
28
+ }
29
+
30
+ export interface EnsureRoomPresenceOptions {
31
+ /** Extra wait after the room answered. Default 0. */
32
+ settleDelay?: number;
33
+ /** How long this caller waits for the join. Default 2000. */
34
+ timeoutMs?: number;
35
+ /** false: fire the join and return true at once. Default true. */
36
+ waitForJoin?: boolean;
37
+ source?: 'active_room' | 'send' | 'background' | 'other';
38
+ }
39
+
40
+ const DAY_MS = 24 * 60 * 60 * 1000;
41
+ export const SWEEP_RETRY_DELAYS_MS = [2000, 5000, 10000];
42
+ const DEFAULT_JOIN_CONCURRENCY = 5;
43
+ const DEFAULT_FAILURE_BACKOFF_MS = 10000;
44
+
45
+ const formatError = (error: unknown): string =>
46
+ error instanceof Error ? error.message : String(error);
47
+
48
+ const emptySummary = (): AllRoomPresenceSummary => ({
49
+ total: 0,
50
+ success: 0,
51
+ failed: 0,
52
+ failedRooms: [],
53
+ sweptRooms: [],
54
+ failures: [],
55
+ });
56
+
57
+ /**
58
+ * Per-connection MUC join state and the background join sweep.
59
+ *
60
+ * Why it exists: the RN client used to join every room with a Promise.all
61
+ * and only then call the session ready, so the room list waited for the
62
+ * slowest of N joins and a join in flight when the socket dropped could
63
+ * poison the next connection. Here joins go through one dedup layer
64
+ * (ensureRoomPresence), the sweep is a bounded pool that runs in the
65
+ * background (active room first, then by recent activity), and every join
66
+ * remembers the connection epoch it started on: when the socket was
67
+ * replaced meanwhile its outcome is discarded (no joined mark, no backoff).
68
+ *
69
+ * `presencesReady` means the whole sweep finished, `priorityPresencesReady`
70
+ * that its first wave (active room + one pool width) settled.
71
+ */
72
+ export class RoomJoinManager {
73
+ presencesReady = false;
74
+ priorityPresencesReady = false;
75
+ joinedRooms: Set<string> = new Set();
76
+ roomPresenceInFlight: Map<string, Promise<boolean>> = new Map();
77
+ roomPresenceBlockedUntil: Map<string, number> = new Map();
78
+ sweepRetryTimer: ReturnType<typeof setTimeout> | null = null;
79
+ private sweepRetryRunning = false;
80
+ private sendAllPresencesInFlight: Promise<void> | null = null;
81
+
82
+ constructor(private readonly host: RoomJoinHost) {}
83
+
84
+ // ---- config -------------------------------------------------------
85
+ private qos(): HistoryQoSConfig {
86
+ const own = this.host.getHistoryQoS() || {};
87
+ let fromConfig: HistoryQoSConfig = {};
88
+ try {
89
+ fromConfig =
90
+ (store.getState() as any)?.chatSettingStore?.config?.historyQoS || {};
91
+ } catch {
92
+ fromConfig = {};
93
+ }
94
+ return { ...fromConfig, ...own };
95
+ }
96
+
97
+ get joinConcurrency(): number {
98
+ return Math.max(
99
+ 1,
100
+ Math.floor(Number(this.qos().joinConcurrency) || DEFAULT_JOIN_CONCURRENCY)
101
+ );
102
+ }
103
+
104
+ get joinHistoryStanzas(): number {
105
+ return Math.max(0, Math.floor(Number(this.qos().joinHistoryStanzas) || 0));
106
+ }
107
+
108
+ private get failureBackoffMs(): number {
109
+ return Math.max(
110
+ 0,
111
+ Number(this.qos().presenceFailureBackoffMs || DEFAULT_FAILURE_BACKOFF_MS)
112
+ );
113
+ }
114
+
115
+ private get epoch(): number {
116
+ return this.host.getConnectionEpoch();
117
+ }
118
+
119
+ // A room the sweep may fan out over: a conference-domain JID (or the
120
+ // server's own, possibly custom, conference domain).
121
+ private isValidRoomJid(jid: unknown): jid is string {
122
+ if (isLikelyMucJid(jid)) {return true;}
123
+ if (typeof jid !== 'string') {return false;}
124
+ const conference = this.host.getConference?.();
125
+ const at = jid.indexOf('@');
126
+ return (
127
+ !!conference && at > 0 && jid.slice(at + 1).split('/')[0] === conference
128
+ );
129
+ }
130
+
131
+ // An explicit join of one room (a send, an open room, an invite) only
132
+ // needs a well-formed `local@domain`: the caller named the room.
133
+ private isJoinableJid(jid: unknown): jid is string {
134
+ if (typeof jid !== 'string') {return false;}
135
+ const at = jid.indexOf('@');
136
+ return at > 0 && at < jid.length - 1;
137
+ }
138
+
139
+ // ---- lifecycle ----------------------------------------------------
140
+ /** Called on every disconnect / reconnect / close: nothing carries over. */
141
+ reset() {
142
+ this.presencesReady = false;
143
+ this.priorityPresencesReady = false;
144
+ this.clearSweepRetry();
145
+ this.sendAllPresencesInFlight = null;
146
+ this.joinedRooms.clear();
147
+ this.roomPresenceInFlight.clear();
148
+ this.roomPresenceBlockedUntil.clear();
149
+ }
150
+
151
+ isJoined(roomJid: string): boolean {
152
+ return this.joinedRooms.has(roomJid);
153
+ }
154
+
155
+ // ---- one room -----------------------------------------------------
156
+ ensureRoomPresence = async (
157
+ roomJID: string,
158
+ options?: EnsureRoomPresenceOptions
159
+ ): Promise<boolean> => {
160
+ if (!roomJID) {return true;}
161
+ const source = options?.source || 'other';
162
+ if (!this.isJoinableJid(roomJID)) {
163
+ console.warn(
164
+ `[XMPP] room_presence_skipped_invalid_jid jid=${String(roomJID)} source=${source}`
165
+ );
166
+ // Block for a long time so repeated callers don't keep retrying.
167
+ this.roomPresenceBlockedUntil.set(roomJID, Date.now() + DAY_MS);
168
+ return false;
169
+ }
170
+ if (this.joinedRooms.has(roomJID)) {return true;}
171
+ const blockedUntil = this.roomPresenceBlockedUntil.get(roomJID) || 0;
172
+ if (Date.now() < blockedUntil) {return false;}
173
+
174
+ const settleDelay = options?.settleDelay ?? 0;
175
+ const timeoutMs = options?.timeoutMs ?? 2000;
176
+ const waitForJoin = options?.waitForJoin ?? true;
177
+
178
+ const existing = this.roomPresenceInFlight.get(roomJID);
179
+ if (existing) {
180
+ if (!waitForJoin) {return true;}
181
+ // Piggyback on someone else's in-flight join but never wait past OUR
182
+ // OWN budget: that join may have been started with a longer timeout
183
+ // (the sweep uses 5 s, a send wants less).
184
+ const OWN_TIMEOUT = Symbol('ensureRoomPresence_own_timeout');
185
+ let timer: ReturnType<typeof setTimeout> | undefined;
186
+ const ownTimeout = new Promise<typeof OWN_TIMEOUT>((resolve) => {
187
+ timer = setTimeout(() => resolve(OWN_TIMEOUT), timeoutMs);
188
+ });
189
+ const result = await Promise.race([existing, ownTimeout]);
190
+ if (timer) {clearTimeout(timer);}
191
+ return result === OWN_TIMEOUT ? false : result;
192
+ }
193
+
194
+ // A join that outlives its connection (socket dropped while it waited)
195
+ // must not write into the NEW connection's state: neither joined nor a
196
+ // failure backoff.
197
+ const joinEpoch = this.epoch;
198
+ const promise: Promise<boolean> = (async () => {
199
+ // Online: go straight to the write (synchronously for the first
200
+ // caller), so a send queued right behind it stays ordered after it.
201
+ if (!this.host.isOnline?.()) {
202
+ await this.host.waitForOnline(Math.max(timeoutMs, 1000));
203
+ }
204
+ if (joinEpoch !== this.epoch) {return false;}
205
+ const client = this.host.getClient();
206
+ if (!client) {return false;}
207
+ await presenceInRoom(
208
+ client,
209
+ roomJID,
210
+ settleDelay,
211
+ timeoutMs,
212
+ this.joinHistoryStanzas
213
+ );
214
+ if (joinEpoch !== this.epoch) {return false;}
215
+ this.joinedRooms.add(roomJID);
216
+ this.roomPresenceBlockedUntil.delete(roomJID);
217
+ return true;
218
+ })()
219
+ .catch((error) => {
220
+ if (joinEpoch !== this.epoch) {return false;}
221
+ const message = formatError(error);
222
+ // Permanent / long-lived failures: "you are not a member" or "this
223
+ // room does not exist". No point retrying for an hour.
224
+ const isHardFailure =
225
+ message.includes('presence_error:forbidden') ||
226
+ message.includes('presence_error:not-allowed') ||
227
+ message.includes('presence_error:remote-server-not-found') ||
228
+ message.includes('presence_error:item-not-found') ||
229
+ message.includes('presence_invalid_jid');
230
+ if (isHardFailure) {
231
+ this.roomPresenceBlockedUntil.set(roomJID, Date.now() + 60 * 60 * 1000);
232
+ } else if (
233
+ message.includes('presence_timeout') ||
234
+ message.includes('presence_send_failed') ||
235
+ message.includes('presence_error')
236
+ ) {
237
+ this.roomPresenceBlockedUntil.set(
238
+ roomJID,
239
+ Date.now() + this.failureBackoffMs
240
+ );
241
+ }
242
+ console.warn(
243
+ `[XMPP] room_presence_failed room=${roomJID} source=${source} error=${message}`
244
+ );
245
+ return false;
246
+ })
247
+ .finally(() => {
248
+ // The map was cleared on disconnect: only drop our own entry.
249
+ if (this.roomPresenceInFlight.get(roomJID) === promise) {
250
+ this.roomPresenceInFlight.delete(roomJID);
251
+ }
252
+ });
253
+
254
+ this.roomPresenceInFlight.set(roomJID, promise);
255
+ if (waitForJoin) {return promise;}
256
+ return true;
257
+ };
258
+
259
+ // ---- the sweep ----------------------------------------------------
260
+ /**
261
+ * Start the background join sweep. Every caller shares one in-flight
262
+ * sweep; a finished sweep is only repeated when rooms appeared since.
263
+ * Never throws.
264
+ */
265
+ async sendAllPresencesAndMarkReady(): Promise<void> {
266
+ if (this.sendAllPresencesInFlight) {return this.sendAllPresencesInFlight;}
267
+ if (this.presencesReady && !this.hasUnjoinedRooms()) {return;}
268
+ const run: Promise<void> = this.runAllPresencesSweep().finally(() => {
269
+ if (this.sendAllPresencesInFlight === run) {
270
+ this.sendAllPresencesInFlight = null;
271
+ }
272
+ });
273
+ this.sendAllPresencesInFlight = run;
274
+ return run;
275
+ }
276
+
277
+ // Store rooms this connection has not joined and is not backing off from.
278
+ private hasUnjoinedRooms(): boolean {
279
+ const rooms = store.getState().rooms.rooms;
280
+ const now = Date.now();
281
+ return Object.keys(rooms || {}).some(
282
+ (jid) =>
283
+ this.isValidRoomJid(jid) &&
284
+ !this.joinedRooms.has(jid) &&
285
+ now >= (this.roomPresenceBlockedUntil.get(jid) || 0)
286
+ );
287
+ }
288
+
289
+ private async runAllPresencesSweep(): Promise<void> {
290
+ const epoch = this.epoch;
291
+ this.presencesReady = false;
292
+ let summary = emptySummary();
293
+ try {
294
+ summary = await this.allRoomPresencesStanza(epoch);
295
+ } catch (error) {
296
+ console.warn(`[XMPP] allRoomPresences fallback reason=${formatError(error)}`);
297
+ }
298
+ // The connection dropped mid-sweep: a newer connection owns the state.
299
+ if (epoch !== this.epoch) {return;}
300
+ // Only rooms the sweep actually sent a presence for count as joined.
301
+ // Reading the store here would also mark rooms discovered DURING the
302
+ // sweep, and ensureRoomPresence would then short-circuit for them.
303
+ summary.sweptRooms.forEach((jid) => {
304
+ if (!summary.failedRooms.includes(jid)) {this.joinedRooms.add(jid);}
305
+ });
306
+ if (summary.failed > 0 && summary.failures?.length) {
307
+ const text = summary.failures
308
+ .slice(0, 3)
309
+ .map((item) => `${item.roomJid}:${item.reason}`)
310
+ .join(' | ');
311
+ console.warn(`[XMPP] allRoomPresences failures_top3=${text}`);
312
+ }
313
+ this.priorityPresencesReady = true;
314
+ this.presencesReady = true;
315
+ this.scheduleSweepRetry(epoch, 0);
316
+ }
317
+
318
+ private clearSweepRetry() {
319
+ if (this.sweepRetryTimer) {clearTimeout(this.sweepRetryTimer);}
320
+ this.sweepRetryTimer = null;
321
+ this.sweepRetryRunning = false;
322
+ }
323
+
324
+ // Rooms the connection has not joined that a retry can still help: not
325
+ // joined, not under a long (hard) block. Returns the soonest moment a retry
326
+ // is worthwhile (0 = now) or null when nothing is left.
327
+ private nextSweepRetryAt(): number | null {
328
+ const rooms = store.getState().rooms?.rooms;
329
+ const now = Date.now();
330
+ let soonest: number | null = null;
331
+ Object.keys(rooms || {}).forEach((jid) => {
332
+ if (!this.isValidRoomJid(jid) || this.joinedRooms.has(jid)) {return;}
333
+ const until = this.roomPresenceBlockedUntil.get(jid) || 0;
334
+ // Hard failures (1 h) and invalid JIDs (24 h) are not worth a retry.
335
+ if (until - now > Math.max(this.failureBackoffMs, 1000) * 2) {return;}
336
+ const at = Math.max(until, now);
337
+ if (soonest === null || at < soonest) {soonest = at;}
338
+ });
339
+ return soonest;
340
+ }
341
+
342
+ private scheduleSweepRetry(epoch: number, round: number) {
343
+ if (epoch !== this.epoch) {return;}
344
+ if (round >= SWEEP_RETRY_DELAYS_MS.length) {return;}
345
+ const at = this.nextSweepRetryAt();
346
+ if (at === null) {return;}
347
+ if (this.sweepRetryTimer) {clearTimeout(this.sweepRetryTimer);}
348
+ const delay = Math.max(SWEEP_RETRY_DELAYS_MS[round], at - Date.now() + 100);
349
+ this.sweepRetryTimer = setTimeout(() => {
350
+ this.sweepRetryTimer = null;
351
+ this.runSweepRetry(epoch, round).catch(() => undefined);
352
+ }, delay);
353
+ }
354
+
355
+ private async runSweepRetry(epoch: number, round: number) {
356
+ if (epoch !== this.epoch || !this.host.getClient()) {return;}
357
+ // A fresh full sweep owns the pool right now: try again after it.
358
+ if (this.sweepRetryRunning || this.sendAllPresencesInFlight) {
359
+ this.scheduleSweepRetry(epoch, round);
360
+ return;
361
+ }
362
+ if (this.nextSweepRetryAt() === null) {return;}
363
+ this.sweepRetryRunning = true;
364
+ try {
365
+ const summary = await this.allRoomPresencesStanza(epoch);
366
+ if (epoch !== this.epoch) {return;}
367
+ const failed = new Set(summary.failedRooms);
368
+ summary.sweptRooms.forEach((jid) => {
369
+ if (!failed.has(jid)) {this.joinedRooms.add(jid);}
370
+ });
371
+ } catch (error) {
372
+ console.warn(`[XMPP] sweep_retry:error ${formatError(error)}`);
373
+ } finally {
374
+ this.sweepRetryRunning = false;
375
+ }
376
+ this.scheduleSweepRetry(epoch, round + 1);
377
+ }
378
+
379
+ async allRoomPresencesStanza(
380
+ epoch: number = this.epoch
381
+ ): Promise<AllRoomPresenceSummary> {
382
+ const client = this.host.getClient();
383
+ if (!client) {return emptySummary();}
384
+ try {
385
+ return await allRoomPresences(
386
+ client,
387
+ (roomJid) =>
388
+ this.ensureRoomPresence(roomJid, {
389
+ settleDelay: 0,
390
+ timeoutMs: 5000,
391
+ waitForJoin: true,
392
+ source: 'background',
393
+ }),
394
+ {
395
+ concurrency: this.joinConcurrency,
396
+ isJoined: (jid) => this.joinedRooms.has(jid),
397
+ getActiveRoomJid: () => store.getState().rooms.activeRoomJID,
398
+ rank: (jid) =>
399
+ getRoomLastActivityScore(store.getState().rooms.rooms?.[jid]),
400
+ isCancelled: () => epoch !== this.epoch,
401
+ isRoomJid: (jid) => this.isValidRoomJid(jid),
402
+ onPriorityDone: () => {
403
+ if (epoch === this.epoch) {this.priorityPresencesReady = true;}
404
+ },
405
+ }
406
+ );
407
+ } catch (error) {
408
+ console.warn(`[XMPP] allRoomPresencesStanza:error ${formatError(error)}`);
409
+ return emptySummary();
410
+ }
411
+ }
412
+ }
@@ -36,7 +36,6 @@ export function sendMediaMessage(
36
36
  senderFirstName: data.firstName,
37
37
  senderLastName: data.lastName,
38
38
  senderWalletAddress: data.walletAddress,
39
- isSystemMessage: false,
40
39
  tokenAmount: '0',
41
40
  receiverMessageId: '0',
42
41
  mucname: data.chatName,
@@ -62,7 +62,6 @@ export const sendTextMessage = (
62
62
  senderJID: client.jid?.toString(),
63
63
  senderWalletAddress: walletAddress,
64
64
  roomJid: roomJID,
65
- isSystemMessage: false,
66
65
  tokenAmount: 0,
67
66
  quickReplies: '',
68
67
  notDisplayedValue: '',
@@ -49,7 +49,6 @@ export const sendTextMessageWithTranslateTag = (
49
49
  senderJID: client.jid?.toString(),
50
50
  senderWalletAddress: stanzaMessage.walletAddress,
51
51
  roomJid: stanzaMessage.roomJID,
52
- isSystemMessage: false,
53
52
  tokenAmount: 0,
54
53
  quickReplies: '',
55
54
  notDisplayedValue: '',