@ethora/chat-component-rn 26.9.1 → 26.10.1

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 (816) 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/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.js +14 -12
  60. package/lib/commonjs/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.js.map +1 -1
  61. package/lib/commonjs/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.js +41 -39
  62. package/lib/commonjs/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.js.map +1 -1
  63. package/lib/commonjs/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js +137 -50
  64. package/lib/commonjs/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js.map +1 -1
  65. package/lib/commonjs/components/Modals/SettingsModals/ProfileShares/ProfileShares.js +15 -13
  66. package/lib/commonjs/components/Modals/SettingsModals/ProfileShares/ProfileShares.js.map +1 -1
  67. package/lib/commonjs/components/Modals/SettingsModals/Referrals/Referrals.js +57 -55
  68. package/lib/commonjs/components/Modals/SettingsModals/Referrals/Referrals.js.map +1 -1
  69. package/lib/commonjs/components/Modals/SettingsModals/SharedStyledComponents.js +15 -1
  70. package/lib/commonjs/components/Modals/SettingsModals/SharedStyledComponents.js.map +1 -1
  71. package/lib/commonjs/components/Modals/SettingsModals/Visibility/VisibilityModal.js +61 -59
  72. package/lib/commonjs/components/Modals/SettingsModals/Visibility/VisibilityModal.js.map +1 -1
  73. package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js +8 -3
  74. package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
  75. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +13 -2
  76. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
  77. package/lib/commonjs/components/RoomComponents/SwipeableRoomRow.js +38 -6
  78. package/lib/commonjs/components/RoomComponents/SwipeableRoomRow.js.map +1 -1
  79. package/lib/commonjs/components/Thread/ThreadHeader.js +3 -1
  80. package/lib/commonjs/components/Thread/ThreadHeader.js.map +1 -1
  81. package/lib/commonjs/components/Thread/ThreadWrapper.js +90 -10
  82. package/lib/commonjs/components/Thread/ThreadWrapper.js.map +1 -1
  83. package/lib/commonjs/components/styled/AudioDecoderHost.js +338 -0
  84. package/lib/commonjs/components/styled/AudioDecoderHost.js.map +1 -0
  85. package/lib/commonjs/components/styled/AudioMessage.js +493 -420
  86. package/lib/commonjs/components/styled/AudioMessage.js.map +1 -1
  87. package/lib/commonjs/components/styled/SendInput.js +31 -5
  88. package/lib/commonjs/components/styled/SendInput.js.map +1 -1
  89. package/lib/commonjs/context/MessageNotificationContext.js +14 -4
  90. package/lib/commonjs/context/MessageNotificationContext.js.map +1 -1
  91. package/lib/commonjs/context/xmppProvider.js +41 -77
  92. package/lib/commonjs/context/xmppProvider.js.map +1 -1
  93. package/lib/commonjs/helpers/audioWaveform.js +165 -0
  94. package/lib/commonjs/helpers/audioWaveform.js.map +1 -0
  95. package/lib/commonjs/helpers/backgroundJoinSweep.js +36 -0
  96. package/lib/commonjs/helpers/backgroundJoinSweep.js.map +1 -0
  97. package/lib/commonjs/helpers/bubbleHighlight.js +44 -0
  98. package/lib/commonjs/helpers/bubbleHighlight.js.map +1 -0
  99. package/lib/commonjs/helpers/checkUniqueUsers.js +14 -12
  100. package/lib/commonjs/helpers/checkUniqueUsers.js.map +1 -1
  101. package/lib/commonjs/helpers/constants/MODAL_COMPONENTS.js +5 -1
  102. package/lib/commonjs/helpers/constants/MODAL_COMPONENTS.js.map +1 -1
  103. package/lib/commonjs/helpers/constants/MODAL_TYPES.js +3 -1
  104. package/lib/commonjs/helpers/constants/MODAL_TYPES.js.map +1 -1
  105. package/lib/commonjs/helpers/createRoomFromApi.js +40 -3
  106. package/lib/commonjs/helpers/createRoomFromApi.js.map +1 -1
  107. package/lib/commonjs/helpers/dedupeMembers.js +34 -0
  108. package/lib/commonjs/helpers/dedupeMembers.js.map +1 -0
  109. package/lib/commonjs/helpers/ethoraLogger.js +56 -0
  110. package/lib/commonjs/helpers/ethoraLogger.js.map +1 -0
  111. package/lib/commonjs/helpers/getUnnamedUsers.js +9 -4
  112. package/lib/commonjs/helpers/getUnnamedUsers.js.map +1 -1
  113. package/lib/commonjs/helpers/historyPreloadConfig.js +44 -0
  114. package/lib/commonjs/helpers/historyPreloadConfig.js.map +1 -0
  115. package/lib/commonjs/helpers/historyPreloadScheduler.js +372 -137
  116. package/lib/commonjs/helpers/historyPreloadScheduler.js.map +1 -1
  117. package/lib/commonjs/helpers/initRoomsPresence.js +17 -5
  118. package/lib/commonjs/helpers/initRoomsPresence.js.map +1 -1
  119. package/lib/commonjs/helpers/insertMessageWithDelimiter.js +5 -0
  120. package/lib/commonjs/helpers/insertMessageWithDelimiter.js.map +1 -1
  121. package/lib/commonjs/helpers/isLikelyMucJid.js +67 -0
  122. package/lib/commonjs/helpers/isLikelyMucJid.js.map +1 -0
  123. package/lib/commonjs/helpers/isMessageSearchEnabled.js +18 -0
  124. package/lib/commonjs/helpers/isMessageSearchEnabled.js.map +1 -0
  125. package/lib/commonjs/helpers/joiningRoom.js +14 -0
  126. package/lib/commonjs/helpers/joiningRoom.js.map +1 -0
  127. package/lib/commonjs/helpers/jumpThread.js +100 -0
  128. package/lib/commonjs/helpers/jumpThread.js.map +1 -0
  129. package/lib/commonjs/helpers/jumpToMessage.js +58 -0
  130. package/lib/commonjs/helpers/jumpToMessage.js.map +1 -0
  131. package/lib/commonjs/helpers/jumpWindow.js +187 -0
  132. package/lib/commonjs/helpers/jumpWindow.js.map +1 -0
  133. package/lib/commonjs/helpers/loadRoomHistory.js +75 -0
  134. package/lib/commonjs/helpers/loadRoomHistory.js.map +1 -0
  135. package/lib/commonjs/helpers/notificationPolicy.js +77 -0
  136. package/lib/commonjs/helpers/notificationPolicy.js.map +1 -0
  137. package/lib/commonjs/helpers/openRoomAtMessage.js +47 -0
  138. package/lib/commonjs/helpers/openRoomAtMessage.js.map +1 -0
  139. package/lib/commonjs/helpers/openThreadForJump.js +72 -0
  140. package/lib/commonjs/helpers/openThreadForJump.js.map +1 -0
  141. package/lib/commonjs/helpers/parseMessageReference.js +27 -8
  142. package/lib/commonjs/helpers/parseMessageReference.js.map +1 -1
  143. package/lib/commonjs/helpers/publicChatsEntry.js +17 -0
  144. package/lib/commonjs/helpers/publicChatsEntry.js.map +1 -0
  145. package/lib/commonjs/helpers/roomActivityScore.js +37 -0
  146. package/lib/commonjs/helpers/roomActivityScore.js.map +1 -0
  147. package/lib/commonjs/helpers/roomUserCount.js +36 -0
  148. package/lib/commonjs/helpers/roomUserCount.js.map +1 -0
  149. package/lib/commonjs/helpers/runConfiguredHistoryPreload.js +68 -0
  150. package/lib/commonjs/helpers/runConfiguredHistoryPreload.js.map +1 -0
  151. package/lib/commonjs/helpers/sessionAppId.js +24 -0
  152. package/lib/commonjs/helpers/sessionAppId.js.map +1 -0
  153. package/lib/commonjs/helpers/timestamp.js +43 -0
  154. package/lib/commonjs/helpers/timestamp.js.map +1 -0
  155. package/lib/commonjs/helpers/userResolver.js +517 -0
  156. package/lib/commonjs/helpers/userResolver.js.map +1 -0
  157. package/lib/commonjs/helpers/xmppIdShape.js +52 -0
  158. package/lib/commonjs/helpers/xmppIdShape.js.map +1 -0
  159. package/lib/commonjs/hooks/useChatWrapperInit.js +27 -5
  160. package/lib/commonjs/hooks/useChatWrapperInit.js.map +1 -1
  161. package/lib/commonjs/hooks/useHeapSender.js +54 -3
  162. package/lib/commonjs/hooks/useHeapSender.js.map +1 -1
  163. package/lib/commonjs/hooks/useJumpToMessage.js +411 -0
  164. package/lib/commonjs/hooks/useJumpToMessage.js.map +1 -0
  165. package/lib/commonjs/hooks/useMessageLoaderQueue.js +32 -5
  166. package/lib/commonjs/hooks/useMessageLoaderQueue.js.map +1 -1
  167. package/lib/commonjs/hooks/useMessageQueue.js +13 -5
  168. package/lib/commonjs/hooks/useMessageQueue.js.map +1 -1
  169. package/lib/commonjs/hooks/useRoomDirectory.js +29 -0
  170. package/lib/commonjs/hooks/useRoomDirectory.js.map +1 -0
  171. package/lib/commonjs/hooks/useRoomInitialization.js +27 -5
  172. package/lib/commonjs/hooks/useRoomInitialization.js.map +1 -1
  173. package/lib/commonjs/hooks/useRoomMute.js +62 -0
  174. package/lib/commonjs/hooks/useRoomMute.js.map +1 -0
  175. package/lib/commonjs/hooks/useRoomState.js +3 -1
  176. package/lib/commonjs/hooks/useRoomState.js.map +1 -1
  177. package/lib/commonjs/hooks/useSendMessage.js +13 -3
  178. package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
  179. package/lib/commonjs/i18n/strings.js +312 -6
  180. package/lib/commonjs/i18n/strings.js.map +1 -1
  181. package/lib/commonjs/networking/api-requests/messageSearch.api.js +87 -0
  182. package/lib/commonjs/networking/api-requests/messageSearch.api.js.map +1 -0
  183. package/lib/commonjs/networking/api-requests/publicChats.api.js +48 -0
  184. package/lib/commonjs/networking/api-requests/publicChats.api.js.map +1 -0
  185. package/lib/commonjs/networking/api-requests/roomMembers.api.js +253 -4
  186. package/lib/commonjs/networking/api-requests/roomMembers.api.js.map +1 -1
  187. package/lib/commonjs/networking/api-requests/rooms.api.js +48 -12
  188. package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
  189. package/lib/commonjs/networking/api-requests/user.api.js +32 -3
  190. package/lib/commonjs/networking/api-requests/user.api.js.map +1 -1
  191. package/lib/commonjs/networking/api-requests/xmppToken.api.js +71 -0
  192. package/lib/commonjs/networking/api-requests/xmppToken.api.js.map +1 -0
  193. package/lib/commonjs/networking/ethoraEvents.js +227 -0
  194. package/lib/commonjs/networking/ethoraEvents.js.map +1 -0
  195. package/lib/commonjs/networking/stanzaHandlers.js +153 -16
  196. package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
  197. package/lib/commonjs/networking/xmpp/allRoomPresences.xmpp.js +124 -3
  198. package/lib/commonjs/networking/xmpp/allRoomPresences.xmpp.js.map +1 -1
  199. package/lib/commonjs/networking/xmpp/getHistory.xmpp.js +319 -35
  200. package/lib/commonjs/networking/xmpp/getHistory.xmpp.js.map +1 -1
  201. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js +7 -0
  202. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  203. package/lib/commonjs/networking/xmpp/historyCursor.js +101 -0
  204. package/lib/commonjs/networking/xmpp/historyCursor.js.map +1 -0
  205. package/lib/commonjs/networking/xmpp/mamQueryIds.js +17 -0
  206. package/lib/commonjs/networking/xmpp/mamQueryIds.js.map +1 -0
  207. package/lib/commonjs/networking/xmpp/mamRouter.js +24 -9
  208. package/lib/commonjs/networking/xmpp/mamRouter.js.map +1 -1
  209. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js +70 -65
  210. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  211. package/lib/commonjs/networking/xmpp/roomJoinSweep.js +389 -0
  212. package/lib/commonjs/networking/xmpp/roomJoinSweep.js.map +1 -0
  213. package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js +0 -1
  214. package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
  215. package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js +0 -1
  216. package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
  217. package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +0 -1
  218. package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
  219. package/lib/commonjs/networking/xmppClient.js +269 -41
  220. package/lib/commonjs/networking/xmppClient.js.map +1 -1
  221. package/lib/commonjs/networking/xmppCredentials.js +80 -0
  222. package/lib/commonjs/networking/xmppCredentials.js.map +1 -0
  223. package/lib/commonjs/roomStore/Middleware/jumpThreadMiddleware.js +158 -0
  224. package/lib/commonjs/roomStore/Middleware/jumpThreadMiddleware.js.map +1 -0
  225. package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js +6 -0
  226. package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
  227. package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js +45 -7
  228. package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js.map +1 -1
  229. package/lib/commonjs/roomStore/chatSettingsSlice.js +21 -1
  230. package/lib/commonjs/roomStore/chatSettingsSlice.js.map +1 -1
  231. package/lib/commonjs/roomStore/index.js +13 -3
  232. package/lib/commonjs/roomStore/index.js.map +1 -1
  233. package/lib/commonjs/roomStore/persistence.js +48 -1
  234. package/lib/commonjs/roomStore/persistence.js.map +1 -1
  235. package/lib/commonjs/roomStore/roomsSlice.js +474 -60
  236. package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
  237. package/lib/commonjs/roomStore/safeKey.js +44 -0
  238. package/lib/commonjs/roomStore/safeKey.js.map +1 -0
  239. package/lib/commonjs/roomStore/usersSetCap.js +37 -0
  240. package/lib/commonjs/roomStore/usersSetCap.js.map +1 -0
  241. package/lib/commonjs/version.js +1 -1
  242. package/lib/commonjs/version.js.map +1 -1
  243. package/lib/module/assets/icons.js +1 -1
  244. package/lib/module/assets/icons.js.map +1 -1
  245. package/lib/module/components/Header/HeaderRoomList.js +23 -7
  246. package/lib/module/components/Header/HeaderRoomList.js.map +1 -1
  247. package/lib/module/components/InputComponents/Search.js +39 -2
  248. package/lib/module/components/InputComponents/Search.js.map +1 -1
  249. package/lib/module/components/MainComponents/ArchivedMessageCard.js +161 -0
  250. package/lib/module/components/MainComponents/ArchivedMessageCard.js.map +1 -0
  251. package/lib/module/components/MainComponents/ChatHeader.js +22 -5
  252. package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
  253. package/lib/module/components/MainComponents/ChatRoom.js +57 -26
  254. package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
  255. package/lib/module/components/MainComponents/ChatWrapper.js +31 -1
  256. package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
  257. package/lib/module/components/MainComponents/MediaMessage.js +18 -3
  258. package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
  259. package/lib/module/components/MainComponents/MessageList.js +740 -42
  260. package/lib/module/components/MainComponents/MessageList.js.map +1 -1
  261. package/lib/module/components/MainComponents/MessageSearchButton.js +48 -0
  262. package/lib/module/components/MainComponents/MessageSearchButton.js.map +1 -0
  263. package/lib/module/components/MainComponents/ReduxWrapper.js +15 -7
  264. package/lib/module/components/MainComponents/ReduxWrapper.js.map +1 -1
  265. package/lib/module/components/MainComponents/RoomList.js +111 -2
  266. package/lib/module/components/MainComponents/RoomList.js.map +1 -1
  267. package/lib/module/components/Menu/HeaderRoomListMenu.js +15 -4
  268. package/lib/module/components/Menu/HeaderRoomListMenu.js.map +1 -1
  269. package/lib/module/components/MessageBubble/BubbleHighlight.js +106 -0
  270. package/lib/module/components/MessageBubble/BubbleHighlight.js.map +1 -0
  271. package/lib/module/components/MessageBubble/Message.js +172 -127
  272. package/lib/module/components/MessageBubble/Message.js.map +1 -1
  273. package/lib/module/components/MessageBubble/MessageInteractions.js +98 -78
  274. package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
  275. package/lib/module/components/MessageBubble/messageMenuLayout.js +45 -0
  276. package/lib/module/components/MessageBubble/messageMenuLayout.js.map +1 -0
  277. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +74 -38
  278. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  279. package/lib/module/components/Modals/MessageSearchModal/MessageHitResults.js +243 -0
  280. package/lib/module/components/Modals/MessageSearchModal/MessageHitResults.js.map +1 -0
  281. package/lib/module/components/Modals/MessageSearchModal/MessageSearchModal.js +482 -0
  282. package/lib/module/components/Modals/MessageSearchModal/MessageSearchModal.js.map +1 -0
  283. package/lib/module/components/Modals/MessageSearchModal/openHit.js +45 -0
  284. package/lib/module/components/Modals/MessageSearchModal/openHit.js.map +1 -0
  285. package/lib/module/components/Modals/MessageSearchModal/resolveSender.js +41 -0
  286. package/lib/module/components/Modals/MessageSearchModal/resolveSender.js.map +1 -0
  287. package/lib/module/components/Modals/MessageSearchModal/searchFilters.js +74 -0
  288. package/lib/module/components/Modals/MessageSearchModal/searchFilters.js.map +1 -0
  289. package/lib/module/components/Modals/MessageSearchModal/snippet.js +57 -0
  290. package/lib/module/components/Modals/MessageSearchModal/snippet.js.map +1 -0
  291. package/lib/module/components/Modals/MessageSearchModal/useMessageSearch.js +131 -0
  292. package/lib/module/components/Modals/MessageSearchModal/useMessageSearch.js.map +1 -0
  293. package/lib/module/components/Modals/PublicChatsModal/PublicChatsModal.js +300 -0
  294. package/lib/module/components/Modals/PublicChatsModal/PublicChatsModal.js.map +1 -0
  295. package/lib/module/components/Modals/PublicChatsModal/publicChatsLogic.js +30 -0
  296. package/lib/module/components/Modals/PublicChatsModal/publicChatsLogic.js.map +1 -0
  297. package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js +8 -1
  298. package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
  299. package/lib/module/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.js +15 -13
  300. package/lib/module/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.js.map +1 -1
  301. package/lib/module/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.js +42 -40
  302. package/lib/module/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.js.map +1 -1
  303. package/lib/module/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js +138 -52
  304. package/lib/module/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js.map +1 -1
  305. package/lib/module/components/Modals/SettingsModals/ProfileShares/ProfileShares.js +16 -14
  306. package/lib/module/components/Modals/SettingsModals/ProfileShares/ProfileShares.js.map +1 -1
  307. package/lib/module/components/Modals/SettingsModals/Referrals/Referrals.js +58 -56
  308. package/lib/module/components/Modals/SettingsModals/Referrals/Referrals.js.map +1 -1
  309. package/lib/module/components/Modals/SettingsModals/SharedStyledComponents.js +14 -0
  310. package/lib/module/components/Modals/SettingsModals/SharedStyledComponents.js.map +1 -1
  311. package/lib/module/components/Modals/SettingsModals/Visibility/VisibilityModal.js +62 -60
  312. package/lib/module/components/Modals/SettingsModals/Visibility/VisibilityModal.js.map +1 -1
  313. package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js +9 -4
  314. package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
  315. package/lib/module/components/RoomComponents/ChatRoomItem.js +14 -3
  316. package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
  317. package/lib/module/components/RoomComponents/SwipeableRoomRow.js +39 -7
  318. package/lib/module/components/RoomComponents/SwipeableRoomRow.js.map +1 -1
  319. package/lib/module/components/Thread/ThreadHeader.js +3 -1
  320. package/lib/module/components/Thread/ThreadHeader.js.map +1 -1
  321. package/lib/module/components/Thread/ThreadWrapper.js +89 -9
  322. package/lib/module/components/Thread/ThreadWrapper.js.map +1 -1
  323. package/lib/module/components/styled/AudioDecoderHost.js +332 -0
  324. package/lib/module/components/styled/AudioDecoderHost.js.map +1 -0
  325. package/lib/module/components/styled/AudioMessage.js +495 -422
  326. package/lib/module/components/styled/AudioMessage.js.map +1 -1
  327. package/lib/module/components/styled/SendInput.js +32 -6
  328. package/lib/module/components/styled/SendInput.js.map +1 -1
  329. package/lib/module/context/MessageNotificationContext.js +15 -5
  330. package/lib/module/context/MessageNotificationContext.js.map +1 -1
  331. package/lib/module/context/xmppProvider.js +42 -78
  332. package/lib/module/context/xmppProvider.js.map +1 -1
  333. package/lib/module/helpers/audioWaveform.js +153 -0
  334. package/lib/module/helpers/audioWaveform.js.map +1 -0
  335. package/lib/module/helpers/backgroundJoinSweep.js +30 -0
  336. package/lib/module/helpers/backgroundJoinSweep.js.map +1 -0
  337. package/lib/module/helpers/bubbleHighlight.js +38 -0
  338. package/lib/module/helpers/bubbleHighlight.js.map +1 -0
  339. package/lib/module/helpers/checkUniqueUsers.js +15 -13
  340. package/lib/module/helpers/checkUniqueUsers.js.map +1 -1
  341. package/lib/module/helpers/constants/MODAL_COMPONENTS.js +5 -1
  342. package/lib/module/helpers/constants/MODAL_COMPONENTS.js.map +1 -1
  343. package/lib/module/helpers/constants/MODAL_TYPES.js +3 -1
  344. package/lib/module/helpers/constants/MODAL_TYPES.js.map +1 -1
  345. package/lib/module/helpers/createRoomFromApi.js +37 -3
  346. package/lib/module/helpers/createRoomFromApi.js.map +1 -1
  347. package/lib/module/helpers/dedupeMembers.js +28 -0
  348. package/lib/module/helpers/dedupeMembers.js.map +1 -0
  349. package/lib/module/helpers/ethoraLogger.js +52 -0
  350. package/lib/module/helpers/ethoraLogger.js.map +1 -0
  351. package/lib/module/helpers/getUnnamedUsers.js +9 -4
  352. package/lib/module/helpers/getUnnamedUsers.js.map +1 -1
  353. package/lib/module/helpers/historyPreloadConfig.js +39 -0
  354. package/lib/module/helpers/historyPreloadConfig.js.map +1 -0
  355. package/lib/module/helpers/historyPreloadScheduler.js +368 -134
  356. package/lib/module/helpers/historyPreloadScheduler.js.map +1 -1
  357. package/lib/module/helpers/initRoomsPresence.js +18 -5
  358. package/lib/module/helpers/initRoomsPresence.js.map +1 -1
  359. package/lib/module/helpers/insertMessageWithDelimiter.js +5 -0
  360. package/lib/module/helpers/insertMessageWithDelimiter.js.map +1 -1
  361. package/lib/module/helpers/isLikelyMucJid.js +60 -0
  362. package/lib/module/helpers/isLikelyMucJid.js.map +1 -0
  363. package/lib/module/helpers/isMessageSearchEnabled.js +13 -0
  364. package/lib/module/helpers/isMessageSearchEnabled.js.map +1 -0
  365. package/lib/module/helpers/joiningRoom.js +9 -0
  366. package/lib/module/helpers/joiningRoom.js.map +1 -0
  367. package/lib/module/helpers/jumpThread.js +83 -0
  368. package/lib/module/helpers/jumpThread.js.map +1 -0
  369. package/lib/module/helpers/jumpToMessage.js +52 -0
  370. package/lib/module/helpers/jumpToMessage.js.map +1 -0
  371. package/lib/module/helpers/jumpWindow.js +177 -0
  372. package/lib/module/helpers/jumpWindow.js.map +1 -0
  373. package/lib/module/helpers/loadRoomHistory.js +69 -0
  374. package/lib/module/helpers/loadRoomHistory.js.map +1 -0
  375. package/lib/module/helpers/notificationPolicy.js +70 -0
  376. package/lib/module/helpers/notificationPolicy.js.map +1 -0
  377. package/lib/module/helpers/openRoomAtMessage.js +41 -0
  378. package/lib/module/helpers/openRoomAtMessage.js.map +1 -0
  379. package/lib/module/helpers/openThreadForJump.js +68 -0
  380. package/lib/module/helpers/openThreadForJump.js.map +1 -0
  381. package/lib/module/helpers/parseMessageReference.js +26 -6
  382. package/lib/module/helpers/parseMessageReference.js.map +1 -1
  383. package/lib/module/helpers/publicChatsEntry.js +12 -0
  384. package/lib/module/helpers/publicChatsEntry.js.map +1 -0
  385. package/lib/module/helpers/roomActivityScore.js +30 -0
  386. package/lib/module/helpers/roomActivityScore.js.map +1 -0
  387. package/lib/module/helpers/roomUserCount.js +29 -0
  388. package/lib/module/helpers/roomUserCount.js.map +1 -0
  389. package/lib/module/helpers/runConfiguredHistoryPreload.js +63 -0
  390. package/lib/module/helpers/runConfiguredHistoryPreload.js.map +1 -0
  391. package/lib/module/helpers/sessionAppId.js +20 -0
  392. package/lib/module/helpers/sessionAppId.js.map +1 -0
  393. package/lib/module/helpers/timestamp.js +37 -0
  394. package/lib/module/helpers/timestamp.js.map +1 -0
  395. package/lib/module/helpers/userResolver.js +503 -0
  396. package/lib/module/helpers/userResolver.js.map +1 -0
  397. package/lib/module/helpers/xmppIdShape.js +46 -0
  398. package/lib/module/helpers/xmppIdShape.js.map +1 -0
  399. package/lib/module/hooks/useChatWrapperInit.js +16 -5
  400. package/lib/module/hooks/useChatWrapperInit.js.map +1 -1
  401. package/lib/module/hooks/useHeapSender.js +54 -3
  402. package/lib/module/hooks/useHeapSender.js.map +1 -1
  403. package/lib/module/hooks/useJumpToMessage.js +389 -0
  404. package/lib/module/hooks/useJumpToMessage.js.map +1 -0
  405. package/lib/module/hooks/useMessageLoaderQueue.js +32 -5
  406. package/lib/module/hooks/useMessageLoaderQueue.js.map +1 -1
  407. package/lib/module/hooks/useMessageQueue.js +13 -5
  408. package/lib/module/hooks/useMessageQueue.js.map +1 -1
  409. package/lib/module/hooks/useRoomDirectory.js +24 -0
  410. package/lib/module/hooks/useRoomDirectory.js.map +1 -0
  411. package/lib/module/hooks/useRoomInitialization.js +29 -7
  412. package/lib/module/hooks/useRoomInitialization.js.map +1 -1
  413. package/lib/module/hooks/useRoomMute.js +58 -0
  414. package/lib/module/hooks/useRoomMute.js.map +1 -0
  415. package/lib/module/hooks/useRoomState.js +3 -1
  416. package/lib/module/hooks/useRoomState.js.map +1 -1
  417. package/lib/module/hooks/useSendMessage.js +13 -3
  418. package/lib/module/hooks/useSendMessage.js.map +1 -1
  419. package/lib/module/i18n/strings.js +312 -6
  420. package/lib/module/i18n/strings.js.map +1 -1
  421. package/lib/module/networking/api-requests/messageSearch.api.js +81 -0
  422. package/lib/module/networking/api-requests/messageSearch.api.js.map +1 -0
  423. package/lib/module/networking/api-requests/publicChats.api.js +43 -0
  424. package/lib/module/networking/api-requests/publicChats.api.js.map +1 -0
  425. package/lib/module/networking/api-requests/roomMembers.api.js +248 -4
  426. package/lib/module/networking/api-requests/roomMembers.api.js.map +1 -1
  427. package/lib/module/networking/api-requests/rooms.api.js +48 -12
  428. package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
  429. package/lib/module/networking/api-requests/user.api.js +31 -3
  430. package/lib/module/networking/api-requests/user.api.js.map +1 -1
  431. package/lib/module/networking/api-requests/xmppToken.api.js +66 -0
  432. package/lib/module/networking/api-requests/xmppToken.api.js.map +1 -0
  433. package/lib/module/networking/ethoraEvents.js +220 -0
  434. package/lib/module/networking/ethoraEvents.js.map +1 -0
  435. package/lib/module/networking/stanzaHandlers.js +155 -18
  436. package/lib/module/networking/stanzaHandlers.js.map +1 -1
  437. package/lib/module/networking/xmpp/allRoomPresences.xmpp.js +125 -3
  438. package/lib/module/networking/xmpp/allRoomPresences.xmpp.js.map +1 -1
  439. package/lib/module/networking/xmpp/getHistory.xmpp.js +318 -35
  440. package/lib/module/networking/xmpp/getHistory.xmpp.js.map +1 -1
  441. package/lib/module/networking/xmpp/handleStanzas.xmpp.js +7 -0
  442. package/lib/module/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  443. package/lib/module/networking/xmpp/historyCursor.js +95 -0
  444. package/lib/module/networking/xmpp/historyCursor.js.map +1 -0
  445. package/lib/module/networking/xmpp/mamQueryIds.js +12 -0
  446. package/lib/module/networking/xmpp/mamQueryIds.js.map +1 -0
  447. package/lib/module/networking/xmpp/mamRouter.js +22 -8
  448. package/lib/module/networking/xmpp/mamRouter.js.map +1 -1
  449. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js +68 -62
  450. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  451. package/lib/module/networking/xmpp/roomJoinSweep.js +385 -0
  452. package/lib/module/networking/xmpp/roomJoinSweep.js.map +1 -0
  453. package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js +0 -1
  454. package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
  455. package/lib/module/networking/xmpp/sendTextMessage.xmpp.js +0 -1
  456. package/lib/module/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
  457. package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +0 -1
  458. package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
  459. package/lib/module/networking/xmppClient.js +269 -41
  460. package/lib/module/networking/xmppClient.js.map +1 -1
  461. package/lib/module/networking/xmppCredentials.js +76 -0
  462. package/lib/module/networking/xmppCredentials.js.map +1 -0
  463. package/lib/module/roomStore/Middleware/jumpThreadMiddleware.js +153 -0
  464. package/lib/module/roomStore/Middleware/jumpThreadMiddleware.js.map +1 -0
  465. package/lib/module/roomStore/Middleware/reactionsMiddleware.js +6 -0
  466. package/lib/module/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
  467. package/lib/module/roomStore/Middleware/unreadMidlleware.js +46 -7
  468. package/lib/module/roomStore/Middleware/unreadMidlleware.js.map +1 -1
  469. package/lib/module/roomStore/chatSettingsSlice.js +19 -0
  470. package/lib/module/roomStore/chatSettingsSlice.js.map +1 -1
  471. package/lib/module/roomStore/index.js +7 -3
  472. package/lib/module/roomStore/index.js.map +1 -1
  473. package/lib/module/roomStore/persistence.js +46 -1
  474. package/lib/module/roomStore/persistence.js.map +1 -1
  475. package/lib/module/roomStore/roomsSlice.js +459 -58
  476. package/lib/module/roomStore/roomsSlice.js.map +1 -1
  477. package/lib/module/roomStore/safeKey.js +37 -0
  478. package/lib/module/roomStore/safeKey.js.map +1 -0
  479. package/lib/module/roomStore/usersSetCap.js +32 -0
  480. package/lib/module/roomStore/usersSetCap.js.map +1 -0
  481. package/lib/module/version.js +1 -1
  482. package/lib/module/version.js.map +1 -1
  483. package/lib/typescript/assets/icons.d.ts +4 -0
  484. package/lib/typescript/assets/icons.d.ts.map +1 -1
  485. package/lib/typescript/components/Header/HeaderRoomList.d.ts.map +1 -1
  486. package/lib/typescript/components/InputComponents/Search.d.ts.map +1 -1
  487. package/lib/typescript/components/MainComponents/ArchivedMessageCard.d.ts +12 -0
  488. package/lib/typescript/components/MainComponents/ArchivedMessageCard.d.ts.map +1 -0
  489. package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
  490. package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
  491. package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
  492. package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
  493. package/lib/typescript/components/MainComponents/MessageList.d.ts +22 -1
  494. package/lib/typescript/components/MainComponents/MessageList.d.ts.map +1 -1
  495. package/lib/typescript/components/MainComponents/MessageSearchButton.d.ts +7 -0
  496. package/lib/typescript/components/MainComponents/MessageSearchButton.d.ts.map +1 -0
  497. package/lib/typescript/components/MainComponents/ReduxWrapper.d.ts.map +1 -1
  498. package/lib/typescript/components/MainComponents/RoomList.d.ts.map +1 -1
  499. package/lib/typescript/components/Menu/HeaderRoomListMenu.d.ts.map +1 -1
  500. package/lib/typescript/components/MessageBubble/BubbleHighlight.d.ts +12 -0
  501. package/lib/typescript/components/MessageBubble/BubbleHighlight.d.ts.map +1 -0
  502. package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
  503. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts +5 -0
  504. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts.map +1 -1
  505. package/lib/typescript/components/MessageBubble/messageMenuLayout.d.ts +29 -0
  506. package/lib/typescript/components/MessageBubble/messageMenuLayout.d.ts.map +1 -0
  507. package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts +2 -0
  508. package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
  509. package/lib/typescript/components/Modals/MessageSearchModal/MessageHitResults.d.ts +44 -0
  510. package/lib/typescript/components/Modals/MessageSearchModal/MessageHitResults.d.ts.map +1 -0
  511. package/lib/typescript/components/Modals/MessageSearchModal/MessageSearchModal.d.ts +12 -0
  512. package/lib/typescript/components/Modals/MessageSearchModal/MessageSearchModal.d.ts.map +1 -0
  513. package/lib/typescript/components/Modals/MessageSearchModal/openHit.d.ts +15 -0
  514. package/lib/typescript/components/Modals/MessageSearchModal/openHit.d.ts.map +1 -0
  515. package/lib/typescript/components/Modals/MessageSearchModal/resolveSender.d.ts +34 -0
  516. package/lib/typescript/components/Modals/MessageSearchModal/resolveSender.d.ts.map +1 -0
  517. package/lib/typescript/components/Modals/MessageSearchModal/searchFilters.d.ts +41 -0
  518. package/lib/typescript/components/Modals/MessageSearchModal/searchFilters.d.ts.map +1 -0
  519. package/lib/typescript/components/Modals/MessageSearchModal/snippet.d.ts +15 -0
  520. package/lib/typescript/components/Modals/MessageSearchModal/snippet.d.ts.map +1 -0
  521. package/lib/typescript/components/Modals/MessageSearchModal/useMessageSearch.d.ts +23 -0
  522. package/lib/typescript/components/Modals/MessageSearchModal/useMessageSearch.d.ts.map +1 -0
  523. package/lib/typescript/components/Modals/PublicChatsModal/PublicChatsModal.d.ts +16 -0
  524. package/lib/typescript/components/Modals/PublicChatsModal/PublicChatsModal.d.ts.map +1 -0
  525. package/lib/typescript/components/Modals/PublicChatsModal/publicChatsLogic.d.ts +14 -0
  526. package/lib/typescript/components/Modals/PublicChatsModal/publicChatsLogic.d.ts.map +1 -0
  527. package/lib/typescript/components/Modals/SelectUsersModal/SelectUsersModal.d.ts.map +1 -1
  528. package/lib/typescript/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.d.ts.map +1 -1
  529. package/lib/typescript/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.d.ts.map +1 -1
  530. package/lib/typescript/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.d.ts.map +1 -1
  531. package/lib/typescript/components/Modals/SettingsModals/ProfileShares/ProfileShares.d.ts.map +1 -1
  532. package/lib/typescript/components/Modals/SettingsModals/Referrals/Referrals.d.ts.map +1 -1
  533. package/lib/typescript/components/Modals/SettingsModals/SharedStyledComponents.d.ts +1 -0
  534. package/lib/typescript/components/Modals/SettingsModals/SharedStyledComponents.d.ts.map +1 -1
  535. package/lib/typescript/components/Modals/SettingsModals/Visibility/VisibilityModal.d.ts.map +1 -1
  536. package/lib/typescript/components/Modals/UserSettingsModal/UserSettingsModal.d.ts.map +1 -1
  537. package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
  538. package/lib/typescript/components/RoomComponents/SwipeableRoomRow.d.ts +5 -1
  539. package/lib/typescript/components/RoomComponents/SwipeableRoomRow.d.ts.map +1 -1
  540. package/lib/typescript/components/Thread/ThreadHeader.d.ts.map +1 -1
  541. package/lib/typescript/components/Thread/ThreadWrapper.d.ts +1 -0
  542. package/lib/typescript/components/Thread/ThreadWrapper.d.ts.map +1 -1
  543. package/lib/typescript/components/styled/AudioDecoderHost.d.ts +39 -0
  544. package/lib/typescript/components/styled/AudioDecoderHost.d.ts.map +1 -0
  545. package/lib/typescript/components/styled/AudioMessage.d.ts +14 -1
  546. package/lib/typescript/components/styled/AudioMessage.d.ts.map +1 -1
  547. package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
  548. package/lib/typescript/context/MessageNotificationContext.d.ts.map +1 -1
  549. package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
  550. package/lib/typescript/helpers/audioWaveform.d.ts +54 -0
  551. package/lib/typescript/helpers/audioWaveform.d.ts.map +1 -0
  552. package/lib/typescript/helpers/backgroundJoinSweep.d.ts +14 -0
  553. package/lib/typescript/helpers/backgroundJoinSweep.d.ts.map +1 -0
  554. package/lib/typescript/helpers/bubbleHighlight.d.ts +17 -0
  555. package/lib/typescript/helpers/bubbleHighlight.d.ts.map +1 -0
  556. package/lib/typescript/helpers/checkUniqueUsers.d.ts +2 -2
  557. package/lib/typescript/helpers/checkUniqueUsers.d.ts.map +1 -1
  558. package/lib/typescript/helpers/constants/MODAL_COMPONENTS.d.ts.map +1 -1
  559. package/lib/typescript/helpers/constants/MODAL_TYPES.d.ts +2 -0
  560. package/lib/typescript/helpers/constants/MODAL_TYPES.d.ts.map +1 -1
  561. package/lib/typescript/helpers/createRoomFromApi.d.ts +25 -0
  562. package/lib/typescript/helpers/createRoomFromApi.d.ts.map +1 -1
  563. package/lib/typescript/helpers/dedupeMembers.d.ts +11 -0
  564. package/lib/typescript/helpers/dedupeMembers.d.ts.map +1 -0
  565. package/lib/typescript/helpers/ethoraLogger.d.ts +13 -0
  566. package/lib/typescript/helpers/ethoraLogger.d.ts.map +1 -0
  567. package/lib/typescript/helpers/getUnnamedUsers.d.ts.map +1 -1
  568. package/lib/typescript/helpers/historyPreloadConfig.d.ts +26 -0
  569. package/lib/typescript/helpers/historyPreloadConfig.d.ts.map +1 -0
  570. package/lib/typescript/helpers/historyPreloadScheduler.d.ts +8 -4
  571. package/lib/typescript/helpers/historyPreloadScheduler.d.ts.map +1 -1
  572. package/lib/typescript/helpers/initRoomsPresence.d.ts +7 -0
  573. package/lib/typescript/helpers/initRoomsPresence.d.ts.map +1 -1
  574. package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts.map +1 -1
  575. package/lib/typescript/helpers/isLikelyMucJid.d.ts +19 -0
  576. package/lib/typescript/helpers/isLikelyMucJid.d.ts.map +1 -0
  577. package/lib/typescript/helpers/isMessageSearchEnabled.d.ts +12 -0
  578. package/lib/typescript/helpers/isMessageSearchEnabled.d.ts.map +1 -0
  579. package/lib/typescript/helpers/joiningRoom.d.ts +7 -0
  580. package/lib/typescript/helpers/joiningRoom.d.ts.map +1 -0
  581. package/lib/typescript/helpers/jumpThread.d.ts +48 -0
  582. package/lib/typescript/helpers/jumpThread.d.ts.map +1 -0
  583. package/lib/typescript/helpers/jumpToMessage.d.ts +26 -0
  584. package/lib/typescript/helpers/jumpToMessage.d.ts.map +1 -0
  585. package/lib/typescript/helpers/jumpWindow.d.ts +74 -0
  586. package/lib/typescript/helpers/jumpWindow.d.ts.map +1 -0
  587. package/lib/typescript/helpers/loadRoomHistory.d.ts +34 -0
  588. package/lib/typescript/helpers/loadRoomHistory.d.ts.map +1 -0
  589. package/lib/typescript/helpers/notificationPolicy.d.ts +42 -0
  590. package/lib/typescript/helpers/notificationPolicy.d.ts.map +1 -0
  591. package/lib/typescript/helpers/openRoomAtMessage.d.ts +17 -0
  592. package/lib/typescript/helpers/openRoomAtMessage.d.ts.map +1 -0
  593. package/lib/typescript/helpers/openThreadForJump.d.ts +27 -0
  594. package/lib/typescript/helpers/openThreadForJump.d.ts.map +1 -0
  595. package/lib/typescript/helpers/parseMessageReference.d.ts +18 -5
  596. package/lib/typescript/helpers/parseMessageReference.d.ts.map +1 -1
  597. package/lib/typescript/helpers/publicChatsEntry.d.ts +11 -0
  598. package/lib/typescript/helpers/publicChatsEntry.d.ts.map +1 -0
  599. package/lib/typescript/helpers/roomActivityScore.d.ts +5 -0
  600. package/lib/typescript/helpers/roomActivityScore.d.ts.map +1 -0
  601. package/lib/typescript/helpers/roomUserCount.d.ts +20 -0
  602. package/lib/typescript/helpers/roomUserCount.d.ts.map +1 -0
  603. package/lib/typescript/helpers/runConfiguredHistoryPreload.d.ts +21 -0
  604. package/lib/typescript/helpers/runConfiguredHistoryPreload.d.ts.map +1 -0
  605. package/lib/typescript/helpers/sessionAppId.d.ts +8 -0
  606. package/lib/typescript/helpers/sessionAppId.d.ts.map +1 -0
  607. package/lib/typescript/helpers/timestamp.d.ts +3 -0
  608. package/lib/typescript/helpers/timestamp.d.ts.map +1 -0
  609. package/lib/typescript/helpers/userResolver.d.ts +58 -0
  610. package/lib/typescript/helpers/userResolver.d.ts.map +1 -0
  611. package/lib/typescript/helpers/xmppIdShape.d.ts +10 -0
  612. package/lib/typescript/helpers/xmppIdShape.d.ts.map +1 -0
  613. package/lib/typescript/hooks/useChatWrapperInit.d.ts +2 -0
  614. package/lib/typescript/hooks/useChatWrapperInit.d.ts.map +1 -1
  615. package/lib/typescript/hooks/useHeapSender.d.ts.map +1 -1
  616. package/lib/typescript/hooks/useJumpToMessage.d.ts +116 -0
  617. package/lib/typescript/hooks/useJumpToMessage.d.ts.map +1 -0
  618. package/lib/typescript/hooks/useMessageLoaderQueue.d.ts.map +1 -1
  619. package/lib/typescript/hooks/useMessageQueue.d.ts.map +1 -1
  620. package/lib/typescript/hooks/useRoomDirectory.d.ts +12 -0
  621. package/lib/typescript/hooks/useRoomDirectory.d.ts.map +1 -0
  622. package/lib/typescript/hooks/useRoomInitialization.d.ts.map +1 -1
  623. package/lib/typescript/hooks/useRoomMute.d.ts +8 -0
  624. package/lib/typescript/hooks/useRoomMute.d.ts.map +1 -0
  625. package/lib/typescript/hooks/useRoomState.d.ts +1 -0
  626. package/lib/typescript/hooks/useRoomState.d.ts.map +1 -1
  627. package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
  628. package/lib/typescript/i18n/strings.d.ts.map +1 -1
  629. package/lib/typescript/networking/api-requests/messageSearch.api.d.ts +57 -0
  630. package/lib/typescript/networking/api-requests/messageSearch.api.d.ts.map +1 -0
  631. package/lib/typescript/networking/api-requests/publicChats.api.d.ts +24 -0
  632. package/lib/typescript/networking/api-requests/publicChats.api.d.ts.map +1 -0
  633. package/lib/typescript/networking/api-requests/roomMembers.api.d.ts +19 -1
  634. package/lib/typescript/networking/api-requests/roomMembers.api.d.ts.map +1 -1
  635. package/lib/typescript/networking/api-requests/rooms.api.d.ts.map +1 -1
  636. package/lib/typescript/networking/api-requests/user.api.d.ts +8 -0
  637. package/lib/typescript/networking/api-requests/user.api.d.ts.map +1 -1
  638. package/lib/typescript/networking/api-requests/xmppToken.api.d.ts +2 -0
  639. package/lib/typescript/networking/api-requests/xmppToken.api.d.ts.map +1 -0
  640. package/lib/typescript/networking/ethoraEvents.d.ts +45 -0
  641. package/lib/typescript/networking/ethoraEvents.d.ts.map +1 -0
  642. package/lib/typescript/networking/stanzaHandlers.d.ts +1 -1
  643. package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
  644. package/lib/typescript/networking/xmpp/allRoomPresences.xmpp.d.ts +32 -1
  645. package/lib/typescript/networking/xmpp/allRoomPresences.xmpp.d.ts.map +1 -1
  646. package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts +64 -0
  647. package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts.map +1 -1
  648. package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts.map +1 -1
  649. package/lib/typescript/networking/xmpp/historyCursor.d.ts +35 -0
  650. package/lib/typescript/networking/xmpp/historyCursor.d.ts.map +1 -0
  651. package/lib/typescript/networking/xmpp/mamQueryIds.d.ts +10 -0
  652. package/lib/typescript/networking/xmpp/mamQueryIds.d.ts.map +1 -0
  653. package/lib/typescript/networking/xmpp/mamRouter.d.ts +7 -0
  654. package/lib/typescript/networking/xmpp/mamRouter.d.ts.map +1 -1
  655. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts +13 -2
  656. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts.map +1 -1
  657. package/lib/typescript/networking/xmpp/roomJoinSweep.d.ts +82 -0
  658. package/lib/typescript/networking/xmpp/roomJoinSweep.d.ts.map +1 -0
  659. package/lib/typescript/networking/xmpp/sendMediaMessage.xmpp.d.ts.map +1 -1
  660. package/lib/typescript/networking/xmpp/sendTextMessage.xmpp.d.ts.map +1 -1
  661. package/lib/typescript/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.d.ts.map +1 -1
  662. package/lib/typescript/networking/xmppClient.d.ts +90 -4
  663. package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
  664. package/lib/typescript/networking/xmppCredentials.d.ts +12 -0
  665. package/lib/typescript/networking/xmppCredentials.d.ts.map +1 -0
  666. package/lib/typescript/roomStore/Middleware/jumpThreadMiddleware.d.ts +3 -0
  667. package/lib/typescript/roomStore/Middleware/jumpThreadMiddleware.d.ts.map +1 -0
  668. package/lib/typescript/roomStore/Middleware/reactionsMiddleware.d.ts.map +1 -1
  669. package/lib/typescript/roomStore/Middleware/unreadMidlleware.d.ts.map +1 -1
  670. package/lib/typescript/roomStore/chatSettingsSlice.d.ts +8 -1
  671. package/lib/typescript/roomStore/chatSettingsSlice.d.ts.map +1 -1
  672. package/lib/typescript/roomStore/index.d.ts +2 -1
  673. package/lib/typescript/roomStore/index.d.ts.map +1 -1
  674. package/lib/typescript/roomStore/persistence.d.ts +8 -0
  675. package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
  676. package/lib/typescript/roomStore/roomsSlice.d.ts +138 -2
  677. package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
  678. package/lib/typescript/roomStore/safeKey.d.ts +13 -0
  679. package/lib/typescript/roomStore/safeKey.d.ts.map +1 -0
  680. package/lib/typescript/roomStore/usersSetCap.d.ts +16 -0
  681. package/lib/typescript/roomStore/usersSetCap.d.ts.map +1 -0
  682. package/lib/typescript/types/models/media.model.d.ts +2 -0
  683. package/lib/typescript/types/models/media.model.d.ts.map +1 -1
  684. package/lib/typescript/types/models/room.model.d.ts +18 -5
  685. package/lib/typescript/types/models/room.model.d.ts.map +1 -1
  686. package/lib/typescript/types/models/xmpp.model.d.ts +8 -1
  687. package/lib/typescript/types/models/xmpp.model.d.ts.map +1 -1
  688. package/lib/typescript/types/types.d.ts +88 -5
  689. package/lib/typescript/types/types.d.ts.map +1 -1
  690. package/lib/typescript/version.d.ts +1 -1
  691. package/lib/typescript/version.d.ts.map +1 -1
  692. package/package.json +1 -1
  693. package/src/assets/icons.tsx +13 -0
  694. package/src/components/Header/HeaderRoomList.tsx +21 -4
  695. package/src/components/InputComponents/Search.tsx +33 -0
  696. package/src/components/MainComponents/ArchivedMessageCard.tsx +139 -0
  697. package/src/components/MainComponents/ChatHeader.tsx +19 -3
  698. package/src/components/MainComponents/ChatRoom.tsx +60 -23
  699. package/src/components/MainComponents/ChatWrapper.tsx +23 -4
  700. package/src/components/MainComponents/MediaMessage.tsx +17 -0
  701. package/src/components/MainComponents/MessageList.tsx +823 -84
  702. package/src/components/MainComponents/MessageSearchButton.tsx +48 -0
  703. package/src/components/MainComponents/ReduxWrapper.tsx +16 -5
  704. package/src/components/MainComponents/RoomList.tsx +125 -0
  705. package/src/components/Menu/HeaderRoomListMenu.tsx +26 -2
  706. package/src/components/MessageBubble/BubbleHighlight.tsx +106 -0
  707. package/src/components/MessageBubble/Message.tsx +265 -177
  708. package/src/components/MessageBubble/MessageInteractions.tsx +109 -86
  709. package/src/components/MessageBubble/messageMenuLayout.ts +59 -0
  710. package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +92 -21
  711. package/src/components/Modals/MessageSearchModal/MessageHitResults.tsx +271 -0
  712. package/src/components/Modals/MessageSearchModal/MessageSearchModal.tsx +487 -0
  713. package/src/components/Modals/MessageSearchModal/openHit.ts +50 -0
  714. package/src/components/Modals/MessageSearchModal/resolveSender.ts +57 -0
  715. package/src/components/Modals/MessageSearchModal/searchFilters.ts +109 -0
  716. package/src/components/Modals/MessageSearchModal/snippet.ts +58 -0
  717. package/src/components/Modals/MessageSearchModal/useMessageSearch.ts +151 -0
  718. package/src/components/Modals/PublicChatsModal/PublicChatsModal.tsx +288 -0
  719. package/src/components/Modals/PublicChatsModal/publicChatsLogic.ts +36 -0
  720. package/src/components/Modals/SelectUsersModal/SelectUsersModal.tsx +8 -1
  721. package/src/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.tsx +20 -17
  722. package/src/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.tsx +58 -55
  723. package/src/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.tsx +156 -62
  724. package/src/components/Modals/SettingsModals/ProfileShares/ProfileShares.tsx +22 -19
  725. package/src/components/Modals/SettingsModals/Referrals/Referrals.tsx +48 -45
  726. package/src/components/Modals/SettingsModals/SharedStyledComponents.ts +11 -0
  727. package/src/components/Modals/SettingsModals/Visibility/VisibilityModal.tsx +63 -60
  728. package/src/components/Modals/UserSettingsModal/UserSettingsModal.tsx +11 -3
  729. package/src/components/RoomComponents/ChatRoomItem.tsx +16 -3
  730. package/src/components/RoomComponents/SwipeableRoomRow.tsx +39 -6
  731. package/src/components/Thread/ThreadHeader.tsx +3 -1
  732. package/src/components/Thread/ThreadWrapper.tsx +96 -10
  733. package/src/components/styled/AudioDecoderHost.tsx +351 -0
  734. package/src/components/styled/AudioMessage.tsx +482 -425
  735. package/src/components/styled/SendInput.tsx +42 -4
  736. package/src/context/MessageNotificationContext.tsx +19 -5
  737. package/src/context/xmppProvider.tsx +44 -91
  738. package/src/helpers/audioWaveform.ts +142 -0
  739. package/src/helpers/backgroundJoinSweep.ts +35 -0
  740. package/src/helpers/bubbleHighlight.ts +47 -0
  741. package/src/helpers/checkUniqueUsers.tsx +15 -17
  742. package/src/helpers/constants/MODAL_COMPONENTS.tsx +4 -0
  743. package/src/helpers/constants/MODAL_TYPES.ts +3 -0
  744. package/src/helpers/createRoomFromApi.tsx +45 -4
  745. package/src/helpers/dedupeMembers.ts +29 -0
  746. package/src/helpers/ethoraLogger.ts +50 -0
  747. package/src/helpers/getUnnamedUsers.ts +7 -4
  748. package/src/helpers/historyPreloadConfig.ts +68 -0
  749. package/src/helpers/historyPreloadScheduler.ts +437 -199
  750. package/src/helpers/initRoomsPresence.ts +20 -7
  751. package/src/helpers/insertMessageWithDelimiter.ts +3 -0
  752. package/src/helpers/isLikelyMucJid.ts +72 -0
  753. package/src/helpers/isMessageSearchEnabled.ts +18 -0
  754. package/src/helpers/joiningRoom.ts +13 -0
  755. package/src/helpers/jumpThread.ts +102 -0
  756. package/src/helpers/jumpToMessage.ts +57 -0
  757. package/src/helpers/jumpWindow.ts +212 -0
  758. package/src/helpers/loadRoomHistory.ts +83 -0
  759. package/src/helpers/notificationPolicy.ts +82 -0
  760. package/src/helpers/openRoomAtMessage.ts +38 -0
  761. package/src/helpers/openThreadForJump.ts +96 -0
  762. package/src/helpers/parseMessageReference.ts +37 -8
  763. package/src/helpers/publicChatsEntry.ts +15 -0
  764. package/src/helpers/roomActivityScore.ts +45 -0
  765. package/src/helpers/roomUserCount.ts +44 -0
  766. package/src/helpers/runConfiguredHistoryPreload.ts +76 -0
  767. package/src/helpers/sessionAppId.ts +17 -0
  768. package/src/helpers/timestamp.ts +44 -0
  769. package/src/helpers/userResolver.ts +542 -0
  770. package/src/helpers/xmppIdShape.ts +46 -0
  771. package/src/hooks/useChatWrapperInit.ts +22 -4
  772. package/src/hooks/useHeapSender.tsx +54 -3
  773. package/src/hooks/useJumpToMessage.ts +538 -0
  774. package/src/hooks/useMessageLoaderQueue.tsx +40 -4
  775. package/src/hooks/useMessageQueue.ts +9 -5
  776. package/src/hooks/useRoomDirectory.ts +39 -0
  777. package/src/hooks/useRoomInitialization.tsx +33 -7
  778. package/src/hooks/useRoomMute.ts +42 -0
  779. package/src/hooks/useRoomState.tsx +6 -0
  780. package/src/hooks/useSendMessage.tsx +14 -2
  781. package/src/i18n/strings.ts +306 -0
  782. package/src/networking/api-requests/messageSearch.api.ts +130 -0
  783. package/src/networking/api-requests/publicChats.api.ts +71 -0
  784. package/src/networking/api-requests/roomMembers.api.ts +263 -11
  785. package/src/networking/api-requests/rooms.api.ts +52 -12
  786. package/src/networking/api-requests/user.api.ts +28 -2
  787. package/src/networking/api-requests/xmppToken.api.ts +62 -0
  788. package/src/networking/ethoraEvents.ts +262 -0
  789. package/src/networking/stanzaHandlers.ts +145 -19
  790. package/src/networking/xmpp/allRoomPresences.xmpp.ts +155 -5
  791. package/src/networking/xmpp/getHistory.xmpp.ts +433 -47
  792. package/src/networking/xmpp/handleStanzas.xmpp.ts +8 -0
  793. package/src/networking/xmpp/historyCursor.ts +124 -0
  794. package/src/networking/xmpp/mamQueryIds.ts +11 -0
  795. package/src/networking/xmpp/mamRouter.ts +24 -10
  796. package/src/networking/xmpp/presenceInRoom.xmpp.ts +91 -68
  797. package/src/networking/xmpp/roomJoinSweep.ts +412 -0
  798. package/src/networking/xmpp/sendMediaMessage.xmpp.ts +0 -1
  799. package/src/networking/xmpp/sendTextMessage.xmpp.ts +0 -1
  800. package/src/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.ts +0 -1
  801. package/src/networking/xmppClient.ts +323 -47
  802. package/src/networking/xmppCredentials.ts +87 -0
  803. package/src/roomStore/Middleware/jumpThreadMiddleware.ts +163 -0
  804. package/src/roomStore/Middleware/reactionsMiddleware.tsx +4 -0
  805. package/src/roomStore/Middleware/unreadMidlleware.tsx +59 -11
  806. package/src/roomStore/chatSettingsSlice.ts +17 -0
  807. package/src/roomStore/index.ts +10 -3
  808. package/src/roomStore/persistence.ts +54 -0
  809. package/src/roomStore/roomsSlice.ts +547 -65
  810. package/src/roomStore/safeKey.ts +49 -0
  811. package/src/roomStore/usersSetCap.ts +37 -0
  812. package/src/types/models/media.model.ts +4 -0
  813. package/src/types/models/room.model.ts +18 -5
  814. package/src/types/models/xmpp.model.ts +15 -1
  815. package/src/types/types.ts +93 -5
  816. package/src/version.ts +1 -1
