@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
@@ -3,6 +3,9 @@
3
3
  import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
4
4
  import { insertMessageWithDelimiter } from '../helpers/insertMessageWithDelimiter';
5
5
  import { msgSortableMs } from '../helpers/msgSortableMs';
6
+ import { isSafeKey } from './safeKey';
7
+ import { mergeUsersSet as mergeIntoUsersSet } from './usersSetCap';
8
+ import { getRoomUserCount } from '../helpers/roomUserCount';
6
9
  import { subscribeRoomForPush } from '../services/pushSubscriptionService';
7
10
 
8
11
  // Per-room runtime message cap. Mirrors the persistence layer's
@@ -145,6 +148,65 @@ const insertRoomMessage = (state, roomJID, message, start) => {
145
148
  atHead
146
149
  };
147
150
  };
151
+
152
+ /**
153
+ * Keeps the jump window's separate copy of a message in step with the live
154
+ * list: an echo of a message the reader sees flips it from "sending" to
155
+ * delivered there too, call-log entries collapse per callId, and (only for a
156
+ * live single-message add, `allowAppend`) a reader parked at the LIVE END of
157
+ * a window (hasNewer false) sees what arrives next. While hasNewer is true
158
+ * the window is not adjacent to the tail and the message waits in
159
+ * room.messages until the reader returns to live.
160
+ */
161
+ const syncJumpWindowWithMessage = (state, roomJID, message, start, allowAppend) => {
162
+ const win = state.jumpWindow;
163
+ if (!win || win.roomJID !== roomJID || isCallSignalMessage(message)) {
164
+ return;
165
+ }
166
+ const incomingCallLog = message.callLog;
167
+ if (incomingCallLog?.callId) {
168
+ const wi = win.messages.findIndex(msg => msg.callLog?.callId === incomingCallLog.callId);
169
+ if (wi !== -1) {
170
+ const wExisting = win.messages[wi];
171
+ const wMerged = mergeCallLogEntries(wExisting, message);
172
+ if (wMerged !== wExisting) {
173
+ win.messages[wi] = wMerged;
174
+ }
175
+ return;
176
+ }
177
+ }
178
+ if (win.messages.length === 0) {
179
+ return;
180
+ }
181
+ const isKnownMessage = msg => msg.id === message.id || !!message.xmppId && msg.id === message.xmppId || !!msg.xmppId && msg.xmppId === message.id;
182
+ const wi = win.messages.findIndex(isKnownMessage);
183
+ if (wi !== -1) {
184
+ const prev = win.messages[wi];
185
+ const next = {
186
+ ...prev
187
+ };
188
+ for (const [key, value] of Object.entries(message)) {
189
+ if (value !== undefined && isSafeKey(key)) {
190
+ next[key] = value;
191
+ }
192
+ }
193
+ // The sender identity captured on first insert wins, as in the live
194
+ // list (the echo parses a different id form).
195
+ next.user = prev.user;
196
+ next.pending = false;
197
+ win.messages[wi] = next;
198
+ } else if (allowAppend && !win.hasNewer && !start) {
199
+ win.messages.push({
200
+ ...message
201
+ });
202
+ if (win.messages.length > JUMP_WINDOW_MAX_MESSAGES) {
203
+ win.messages = win.messages.slice(-JUMP_WINDOW_MAX_MESSAGES);
204
+ const oldest = Number(win.messages[0].id);
205
+ win.olderCursor = Number.isFinite(oldest) ? oldest : win.olderCursor;
206
+ win.hasOlder = true;
207
+ }
208
+ }
209
+ };
148
210
  const capAfterGrowth = (messages, lengthBefore, atHead) => {
149
211
  if (atHead) {
150
212
  enforceMessageCap(messages, RUNTIME_MESSAGE_CEILING);
@@ -166,6 +228,9 @@ const bumpLastMessageTimestamp = (state, roomJID, message) => {
166
228
  }
167
229
  };
168
230
  const upsertRoom = (state, roomData) => {
231
+ if (!isSafeKey(roomData?.jid)) {
232
+ return;
233
+ }
169
234
  const existing = state.rooms[roomData.jid];
170
235
  let lastViewed;
171
236
  const serverMarker = state.privateStoreMarkers?.[roomData.jid] || 0;
@@ -190,11 +255,17 @@ const upsertRoom = (state, roomData) => {
190
255
  const existingMessages = Array.isArray(existing?.messages) ? existing.messages : [];
191
256
  state.rooms[roomData.jid] = {
192
257
  ...roomData,
258
+ usersCnt: resolveIncomingUsersCnt(roomData, existing),
259
+ // A seed for the room-list preview: take the freshest API value but
260
+ // never let a payload without one erase what is already there.
261
+ lastMessage: roomData.lastMessage ?? existing?.lastMessage,
262
+ ...resolveApiUnread(state, roomData.jid, roomData, existing),
193
263
  icon: roomData.icon !== undefined ? roomData.icon : existing?.icon,
194
264
  roomBg: roomData.roomBg !== undefined ? roomData.roomBg : existing?.roomBg,
195
265
  messages: existingMessages.length > 0 ? existingMessages : incomingMessages,
196
266
  lastViewedTimestamp: lastViewed,
197
- unreadMessages: roomData.unreadMessages ?? existing?.unreadMessages ?? 0,
267
+ // A server-seeded count must not badge a room that is open right now.
268
+ unreadMessages: roomData.apiUnreadCount !== undefined && (state.activeRoomJID === roomData.jid || state.visibleRoomJID === roomData.jid) ? existing?.unreadMessages ?? 0 : roomData.unreadMessages ?? existing?.unreadMessages ?? 0,
198
269
  unreadBaselineTimestamp: existing?.unreadBaselineTimestamp ?? existing?.lastViewedTimestamp ?? roomData.unreadBaselineTimestamp ?? 0
199
270
  };
200
271
  };
@@ -363,6 +434,40 @@ function mergeHistoryIntoCache(existing, fetched) {
363
434
  const merged = collapseCallLogDuplicates(Array.from(byId.values()).sort(byMs));
364
435
  return [...capTail(merged), ...pending];
365
436
  }
437
+
438
+ /** A message found in the archive that the chat cannot show in place. */
439
+
440
+ /** A request to scroll a room's transcript to one message. */
441
+
442
+ /**
443
+ * A short slice of a room's archive around one message, shown INSTEAD of the
444
+ * live list while the reader is away from the tail (a search jump to a message
445
+ * far back). Separate from room.messages on purpose: it is not contiguous with
446
+ * the live history, so it must not touch messageStats or historyComplete.
447
+ * Never persisted.
448
+ */
449
+
450
+ /** The window is trimmed on the far side past this many messages. */
451
+ export const JUMP_WINDOW_MAX_MESSAGES = 300;
452
+ const mergeWindowMessages = (a, b) => {
453
+ const seen = new Set();
454
+ const merged = [];
455
+ for (const message of [...a, ...b]) {
456
+ const key = String(message.id);
457
+ if (seen.has(key)) {
458
+ continue;
459
+ }
460
+ seen.add(key);
461
+ merged.push(message);
462
+ }
463
+ const num = message => {
464
+ const id = Number(message.id);
465
+ return Number.isFinite(id) && id > 0 ? id : new Date(message.date).getTime();
466
+ };
467
+ // Archive ids are microsecond stanza ids and ascending in time; fall back to
468
+ // the date when an id is not numeric.
469
+ return merged.sort((x, y) => num(x) - num(y));
470
+ };
366
471
  const initialState = {
367
472
  rooms: {},
368
473
  activeRoomJID: null,
@@ -377,14 +482,89 @@ const initialState = {
377
482
  },
378
483
  pendingNotificationJid: null,
379
484
  privateStoreMarkers: {},
485
+ pendingJump: null,
486
+ joiningRoomJID: null,
380
487
  readBoundaries: {},
488
+ usersSet: {},
489
+ jumpWindow: null,
490
+ archivedMessage: null,
381
491
  pendingReactions: {}
382
492
  };
383
493
  const isValidRoomJid = jid => {
384
- if (typeof jid !== 'string' || !jid) return false;
385
- if (!jid.includes('@')) return false;
494
+ if (!isSafeKey(jid)) {
495
+ return false;
496
+ }
497
+ if (!jid.includes('@')) {
498
+ return false;
499
+ }
386
500
  return true;
387
501
  };
502
+
503
+ /**
504
+ * Visits every stored copy of one message: the live copy in
505
+ * state.rooms[jid].messages and, when a jump window is open on that room, the
506
+ * window's separate copy. The window is a second list of the same messages, so
507
+ * every reducer that mutates ONE message must go through this or the reader
508
+ * sees stale edits/reactions/delivery state while away from the live tail.
509
+ * `matches` is an id, or a predicate when a reducer also matches on xmppId.
510
+ */
511
+ const forEachMessageCopy = (state, jid, matches, fn) => {
512
+ const pred = typeof matches === 'function' ? matches : message => message.id === matches;
513
+ const live = state.rooms[jid]?.messages;
514
+ if (Array.isArray(live)) {
515
+ for (const message of live) {
516
+ if (pred(message)) {
517
+ fn(message);
518
+ }
519
+ }
520
+ }
521
+ const win = state.jumpWindow;
522
+ if (win && win.roomJID === jid && Array.isArray(win.messages)) {
523
+ for (const message of win.messages) {
524
+ if (pred(message)) {
525
+ fn(message);
526
+ }
527
+ }
528
+ }
529
+ };
530
+
531
+ /**
532
+ * usersCnt after a /chats/my refresh. The API reports the true total in
533
+ * `usersCnt` but at most 30 `members` for a big room, so the members array
534
+ * length is only a floor; and a count already known (a larger one from an
535
+ * earlier response or a live join) is never lowered by a refresh.
536
+ */
537
+ const resolveIncomingUsersCnt = (incoming, existing) => {
538
+ const apiTotal = typeof incoming.usersCnt === 'number' && incoming.usersCnt > 0 ? incoming.usersCnt : 0;
539
+ const membersLen = Array.isArray(incoming.members) ? incoming.members.length : 0;
540
+ const next = Math.max(apiTotal, membersLen);
541
+ return Math.max(next, existing ? getRoomUserCount(existing) : 0);
542
+ };
543
+
544
+ /**
545
+ * The server-reported unread snapshot of a room after an incoming /chats/my
546
+ * item: the freshest API value wins while the user is not looking at the
547
+ * room; one being read right now keeps none. Absent from the response =
548
+ * keep what an earlier, richer response set.
549
+ */
550
+ const resolveApiUnread = (state, jid, incoming, existing) => {
551
+ if (state.activeRoomJID === jid || state.visibleRoomJID === jid) {
552
+ return {
553
+ apiUnreadCount: undefined,
554
+ apiUnreadSeededAt: undefined
555
+ };
556
+ }
557
+ if (incoming.apiUnreadCount !== undefined) {
558
+ return {
559
+ apiUnreadCount: incoming.apiUnreadCount,
560
+ apiUnreadSeededAt: incoming.apiUnreadSeededAt ?? Date.now()
561
+ };
562
+ }
563
+ return {
564
+ apiUnreadCount: existing?.apiUnreadCount,
565
+ apiUnreadSeededAt: existing?.apiUnreadSeededAt
566
+ };
567
+ };
388
568
  export const addRoomViaApi = createAsyncThunk('roomMessages/addRoomViaApi', async ({
389
569
  room,
390
570
  xmpp
@@ -437,6 +617,9 @@ const reducers = {
437
617
  const {
438
618
  jid
439
619
  } = action.payload;
620
+ if (!isSafeKey(jid)) {
621
+ return;
622
+ }
440
623
  if (state.rooms[jid]) {
441
624
  delete state.rooms[jid];
442
625
  if (state.visibleRoomJID === jid) {
@@ -449,19 +632,40 @@ const reducers = {
449
632
  jid,
450
633
  updates
451
634
  } = action.payload;
635
+ if (!isSafeKey(jid)) {
636
+ return;
637
+ }
452
638
  const existingRoom = state.rooms[jid];
453
- if (existingRoom) {
454
- state.rooms[jid] = {
455
- ...existingRoom,
456
- ...updates
457
- };
639
+ if (!existingRoom) {
640
+ return;
458
641
  }
642
+ const merged = {
643
+ ...existingRoom,
644
+ ...updates
645
+ };
646
+ if (typeof updates.usersCnt === 'number') {
647
+ // An explicit count (a live join or leave) is taken as given, with the
648
+ // known members as a floor.
649
+ const newMembers = Array.isArray(updates.members) ? updates.members : existingRoom.members;
650
+ const floor = Array.isArray(newMembers) ? newMembers.length : 0;
651
+ merged.usersCnt = Math.max(updates.usersCnt, floor);
652
+ } else if (Array.isArray(updates.members)) {
653
+ // A members-only refresh of a truncated big room (usersCnt > the
654
+ // first page) must not collapse the true total to the page length.
655
+ const prevMembers = Array.isArray(existingRoom.members) ? existingRoom.members.length : 0;
656
+ const prevCnt = typeof existingRoom.usersCnt === 'number' ? existingRoom.usersCnt : 0;
657
+ merged.usersCnt = prevCnt > prevMembers ? Math.max(prevCnt, updates.members.length) : updates.members.length;
658
+ }
659
+ state.rooms[jid] = merged;
459
660
  },
460
661
  setRoomMessages(state, action) {
461
662
  const {
462
663
  roomJID,
463
664
  messages
464
665
  } = action.payload;
666
+ if (!isSafeKey(roomJID)) {
667
+ return;
668
+ }
465
669
  if (state.rooms[roomJID]) {
466
670
  // Cap to the runtime limit on replace too — guards against a
467
671
  // single MAM page returning more than the limit (would balloon
@@ -475,6 +679,9 @@ const reducers = {
475
679
  roomJID,
476
680
  messageId
477
681
  } = action.payload;
682
+ if (!isSafeKey(roomJID)) {
683
+ return;
684
+ }
478
685
  const room = state.rooms[roomJID];
479
686
  if (!room?.messages) {
480
687
  return;
@@ -491,11 +698,9 @@ const reducers = {
491
698
  }
492
699
  return;
493
700
  }
494
- room.messages.map(message => {
495
- if (message.id === messageId) {
496
- message.isDeleted = true;
497
- message.reaction = undefined;
498
- }
701
+ forEachMessageCopy(state, roomJID, messageId, message => {
702
+ message.isDeleted = true;
703
+ message.reaction = undefined;
499
704
  });
500
705
  },
501
706
  setEditAction: (state, action) => {
@@ -516,30 +721,77 @@ const reducers = {
516
721
  messageId,
517
722
  text
518
723
  } = action.payload;
519
- if (state.rooms[roomJID]) {
520
- state.rooms[roomJID].messages.map(message => {
521
- if (message.id === messageId) {
522
- message.body = text;
523
- // Flag the correction so the bubble can render an "edited" marker.
524
- // Covers both the author's own edit and edits from other users —
525
- // every <replace> echo flows through here.
526
- message.isEdited = true;
527
- }
528
- });
724
+ if (!isSafeKey(roomJID)) {
725
+ return;
726
+ }
727
+ // Edited in place on every copy (live list and jump window).
728
+ forEachMessageCopy(state, roomJID, messageId, message => {
729
+ message.body = text;
730
+ // Flag the correction so the bubble can render an "edited" marker.
731
+ // Covers both the author's own edit and edits from other users -
732
+ // every <replace> echo flows through here.
733
+ message.isEdited = true;
734
+ });
735
+ },
736
+ /**
737
+ * Hard removal, unlike `deleteRoomMessage`'s tombstone. For optimistic
738
+ * messages that never made it onto the wire.
739
+ */
740
+ removeRoomMessage(state, action) {
741
+ const {
742
+ roomJID,
743
+ messageId
744
+ } = action.payload;
745
+ if (!isSafeKey(roomJID)) {
746
+ return;
747
+ }
748
+ if (state.rooms[roomJID]?.messages) {
749
+ state.rooms[roomJID].messages = state.rooms[roomJID].messages.filter(message => message.id !== messageId);
750
+ }
751
+ const win = state.jumpWindow;
752
+ if (win && win.roomJID === roomJID) {
753
+ win.messages = win.messages.filter(message => message.id !== messageId);
529
754
  }
530
755
  },
756
+ /**
757
+ * Caches one translation onto the message it belongs to, keyed by the
758
+ * locale tag the translate service echoed back. Applied to the live
759
+ * copy and the jump window's copy.
760
+ */
761
+ setMessageTranslation(state, action) {
762
+ const {
763
+ roomJID,
764
+ messageId,
765
+ locale,
766
+ entry
767
+ } = action.payload;
768
+ if (!isSafeKey(roomJID) || !isSafeKey(locale)) {
769
+ return;
770
+ }
771
+ forEachMessageCopy(state, roomJID, messageId, message => {
772
+ if (!message.translations) {
773
+ message.translations = {};
774
+ }
775
+ message.translations[locale] = entry;
776
+ });
777
+ },
531
778
  addRoomMessage(state, action) {
532
779
  const {
533
780
  roomJID,
534
781
  message,
535
782
  start
536
783
  } = action.payload;
784
+ if (!isSafeKey(roomJID)) {
785
+ return;
786
+ }
537
787
  const lengthBefore = state.rooms[roomJID]?.messages?.length || 0;
538
788
  const outcome = insertRoomMessage(state, roomJID, message, start);
539
789
  if (outcome.grew) {
540
790
  capAfterGrowth(state.rooms[roomJID].messages, lengthBefore, outcome.atHead);
541
791
  }
542
792
  bumpLastMessageTimestamp(state, roomJID, message);
793
+ // Keep the jump window's copy in step with the live list.
794
+ syncJumpWindowWithMessage(state, roomJID, message, start, true);
543
795
  },
544
796
  /**
545
797
  * A whole page of messages (a MAM history page) in ONE action: the same
@@ -553,7 +805,7 @@ const reducers = {
553
805
  messages,
554
806
  start
555
807
  } = action.payload;
556
- if (!state.rooms[roomJID] || !Array.isArray(messages)) {
808
+ if (!isSafeKey(roomJID) || !state.rooms[roomJID] || !Array.isArray(messages)) {
557
809
  return;
558
810
  }
559
811
  const lengthBefore = state.rooms[roomJID].messages?.length || 0;
@@ -571,6 +823,9 @@ const reducers = {
571
823
  if (!newest || Number(message?.id) > Number(newest.id)) {
572
824
  newest = message;
573
825
  }
826
+ // History pages never append to a reader's jump window (they are not
827
+ // "the newest message"); they only refresh copies it already holds.
828
+ syncJumpWindowWithMessage(state, roomJID, message, start, false);
574
829
  }
575
830
  if (grew) {
576
831
  // A page that only prepended older history is never trimmed.
@@ -582,6 +837,7 @@ const reducers = {
582
837
  },
583
838
  deleteAllRooms(state) {
584
839
  state.rooms = {};
840
+ state.jumpWindow = null;
585
841
  state.visibleRoomJID = null;
586
842
  state.privateStoreMarkers = {};
587
843
  state.readBoundaries = {};
@@ -593,6 +849,9 @@ const reducers = {
593
849
  composing,
594
850
  composingList
595
851
  } = action.payload;
852
+ if (!isSafeKey(chatJID) || !state.rooms[chatJID]) {
853
+ return;
854
+ }
596
855
  state.rooms[chatJID].composing = composing;
597
856
  state.rooms[chatJID].composingList = composingList;
598
857
  },
@@ -602,7 +861,7 @@ const reducers = {
602
861
  loading,
603
862
  loadingText
604
863
  } = action.payload;
605
- if (chatJID && state.rooms?.[chatJID]) {
864
+ if (isSafeKey(chatJID) && state.rooms?.[chatJID]) {
606
865
  state.rooms[chatJID].isLoading = loading;
607
866
  }
608
867
  state.isLoading = loading;
@@ -616,7 +875,7 @@ const reducers = {
616
875
  chatJID,
617
876
  timestamp
618
877
  } = action.payload;
619
- if (state.rooms[chatJID]) {
878
+ if (isSafeKey(chatJID) && state.rooms[chatJID]) {
620
879
  state.rooms[chatJID].lastViewedTimestamp = timestamp;
621
880
  // A non-positive timestamp means "no persisted marker yet" and
622
881
  // must not inflate unread from history that predates the first
@@ -667,7 +926,7 @@ const reducers = {
667
926
  }
668
927
  for (const jid of Object.keys(markers)) {
669
928
  const ts = Number(markers[jid]);
670
- if (!jid || !Number.isFinite(ts) || ts <= 0) {
929
+ if (!isSafeKey(jid) || !Number.isFinite(ts) || ts <= 0) {
671
930
  continue;
672
931
  }
673
932
  const room = state.rooms[jid];
@@ -711,7 +970,7 @@ const reducers = {
711
970
  jid,
712
971
  ts
713
972
  } = action.payload;
714
- if (!jid) {
973
+ if (!isSafeKey(jid)) {
715
974
  return;
716
975
  }
717
976
  if (!state.readBoundaries) {
@@ -733,7 +992,7 @@ const reducers = {
733
992
  const {
734
993
  jid
735
994
  } = action.payload;
736
- if (jid && state.readBoundaries) {
995
+ if (isSafeKey(jid) && state.readBoundaries) {
737
996
  delete state.readBoundaries[jid];
738
997
  }
739
998
  },
@@ -742,7 +1001,7 @@ const reducers = {
742
1001
  chatJID,
743
1002
  role
744
1003
  } = action.payload;
745
- if (state.rooms[chatJID]) {
1004
+ if (isSafeKey(chatJID) && state.rooms[chatJID]) {
746
1005
  state.rooms[chatJID].role = role;
747
1006
  }
748
1007
  },
@@ -751,20 +1010,40 @@ const reducers = {
751
1010
  value,
752
1011
  chatJID
753
1012
  } = action.payload;
754
- if (chatJID) {
1013
+ if (isSafeKey(chatJID) && state.rooms[chatJID]) {
755
1014
  state.rooms[chatJID].noMessages = value;
756
1015
  }
757
1016
  },
758
1017
  setCurrentRoom: (state, action) => {
759
1018
  // Accept null/empty so callers can clear the active room (e.g.
760
1019
  // back button from chat → return to RoomList). Mirrors web.
761
- state.activeRoomJID = action.payload.roomJID || '';
1020
+ const {
1021
+ roomJID
1022
+ } = action.payload;
1023
+ if (roomJID && !isSafeKey(roomJID)) {
1024
+ return;
1025
+ }
1026
+ state.activeRoomJID = roomJID || '';
1027
+ // Opening a room reads it: the server's earlier unread count no longer
1028
+ // applies (the unread middleware would otherwise bring it back the
1029
+ // moment the user leaves the room again).
1030
+ if (roomJID && state.rooms[roomJID]?.apiUnreadCount !== undefined) {
1031
+ state.rooms[roomJID].apiUnreadCount = undefined;
1032
+ state.rooms[roomJID].apiUnreadSeededAt = undefined;
1033
+ state.rooms[roomJID].unreadMessages = 0;
1034
+ }
762
1035
  },
763
1036
  setVisibleRoom: (state, action) => {
764
- state.visibleRoomJID = action.payload.roomJID || null;
1037
+ const requested = action.payload.roomJID;
1038
+ if (requested && !isSafeKey(requested)) {
1039
+ return;
1040
+ }
1041
+ state.visibleRoomJID = requested || null;
765
1042
  const jid = state.visibleRoomJID;
766
1043
  if (jid && state.rooms[jid]) {
767
1044
  state.rooms[jid].unreadMessages = 0;
1045
+ state.rooms[jid].apiUnreadCount = undefined;
1046
+ state.rooms[jid].apiUnreadSeededAt = undefined;
768
1047
  }
769
1048
  },
770
1049
  clearVisibleRoom: state => {
@@ -787,6 +1066,81 @@ const reducers = {
787
1066
  clearPendingNotificationJid: state => {
788
1067
  state.pendingNotificationJid = null;
789
1068
  },
1069
+ requestJumpToMessage: (state, action) => {
1070
+ const ids = action.payload.ids.filter(Boolean);
1071
+ const canMatchByContent = Boolean(action.payload.createdAt && action.payload.body);
1072
+ if (!action.payload.roomJID || ids.length === 0 && !canMatchByContent) {
1073
+ return;
1074
+ }
1075
+ state.pendingJump = {
1076
+ roomJID: action.payload.roomJID,
1077
+ ids,
1078
+ createdAt: action.payload.createdAt,
1079
+ body: action.payload.body,
1080
+ preview: action.payload.preview,
1081
+ at: Date.now()
1082
+ };
1083
+ },
1084
+ clearPendingJump: state => {
1085
+ state.pendingJump = null;
1086
+ },
1087
+ showArchivedMessage: (state, action) => {
1088
+ state.archivedMessage = action.payload;
1089
+ },
1090
+ clearArchivedMessage: state => {
1091
+ state.archivedMessage = null;
1092
+ },
1093
+ setJumpWindow: (state, action) => {
1094
+ state.jumpWindow = {
1095
+ ...action.payload,
1096
+ messages: mergeWindowMessages(action.payload.messages, [])
1097
+ };
1098
+ },
1099
+ prependJumpWindowMessages: (state, action) => {
1100
+ const win = state.jumpWindow;
1101
+ if (!win || win.roomJID !== action.payload.roomJID) {
1102
+ return;
1103
+ }
1104
+ win.messages = mergeWindowMessages(action.payload.messages, win.messages);
1105
+ win.olderCursor = action.payload.olderCursor;
1106
+ win.hasOlder = action.payload.hasOlder;
1107
+ if (win.messages.length > JUMP_WINDOW_MAX_MESSAGES) {
1108
+ // Reader is going up: drop the far (newest) side and page it again if
1109
+ // they come back down.
1110
+ win.messages = win.messages.slice(0, JUMP_WINDOW_MAX_MESSAGES);
1111
+ const newest = Number(win.messages[win.messages.length - 1].id);
1112
+ win.newerCursor = Number.isFinite(newest) ? newest : win.newerCursor;
1113
+ win.hasNewer = true;
1114
+ }
1115
+ },
1116
+ appendJumpWindowMessages: (state, action) => {
1117
+ const win = state.jumpWindow;
1118
+ if (!win || win.roomJID !== action.payload.roomJID) {
1119
+ return;
1120
+ }
1121
+ win.messages = mergeWindowMessages(win.messages, action.payload.messages);
1122
+ win.newerCursor = action.payload.newerCursor;
1123
+ win.hasNewer = action.payload.hasNewer;
1124
+ if (win.messages.length > JUMP_WINDOW_MAX_MESSAGES) {
1125
+ win.messages = win.messages.slice(-JUMP_WINDOW_MAX_MESSAGES);
1126
+ const oldest = Number(win.messages[0].id);
1127
+ win.olderCursor = Number.isFinite(oldest) ? oldest : win.olderCursor;
1128
+ win.hasOlder = true;
1129
+ }
1130
+ },
1131
+ clearJumpWindow: state => {
1132
+ state.jumpWindow = null;
1133
+ },
1134
+ setJoiningRoom: (state, action) => {
1135
+ state.joiningRoomJID = action.payload || null;
1136
+ },
1137
+ // Only clears when it still names that room, so a slow join for a room
1138
+ // the user already left cannot wipe the join of the current one.
1139
+ clearJoiningRoom: (state, action) => {
1140
+ if (state.joiningRoomJID === action.payload) {
1141
+ state.joiningRoomJID = null;
1142
+ }
1143
+ },
790
1144
  /**
791
1145
  * Stamp a message in `state.rooms[roomJID].messages` with an updated
792
1146
  * reactions list. The reactionsMiddleware listens for this action to
@@ -801,13 +1155,21 @@ const reducers = {
801
1155
  data,
802
1156
  latestReactionTimestamp
803
1157
  } = action.payload;
804
- if (!from) {
1158
+ if (!isSafeKey(roomJID) || !from) {
805
1159
  return;
806
1160
  }
807
- const room = state.rooms[roomJID];
808
- const target = room?.messages?.find(msg => msg?.id === messageId || msg?.xmppId === messageId);
809
- if (target) {
810
- applyReactionToMessage(target, from, reactions, data, latestReactionTimestamp);
1161
+ // `fromId` becomes a property name on the message's reaction map.
1162
+ const fromId = String(from).split('/')[0].split('@')[0];
1163
+ if (!isSafeKey(fromId)) {
1164
+ return;
1165
+ }
1166
+ let found = false;
1167
+ // Applied on every stored copy (live list and jump window).
1168
+ forEachMessageCopy(state, roomJID, msg => msg?.id === messageId || msg?.xmppId === messageId, message => {
1169
+ found = true;
1170
+ applyReactionToMessage(message, from, reactions, data, latestReactionTimestamp);
1171
+ });
1172
+ if (found) {
811
1173
  return;
812
1174
  }
813
1175
  // The message is not loaded (yet): keep the reaction for it.
@@ -834,27 +1196,42 @@ const reducers = {
834
1196
  state.isUnreadSyncing = false;
835
1197
  state.privateStoreMarkers = {};
836
1198
  state.readBoundaries = {};
1199
+ state.usersSet = {};
1200
+ state.jumpWindow = null;
1201
+ state.archivedMessage = null;
1202
+ state.pendingJump = null;
837
1203
  },
838
1204
  setActiveMessage: (state, action) => {
839
1205
  const {
840
1206
  id,
841
1207
  chatJID
842
1208
  } = action.payload;
843
- state.rooms[chatJID].messages.map(message => {
844
- if (message.id === id) {
845
- message.activeMessage = true;
846
- } else {
847
- message.activeMessage = false;
848
- }
849
- });
1209
+ if (!isSafeKey(chatJID) || !state.rooms[chatJID]) {
1210
+ return;
1211
+ }
1212
+ const flag = message => {
1213
+ message.activeMessage = message.id === id;
1214
+ };
1215
+ state.rooms[chatJID].messages.forEach(flag);
1216
+ if (state.jumpWindow?.roomJID === chatJID) {
1217
+ state.jumpWindow.messages.forEach(flag);
1218
+ }
850
1219
  },
851
1220
  setCloseActiveMessage: (state, action) => {
852
1221
  const {
853
1222
  chatJID
854
1223
  } = action.payload;
855
- state.rooms[chatJID].messages.map(message => {
1224
+ if (!isSafeKey(chatJID) || !state.rooms[chatJID]) {
1225
+ return;
1226
+ }
1227
+ state.rooms[chatJID].messages.forEach(message => {
856
1228
  message.activeMessage = false;
857
1229
  });
1230
+ if (state.jumpWindow?.roomJID === chatJID) {
1231
+ state.jumpWindow.messages.forEach(message => {
1232
+ message.activeMessage = false;
1233
+ });
1234
+ }
858
1235
  },
859
1236
  /**
860
1237
  * Batched update used by the history preload scheduler. Each patch is
@@ -873,15 +1250,14 @@ const reducers = {
873
1250
  ...existing,
874
1251
  ...room,
875
1252
  title: room.title || existing?.title || room.title,
876
- usersCnt: (() => {
877
- const incoming = typeof room.usersCnt === 'number' && room.usersCnt > 0 ? room.usersCnt : 0;
878
- const previous = typeof existing?.usersCnt === 'number' && existing.usersCnt > 0 ? existing.usersCnt : 0;
879
- if (incoming === 0 && previous === 0) return room.usersCnt;
880
- return Math.max(incoming, previous);
881
- })(),
1253
+ usersCnt: resolveIncomingUsersCnt(room, existing),
882
1254
  icon: room.icon ?? existing?.icon,
883
1255
  messages: existingMessages.length > 0 ? existingMessages : incomingMessages,
1256
+ // A seed for the room-list preview (the API's `lastMessage`): take the
1257
+ // freshest value, never let a refresh without one erase it.
1258
+ lastMessage: room.lastMessage ?? existing?.lastMessage,
884
1259
  unreadMessages: existing?.unreadMessages ?? room.unreadMessages ?? 0,
1260
+ ...resolveApiUnread(state, room.jid, room, existing),
885
1261
  lastViewedTimestamp: existing?.lastViewedTimestamp ?? room.lastViewedTimestamp ?? 0,
886
1262
  unreadBaselineTimestamp: existing?.unreadBaselineTimestamp ?? existing?.lastViewedTimestamp ?? room.unreadBaselineTimestamp ?? room.lastViewedTimestamp ?? 0,
887
1263
  composingList: existing?.composingList ?? room.composingList,
@@ -897,8 +1273,11 @@ const reducers = {
897
1273
  rooms
898
1274
  } = action.payload;
899
1275
  for (const patch of rooms) {
1276
+ if (!isSafeKey(patch?.jid)) {
1277
+ continue;
1278
+ }
900
1279
  const room = state.rooms[patch.jid];
901
- if (!room) {
1280
+ if (!room || typeof room !== 'object' || Array.isArray(room)) {
902
1281
  continue;
903
1282
  }
904
1283
  if (typeof patch.historyPreloadState !== 'undefined') {
@@ -910,6 +1289,12 @@ const reducers = {
910
1289
  if (typeof patch.historyComplete !== 'undefined') {
911
1290
  room.historyComplete = patch.historyComplete;
912
1291
  }
1292
+ if (patch.messageStats) {
1293
+ room.messageStats = {
1294
+ ...room.messageStats,
1295
+ ...patch.messageStats
1296
+ };
1297
+ }
913
1298
  if (Array.isArray(patch.messages)) {
914
1299
  for (const m of patch.messages) {
915
1300
  takePendingReactions(state, patch.jid, m);
@@ -927,10 +1312,13 @@ const reducers = {
927
1312
  // part and the full jid so either lookup style hits — a message's
928
1313
  // `user.id` can be either depending on how it was parsed.
929
1314
  mergeUsersSet(state, action) {
930
- state.usersSet = {
931
- ...(state.usersSet || {}),
932
- ...action.payload.members
933
- };
1315
+ // A real merge with a cap: fresh entries win (and move to the newest
1316
+ // position), entries fetched lazily earlier stay, the oldest-inserted
1317
+ // are evicted past USERS_SET_CAP. Unsafe keys are skipped.
1318
+ if (!state.usersSet || typeof state.usersSet !== 'object') {
1319
+ state.usersSet = {};
1320
+ }
1321
+ mergeIntoUsersSet(state.usersSet, action.payload?.members || {});
934
1322
  }
935
1323
  };
936
1324
  export const roomsStore = createSlice({
@@ -1050,8 +1438,21 @@ export const {
1050
1438
  setUnreadCounts,
1051
1439
  setPendingNotificationJid,
1052
1440
  clearPendingNotificationJid,
1441
+ requestJumpToMessage,
1442
+ clearPendingJump,
1443
+ setJoiningRoom,
1444
+ clearJoiningRoom,
1053
1445
  setReactions,
1054
- mergeUsersSet
1446
+ mergeUsersSet,
1447
+ removeRoomMessage,
1448
+ addRoomFromApi,
1449
+ setMessageTranslation,
1450
+ showArchivedMessage,
1451
+ clearArchivedMessage,
1452
+ setJumpWindow,
1453
+ prependJumpWindowMessages,
1454
+ appendJumpWindowMessages,
1455
+ clearJumpWindow
1055
1456
  } = roomsStore.actions;
1056
1457
  export default roomsStore.reducer;
1057
1458
  //# sourceMappingURL=roomsSlice.js.map