@@ -2,7 +2,15 @@ import XmppClient from '../networking/xmppClient';
2
2
  import { IRoom } from '../types/types';
3
3
  import { presenceInRoom } from '../networking/xmpp/presenceInRoom.xmpp';
4
4
  import { pushSubscriptionService } from '../services/pushSubscriptionService';
5
+ import { startBackgroundJoinSweep } from './backgroundJoinSweep';
5
6
 
7
+ /**
8
+ * Joins the known rooms and subscribes them for push. Callers should NOT
9
+ * await it on a path that gates first paint: with a real XmppClient the
10
+ * joins are the shared background sweep (open room first, then recent
11
+ * activity, bounded concurrency), started here and not waited for. Only a
12
+ * bare client without the sweep falls back to joining every room at once.
13
+ */
6
14
  export const initRoomsPresence = async (
7
15
  client: XmppClient,
8
16
  rooms: { [jid: string]: IRoom }
@@ -11,13 +19,18 @@ export const initRoomsPresence = async (
11
19
  if (!client) {return null;}
12
20
  const jids = Object.keys(rooms || {});
13
21
  if (!jids.length) {return null;}
14
- await Promise.allSettled(
15
- jids.map(async (jid) => {
16
- try {
17
- await presenceInRoom(client.client, jid);
18
- } catch (e) {}
19
- })
20
- );
22
+
23
+ if (typeof (client as any).sendAllPresencesAndMarkReady === 'function') {
24
+ startBackgroundJoinSweep(client);
25
+ } else {
26
+ await Promise.allSettled(
27
+ jids.map(async (jid) => {
28
+ try {
29
+ await presenceInRoom(client.client, jid);
30
+ } catch (e) {}
31
+ })
32
+ );
33
+ }
21
34
 
22
35
  if (jids.length > 0 && client.client) {
23
36
  const userNick = client.client.jid?.getLocal();
@@ -1,5 +1,6 @@
1
1
  import { IMessage } from '../types/types';
2
2
  import { msgSortableMs } from './msgSortableMs';
3
+ import { isSafeKey } from '../roomStore/safeKey';
3
4
 
4
5
  // Robustly resolve a caller-supplied read marker to epoch milliseconds.
5
6
  // Callers pass a plain number (the redux read boundary, or a room's
@@ -32,6 +33,8 @@ function resolveMarkerMs(
32
33
 
33
34
  function deepMerge(target: any, source: any): any {
34
35
  for (const key in source) {
36
+ // Never walk into the prototype chain through attacker-shaped keys.
37
+ if (!isSafeKey(key)) {continue;}
35
38
  if (source[key] === undefined) {
36
39
  // `for...in` visits a key even when its value is `undefined` — every
37
40
  // stanza parser (getDataFromXml/createMessageFromXml) returns an
@@ -0,0 +1,72 @@
1
+ // Real MUC room JIDs always look like `<localpart>@conference.<host>`. Various
2
+ // state-map iterations over `rooms.rooms` (history preload, presence sweeps,
3
+ // catch-up sync) can encounter non-room entries - corrupted/legacy persisted
4
+ // state where root-slice keys (`activeRoomJID`, `usersSet`, `subscribedRooms`,
5
+ // `pushSubscriptionStatus`, `rooms` itself) leaked into the rooms map, or a
6
+ // bare app ID without the conference suffix. Treating those as room JIDs sends
7
+ // MAM/presence requests for garbage names, wasting queue slots and network
8
+ // round-trips that could go to real rooms instead. Filter with this before
9
+ // any operation that fans out over "all rooms".
10
+ export const isLikelyMucJid = (jid: unknown): jid is string => {
11
+ if (typeof jid !== 'string' || !jid) return false;
12
+ const at = jid.indexOf('@');
13
+ if (at <= 0) return false;
14
+ const domain = jid.slice(at + 1).split('/')[0];
15
+ return domain.includes('.') && domain.startsWith('conference.');
16
+ };
17
+
18
+ /**
19
+ * Root keys of the rooms slice. When a caller fans out over the slice itself
20
+ * instead of `slice.rooms`, these leak through as if they were room ids, and
21
+ * anything that appends the conference domain then produces real-looking but
22
+ * nonexistent JIDs (`usersSet@conference.host`), which the server answers with
23
+ * "Conference room does not exist". Cheap explicit denylist so the failure is
24
+ * named rather than mysterious.
25
+ */
26
+ const ROOMS_SLICE_ROOT_KEYS = new Set([
27
+ 'rooms',
28
+ 'activeRoomJID',
29
+ 'isChatUiVisible',
30
+ 'isLoading',
31
+ 'editAction',
32
+ 'usersSet',
33
+ 'presenceByRoom',
34
+ 'reportRoom',
35
+ 'subscribedRooms',
36
+ 'pushSubscriptionStatus',
37
+ 'loadingText',
38
+ ]);
39
+
40
+ /**
41
+ * True when `value` can be used as the localpart of a MUC room JID, i.e. it is
42
+ * safe to build `${value}@conference.<host>` from it.
43
+ *
44
+ * Ethora room localparts are always `<appId>_<roomId>`, so the underscore is a
45
+ * reliable discriminator against slice keys, plain flags and stray strings.
46
+ * Callers that already hold a full JID should use `isLikelyMucJid` instead.
47
+ */
48
+ export const isLikelyRoomLocalpart = (value: unknown): value is string => {
49
+ if (typeof value !== 'string') return false;
50
+ const v = value.trim();
51
+ if (!v || v.includes('@')) return false;
52
+ if (ROOMS_SLICE_ROOT_KEYS.has(v)) return false;
53
+ return v.includes('_');
54
+ };
55
+
56
+ /**
57
+ * Normalise a room reference into a full MUC JID, or return null when the
58
+ * input cannot be one. Use at every point that would otherwise blindly do
59
+ * `chatJID.includes('@') ? chatJID : chatJID + '@' + conference`: that pattern
60
+ * silently manufactures a valid-looking JID out of any garbage handed to it,
61
+ * which is how slice keys ended up being joined as rooms.
62
+ */
63
+ export const toRoomJid = (
64
+ chatJID: unknown,
65
+ conference: string | undefined
66
+ ): string | null => {
67
+ if (typeof chatJID !== 'string' || !chatJID) return null;
68
+ if (chatJID.includes('@')) return chatJID;
69
+ if (!conference) return null;
70
+ if (!isLikelyRoomLocalpart(chatJID)) return null;
71
+ return `${chatJID}@${conference}`;
72
+ };
@@ -0,0 +1,18 @@
1
+ import type { IConfig } from '../types/types';
2
+
3
+ /**
4
+ * Single gate for every message search entry point (header button, chat
5
+ * profile row, the search screen and its request).
6
+ *
7
+ * Search is opt-in: it needs `enableMessageSearch: true` and an `appId` (the
8
+ * archive it queries is scoped by app). The deprecated `disableMessageSearch`
9
+ * is still honoured as a hard off.
10
+ */
11
+ export const isMessageSearchEnabled = (
12
+ config?: Pick<IConfig, 'enableMessageSearch' | 'disableMessageSearch' | 'appId'> | null
13
+ ): boolean =>
14
+ Boolean(config?.enableMessageSearch) &&
15
+ Boolean(config?.appId) &&
16
+ !config?.disableMessageSearch;
17
+
18
+ export default isMessageSearchEnabled;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * True while the pane should say "joining" instead of "choose a chat": the
3
+ * requested room is not in the list yet and a join for exactly that room is
4
+ * in flight (see useRoomInitialization).
5
+ */
6
+ export const isJoiningRoom = (
7
+ activeRoomJID: string | null | undefined,
8
+ roomsList: Record<string, unknown> | undefined,
9
+ joiningRoomJID: string | null | undefined
10
+ ): boolean =>
11
+ Boolean(activeRoomJID) &&
12
+ !roomsList?.[activeRoomJID as string] &&
13
+ joiningRoomJID === activeRoomJID;
@@ -0,0 +1,102 @@
1
+ import { useSyncExternalStore } from 'react';
2
+ import { IMessage } from '../types/types';
3
+ import { parseMessageReference } from './parseMessageReference';
4
+ import { findMessageIndex } from './jumpToMessage';
5
+
6
+ // The id/content lookup is shared with the jump-to-message scroll helper.
7
+ export { findMessageIndex };
8
+
9
+ /** How long a jump request may stay pending before it is dropped. */
10
+ export const JUMP_TTL_MS = 60_000;
11
+
12
+ /**
13
+ * Where a jump to a thread REPLY lands, and the thread panel's parent message
14
+ * when that message is not in the room's live list.
15
+ *
16
+ * Replies never appear in the main list (it hides them unless they are also
17
+ * shown in the channel), so a jump to one has to open its parent's thread and
18
+ * highlight the reply there. Two things have to be remembered for that:
19
+ * - which list owns the jump: `at` is the pending request this entry serves,
20
+ * `parentId` the thread that owns it. The main list stays inert for a jump
21
+ * that has an owner thread, and a thread list stays inert for any jump that
22
+ * is not its own (see useJumpToMessage);
23
+ * - the parent and the replies when they exist only in a jump window or came
24
+ * from a separate fetch: the thread panel reads them from here, so it does
25
+ * not depend on the window that found them still being on screen.
26
+ *
27
+ * Kept outside redux on purpose: the room slice's thread flag lives on
28
+ * messages of the live list, which is exactly what these messages are not in.
29
+ */
30
+ export interface JumpThreadState {
31
+ roomJID: string;
32
+ parentId: string;
33
+ /** The pending request this entry serves; null for a thread opened by hand. */
34
+ at: number | null;
35
+ /** Set only when the parent is not in the room's live messages. */
36
+ parent: IMessage | null;
37
+ /** Replies known to belong to the thread beyond the live list. */
38
+ replies: IMessage[];
39
+ }
40
+
41
+ let state: JumpThreadState | null = null;
42
+ const listeners = new Set<() => void>();
43
+
44
+ const emit = () => listeners.forEach((listener) => listener());
45
+
46
+ export const getJumpThread = (): JumpThreadState | null => state;
47
+
48
+ export const setJumpThread = (next: JumpThreadState | null): void => {
49
+ state = next;
50
+ emit();
51
+ };
52
+
53
+ export const clearJumpThread = (): void => {
54
+ if (state === null) return;
55
+ state = null;
56
+ emit();
57
+ };
58
+
59
+ export const subscribeJumpThread = (listener: () => void): (() => void) => {
60
+ listeners.add(listener);
61
+ return () => {
62
+ listeners.delete(listener);
63
+ };
64
+ };
65
+
66
+ export const useJumpThread = (): JumpThreadState | null =>
67
+ useSyncExternalStore(subscribeJumpThread, getJumpThread, getJumpThread);
68
+
69
+ /** The thread that owns the jump `at`, or null when the main list does. */
70
+ export const ownerThreadFor = (
71
+ thread: JumpThreadState | null,
72
+ at: number | undefined
73
+ ): string | null =>
74
+ thread && at !== undefined && thread.at === at ? thread.parentId : null;
75
+
76
+ /**
77
+ * The parent id of a message that is a thread reply and nothing else, or null:
78
+ * a reply also shown in the channel is in the main list, so it needs no thread.
79
+ */
80
+ export const replyParentId = (message: IMessage): string | null => {
81
+ if (!message || String(message.isReply) !== 'true') return null;
82
+ if (String(message.showInChannel) === 'true') return null;
83
+ const id = parseMessageReference(message.mainMessage)?.id;
84
+ return id ? String(id) : null;
85
+ };
86
+
87
+ /** `a` then `b`, one entry per message id, oldest first. */
88
+ export const mergeById = (a: IMessage[], b: IMessage[]): IMessage[] => {
89
+ const seen = new Set<string>();
90
+ const merged: IMessage[] = [];
91
+ for (const message of [...a, ...b]) {
92
+ const key = String(message.id);
93
+ if (seen.has(key)) continue;
94
+ seen.add(key);
95
+ merged.push(message);
96
+ }
97
+ const time = (message: IMessage) => {
98
+ const value = new Date(message.date).getTime();
99
+ return Number.isNaN(value) ? 0 : value;
100
+ };
101
+ return merged.sort((x, y) => time(x) - time(y));
102
+ };
@@ -0,0 +1,57 @@
1
+ import type { IMessage } from '../types/types';
2
+
3
+ // How far apart the archive's timestamp and the transcript's may be for the
4
+ // same message. They are recorded by different components, so they are not
5
+ // identical, but never more than a moment apart.
6
+ export const CONTENT_MATCH_WINDOW_MS = 5000;
7
+
8
+ /**
9
+ * Index of the message a jump names.
10
+ *
11
+ * By id first (message.id is the MAM stanza id for history, xmppId the client
12
+ * message id). When the request has no id at all, which is common for archive
13
+ * rows, by content: same text, sent within a few seconds of the same time.
14
+ */
15
+ export const findMessageIndex = (
16
+ messages: IMessage[],
17
+ ids: string[],
18
+ content?: { createdAt?: string; body?: string }
19
+ ): number => {
20
+ if (ids.length > 0) {
21
+ const byId = messages.findIndex(
22
+ (message) =>
23
+ ids.includes(String(message.id)) ||
24
+ (message.xmppId ? ids.includes(String(message.xmppId)) : false)
25
+ );
26
+ if (byId >= 0) {return byId;}
27
+ }
28
+
29
+ if (!content?.createdAt || !content.body) {return -1;}
30
+ const wanted = new Date(content.createdAt).getTime();
31
+ if (Number.isNaN(wanted)) {return -1;}
32
+ const body = content.body.trim();
33
+ return messages.findIndex((message) => {
34
+ if (String(message.body ?? '').trim() !== body) {return false;}
35
+ return (
36
+ Math.abs(new Date(message.date).getTime() - wanted) <=
37
+ CONTENT_MATCH_WINDOW_MS
38
+ );
39
+ });
40
+ };
41
+
42
+ export const MAX_SCROLL_RETRIES = 4;
43
+
44
+ /**
45
+ * FlatList only knows the position of rows it has measured, so
46
+ * scrollToIndex fails for a row far from the rendered window. The usual
47
+ * remedy: scroll to an estimated offset (which renders that region), then
48
+ * try scrollToIndex again. Returns the offset to estimate to, or null once
49
+ * the retry budget is spent.
50
+ */
51
+ export const scrollRetryOffset = (
52
+ info: { index: number; averageItemLength: number },
53
+ attempt: number
54
+ ): number | null => {
55
+ if (attempt >= MAX_SCROLL_RETRIES) {return null;}
56
+ return Math.max(0, info.averageItemLength * info.index);
57
+ };
@@ -0,0 +1,212 @@
1
+ import type { HistoryWindowPage } from '../networking/xmppClient';
2
+ import type { JumpWindow } from '../roomStore/roomsSlice';
3
+ import { IMessage } from '../types/types';
4
+
5
+ /** Messages shown above / below the target when a window opens (tunable). */
6
+ export const JUMP_WINDOW_BEFORE = 10;
7
+ export const JUMP_WINDOW_AFTER = 10;
8
+ /** Page size for loading more once the reader scrolls toward either edge. */
9
+ export const JUMP_WINDOW_PAGE = 20;
10
+
11
+ /** The slice of the XMPP client the window helpers need. */
12
+ export interface HistoryWindowClient {
13
+ getHistoryWindow: (
14
+ chatJID: string,
15
+ max: number,
16
+ cursor: { before?: number; after?: number; start?: string; end?: string }
17
+ ) => Promise<HistoryWindowPage>;
18
+ }
19
+
20
+ export type JumpWindowResult =
21
+ /** The window around the target is ready to be shown. */
22
+ | { status: 'found'; window: JumpWindow }
23
+ /** The server answered, and the target is not in the archive. */
24
+ | { status: 'missing' }
25
+ /** No usable id, or a request failed: use the paging path instead. */
26
+ | { status: 'unavailable' };
27
+
28
+ // MAM stanza ids are microsecond timestamps (16 digits today).
29
+ const MAM_ID = /^\d{13,}$/;
30
+
31
+ /**
32
+ * How far apart the archive's timestamp and the transcript's may be for the
33
+ * same message. They are recorded by different components, so they are not
34
+ * identical, but never more than a moment apart.
35
+ */
36
+ export const CONTENT_MATCH_WINDOW_MS = 5000;
37
+ /** Rows asked for per page while locating a row by its time. */
38
+ const TIME_LOOKUP_PAGE = 50;
39
+ /** Pages of the time range read before giving up (a very busy 10 seconds). */
40
+ const TIME_LOOKUP_MAX_PAGES = 4;
41
+
42
+ /** What a hit with no archive id can be located by. */
43
+ export interface JumpContent {
44
+ createdAt?: string;
45
+ body?: string;
46
+ }
47
+
48
+ export const mamIdCandidates = (ids: string[]): string[] =>
49
+ Array.from(new Set(ids.map(String).filter((id) => MAM_ID.test(id))));
50
+
51
+ /**
52
+ * Fetches about JUMP_WINDOW_BEFORE messages before the target, the target and
53
+ * about JUMP_WINDOW_AFTER after it: two MAM queries in parallel (the target
54
+ * itself comes with the "after" page, asked from one microsecond before it).
55
+ * Nothing is written to the store here.
56
+ */
57
+ export async function loadJumpWindow(
58
+ client: HistoryWindowClient,
59
+ roomJID: string,
60
+ ids: string[],
61
+ content?: JumpContent
62
+ ): Promise<JumpWindowResult> {
63
+ const candidates = mamIdCandidates(ids);
64
+ if (candidates.length === 0) {
65
+ return content?.createdAt && content.body
66
+ ? loadJumpWindowByTime(client, roomJID, content)
67
+ : { status: 'unavailable' };
68
+ }
69
+
70
+ // Almost always one candidate; a second is only tried when the first one is
71
+ // not an archive id after all (the server then simply does not return it).
72
+ for (const candidate of candidates) {
73
+ const id = Number(candidate);
74
+ const [older, newer] = await Promise.all([
75
+ client.getHistoryWindow(roomJID, JUMP_WINDOW_BEFORE, { before: id }),
76
+ client.getHistoryWindow(roomJID, JUMP_WINDOW_AFTER + 1, {
77
+ after: id - 1,
78
+ }),
79
+ ]);
80
+ if (!older.ok || !newer.ok) return { status: 'unavailable' };
81
+
82
+ const target = newer.messages.find(
83
+ (message) => String(message.id) === candidate
84
+ );
85
+ if (!target) continue;
86
+
87
+ return {
88
+ status: 'found',
89
+ window: {
90
+ roomJID,
91
+ messages: [...older.messages, ...newer.messages],
92
+ targetId: String(target.id),
93
+ olderCursor: older.first ?? id,
94
+ hasOlder: !older.complete && older.first !== null,
95
+ newerCursor: newer.last ?? id,
96
+ hasNewer: !newer.complete && newer.last !== null,
97
+ },
98
+ };
99
+ }
100
+ // None of the ids was an archive id. A hit that also knows its text and time
101
+ // can still be located by them.
102
+ if (content?.createdAt && content.body) {
103
+ return loadJumpWindowByTime(client, roomJID, content);
104
+ }
105
+ return { status: 'missing' };
106
+ }
107
+
108
+ /**
109
+ * For a hit with no usable archive id (older archive documents carry neither a
110
+ * stanza id nor a message id): ask the server for the rows within a few
111
+ * seconds of its timestamp (MAM start/end filter), find the one with the same
112
+ * text, and continue exactly as the id-based window does with that row's id.
113
+ * The server's answer is final: 'missing' only when it said the range holds no
114
+ * such row.
115
+ */
116
+ export async function loadJumpWindowByTime(
117
+ client: HistoryWindowClient,
118
+ roomJID: string,
119
+ content: JumpContent
120
+ ): Promise<JumpWindowResult> {
121
+ const wanted = new Date(content.createdAt ?? '').getTime();
122
+ const body = (content.body ?? '').trim();
123
+ if (Number.isNaN(wanted) || !body) return { status: 'unavailable' };
124
+
125
+ const start = new Date(wanted - CONTENT_MATCH_WINDOW_MS).toISOString();
126
+ const end = new Date(wanted + CONTENT_MATCH_WINDOW_MS).toISOString();
127
+
128
+ let after: number | undefined;
129
+ let best: IMessage | null = null;
130
+ for (let page = 0; page < TIME_LOOKUP_MAX_PAGES; page += 1) {
131
+ const result = await client.getHistoryWindow(
132
+ roomJID,
133
+ TIME_LOOKUP_PAGE,
134
+ after === undefined ? { start, end } : { start, end, after }
135
+ );
136
+ if (!result.ok) return { status: 'unavailable' };
137
+ for (const message of result.messages) {
138
+ if (String(message.body ?? '').trim() !== body) continue;
139
+ const gap = Math.abs(new Date(message.date).getTime() - wanted);
140
+ if (gap > CONTENT_MATCH_WINDOW_MS) continue;
141
+ if (
142
+ !best ||
143
+ gap < Math.abs(new Date(best.date).getTime() - wanted)
144
+ ) {
145
+ best = message;
146
+ }
147
+ }
148
+ if (best) break;
149
+ if (result.complete || result.last === null) {
150
+ return { status: 'missing' };
151
+ }
152
+ after = result.last;
153
+ }
154
+ if (!best) return { status: 'unavailable' };
155
+
156
+ const id = String(best.id);
157
+ if (!MAM_ID.test(id)) return { status: 'unavailable' };
158
+ return loadJumpWindow(client, roomJID, [id]);
159
+ }
160
+
161
+ export interface OlderWindowPage {
162
+ messages: IMessage[];
163
+ olderCursor: number | null;
164
+ hasOlder: boolean;
165
+ }
166
+
167
+ export interface NewerWindowPage {
168
+ messages: IMessage[];
169
+ newerCursor: number | null;
170
+ hasNewer: boolean;
171
+ }
172
+
173
+ /** The page above the window; null when the request failed. */
174
+ export async function loadOlderWindowPage(
175
+ client: HistoryWindowClient,
176
+ window: JumpWindow
177
+ ): Promise<OlderWindowPage | null> {
178
+ if (window.olderCursor === null) {
179
+ return { messages: [], olderCursor: null, hasOlder: false };
180
+ }
181
+ const page = await client.getHistoryWindow(window.roomJID, JUMP_WINDOW_PAGE, {
182
+ before: window.olderCursor,
183
+ });
184
+ if (!page.ok) return null;
185
+ // A page that does not move the cursor would be asked for again forever.
186
+ const progressed = page.first !== null && page.first < window.olderCursor;
187
+ return {
188
+ messages: page.messages,
189
+ olderCursor: progressed ? page.first : window.olderCursor,
190
+ hasOlder: progressed && !page.complete,
191
+ };
192
+ }
193
+
194
+ /** The page below the window; null when the request failed. */
195
+ export async function loadNewerWindowPage(
196
+ client: HistoryWindowClient,
197
+ window: JumpWindow
198
+ ): Promise<NewerWindowPage | null> {
199
+ if (window.newerCursor === null) {
200
+ return { messages: [], newerCursor: null, hasNewer: false };
201
+ }
202
+ const page = await client.getHistoryWindow(window.roomJID, JUMP_WINDOW_PAGE, {
203
+ after: window.newerCursor,
204
+ });
205
+ if (!page.ok) return null;
206
+ const progressed = page.last !== null && page.last > window.newerCursor;
207
+ return {
208
+ messages: page.messages,
209
+ newerCursor: progressed ? page.last : window.newerCursor,
210
+ hasNewer: progressed && !page.complete,
211
+ };
212
+ }
@@ -0,0 +1,83 @@
1
+ import type { IRoom } from '../types/types';
2
+
3
+ /** The slice of the XMPP client the history loader needs. */
4
+ export interface HistoryPageClient {
5
+ getHistoryStanza: (
6
+ chatJID: string,
7
+ max: number,
8
+ before?: number,
9
+ id?: string,
10
+ options?: { source?: 'active' | 'send_ack' | 'background' | 'default' }
11
+ ) => Promise<unknown>;
12
+ }
13
+
14
+ /**
15
+ * Where the next page of older history starts when the caller names no
16
+ * anchor: the server's own paging cursor, or the oldest message that carries a
17
+ * numeric archive id, whichever is older. Never a position in the message
18
+ * list: a page made only of receipts or reactions adds nothing to it, so a
19
+ * position keeps pointing at the same message and paging stalls.
20
+ */
21
+ export const resolveHistoryBefore = (
22
+ room: Pick<IRoom, 'messages' | 'messageStats'> | undefined,
23
+ explicit?: number
24
+ ): number | undefined => {
25
+ if (typeof explicit === 'number' && Number.isFinite(explicit)) {return explicit;}
26
+ if (!room) {return undefined;}
27
+ const candidates: number[] = [];
28
+ const cursor = room.messageStats?.firstMessageTimestamp;
29
+ if (typeof cursor === 'number' && Number.isFinite(cursor)) {
30
+ candidates.push(cursor);
31
+ }
32
+ for (const message of room.messages ?? []) {
33
+ const id = Number(message.id);
34
+ if (Number.isFinite(id) && id > 0) {candidates.push(id);}
35
+ }
36
+ return candidates.length > 0 ? Math.min(...candidates) : undefined;
37
+ };
38
+
39
+ export interface LoadRoomHistoryParams {
40
+ client: HistoryPageClient | null | undefined;
41
+ /** The room as it is in the store NOW (read at call time, not from a render). */
42
+ room: IRoom | undefined;
43
+ /** Rooms with a request in flight: one request per room at a time. */
44
+ inFlight: Set<string>;
45
+ chatJID: string;
46
+ max: number;
47
+ before?: number;
48
+ /** Told when the first request starts and when the last one ends. */
49
+ onBusyChange?: (busy: boolean) => void;
50
+ }
51
+
52
+ /**
53
+ * One page of older history for a room. Always settles and never rejects: a
54
+ * failed page must not leave the room blocked or reject into the caller's
55
+ * chain. Does nothing for a room that is complete, unknown, or already loading.
56
+ */
57
+ export async function loadRoomHistory({
58
+ client,
59
+ room,
60
+ inFlight,
61
+ chatJID,
62
+ max,
63
+ before,
64
+ onBusyChange,
65
+ }: LoadRoomHistoryParams): Promise<void> {
66
+ if (!client || !chatJID) {return;}
67
+ if (inFlight.has(chatJID)) {return;}
68
+ if (!room || room.historyComplete) {return;}
69
+
70
+ const anchor = resolveHistoryBefore(room, before);
71
+ inFlight.add(chatJID);
72
+ onBusyChange?.(true);
73
+ try {
74
+ await client.getHistoryStanza(chatJID, max, anchor, undefined, {
75
+ source: 'active',
76
+ });
77
+ } catch {
78
+ // swallowed on purpose, see above
79
+ } finally {
80
+ inFlight.delete(chatJID);
81
+ onBusyChange?.(inFlight.size > 0);
82
+ }
83
+ }