@ethora/chat-component-rn 26.9.1 → 26.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (760) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +19 -0
  3. package/lib/commonjs/assets/icons.js +2 -2
  4. package/lib/commonjs/assets/icons.js.map +1 -1
  5. package/lib/commonjs/components/Header/HeaderRoomList.js +22 -6
  6. package/lib/commonjs/components/Header/HeaderRoomList.js.map +1 -1
  7. package/lib/commonjs/components/InputComponents/Search.js +38 -1
  8. package/lib/commonjs/components/InputComponents/Search.js.map +1 -1
  9. package/lib/commonjs/components/MainComponents/ArchivedMessageCard.js +166 -0
  10. package/lib/commonjs/components/MainComponents/ArchivedMessageCard.js.map +1 -0
  11. package/lib/commonjs/components/MainComponents/ChatHeader.js +22 -5
  12. package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
  13. package/lib/commonjs/components/MainComponents/ChatRoom.js +56 -25
  14. package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
  15. package/lib/commonjs/components/MainComponents/ChatWrapper.js +31 -1
  16. package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
  17. package/lib/commonjs/components/MainComponents/MediaMessage.js +18 -3
  18. package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
  19. package/lib/commonjs/components/MainComponents/MessageList.js +739 -42
  20. package/lib/commonjs/components/MainComponents/MessageList.js.map +1 -1
  21. package/lib/commonjs/components/MainComponents/MessageSearchButton.js +58 -0
  22. package/lib/commonjs/components/MainComponents/MessageSearchButton.js.map +1 -0
  23. package/lib/commonjs/components/MainComponents/ReduxWrapper.js +15 -6
  24. package/lib/commonjs/components/MainComponents/ReduxWrapper.js.map +1 -1
  25. package/lib/commonjs/components/MainComponents/RoomList.js +110 -1
  26. package/lib/commonjs/components/MainComponents/RoomList.js.map +1 -1
  27. package/lib/commonjs/components/Menu/HeaderRoomListMenu.js +14 -3
  28. package/lib/commonjs/components/Menu/HeaderRoomListMenu.js.map +1 -1
  29. package/lib/commonjs/components/MessageBubble/BubbleHighlight.js +112 -0
  30. package/lib/commonjs/components/MessageBubble/BubbleHighlight.js.map +1 -0
  31. package/lib/commonjs/components/MessageBubble/Message.js +169 -125
  32. package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
  33. package/lib/commonjs/components/MessageBubble/MessageInteractions.js +98 -78
  34. package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
  35. package/lib/commonjs/components/MessageBubble/messageMenuLayout.js +50 -0
  36. package/lib/commonjs/components/MessageBubble/messageMenuLayout.js.map +1 -0
  37. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +73 -37
  38. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  39. package/lib/commonjs/components/Modals/MessageSearchModal/MessageHitResults.js +253 -0
  40. package/lib/commonjs/components/Modals/MessageSearchModal/MessageHitResults.js.map +1 -0
  41. package/lib/commonjs/components/Modals/MessageSearchModal/MessageSearchModal.js +488 -0
  42. package/lib/commonjs/components/Modals/MessageSearchModal/MessageSearchModal.js.map +1 -0
  43. package/lib/commonjs/components/Modals/MessageSearchModal/openHit.js +51 -0
  44. package/lib/commonjs/components/Modals/MessageSearchModal/openHit.js.map +1 -0
  45. package/lib/commonjs/components/Modals/MessageSearchModal/resolveSender.js +47 -0
  46. package/lib/commonjs/components/Modals/MessageSearchModal/resolveSender.js.map +1 -0
  47. package/lib/commonjs/components/Modals/MessageSearchModal/searchFilters.js +83 -0
  48. package/lib/commonjs/components/Modals/MessageSearchModal/searchFilters.js.map +1 -0
  49. package/lib/commonjs/components/Modals/MessageSearchModal/snippet.js +61 -0
  50. package/lib/commonjs/components/Modals/MessageSearchModal/snippet.js.map +1 -0
  51. package/lib/commonjs/components/Modals/MessageSearchModal/useMessageSearch.js +136 -0
  52. package/lib/commonjs/components/Modals/MessageSearchModal/useMessageSearch.js.map +1 -0
  53. package/lib/commonjs/components/Modals/PublicChatsModal/PublicChatsModal.js +306 -0
  54. package/lib/commonjs/components/Modals/PublicChatsModal/PublicChatsModal.js.map +1 -0
  55. package/lib/commonjs/components/Modals/PublicChatsModal/publicChatsLogic.js +36 -0
  56. package/lib/commonjs/components/Modals/PublicChatsModal/publicChatsLogic.js.map +1 -0
  57. package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js +8 -1
  58. package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
  59. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +13 -2
  60. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
  61. package/lib/commonjs/components/RoomComponents/SwipeableRoomRow.js +38 -6
  62. package/lib/commonjs/components/RoomComponents/SwipeableRoomRow.js.map +1 -1
  63. package/lib/commonjs/components/Thread/ThreadHeader.js +3 -1
  64. package/lib/commonjs/components/Thread/ThreadHeader.js.map +1 -1
  65. package/lib/commonjs/components/Thread/ThreadWrapper.js +90 -10
  66. package/lib/commonjs/components/Thread/ThreadWrapper.js.map +1 -1
  67. package/lib/commonjs/components/styled/AudioDecoderHost.js +338 -0
  68. package/lib/commonjs/components/styled/AudioDecoderHost.js.map +1 -0
  69. package/lib/commonjs/components/styled/AudioMessage.js +493 -420
  70. package/lib/commonjs/components/styled/AudioMessage.js.map +1 -1
  71. package/lib/commonjs/components/styled/SendInput.js +31 -5
  72. package/lib/commonjs/components/styled/SendInput.js.map +1 -1
  73. package/lib/commonjs/context/MessageNotificationContext.js +14 -4
  74. package/lib/commonjs/context/MessageNotificationContext.js.map +1 -1
  75. package/lib/commonjs/context/xmppProvider.js +41 -77
  76. package/lib/commonjs/context/xmppProvider.js.map +1 -1
  77. package/lib/commonjs/helpers/audioWaveform.js +165 -0
  78. package/lib/commonjs/helpers/audioWaveform.js.map +1 -0
  79. package/lib/commonjs/helpers/backgroundJoinSweep.js +36 -0
  80. package/lib/commonjs/helpers/backgroundJoinSweep.js.map +1 -0
  81. package/lib/commonjs/helpers/bubbleHighlight.js +44 -0
  82. package/lib/commonjs/helpers/bubbleHighlight.js.map +1 -0
  83. package/lib/commonjs/helpers/checkUniqueUsers.js +14 -12
  84. package/lib/commonjs/helpers/checkUniqueUsers.js.map +1 -1
  85. package/lib/commonjs/helpers/constants/MODAL_COMPONENTS.js +5 -1
  86. package/lib/commonjs/helpers/constants/MODAL_COMPONENTS.js.map +1 -1
  87. package/lib/commonjs/helpers/constants/MODAL_TYPES.js +3 -1
  88. package/lib/commonjs/helpers/constants/MODAL_TYPES.js.map +1 -1
  89. package/lib/commonjs/helpers/createRoomFromApi.js +40 -3
  90. package/lib/commonjs/helpers/createRoomFromApi.js.map +1 -1
  91. package/lib/commonjs/helpers/dedupeMembers.js +34 -0
  92. package/lib/commonjs/helpers/dedupeMembers.js.map +1 -0
  93. package/lib/commonjs/helpers/ethoraLogger.js +56 -0
  94. package/lib/commonjs/helpers/ethoraLogger.js.map +1 -0
  95. package/lib/commonjs/helpers/getUnnamedUsers.js +9 -4
  96. package/lib/commonjs/helpers/getUnnamedUsers.js.map +1 -1
  97. package/lib/commonjs/helpers/historyPreloadConfig.js +44 -0
  98. package/lib/commonjs/helpers/historyPreloadConfig.js.map +1 -0
  99. package/lib/commonjs/helpers/historyPreloadScheduler.js +372 -137
  100. package/lib/commonjs/helpers/historyPreloadScheduler.js.map +1 -1
  101. package/lib/commonjs/helpers/initRoomsPresence.js +17 -5
  102. package/lib/commonjs/helpers/initRoomsPresence.js.map +1 -1
  103. package/lib/commonjs/helpers/insertMessageWithDelimiter.js +5 -0
  104. package/lib/commonjs/helpers/insertMessageWithDelimiter.js.map +1 -1
  105. package/lib/commonjs/helpers/isLikelyMucJid.js +67 -0
  106. package/lib/commonjs/helpers/isLikelyMucJid.js.map +1 -0
  107. package/lib/commonjs/helpers/isMessageSearchEnabled.js +18 -0
  108. package/lib/commonjs/helpers/isMessageSearchEnabled.js.map +1 -0
  109. package/lib/commonjs/helpers/joiningRoom.js +14 -0
  110. package/lib/commonjs/helpers/joiningRoom.js.map +1 -0
  111. package/lib/commonjs/helpers/jumpThread.js +100 -0
  112. package/lib/commonjs/helpers/jumpThread.js.map +1 -0
  113. package/lib/commonjs/helpers/jumpToMessage.js +58 -0
  114. package/lib/commonjs/helpers/jumpToMessage.js.map +1 -0
  115. package/lib/commonjs/helpers/jumpWindow.js +187 -0
  116. package/lib/commonjs/helpers/jumpWindow.js.map +1 -0
  117. package/lib/commonjs/helpers/loadRoomHistory.js +75 -0
  118. package/lib/commonjs/helpers/loadRoomHistory.js.map +1 -0
  119. package/lib/commonjs/helpers/notificationPolicy.js +77 -0
  120. package/lib/commonjs/helpers/notificationPolicy.js.map +1 -0
  121. package/lib/commonjs/helpers/openRoomAtMessage.js +47 -0
  122. package/lib/commonjs/helpers/openRoomAtMessage.js.map +1 -0
  123. package/lib/commonjs/helpers/openThreadForJump.js +72 -0
  124. package/lib/commonjs/helpers/openThreadForJump.js.map +1 -0
  125. package/lib/commonjs/helpers/parseMessageReference.js +27 -8
  126. package/lib/commonjs/helpers/parseMessageReference.js.map +1 -1
  127. package/lib/commonjs/helpers/publicChatsEntry.js +17 -0
  128. package/lib/commonjs/helpers/publicChatsEntry.js.map +1 -0
  129. package/lib/commonjs/helpers/roomActivityScore.js +37 -0
  130. package/lib/commonjs/helpers/roomActivityScore.js.map +1 -0
  131. package/lib/commonjs/helpers/roomUserCount.js +36 -0
  132. package/lib/commonjs/helpers/roomUserCount.js.map +1 -0
  133. package/lib/commonjs/helpers/runConfiguredHistoryPreload.js +68 -0
  134. package/lib/commonjs/helpers/runConfiguredHistoryPreload.js.map +1 -0
  135. package/lib/commonjs/helpers/sessionAppId.js +24 -0
  136. package/lib/commonjs/helpers/sessionAppId.js.map +1 -0
  137. package/lib/commonjs/helpers/timestamp.js +43 -0
  138. package/lib/commonjs/helpers/timestamp.js.map +1 -0
  139. package/lib/commonjs/helpers/userResolver.js +517 -0
  140. package/lib/commonjs/helpers/userResolver.js.map +1 -0
  141. package/lib/commonjs/helpers/xmppIdShape.js +52 -0
  142. package/lib/commonjs/helpers/xmppIdShape.js.map +1 -0
  143. package/lib/commonjs/hooks/useChatWrapperInit.js +27 -5
  144. package/lib/commonjs/hooks/useChatWrapperInit.js.map +1 -1
  145. package/lib/commonjs/hooks/useHeapSender.js +54 -3
  146. package/lib/commonjs/hooks/useHeapSender.js.map +1 -1
  147. package/lib/commonjs/hooks/useJumpToMessage.js +411 -0
  148. package/lib/commonjs/hooks/useJumpToMessage.js.map +1 -0
  149. package/lib/commonjs/hooks/useMessageLoaderQueue.js +32 -5
  150. package/lib/commonjs/hooks/useMessageLoaderQueue.js.map +1 -1
  151. package/lib/commonjs/hooks/useMessageQueue.js +13 -5
  152. package/lib/commonjs/hooks/useMessageQueue.js.map +1 -1
  153. package/lib/commonjs/hooks/useRoomDirectory.js +29 -0
  154. package/lib/commonjs/hooks/useRoomDirectory.js.map +1 -0
  155. package/lib/commonjs/hooks/useRoomInitialization.js +27 -5
  156. package/lib/commonjs/hooks/useRoomInitialization.js.map +1 -1
  157. package/lib/commonjs/hooks/useRoomMute.js +62 -0
  158. package/lib/commonjs/hooks/useRoomMute.js.map +1 -0
  159. package/lib/commonjs/hooks/useRoomState.js +3 -1
  160. package/lib/commonjs/hooks/useRoomState.js.map +1 -1
  161. package/lib/commonjs/hooks/useSendMessage.js +13 -3
  162. package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
  163. package/lib/commonjs/i18n/strings.js +288 -6
  164. package/lib/commonjs/i18n/strings.js.map +1 -1
  165. package/lib/commonjs/networking/api-requests/messageSearch.api.js +87 -0
  166. package/lib/commonjs/networking/api-requests/messageSearch.api.js.map +1 -0
  167. package/lib/commonjs/networking/api-requests/publicChats.api.js +48 -0
  168. package/lib/commonjs/networking/api-requests/publicChats.api.js.map +1 -0
  169. package/lib/commonjs/networking/api-requests/roomMembers.api.js +253 -4
  170. package/lib/commonjs/networking/api-requests/roomMembers.api.js.map +1 -1
  171. package/lib/commonjs/networking/api-requests/rooms.api.js +48 -12
  172. package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
  173. package/lib/commonjs/networking/api-requests/xmppToken.api.js +71 -0
  174. package/lib/commonjs/networking/api-requests/xmppToken.api.js.map +1 -0
  175. package/lib/commonjs/networking/ethoraEvents.js +227 -0
  176. package/lib/commonjs/networking/ethoraEvents.js.map +1 -0
  177. package/lib/commonjs/networking/stanzaHandlers.js +153 -16
  178. package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
  179. package/lib/commonjs/networking/xmpp/allRoomPresences.xmpp.js +124 -3
  180. package/lib/commonjs/networking/xmpp/allRoomPresences.xmpp.js.map +1 -1
  181. package/lib/commonjs/networking/xmpp/getHistory.xmpp.js +319 -35
  182. package/lib/commonjs/networking/xmpp/getHistory.xmpp.js.map +1 -1
  183. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js +7 -0
  184. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  185. package/lib/commonjs/networking/xmpp/historyCursor.js +101 -0
  186. package/lib/commonjs/networking/xmpp/historyCursor.js.map +1 -0
  187. package/lib/commonjs/networking/xmpp/mamQueryIds.js +17 -0
  188. package/lib/commonjs/networking/xmpp/mamQueryIds.js.map +1 -0
  189. package/lib/commonjs/networking/xmpp/mamRouter.js +24 -9
  190. package/lib/commonjs/networking/xmpp/mamRouter.js.map +1 -1
  191. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js +70 -65
  192. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  193. package/lib/commonjs/networking/xmpp/roomJoinSweep.js +389 -0
  194. package/lib/commonjs/networking/xmpp/roomJoinSweep.js.map +1 -0
  195. package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js +0 -1
  196. package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
  197. package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js +0 -1
  198. package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
  199. package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +0 -1
  200. package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
  201. package/lib/commonjs/networking/xmppClient.js +269 -41
  202. package/lib/commonjs/networking/xmppClient.js.map +1 -1
  203. package/lib/commonjs/networking/xmppCredentials.js +80 -0
  204. package/lib/commonjs/networking/xmppCredentials.js.map +1 -0
  205. package/lib/commonjs/roomStore/Middleware/jumpThreadMiddleware.js +158 -0
  206. package/lib/commonjs/roomStore/Middleware/jumpThreadMiddleware.js.map +1 -0
  207. package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js +6 -0
  208. package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
  209. package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js +45 -7
  210. package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js.map +1 -1
  211. package/lib/commonjs/roomStore/chatSettingsSlice.js +15 -1
  212. package/lib/commonjs/roomStore/chatSettingsSlice.js.map +1 -1
  213. package/lib/commonjs/roomStore/index.js +13 -3
  214. package/lib/commonjs/roomStore/index.js.map +1 -1
  215. package/lib/commonjs/roomStore/persistence.js +48 -1
  216. package/lib/commonjs/roomStore/persistence.js.map +1 -1
  217. package/lib/commonjs/roomStore/roomsSlice.js +474 -60
  218. package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
  219. package/lib/commonjs/roomStore/safeKey.js +44 -0
  220. package/lib/commonjs/roomStore/safeKey.js.map +1 -0
  221. package/lib/commonjs/roomStore/usersSetCap.js +37 -0
  222. package/lib/commonjs/roomStore/usersSetCap.js.map +1 -0
  223. package/lib/commonjs/version.js +1 -1
  224. package/lib/commonjs/version.js.map +1 -1
  225. package/lib/module/assets/icons.js +1 -1
  226. package/lib/module/assets/icons.js.map +1 -1
  227. package/lib/module/components/Header/HeaderRoomList.js +23 -7
  228. package/lib/module/components/Header/HeaderRoomList.js.map +1 -1
  229. package/lib/module/components/InputComponents/Search.js +39 -2
  230. package/lib/module/components/InputComponents/Search.js.map +1 -1
  231. package/lib/module/components/MainComponents/ArchivedMessageCard.js +161 -0
  232. package/lib/module/components/MainComponents/ArchivedMessageCard.js.map +1 -0
  233. package/lib/module/components/MainComponents/ChatHeader.js +22 -5
  234. package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
  235. package/lib/module/components/MainComponents/ChatRoom.js +57 -26
  236. package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
  237. package/lib/module/components/MainComponents/ChatWrapper.js +31 -1
  238. package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
  239. package/lib/module/components/MainComponents/MediaMessage.js +18 -3
  240. package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
  241. package/lib/module/components/MainComponents/MessageList.js +740 -42
  242. package/lib/module/components/MainComponents/MessageList.js.map +1 -1
  243. package/lib/module/components/MainComponents/MessageSearchButton.js +48 -0
  244. package/lib/module/components/MainComponents/MessageSearchButton.js.map +1 -0
  245. package/lib/module/components/MainComponents/ReduxWrapper.js +15 -7
  246. package/lib/module/components/MainComponents/ReduxWrapper.js.map +1 -1
  247. package/lib/module/components/MainComponents/RoomList.js +111 -2
  248. package/lib/module/components/MainComponents/RoomList.js.map +1 -1
  249. package/lib/module/components/Menu/HeaderRoomListMenu.js +15 -4
  250. package/lib/module/components/Menu/HeaderRoomListMenu.js.map +1 -1
  251. package/lib/module/components/MessageBubble/BubbleHighlight.js +106 -0
  252. package/lib/module/components/MessageBubble/BubbleHighlight.js.map +1 -0
  253. package/lib/module/components/MessageBubble/Message.js +172 -127
  254. package/lib/module/components/MessageBubble/Message.js.map +1 -1
  255. package/lib/module/components/MessageBubble/MessageInteractions.js +98 -78
  256. package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
  257. package/lib/module/components/MessageBubble/messageMenuLayout.js +45 -0
  258. package/lib/module/components/MessageBubble/messageMenuLayout.js.map +1 -0
  259. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +74 -38
  260. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  261. package/lib/module/components/Modals/MessageSearchModal/MessageHitResults.js +243 -0
  262. package/lib/module/components/Modals/MessageSearchModal/MessageHitResults.js.map +1 -0
  263. package/lib/module/components/Modals/MessageSearchModal/MessageSearchModal.js +482 -0
  264. package/lib/module/components/Modals/MessageSearchModal/MessageSearchModal.js.map +1 -0
  265. package/lib/module/components/Modals/MessageSearchModal/openHit.js +45 -0
  266. package/lib/module/components/Modals/MessageSearchModal/openHit.js.map +1 -0
  267. package/lib/module/components/Modals/MessageSearchModal/resolveSender.js +41 -0
  268. package/lib/module/components/Modals/MessageSearchModal/resolveSender.js.map +1 -0
  269. package/lib/module/components/Modals/MessageSearchModal/searchFilters.js +74 -0
  270. package/lib/module/components/Modals/MessageSearchModal/searchFilters.js.map +1 -0
  271. package/lib/module/components/Modals/MessageSearchModal/snippet.js +57 -0
  272. package/lib/module/components/Modals/MessageSearchModal/snippet.js.map +1 -0
  273. package/lib/module/components/Modals/MessageSearchModal/useMessageSearch.js +131 -0
  274. package/lib/module/components/Modals/MessageSearchModal/useMessageSearch.js.map +1 -0
  275. package/lib/module/components/Modals/PublicChatsModal/PublicChatsModal.js +300 -0
  276. package/lib/module/components/Modals/PublicChatsModal/PublicChatsModal.js.map +1 -0
  277. package/lib/module/components/Modals/PublicChatsModal/publicChatsLogic.js +30 -0
  278. package/lib/module/components/Modals/PublicChatsModal/publicChatsLogic.js.map +1 -0
  279. package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js +8 -1
  280. package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
  281. package/lib/module/components/RoomComponents/ChatRoomItem.js +14 -3
  282. package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
  283. package/lib/module/components/RoomComponents/SwipeableRoomRow.js +39 -7
  284. package/lib/module/components/RoomComponents/SwipeableRoomRow.js.map +1 -1
  285. package/lib/module/components/Thread/ThreadHeader.js +3 -1
  286. package/lib/module/components/Thread/ThreadHeader.js.map +1 -1
  287. package/lib/module/components/Thread/ThreadWrapper.js +89 -9
  288. package/lib/module/components/Thread/ThreadWrapper.js.map +1 -1
  289. package/lib/module/components/styled/AudioDecoderHost.js +332 -0
  290. package/lib/module/components/styled/AudioDecoderHost.js.map +1 -0
  291. package/lib/module/components/styled/AudioMessage.js +495 -422
  292. package/lib/module/components/styled/AudioMessage.js.map +1 -1
  293. package/lib/module/components/styled/SendInput.js +32 -6
  294. package/lib/module/components/styled/SendInput.js.map +1 -1
  295. package/lib/module/context/MessageNotificationContext.js +15 -5
  296. package/lib/module/context/MessageNotificationContext.js.map +1 -1
  297. package/lib/module/context/xmppProvider.js +42 -78
  298. package/lib/module/context/xmppProvider.js.map +1 -1
  299. package/lib/module/helpers/audioWaveform.js +153 -0
  300. package/lib/module/helpers/audioWaveform.js.map +1 -0
  301. package/lib/module/helpers/backgroundJoinSweep.js +30 -0
  302. package/lib/module/helpers/backgroundJoinSweep.js.map +1 -0
  303. package/lib/module/helpers/bubbleHighlight.js +38 -0
  304. package/lib/module/helpers/bubbleHighlight.js.map +1 -0
  305. package/lib/module/helpers/checkUniqueUsers.js +15 -13
  306. package/lib/module/helpers/checkUniqueUsers.js.map +1 -1
  307. package/lib/module/helpers/constants/MODAL_COMPONENTS.js +5 -1
  308. package/lib/module/helpers/constants/MODAL_COMPONENTS.js.map +1 -1
  309. package/lib/module/helpers/constants/MODAL_TYPES.js +3 -1
  310. package/lib/module/helpers/constants/MODAL_TYPES.js.map +1 -1
  311. package/lib/module/helpers/createRoomFromApi.js +37 -3
  312. package/lib/module/helpers/createRoomFromApi.js.map +1 -1
  313. package/lib/module/helpers/dedupeMembers.js +28 -0
  314. package/lib/module/helpers/dedupeMembers.js.map +1 -0
  315. package/lib/module/helpers/ethoraLogger.js +52 -0
  316. package/lib/module/helpers/ethoraLogger.js.map +1 -0
  317. package/lib/module/helpers/getUnnamedUsers.js +9 -4
  318. package/lib/module/helpers/getUnnamedUsers.js.map +1 -1
  319. package/lib/module/helpers/historyPreloadConfig.js +39 -0
  320. package/lib/module/helpers/historyPreloadConfig.js.map +1 -0
  321. package/lib/module/helpers/historyPreloadScheduler.js +368 -134
  322. package/lib/module/helpers/historyPreloadScheduler.js.map +1 -1
  323. package/lib/module/helpers/initRoomsPresence.js +18 -5
  324. package/lib/module/helpers/initRoomsPresence.js.map +1 -1
  325. package/lib/module/helpers/insertMessageWithDelimiter.js +5 -0
  326. package/lib/module/helpers/insertMessageWithDelimiter.js.map +1 -1
  327. package/lib/module/helpers/isLikelyMucJid.js +60 -0
  328. package/lib/module/helpers/isLikelyMucJid.js.map +1 -0
  329. package/lib/module/helpers/isMessageSearchEnabled.js +13 -0
  330. package/lib/module/helpers/isMessageSearchEnabled.js.map +1 -0
  331. package/lib/module/helpers/joiningRoom.js +9 -0
  332. package/lib/module/helpers/joiningRoom.js.map +1 -0
  333. package/lib/module/helpers/jumpThread.js +83 -0
  334. package/lib/module/helpers/jumpThread.js.map +1 -0
  335. package/lib/module/helpers/jumpToMessage.js +52 -0
  336. package/lib/module/helpers/jumpToMessage.js.map +1 -0
  337. package/lib/module/helpers/jumpWindow.js +177 -0
  338. package/lib/module/helpers/jumpWindow.js.map +1 -0
  339. package/lib/module/helpers/loadRoomHistory.js +69 -0
  340. package/lib/module/helpers/loadRoomHistory.js.map +1 -0
  341. package/lib/module/helpers/notificationPolicy.js +70 -0
  342. package/lib/module/helpers/notificationPolicy.js.map +1 -0
  343. package/lib/module/helpers/openRoomAtMessage.js +41 -0
  344. package/lib/module/helpers/openRoomAtMessage.js.map +1 -0
  345. package/lib/module/helpers/openThreadForJump.js +68 -0
  346. package/lib/module/helpers/openThreadForJump.js.map +1 -0
  347. package/lib/module/helpers/parseMessageReference.js +26 -6
  348. package/lib/module/helpers/parseMessageReference.js.map +1 -1
  349. package/lib/module/helpers/publicChatsEntry.js +12 -0
  350. package/lib/module/helpers/publicChatsEntry.js.map +1 -0
  351. package/lib/module/helpers/roomActivityScore.js +30 -0
  352. package/lib/module/helpers/roomActivityScore.js.map +1 -0
  353. package/lib/module/helpers/roomUserCount.js +29 -0
  354. package/lib/module/helpers/roomUserCount.js.map +1 -0
  355. package/lib/module/helpers/runConfiguredHistoryPreload.js +63 -0
  356. package/lib/module/helpers/runConfiguredHistoryPreload.js.map +1 -0
  357. package/lib/module/helpers/sessionAppId.js +20 -0
  358. package/lib/module/helpers/sessionAppId.js.map +1 -0
  359. package/lib/module/helpers/timestamp.js +37 -0
  360. package/lib/module/helpers/timestamp.js.map +1 -0
  361. package/lib/module/helpers/userResolver.js +503 -0
  362. package/lib/module/helpers/userResolver.js.map +1 -0
  363. package/lib/module/helpers/xmppIdShape.js +46 -0
  364. package/lib/module/helpers/xmppIdShape.js.map +1 -0
  365. package/lib/module/hooks/useChatWrapperInit.js +16 -5
  366. package/lib/module/hooks/useChatWrapperInit.js.map +1 -1
  367. package/lib/module/hooks/useHeapSender.js +54 -3
  368. package/lib/module/hooks/useHeapSender.js.map +1 -1
  369. package/lib/module/hooks/useJumpToMessage.js +389 -0
  370. package/lib/module/hooks/useJumpToMessage.js.map +1 -0
  371. package/lib/module/hooks/useMessageLoaderQueue.js +32 -5
  372. package/lib/module/hooks/useMessageLoaderQueue.js.map +1 -1
  373. package/lib/module/hooks/useMessageQueue.js +13 -5
  374. package/lib/module/hooks/useMessageQueue.js.map +1 -1
  375. package/lib/module/hooks/useRoomDirectory.js +24 -0
  376. package/lib/module/hooks/useRoomDirectory.js.map +1 -0
  377. package/lib/module/hooks/useRoomInitialization.js +29 -7
  378. package/lib/module/hooks/useRoomInitialization.js.map +1 -1
  379. package/lib/module/hooks/useRoomMute.js +58 -0
  380. package/lib/module/hooks/useRoomMute.js.map +1 -0
  381. package/lib/module/hooks/useRoomState.js +3 -1
  382. package/lib/module/hooks/useRoomState.js.map +1 -1
  383. package/lib/module/hooks/useSendMessage.js +13 -3
  384. package/lib/module/hooks/useSendMessage.js.map +1 -1
  385. package/lib/module/i18n/strings.js +288 -6
  386. package/lib/module/i18n/strings.js.map +1 -1
  387. package/lib/module/networking/api-requests/messageSearch.api.js +81 -0
  388. package/lib/module/networking/api-requests/messageSearch.api.js.map +1 -0
  389. package/lib/module/networking/api-requests/publicChats.api.js +43 -0
  390. package/lib/module/networking/api-requests/publicChats.api.js.map +1 -0
  391. package/lib/module/networking/api-requests/roomMembers.api.js +248 -4
  392. package/lib/module/networking/api-requests/roomMembers.api.js.map +1 -1
  393. package/lib/module/networking/api-requests/rooms.api.js +48 -12
  394. package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
  395. package/lib/module/networking/api-requests/xmppToken.api.js +66 -0
  396. package/lib/module/networking/api-requests/xmppToken.api.js.map +1 -0
  397. package/lib/module/networking/ethoraEvents.js +220 -0
  398. package/lib/module/networking/ethoraEvents.js.map +1 -0
  399. package/lib/module/networking/stanzaHandlers.js +155 -18
  400. package/lib/module/networking/stanzaHandlers.js.map +1 -1
  401. package/lib/module/networking/xmpp/allRoomPresences.xmpp.js +125 -3
  402. package/lib/module/networking/xmpp/allRoomPresences.xmpp.js.map +1 -1
  403. package/lib/module/networking/xmpp/getHistory.xmpp.js +318 -35
  404. package/lib/module/networking/xmpp/getHistory.xmpp.js.map +1 -1
  405. package/lib/module/networking/xmpp/handleStanzas.xmpp.js +7 -0
  406. package/lib/module/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  407. package/lib/module/networking/xmpp/historyCursor.js +95 -0
  408. package/lib/module/networking/xmpp/historyCursor.js.map +1 -0
  409. package/lib/module/networking/xmpp/mamQueryIds.js +12 -0
  410. package/lib/module/networking/xmpp/mamQueryIds.js.map +1 -0
  411. package/lib/module/networking/xmpp/mamRouter.js +22 -8
  412. package/lib/module/networking/xmpp/mamRouter.js.map +1 -1
  413. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js +68 -62
  414. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  415. package/lib/module/networking/xmpp/roomJoinSweep.js +385 -0
  416. package/lib/module/networking/xmpp/roomJoinSweep.js.map +1 -0
  417. package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js +0 -1
  418. package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
  419. package/lib/module/networking/xmpp/sendTextMessage.xmpp.js +0 -1
  420. package/lib/module/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
  421. package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +0 -1
  422. package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
  423. package/lib/module/networking/xmppClient.js +269 -41
  424. package/lib/module/networking/xmppClient.js.map +1 -1
  425. package/lib/module/networking/xmppCredentials.js +76 -0
  426. package/lib/module/networking/xmppCredentials.js.map +1 -0
  427. package/lib/module/roomStore/Middleware/jumpThreadMiddleware.js +153 -0
  428. package/lib/module/roomStore/Middleware/jumpThreadMiddleware.js.map +1 -0
  429. package/lib/module/roomStore/Middleware/reactionsMiddleware.js +6 -0
  430. package/lib/module/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
  431. package/lib/module/roomStore/Middleware/unreadMidlleware.js +46 -7
  432. package/lib/module/roomStore/Middleware/unreadMidlleware.js.map +1 -1
  433. package/lib/module/roomStore/chatSettingsSlice.js +13 -0
  434. package/lib/module/roomStore/chatSettingsSlice.js.map +1 -1
  435. package/lib/module/roomStore/index.js +7 -3
  436. package/lib/module/roomStore/index.js.map +1 -1
  437. package/lib/module/roomStore/persistence.js +46 -1
  438. package/lib/module/roomStore/persistence.js.map +1 -1
  439. package/lib/module/roomStore/roomsSlice.js +459 -58
  440. package/lib/module/roomStore/roomsSlice.js.map +1 -1
  441. package/lib/module/roomStore/safeKey.js +37 -0
  442. package/lib/module/roomStore/safeKey.js.map +1 -0
  443. package/lib/module/roomStore/usersSetCap.js +32 -0
  444. package/lib/module/roomStore/usersSetCap.js.map +1 -0
  445. package/lib/module/version.js +1 -1
  446. package/lib/module/version.js.map +1 -1
  447. package/lib/typescript/assets/icons.d.ts +4 -0
  448. package/lib/typescript/assets/icons.d.ts.map +1 -1
  449. package/lib/typescript/components/Header/HeaderRoomList.d.ts.map +1 -1
  450. package/lib/typescript/components/InputComponents/Search.d.ts.map +1 -1
  451. package/lib/typescript/components/MainComponents/ArchivedMessageCard.d.ts +12 -0
  452. package/lib/typescript/components/MainComponents/ArchivedMessageCard.d.ts.map +1 -0
  453. package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
  454. package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
  455. package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
  456. package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
  457. package/lib/typescript/components/MainComponents/MessageList.d.ts +22 -1
  458. package/lib/typescript/components/MainComponents/MessageList.d.ts.map +1 -1
  459. package/lib/typescript/components/MainComponents/MessageSearchButton.d.ts +7 -0
  460. package/lib/typescript/components/MainComponents/MessageSearchButton.d.ts.map +1 -0
  461. package/lib/typescript/components/MainComponents/ReduxWrapper.d.ts.map +1 -1
  462. package/lib/typescript/components/MainComponents/RoomList.d.ts.map +1 -1
  463. package/lib/typescript/components/Menu/HeaderRoomListMenu.d.ts.map +1 -1
  464. package/lib/typescript/components/MessageBubble/BubbleHighlight.d.ts +12 -0
  465. package/lib/typescript/components/MessageBubble/BubbleHighlight.d.ts.map +1 -0
  466. package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
  467. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts +5 -0
  468. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts.map +1 -1
  469. package/lib/typescript/components/MessageBubble/messageMenuLayout.d.ts +29 -0
  470. package/lib/typescript/components/MessageBubble/messageMenuLayout.d.ts.map +1 -0
  471. package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts +2 -0
  472. package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
  473. package/lib/typescript/components/Modals/MessageSearchModal/MessageHitResults.d.ts +44 -0
  474. package/lib/typescript/components/Modals/MessageSearchModal/MessageHitResults.d.ts.map +1 -0
  475. package/lib/typescript/components/Modals/MessageSearchModal/MessageSearchModal.d.ts +12 -0
  476. package/lib/typescript/components/Modals/MessageSearchModal/MessageSearchModal.d.ts.map +1 -0
  477. package/lib/typescript/components/Modals/MessageSearchModal/openHit.d.ts +15 -0
  478. package/lib/typescript/components/Modals/MessageSearchModal/openHit.d.ts.map +1 -0
  479. package/lib/typescript/components/Modals/MessageSearchModal/resolveSender.d.ts +34 -0
  480. package/lib/typescript/components/Modals/MessageSearchModal/resolveSender.d.ts.map +1 -0
  481. package/lib/typescript/components/Modals/MessageSearchModal/searchFilters.d.ts +41 -0
  482. package/lib/typescript/components/Modals/MessageSearchModal/searchFilters.d.ts.map +1 -0
  483. package/lib/typescript/components/Modals/MessageSearchModal/snippet.d.ts +15 -0
  484. package/lib/typescript/components/Modals/MessageSearchModal/snippet.d.ts.map +1 -0
  485. package/lib/typescript/components/Modals/MessageSearchModal/useMessageSearch.d.ts +23 -0
  486. package/lib/typescript/components/Modals/MessageSearchModal/useMessageSearch.d.ts.map +1 -0
  487. package/lib/typescript/components/Modals/PublicChatsModal/PublicChatsModal.d.ts +16 -0
  488. package/lib/typescript/components/Modals/PublicChatsModal/PublicChatsModal.d.ts.map +1 -0
  489. package/lib/typescript/components/Modals/PublicChatsModal/publicChatsLogic.d.ts +14 -0
  490. package/lib/typescript/components/Modals/PublicChatsModal/publicChatsLogic.d.ts.map +1 -0
  491. package/lib/typescript/components/Modals/SelectUsersModal/SelectUsersModal.d.ts.map +1 -1
  492. package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
  493. package/lib/typescript/components/RoomComponents/SwipeableRoomRow.d.ts +5 -1
  494. package/lib/typescript/components/RoomComponents/SwipeableRoomRow.d.ts.map +1 -1
  495. package/lib/typescript/components/Thread/ThreadHeader.d.ts.map +1 -1
  496. package/lib/typescript/components/Thread/ThreadWrapper.d.ts +1 -0
  497. package/lib/typescript/components/Thread/ThreadWrapper.d.ts.map +1 -1
  498. package/lib/typescript/components/styled/AudioDecoderHost.d.ts +39 -0
  499. package/lib/typescript/components/styled/AudioDecoderHost.d.ts.map +1 -0
  500. package/lib/typescript/components/styled/AudioMessage.d.ts +14 -1
  501. package/lib/typescript/components/styled/AudioMessage.d.ts.map +1 -1
  502. package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
  503. package/lib/typescript/context/MessageNotificationContext.d.ts.map +1 -1
  504. package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
  505. package/lib/typescript/helpers/audioWaveform.d.ts +54 -0
  506. package/lib/typescript/helpers/audioWaveform.d.ts.map +1 -0
  507. package/lib/typescript/helpers/backgroundJoinSweep.d.ts +14 -0
  508. package/lib/typescript/helpers/backgroundJoinSweep.d.ts.map +1 -0
  509. package/lib/typescript/helpers/bubbleHighlight.d.ts +17 -0
  510. package/lib/typescript/helpers/bubbleHighlight.d.ts.map +1 -0
  511. package/lib/typescript/helpers/checkUniqueUsers.d.ts +2 -2
  512. package/lib/typescript/helpers/checkUniqueUsers.d.ts.map +1 -1
  513. package/lib/typescript/helpers/constants/MODAL_COMPONENTS.d.ts.map +1 -1
  514. package/lib/typescript/helpers/constants/MODAL_TYPES.d.ts +2 -0
  515. package/lib/typescript/helpers/constants/MODAL_TYPES.d.ts.map +1 -1
  516. package/lib/typescript/helpers/createRoomFromApi.d.ts +25 -0
  517. package/lib/typescript/helpers/createRoomFromApi.d.ts.map +1 -1
  518. package/lib/typescript/helpers/dedupeMembers.d.ts +11 -0
  519. package/lib/typescript/helpers/dedupeMembers.d.ts.map +1 -0
  520. package/lib/typescript/helpers/ethoraLogger.d.ts +13 -0
  521. package/lib/typescript/helpers/ethoraLogger.d.ts.map +1 -0
  522. package/lib/typescript/helpers/getUnnamedUsers.d.ts.map +1 -1
  523. package/lib/typescript/helpers/historyPreloadConfig.d.ts +26 -0
  524. package/lib/typescript/helpers/historyPreloadConfig.d.ts.map +1 -0
  525. package/lib/typescript/helpers/historyPreloadScheduler.d.ts +8 -4
  526. package/lib/typescript/helpers/historyPreloadScheduler.d.ts.map +1 -1
  527. package/lib/typescript/helpers/initRoomsPresence.d.ts +7 -0
  528. package/lib/typescript/helpers/initRoomsPresence.d.ts.map +1 -1
  529. package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts.map +1 -1
  530. package/lib/typescript/helpers/isLikelyMucJid.d.ts +19 -0
  531. package/lib/typescript/helpers/isLikelyMucJid.d.ts.map +1 -0
  532. package/lib/typescript/helpers/isMessageSearchEnabled.d.ts +12 -0
  533. package/lib/typescript/helpers/isMessageSearchEnabled.d.ts.map +1 -0
  534. package/lib/typescript/helpers/joiningRoom.d.ts +7 -0
  535. package/lib/typescript/helpers/joiningRoom.d.ts.map +1 -0
  536. package/lib/typescript/helpers/jumpThread.d.ts +48 -0
  537. package/lib/typescript/helpers/jumpThread.d.ts.map +1 -0
  538. package/lib/typescript/helpers/jumpToMessage.d.ts +26 -0
  539. package/lib/typescript/helpers/jumpToMessage.d.ts.map +1 -0
  540. package/lib/typescript/helpers/jumpWindow.d.ts +74 -0
  541. package/lib/typescript/helpers/jumpWindow.d.ts.map +1 -0
  542. package/lib/typescript/helpers/loadRoomHistory.d.ts +34 -0
  543. package/lib/typescript/helpers/loadRoomHistory.d.ts.map +1 -0
  544. package/lib/typescript/helpers/notificationPolicy.d.ts +42 -0
  545. package/lib/typescript/helpers/notificationPolicy.d.ts.map +1 -0
  546. package/lib/typescript/helpers/openRoomAtMessage.d.ts +17 -0
  547. package/lib/typescript/helpers/openRoomAtMessage.d.ts.map +1 -0
  548. package/lib/typescript/helpers/openThreadForJump.d.ts +27 -0
  549. package/lib/typescript/helpers/openThreadForJump.d.ts.map +1 -0
  550. package/lib/typescript/helpers/parseMessageReference.d.ts +18 -5
  551. package/lib/typescript/helpers/parseMessageReference.d.ts.map +1 -1
  552. package/lib/typescript/helpers/publicChatsEntry.d.ts +11 -0
  553. package/lib/typescript/helpers/publicChatsEntry.d.ts.map +1 -0
  554. package/lib/typescript/helpers/roomActivityScore.d.ts +5 -0
  555. package/lib/typescript/helpers/roomActivityScore.d.ts.map +1 -0
  556. package/lib/typescript/helpers/roomUserCount.d.ts +20 -0
  557. package/lib/typescript/helpers/roomUserCount.d.ts.map +1 -0
  558. package/lib/typescript/helpers/runConfiguredHistoryPreload.d.ts +21 -0
  559. package/lib/typescript/helpers/runConfiguredHistoryPreload.d.ts.map +1 -0
  560. package/lib/typescript/helpers/sessionAppId.d.ts +8 -0
  561. package/lib/typescript/helpers/sessionAppId.d.ts.map +1 -0
  562. package/lib/typescript/helpers/timestamp.d.ts +3 -0
  563. package/lib/typescript/helpers/timestamp.d.ts.map +1 -0
  564. package/lib/typescript/helpers/userResolver.d.ts +58 -0
  565. package/lib/typescript/helpers/userResolver.d.ts.map +1 -0
  566. package/lib/typescript/helpers/xmppIdShape.d.ts +10 -0
  567. package/lib/typescript/helpers/xmppIdShape.d.ts.map +1 -0
  568. package/lib/typescript/hooks/useChatWrapperInit.d.ts +2 -0
  569. package/lib/typescript/hooks/useChatWrapperInit.d.ts.map +1 -1
  570. package/lib/typescript/hooks/useHeapSender.d.ts.map +1 -1
  571. package/lib/typescript/hooks/useJumpToMessage.d.ts +116 -0
  572. package/lib/typescript/hooks/useJumpToMessage.d.ts.map +1 -0
  573. package/lib/typescript/hooks/useMessageLoaderQueue.d.ts.map +1 -1
  574. package/lib/typescript/hooks/useMessageQueue.d.ts.map +1 -1
  575. package/lib/typescript/hooks/useRoomDirectory.d.ts +12 -0
  576. package/lib/typescript/hooks/useRoomDirectory.d.ts.map +1 -0
  577. package/lib/typescript/hooks/useRoomInitialization.d.ts.map +1 -1
  578. package/lib/typescript/hooks/useRoomMute.d.ts +8 -0
  579. package/lib/typescript/hooks/useRoomMute.d.ts.map +1 -0
  580. package/lib/typescript/hooks/useRoomState.d.ts +1 -0
  581. package/lib/typescript/hooks/useRoomState.d.ts.map +1 -1
  582. package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
  583. package/lib/typescript/i18n/strings.d.ts.map +1 -1
  584. package/lib/typescript/networking/api-requests/messageSearch.api.d.ts +57 -0
  585. package/lib/typescript/networking/api-requests/messageSearch.api.d.ts.map +1 -0
  586. package/lib/typescript/networking/api-requests/publicChats.api.d.ts +24 -0
  587. package/lib/typescript/networking/api-requests/publicChats.api.d.ts.map +1 -0
  588. package/lib/typescript/networking/api-requests/roomMembers.api.d.ts +19 -1
  589. package/lib/typescript/networking/api-requests/roomMembers.api.d.ts.map +1 -1
  590. package/lib/typescript/networking/api-requests/rooms.api.d.ts.map +1 -1
  591. package/lib/typescript/networking/api-requests/xmppToken.api.d.ts +2 -0
  592. package/lib/typescript/networking/api-requests/xmppToken.api.d.ts.map +1 -0
  593. package/lib/typescript/networking/ethoraEvents.d.ts +45 -0
  594. package/lib/typescript/networking/ethoraEvents.d.ts.map +1 -0
  595. package/lib/typescript/networking/stanzaHandlers.d.ts +1 -1
  596. package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
  597. package/lib/typescript/networking/xmpp/allRoomPresences.xmpp.d.ts +32 -1
  598. package/lib/typescript/networking/xmpp/allRoomPresences.xmpp.d.ts.map +1 -1
  599. package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts +64 -0
  600. package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts.map +1 -1
  601. package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts.map +1 -1
  602. package/lib/typescript/networking/xmpp/historyCursor.d.ts +35 -0
  603. package/lib/typescript/networking/xmpp/historyCursor.d.ts.map +1 -0
  604. package/lib/typescript/networking/xmpp/mamQueryIds.d.ts +10 -0
  605. package/lib/typescript/networking/xmpp/mamQueryIds.d.ts.map +1 -0
  606. package/lib/typescript/networking/xmpp/mamRouter.d.ts +7 -0
  607. package/lib/typescript/networking/xmpp/mamRouter.d.ts.map +1 -1
  608. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts +13 -2
  609. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts.map +1 -1
  610. package/lib/typescript/networking/xmpp/roomJoinSweep.d.ts +82 -0
  611. package/lib/typescript/networking/xmpp/roomJoinSweep.d.ts.map +1 -0
  612. package/lib/typescript/networking/xmpp/sendMediaMessage.xmpp.d.ts.map +1 -1
  613. package/lib/typescript/networking/xmpp/sendTextMessage.xmpp.d.ts.map +1 -1
  614. package/lib/typescript/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.d.ts.map +1 -1
  615. package/lib/typescript/networking/xmppClient.d.ts +90 -4
  616. package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
  617. package/lib/typescript/networking/xmppCredentials.d.ts +12 -0
  618. package/lib/typescript/networking/xmppCredentials.d.ts.map +1 -0
  619. package/lib/typescript/roomStore/Middleware/jumpThreadMiddleware.d.ts +3 -0
  620. package/lib/typescript/roomStore/Middleware/jumpThreadMiddleware.d.ts.map +1 -0
  621. package/lib/typescript/roomStore/Middleware/reactionsMiddleware.d.ts.map +1 -1
  622. package/lib/typescript/roomStore/Middleware/unreadMidlleware.d.ts.map +1 -1
  623. package/lib/typescript/roomStore/chatSettingsSlice.d.ts +8 -1
  624. package/lib/typescript/roomStore/chatSettingsSlice.d.ts.map +1 -1
  625. package/lib/typescript/roomStore/index.d.ts +2 -1
  626. package/lib/typescript/roomStore/index.d.ts.map +1 -1
  627. package/lib/typescript/roomStore/persistence.d.ts +8 -0
  628. package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
  629. package/lib/typescript/roomStore/roomsSlice.d.ts +138 -2
  630. package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
  631. package/lib/typescript/roomStore/safeKey.d.ts +13 -0
  632. package/lib/typescript/roomStore/safeKey.d.ts.map +1 -0
  633. package/lib/typescript/roomStore/usersSetCap.d.ts +16 -0
  634. package/lib/typescript/roomStore/usersSetCap.d.ts.map +1 -0
  635. package/lib/typescript/types/models/media.model.d.ts +2 -0
  636. package/lib/typescript/types/models/media.model.d.ts.map +1 -1
  637. package/lib/typescript/types/models/room.model.d.ts +18 -5
  638. package/lib/typescript/types/models/room.model.d.ts.map +1 -1
  639. package/lib/typescript/types/models/xmpp.model.d.ts +8 -1
  640. package/lib/typescript/types/models/xmpp.model.d.ts.map +1 -1
  641. package/lib/typescript/types/types.d.ts +88 -5
  642. package/lib/typescript/types/types.d.ts.map +1 -1
  643. package/lib/typescript/version.d.ts +1 -1
  644. package/lib/typescript/version.d.ts.map +1 -1
  645. package/package.json +1 -1
  646. package/src/assets/icons.tsx +13 -0
  647. package/src/components/Header/HeaderRoomList.tsx +21 -4
  648. package/src/components/InputComponents/Search.tsx +33 -0
  649. package/src/components/MainComponents/ArchivedMessageCard.tsx +139 -0
  650. package/src/components/MainComponents/ChatHeader.tsx +19 -3
  651. package/src/components/MainComponents/ChatRoom.tsx +60 -23
  652. package/src/components/MainComponents/ChatWrapper.tsx +23 -4
  653. package/src/components/MainComponents/MediaMessage.tsx +17 -0
  654. package/src/components/MainComponents/MessageList.tsx +823 -84
  655. package/src/components/MainComponents/MessageSearchButton.tsx +48 -0
  656. package/src/components/MainComponents/ReduxWrapper.tsx +16 -5
  657. package/src/components/MainComponents/RoomList.tsx +125 -0
  658. package/src/components/Menu/HeaderRoomListMenu.tsx +26 -2
  659. package/src/components/MessageBubble/BubbleHighlight.tsx +106 -0
  660. package/src/components/MessageBubble/Message.tsx +265 -177
  661. package/src/components/MessageBubble/MessageInteractions.tsx +109 -86
  662. package/src/components/MessageBubble/messageMenuLayout.ts +59 -0
  663. package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +92 -21
  664. package/src/components/Modals/MessageSearchModal/MessageHitResults.tsx +271 -0
  665. package/src/components/Modals/MessageSearchModal/MessageSearchModal.tsx +487 -0
  666. package/src/components/Modals/MessageSearchModal/openHit.ts +50 -0
  667. package/src/components/Modals/MessageSearchModal/resolveSender.ts +57 -0
  668. package/src/components/Modals/MessageSearchModal/searchFilters.ts +109 -0
  669. package/src/components/Modals/MessageSearchModal/snippet.ts +58 -0
  670. package/src/components/Modals/MessageSearchModal/useMessageSearch.ts +151 -0
  671. package/src/components/Modals/PublicChatsModal/PublicChatsModal.tsx +288 -0
  672. package/src/components/Modals/PublicChatsModal/publicChatsLogic.ts +36 -0
  673. package/src/components/Modals/SelectUsersModal/SelectUsersModal.tsx +8 -1
  674. package/src/components/RoomComponents/ChatRoomItem.tsx +16 -3
  675. package/src/components/RoomComponents/SwipeableRoomRow.tsx +39 -6
  676. package/src/components/Thread/ThreadHeader.tsx +3 -1
  677. package/src/components/Thread/ThreadWrapper.tsx +96 -10
  678. package/src/components/styled/AudioDecoderHost.tsx +351 -0
  679. package/src/components/styled/AudioMessage.tsx +482 -425
  680. package/src/components/styled/SendInput.tsx +42 -4
  681. package/src/context/MessageNotificationContext.tsx +19 -5
  682. package/src/context/xmppProvider.tsx +44 -91
  683. package/src/helpers/audioWaveform.ts +142 -0
  684. package/src/helpers/backgroundJoinSweep.ts +35 -0
  685. package/src/helpers/bubbleHighlight.ts +47 -0
  686. package/src/helpers/checkUniqueUsers.tsx +15 -17
  687. package/src/helpers/constants/MODAL_COMPONENTS.tsx +4 -0
  688. package/src/helpers/constants/MODAL_TYPES.ts +3 -0
  689. package/src/helpers/createRoomFromApi.tsx +45 -4
  690. package/src/helpers/dedupeMembers.ts +29 -0
  691. package/src/helpers/ethoraLogger.ts +50 -0
  692. package/src/helpers/getUnnamedUsers.ts +7 -4
  693. package/src/helpers/historyPreloadConfig.ts +68 -0
  694. package/src/helpers/historyPreloadScheduler.ts +437 -199
  695. package/src/helpers/initRoomsPresence.ts +20 -7
  696. package/src/helpers/insertMessageWithDelimiter.ts +3 -0
  697. package/src/helpers/isLikelyMucJid.ts +72 -0
  698. package/src/helpers/isMessageSearchEnabled.ts +18 -0
  699. package/src/helpers/joiningRoom.ts +13 -0
  700. package/src/helpers/jumpThread.ts +102 -0
  701. package/src/helpers/jumpToMessage.ts +57 -0
  702. package/src/helpers/jumpWindow.ts +212 -0
  703. package/src/helpers/loadRoomHistory.ts +83 -0
  704. package/src/helpers/notificationPolicy.ts +82 -0
  705. package/src/helpers/openRoomAtMessage.ts +38 -0
  706. package/src/helpers/openThreadForJump.ts +96 -0
  707. package/src/helpers/parseMessageReference.ts +37 -8
  708. package/src/helpers/publicChatsEntry.ts +15 -0
  709. package/src/helpers/roomActivityScore.ts +45 -0
  710. package/src/helpers/roomUserCount.ts +44 -0
  711. package/src/helpers/runConfiguredHistoryPreload.ts +76 -0
  712. package/src/helpers/sessionAppId.ts +17 -0
  713. package/src/helpers/timestamp.ts +44 -0
  714. package/src/helpers/userResolver.ts +542 -0
  715. package/src/helpers/xmppIdShape.ts +46 -0
  716. package/src/hooks/useChatWrapperInit.ts +22 -4
  717. package/src/hooks/useHeapSender.tsx +54 -3
  718. package/src/hooks/useJumpToMessage.ts +538 -0
  719. package/src/hooks/useMessageLoaderQueue.tsx +40 -4
  720. package/src/hooks/useMessageQueue.ts +9 -5
  721. package/src/hooks/useRoomDirectory.ts +39 -0
  722. package/src/hooks/useRoomInitialization.tsx +33 -7
  723. package/src/hooks/useRoomMute.ts +42 -0
  724. package/src/hooks/useRoomState.tsx +6 -0
  725. package/src/hooks/useSendMessage.tsx +14 -2
  726. package/src/i18n/strings.ts +282 -0
  727. package/src/networking/api-requests/messageSearch.api.ts +130 -0
  728. package/src/networking/api-requests/publicChats.api.ts +71 -0
  729. package/src/networking/api-requests/roomMembers.api.ts +263 -11
  730. package/src/networking/api-requests/rooms.api.ts +52 -12
  731. package/src/networking/api-requests/xmppToken.api.ts +62 -0
  732. package/src/networking/ethoraEvents.ts +262 -0
  733. package/src/networking/stanzaHandlers.ts +145 -19
  734. package/src/networking/xmpp/allRoomPresences.xmpp.ts +155 -5
  735. package/src/networking/xmpp/getHistory.xmpp.ts +433 -47
  736. package/src/networking/xmpp/handleStanzas.xmpp.ts +8 -0
  737. package/src/networking/xmpp/historyCursor.ts +124 -0
  738. package/src/networking/xmpp/mamQueryIds.ts +11 -0
  739. package/src/networking/xmpp/mamRouter.ts +24 -10
  740. package/src/networking/xmpp/presenceInRoom.xmpp.ts +91 -68
  741. package/src/networking/xmpp/roomJoinSweep.ts +412 -0
  742. package/src/networking/xmpp/sendMediaMessage.xmpp.ts +0 -1
  743. package/src/networking/xmpp/sendTextMessage.xmpp.ts +0 -1
  744. package/src/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.ts +0 -1
  745. package/src/networking/xmppClient.ts +323 -47
  746. package/src/networking/xmppCredentials.ts +87 -0
  747. package/src/roomStore/Middleware/jumpThreadMiddleware.ts +163 -0
  748. package/src/roomStore/Middleware/reactionsMiddleware.tsx +4 -0
  749. package/src/roomStore/Middleware/unreadMidlleware.tsx +59 -11
  750. package/src/roomStore/chatSettingsSlice.ts +11 -0
  751. package/src/roomStore/index.ts +10 -3
  752. package/src/roomStore/persistence.ts +54 -0
  753. package/src/roomStore/roomsSlice.ts +547 -65
  754. package/src/roomStore/safeKey.ts +49 -0
  755. package/src/roomStore/usersSetCap.ts +37 -0
  756. package/src/types/models/media.model.ts +4 -0
  757. package/src/types/models/room.model.ts +18 -5
  758. package/src/types/models/xmpp.model.ts +15 -1
  759. package/src/types/types.ts +93 -5
  760. package/src/version.ts +1 -1
@@ -31,6 +31,18 @@ import {
31
31
  requestRecordingPermissionsAsync,
32
32
  RecordingPresets,
33
33
  } from 'expo-audio';
34
+ import {
35
+ WAVEFORM_RESOLUTION,
36
+ encodeWaveForm,
37
+ meteringToLevel,
38
+ resamplePeaks,
39
+ scaleLevels,
40
+ } from '../../helpers/audioWaveform';
41
+
42
+ // The voice preset with metering on: the recorder's level, sampled while
43
+ // recording, becomes the waveform the message carries (Telegram-style), so
44
+ // receivers draw it without downloading and decoding the clip first.
45
+ const VOICE_PRESET = { ...RecordingPresets.HIGH_QUALITY, isMeteringEnabled: true };
34
46
 
35
47
  // iOS photos default to HEIC; many web backends (incl. ours) 500 on
36
48
  // HEIC uploads because they can't decode it. Convert to JPEG before
@@ -121,12 +133,15 @@ const SendInput: React.FC<SendInputProps> = ({
121
133
  // Nothing claims the mic, writes a file, or switches the iOS session to
122
134
  // playAndRecord until `prepareToRecordAsync`, so consumers with
123
135
  // `enableAudio` off carry an idle object and nothing more.
124
- const audioRecorder = useAudioRecorder(RecordingPresets.HIGH_QUALITY);
136
+ const audioRecorder = useAudioRecorder(VOICE_PRESET);
125
137
  // Tracks whether a recording is actually in flight, so cancel/stop and
126
138
  // the unmount teardown can tell "never started" from "needs stopping"
127
139
  // without reading native state.
128
140
  const isRecordingRef = useRef(false);
129
141
  const recordingTimerRef = useRef<ReturnType<typeof setInterval> | null>(null);
142
+ // Level samples of the take in flight, and when it started.
143
+ const recordingLevelsRef = useRef<number[]>([]);
144
+ const recordingStartedAtRef = useRef(0);
130
145
 
131
146
  // Refs shadow `message` and `filePreviews` so handleSendClick can:
132
147
  // (a) read the LATEST typed value even when React state hasn't
@@ -425,16 +440,26 @@ const SendInput: React.FC<SendInputProps> = ({
425
440
  // side allocate a FRESH output file for this take. Without it the
426
441
  // recorder reuses the previous URL, so a second voice message would
427
442
  // overwrite the first while its upload is still in flight.
428
- await audioRecorder.prepareToRecordAsync(RecordingPresets.HIGH_QUALITY);
443
+ await audioRecorder.prepareToRecordAsync(VOICE_PRESET);
429
444
  audioRecorder.record();
430
445
  isRecordingRef.current = true;
431
446
  setIsRecording(true);
432
447
  setRecordingDuration(0);
433
448
  const startedAt = Date.now();
434
- // 250ms tick is fine for a seconds counter — keeps re-renders cheap.
449
+ recordingStartedAtRef.current = startedAt;
450
+ recordingLevelsRef.current = [];
451
+ // 100ms: often enough for the waveform's level samples; the seconds
452
+ // counter only re-renders when its value actually changes.
435
453
  recordingTimerRef.current = setInterval(() => {
454
+ try {
455
+ recordingLevelsRef.current.push(
456
+ meteringToLevel(audioRecorder.getStatus().metering)
457
+ );
458
+ } catch {
459
+ /* no level this tick */
460
+ }
436
461
  setRecordingDuration(Math.floor((Date.now() - startedAt) / 1000));
437
- }, 250);
462
+ }, 100);
438
463
  } catch (err) {
439
464
  console.warn('startRecording failed', err);
440
465
  isRecordingRef.current = false;
@@ -495,10 +520,23 @@ const SendInput: React.FC<SendInputProps> = ({
495
520
  // matches the receiver's audio branch in MediaMessage (and
496
521
  // isLikelyAudio for any backend that strips mimetype).
497
522
  const ts = Date.now();
523
+ const levels = recordingLevelsRef.current;
524
+ recordingLevelsRef.current = [];
498
525
  const file: MediaFile = {
499
526
  uri,
500
527
  type: 'audio/m4a',
501
528
  name: `voice-${ts}.m4a`,
529
+ duration: Math.max(
530
+ 1,
531
+ Math.round((ts - recordingStartedAtRef.current) / 1000)
532
+ ),
533
+ // No levels (metering unsupported) → no waveForm; receivers then
534
+ // decode the clip for its bars.
535
+ waveForm: levels.some((level) => level > 0)
536
+ ? encodeWaveForm(
537
+ scaleLevels(resamplePeaks(levels, WAVEFORM_RESOLUTION))
538
+ )
539
+ : undefined,
502
540
  };
503
541
  try {
504
542
  await sendMedia(file, file.type);
@@ -24,7 +24,7 @@ import {
24
24
  View,
25
25
  } from 'react-native';
26
26
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
27
- import { useDispatch, useSelector } from 'react-redux';
27
+ import { useDispatch, useSelector, useStore } from 'react-redux';
28
28
  import { messageNotificationManager } from '../utils/messageNotificationManager';
29
29
  import { setCurrentRoom } from '../roomStore/roomsSlice';
30
30
  import { IConfig, IMessage } from '../types/types';
@@ -33,6 +33,7 @@ import { useTheme } from '../hooks/useTheme';
33
33
  import { ProfileImagePlaceholder } from '../components/MainComponents/ProfileImagePlaceholder';
34
34
  import { useFileToken } from '../hooks/useFileToken';
35
35
  import { appendFileToken } from '../helpers/secureFileUrl';
36
+ import { bareJid, shouldToastForRoom } from '../helpers/notificationPolicy';
36
37
 
37
38
  interface ToastItem {
38
39
  id: string;
@@ -102,6 +103,7 @@ export const MessageNotificationProvider: React.FC<ProviderProps> = ({
102
103
  // below is only its safety net.
103
104
  const pruneAfter = bannerMode ? duration + 2000 : duration;
104
105
 
106
+ const store = useStore<RootState>();
105
107
  const [toasts, setToasts] = useState<ToastItem[]>([]);
106
108
  const appActiveRef = useRef(AppState.currentState === 'active');
107
109
 
@@ -134,7 +136,8 @@ export const MessageNotificationProvider: React.FC<ProviderProps> = ({
134
136
  // Clear toasts when their room becomes active.
135
137
  useEffect(() => {
136
138
  if (!visibleRoomJID) {return;}
137
- setToasts((prev) => prev.filter((t) => t.roomJID !== visibleRoomJID));
139
+ const open = bareJid(visibleRoomJID);
140
+ setToasts((prev) => prev.filter((t) => bareJid(t.roomJID) !== open));
138
141
  }, [visibleRoomJID]);
139
142
 
140
143
  const dismiss = useCallback((id: string) => {
@@ -170,8 +173,19 @@ export const MessageNotificationProvider: React.FC<ProviderProps> = ({
170
173
  roomJID: string
171
174
  ) => {
172
175
  if (!isEnabled) {return;}
173
- // Don't toast for the currently active room.
174
- if (visibleRoomJID && visibleRoomJID === roomJID) {return;}
176
+ // Decided on the store as it is NOW, not on this render's closure:
177
+ // the open chat, a muted chat and a backgrounded app never toast.
178
+ const rooms = store.getState().rooms;
179
+ if (
180
+ !shouldToastForRoom({
181
+ roomJID,
182
+ visibleRoomJID: rooms.visibleRoomJID,
183
+ appActive: appActiveRef.current,
184
+ muted: rooms.rooms[roomJID]?.muted,
185
+ })
186
+ ) {
187
+ return;
188
+ }
175
189
  const id = `msg-notification-${message.id}-${Date.now()}`;
176
190
  const item: ToastItem = {
177
191
  id,
@@ -188,7 +202,7 @@ export const MessageNotificationProvider: React.FC<ProviderProps> = ({
188
202
  : next;
189
203
  });
190
204
  },
191
- [isEnabled, visibleRoomJID, maxNotifications]
205
+ [isEnabled, store, maxNotifications]
192
206
  );
193
207
 
194
208
  // Register with the global manager.
@@ -14,6 +14,7 @@ import { VideoCallOverlay } from '../components/VideoCalls/VideoCallOverlay';
14
14
  import XmppClient, {
15
15
  XmppCredentialsProvider,
16
16
  } from '../networking/xmppClient';
17
+ import { recoverXmppCredentials } from '../networking/xmppCredentials';
17
18
  import { refreshAuthTokensQuietly } from '../networking/authRefresh';
18
19
  import {
19
20
  IConfig,
@@ -31,12 +32,11 @@ import {
31
32
  } from '../utils/clientRegistry';
32
33
  import {
33
34
  applyResolvedUserToStore,
34
- refreshUserCredentialsForXmpp,
35
35
  resolveInitBeforeLoadUser,
36
36
  } from '../helpers/resolveInitBeforeLoadUser';
37
37
  import { ensureScopedChatCache } from '../helpers/ensureScopedChatCache';
38
38
  import { getRooms as prefetchRoomsViaRest } from '../networking/api-requests/rooms.api';
39
- import { allRoomPresences } from '../networking/xmpp/allRoomPresences.xmpp';
39
+ import { startBackgroundJoinSweep } from '../helpers/backgroundJoinSweep';
40
40
  import { pushSubscriptionService } from '../services/pushSubscriptionService';
41
41
  import { store } from '../roomStore';
42
42
  import {
@@ -58,7 +58,7 @@ import {
58
58
  getFlushBoundaryTs,
59
59
  getReadMarkerTimestamp,
60
60
  } from '../helpers/getServerReadTimestamp';
61
- import { runHistoryPreloadScheduler } from '../helpers/historyPreloadScheduler';
61
+ import { runConfiguredHistoryPreload } from '../helpers/runConfiguredHistoryPreload';
62
62
  import { updateMessagesTillLast } from '../helpers/updateMessagesTillLast';
63
63
  import { secureUserStorage } from '../helpers/secureUserStorage';
64
64
  import { clearPersistedState } from '../roomStore/persistence';
@@ -132,62 +132,7 @@ export const XmppProvider: React.FC<XmppProviderProps> = ({ children, config, is
132
132
  // Returns last-known cached creds if nothing usable is available so
133
133
  // the XmppClient at least doesn't crash on `undefined.password`.
134
134
  const credentialsProvider = useMemo<XmppCredentialsProvider>(() => {
135
- return async () => {
136
- // 1. Make sure the REST tokens are fresh before re-minting XMPP
137
- // creds. This used to call `config.refreshTokens.refreshFunction`
138
- // directly and then fall into step 2, which refreshes again —
139
- // two rotations back to back, which the new backend scheme
140
- // reads as a race at best and token reuse at worst. One call to
141
- // the shared rotation point covers both the consumer-supplied
142
- // function and the built-in endpoint.
143
- if (config?.refreshTokens?.enabled) {
144
- const rotated = await refreshAuthTokensQuietly({ force: true });
145
-
146
- if (rotated?.xmppPassword) {
147
- const rotatedUser = store.getState().chatSettingStore.user;
148
- return {
149
- username:
150
- rotatedUser?.xmppUsername ||
151
- rotatedUser?.defaultWallet?.walletAddress ||
152
- '',
153
- password: rotated.xmppPassword,
154
- };
155
- }
156
- }
157
-
158
- // 2. Re-mint XMPP creds via the right priority chain for the
159
- // current auth mode. This call ALWAYS hydrates (unlike
160
- // `resolveInitBeforeLoadUser` which short-circuits when a
161
- // cached user already has xmppCredentials).
162
- const fresh = await refreshUserCredentialsForXmpp(config).catch(
163
- (err) => {
164
- devPushLog('warn', 'XMPP creds refresh: full chain failed', err);
165
- return null;
166
- }
167
- );
168
- if (fresh) {
169
- applyResolvedUserToStore(fresh);
170
- return {
171
- username:
172
- fresh.xmppUsername ||
173
- fresh.defaultWallet?.walletAddress ||
174
- '',
175
- password: fresh.xmppPassword || '',
176
- };
177
- }
178
-
179
- // 3. Last-resort: return the cached creds so reconnect() can
180
- // still attempt a connection. If the original failure was
181
- // a stale JWT this will fail again and the user has to
182
- // re-mount the chat — but at least we don't break the
183
- // transient-network-blip case where the cached creds are
184
- // still valid.
185
- const u = store.getState().chatSettingStore.user;
186
- return {
187
- username: u?.xmppUsername || u?.defaultWallet?.walletAddress || '',
188
- password: u?.xmppPassword || '',
189
- };
190
- };
135
+ return () => recoverXmppCredentials(config);
191
136
  }, [
192
137
  config?.jwtLogin?.enabled,
193
138
  config?.jwtLogin?.token,
@@ -268,23 +213,30 @@ export const XmppProvider: React.FC<XmppProviderProps> = ({ children, config, is
268
213
 
269
214
  // Re-join MUC rooms on every 'online'. After a reconnect the new
270
215
  // XMPP stream isn't a member of any room, so a sent message gets a
271
- // local double-tick but never reaches the room (bug #21). Re-sending
272
- // presence on reconnect fixes delivery. On the very first connect
273
- // the room list isn't loaded yet so this joins nothing — the
274
- // bootstrap's own allRoomPresences handles that pass.
216
+ // local double-tick but never reaches the room (bug #21). The join is
217
+ // a background sweep (open room first, then recent activity, a few at
218
+ // a time) shared with the client's own online handler, so it neither
219
+ // blocks anything nor doubles up. A send / history fetch / room open
220
+ // also joins its own room on demand. On the very first connect the
221
+ // room list isn't loaded yet so this joins little - the bootstrap
222
+ // starts its own sweep once /chats/my has landed.
275
223
  created.setOnOnline(() => {
276
224
  const underlying = (created as any).client;
277
225
  if (!underlying) {return;}
278
- // The headers say "Updating…" until the rooms are joined again and
226
+ // The headers say "Updating..." until the rooms are joined again and
279
227
  // the archive caught up - a stream that is up is not yet a chat
280
228
  // that is. Same tick as the client's own 'online', so the title
281
229
  // never shows the plain state in between.
282
230
  store.dispatch(setConnectionState('syncing'));
283
- const rejoin = allRoomPresences(underlying)
231
+ // The join sweep is shared with the client's own online handler
232
+ // (it dedupes); here it is only awaited so the state can settle.
233
+ const rejoin = Promise.resolve()
234
+ .then(() => created.sendAllPresencesAndMarkReady?.())
284
235
  .catch((e) =>
285
- devPushLog('warn', 'reconnect: allRoomPresences re-join failed', e)
286
- )
287
- .finally(() => subscribeAllRoomsForPush(underlying, 'reconnect'));
236
+ devPushLog('warn', 'reconnect: background join sweep failed', e)
237
+ );
238
+ // Push (mucsub) does not depend on the join: subscribe right away.
239
+ subscribeAllRoomsForPush(underlying, 'reconnect');
288
240
  // Also refresh the private store so unread / lastViewed markers
289
241
  // are accurate after a long reconnect — the MUC re-join above only
290
242
  // restores delivery, not unread state. Idempotent on first connect.
@@ -458,7 +410,7 @@ export const XmppProvider: React.FC<XmppProviderProps> = ({ children, config, is
458
410
  }
459
411
  }
460
412
 
461
- // Kick off REST /chats/my; allRoomPresences below needs the
413
+ // Kick off REST /chats/my; the background join sweep below needs the
462
414
  // room list to be in redux, otherwise it joins 0 MUCs and the
463
415
  // user receives zero realtime messages until they manually tap
464
416
  // into each room. Track the promise so we can await it before
@@ -495,14 +447,15 @@ export const XmppProvider: React.FC<XmppProviderProps> = ({ children, config, is
495
447
  try {
496
448
  await restRoomsPromise;
497
449
  } catch {}
498
- try {
499
- const roomCount = Object.keys(store.getState().rooms.rooms || {}).length;
500
- devPushLog('xmpp', `initBeforeLoad: joining ${roomCount} rooms via presence…`);
501
- await allRoomPresences((c as any).client);
502
- devPushLog('xmpp', 'initBeforeLoad: allRoomPresences ok');
503
- } catch (e) {
504
- devPushLog('warn', 'initBeforeLoad: allRoomPresences failed', e);
505
- }
450
+ // The room list is complete (REST /chats/my seeded it): join the
451
+ // rooms in the BACKGROUND. READY below does not wait for it: a
452
+ // sweep over hundreds of rooms would otherwise hold the whole room
453
+ // list behind it. Open room first, then recent activity; sends,
454
+ // history fetches and opening a room join their own room on demand.
455
+ const roomCount = Object.keys(store.getState().rooms.rooms || {}).length;
456
+ devPushLog('xmpp', `initBeforeLoad: joining ${roomCount} rooms in the background`);
457
+ startBackgroundJoinSweep(c);
458
+ // Push (mucsub) needs the room list, not the joins.
506
459
  subscribeAllRoomsForPush((c as any).client, 'initBeforeLoad');
507
460
 
508
461
  store.dispatch(setStoreClient(c));
@@ -513,21 +466,14 @@ export const XmppProvider: React.FC<XmppProviderProps> = ({ children, config, is
513
466
  setProviderBootstrapStatus('ready');
514
467
  devPushLog('rn', 'initBeforeLoad: READY');
515
468
 
516
- // Background-prefetch history for every room (fire-and-forget).
517
- const qos = config?.historyQoS;
518
- const activeRoomJID = store.getState().rooms.activeRoomJID || null;
519
- const defaultRoomJids =
520
- (config?.defaultRooms as any[])?.map((r) =>
521
- typeof r === 'string' ? r : r?.jid
522
- ).filter(Boolean) || [];
523
- runHistoryPreloadScheduler({
469
+ // Background history preload (fire-and-forget; does not wait for
470
+ // the join sweep: MAM needs no join, and each fetch joins its own
471
+ // room best-effort). Staged by default: the top rooms by activity
472
+ // first, everything else loads when opened. See `historyPreload`.
473
+ runConfiguredHistoryPreload({
524
474
  client: c,
525
475
  signal: abortController.signal,
526
- selectedRoomJid: activeRoomJID,
527
- defaultRoomJids,
528
- concurrency: qos?.stagedPreloadConcurrency,
529
- pageSize: qos?.stagedPreloadFirstPassSize,
530
- roomLimit: qos?.preloadTopKRooms,
476
+ config,
531
477
  }).catch((err) => console.warn('History preload scheduler failed', err));
532
478
  } catch (error: any) {
533
479
  if (cancelled || abortController.signal.aborted) {return;}
@@ -712,7 +658,14 @@ export const XmppProvider: React.FC<XmppProviderProps> = ({ children, config, is
712
658
  // only USED here for the one-shot stamp+flush, matching customer
713
659
  // #42: leaving (or backgrounding) a room while scrolled up must not
714
660
  // mark messages the user never reached as read.
715
- visibleBeforeBackground = visibleRoomJID;
661
+ // iOS leaves in two steps, 'inactive' then 'background', and the
662
+ // first one already cleared visibility below. Overwriting here on the
663
+ // second would forget the open chat, so it was never re-marked
664
+ // visible on return: the chat on screen then counted unread and
665
+ // raised in-app toasts for its own messages. Remember, never forget.
666
+ if (visibleRoomJID) {
667
+ visibleBeforeBackground = visibleRoomJID;
668
+ }
716
669
  let boundaryTs: number | null = null;
717
670
  if (visibleRoomJID) {
718
671
  boundaryTs = state.rooms?.readBoundaries?.[visibleRoomJID] ?? null;
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Waveform helpers for voice messages: the bars a bubble draws, the
3
+ * `waveForm` string a sender attaches to the message, and the recorder's
4
+ * metering turned into the same bars.
5
+ */
6
+
7
+ /** Floor for a bar, as a fraction of the box: silence is still a dot. */
8
+ export const MIN_BAR = 0.08;
9
+
10
+ /** Resolution a waveform is computed and sent at; bubbles resample it. */
11
+ export const WAVEFORM_RESOLUTION = 64;
12
+
13
+ /**
14
+ * Bars for one clip, from its PCM samples — the same curve as the web
15
+ * client's `buildWaveformPeaks`, so a voice note looks the same on both.
16
+ *
17
+ * RMS per bucket (what the ear hears, not the worst sample), scaled against
18
+ * the 95th percentile so a single click cannot set the scale, then a
19
+ * square-root curve because loudness is perceived that way, and a floor so
20
+ * a quiet passage still reads as a bar rather than as nothing.
21
+ *
22
+ * The decoder WebView carries a copy of this in plain JS (it cannot import
23
+ * modules); keep the two in step.
24
+ */
25
+ export const buildWaveformPeaks = (
26
+ samples: ArrayLike<number>,
27
+ barCount: number
28
+ ): number[] => {
29
+ const bars = Math.max(1, Math.floor(barCount));
30
+ const bucket = Math.floor(samples.length / bars);
31
+ if (bucket < 1) {return new Array(bars).fill(MIN_BAR);}
32
+
33
+ const rms: number[] = [];
34
+ for (let i = 0; i < bars; i += 1) {
35
+ let sum = 0;
36
+ for (let j = i * bucket; j < (i + 1) * bucket; j += 1) {
37
+ sum += samples[j]! * samples[j]!;
38
+ }
39
+ rms.push(Math.sqrt(sum / bucket));
40
+ }
41
+ return scaleLevels(rms);
42
+ };
43
+
44
+ /**
45
+ * Raw per-bar levels (RMS, or linear amplitude from the recorder) → 0..1
46
+ * bars, against the 95th percentile with the square-root curve and floor.
47
+ */
48
+ export const scaleLevels = (levels: number[]): number[] => {
49
+ if (!levels.length) {return [];}
50
+ const sorted = [...levels].sort((a, b) => a - b);
51
+ const reference =
52
+ sorted[Math.floor(sorted.length * 0.95)] || sorted[sorted.length - 1] || 0;
53
+ if (reference <= 0) {return levels.map(() => MIN_BAR);}
54
+ return levels.map((value) => {
55
+ const scaled = Math.sqrt(Math.min(value / reference, 1));
56
+ return Math.min(1, MIN_BAR + scaled * (1 - MIN_BAR));
57
+ });
58
+ };
59
+
60
+ /**
61
+ * Stretch or squeeze bars to `count`, taking the loudest bar in each slot
62
+ * when squeezing so a short loud word is not averaged away.
63
+ */
64
+ export const resamplePeaks = (peaks: number[], count: number): number[] => {
65
+ const target = Math.max(1, Math.floor(count));
66
+ if (!peaks.length) {return new Array(target).fill(MIN_BAR);}
67
+ if (peaks.length === target) {return peaks;}
68
+ const out: number[] = [];
69
+ for (let i = 0; i < target; i += 1) {
70
+ const from = Math.floor((i * peaks.length) / target);
71
+ const to = Math.max(from + 1, Math.floor(((i + 1) * peaks.length) / target));
72
+ let max = 0;
73
+ for (let j = from; j < to && j < peaks.length; j += 1) {
74
+ max = Math.max(max, peaks[j]!);
75
+ }
76
+ out.push(max);
77
+ }
78
+ return out;
79
+ };
80
+
81
+ /**
82
+ * Recorder metering (dBFS, about -160..0) → linear amplitude 0..1, which
83
+ * `scaleLevels` then treats like an RMS. Anything at or below -60 dB is
84
+ * room noise and counts as silence.
85
+ */
86
+ export const meteringToLevel = (db: number | undefined): number => {
87
+ if (typeof db !== 'number' || !Number.isFinite(db) || db <= -60) {return 0;}
88
+ return Math.pow(10, Math.min(db, 0) / 20);
89
+ };
90
+
91
+ /**
92
+ * The `waveForm` attribute a voice message carries: comma-separated bar
93
+ * heights, 0..100. Short enough for a stanza attribute, plain enough for
94
+ * any client to read.
95
+ */
96
+ export const encodeWaveForm = (peaks: number[]): string =>
97
+ peaks
98
+ .map((p) => Math.round(Math.max(0, Math.min(1, p)) * 100))
99
+ .join(',');
100
+
101
+ /**
102
+ * Bars from a message's `waveForm`, or null when it has none / nothing
103
+ * usable. Accepts the comma list above and a JSON array, in 0..1 or 0..100.
104
+ */
105
+ export const parseWaveForm = (value: unknown): number[] | null => {
106
+ if (typeof value !== 'string' || !value.trim()) {return null;}
107
+ let raw: unknown[];
108
+ const text = value.trim();
109
+ if (text.startsWith('[')) {
110
+ try {
111
+ const parsed = JSON.parse(text);
112
+ if (!Array.isArray(parsed)) {return null;}
113
+ raw = parsed;
114
+ } catch {
115
+ return null;
116
+ }
117
+ } else {
118
+ raw = text.split(',');
119
+ }
120
+ const numbers = raw.map((n) => Number(n));
121
+ if (numbers.length < 2 || numbers.some((n) => !Number.isFinite(n) || n < 0)) {
122
+ return null;
123
+ }
124
+ const max = Math.max(...numbers);
125
+ const scale = max > 1 ? 100 : 1;
126
+ return numbers.map((n) => Math.max(MIN_BAR, Math.min(1, n / scale)));
127
+ };
128
+
129
+ /** Seconds from a message's `duration` attribute, or 0 when absent. */
130
+ export const parseDurationSeconds = (value: unknown): number => {
131
+ const n = Number(value);
132
+ return Number.isFinite(n) && n > 0 ? n : 0;
133
+ };
134
+
135
+ /** `0:07`, `1:23`, `12:05`. */
136
+ export const formatClipTime = (millis: number): string => {
137
+ const safe = Number.isFinite(millis) && millis > 0 ? millis : 0;
138
+ const totalSec = Math.floor(safe / 1000);
139
+ const min = Math.floor(totalSec / 60);
140
+ const sec = totalSec % 60;
141
+ return `${min}:${sec.toString().padStart(2, '0')}`;
142
+ };
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Starting the MUC join sweep without ever waiting for it.
3
+ *
4
+ * The room list is usable as soon as /chats/my has returned (rooms are
5
+ * seeded with lastMessage / unread / usersCnt), so joining every room is a
6
+ * background job: open room first, then recent activity, a few at a time.
7
+ */
8
+
9
+ type SweepClient = { sendAllPresencesAndMarkReady?: () => Promise<unknown> };
10
+
11
+ // Fire-and-forget: never awaited by the room list, never throws.
12
+ export const startBackgroundJoinSweep = (client: SweepClient | null | undefined) => {
13
+ if (!client || typeof client.sendAllPresencesAndMarkReady !== 'function') {
14
+ return;
15
+ }
16
+ Promise.resolve()
17
+ .then(() => client.sendAllPresencesAndMarkReady?.())
18
+ .catch((error) => {
19
+ console.warn('[loadRooms] background join sweep failed', error);
20
+ });
21
+ };
22
+
23
+ // Ends the loading state right after the rooms fetch and joins in the
24
+ // background. Resolves without waiting for any join; a failing fetch starts
25
+ // no sweep and never calls `onListReady`.
26
+ export const loadRoomsThenJoinInBackground = async <T,>(
27
+ client: SweepClient,
28
+ fetchRooms: () => Promise<T>,
29
+ onListReady: () => void
30
+ ): Promise<T> => {
31
+ const rooms = await fetchRooms();
32
+ startBackgroundJoinSweep(client);
33
+ onListReady();
34
+ return rooms;
35
+ };
@@ -0,0 +1,47 @@
1
+ import { useSyncExternalStore } from 'react';
2
+
3
+ /** How long the jump highlight stays on a bubble. */
4
+ export const HIGHLIGHT_MS = 1000;
5
+
6
+ interface Highlight {
7
+ id: string;
8
+ /** Epoch ms the highlight ends. */
9
+ until: number;
10
+ }
11
+
12
+ let current: Highlight | null = null;
13
+ const listeners = new Set<() => void>();
14
+ const emit = () => listeners.forEach((listener) => listener());
15
+
16
+ /**
17
+ * Highlight the bubble of one message for HIGHLIGHT_MS (a jump just landed on
18
+ * it), or clear the highlight with null. Kept outside the list on purpose: a
19
+ * row that is unmounted and mounted again while the highlight is running (the
20
+ * list recycles rows as the scroll settles) reads the same state, so the
21
+ * highlight follows the message instead of being lost with the row.
22
+ */
23
+ export const setBubbleHighlight = (id: string | null, now = Date.now()): void => {
24
+ current = id === null ? null : { id, until: now + HIGHLIGHT_MS };
25
+ emit();
26
+ };
27
+
28
+ export const getBubbleHighlightUntil = (id: string): number =>
29
+ current && current.id === id ? current.until : 0;
30
+
31
+ const subscribe = (listener: () => void) => {
32
+ listeners.add(listener);
33
+ return () => {
34
+ listeners.delete(listener);
35
+ };
36
+ };
37
+
38
+ /**
39
+ * End time (epoch ms) of the highlight of this message, 0 when it has none.
40
+ * The snapshot is a number, so only the highlighted row re-renders.
41
+ */
42
+ export const useBubbleHighlightUntil = (id: string): number =>
43
+ useSyncExternalStore(
44
+ subscribe,
45
+ () => getBubbleHighlightUntil(id),
46
+ () => 0
47
+ );
@@ -1,31 +1,29 @@
1
1
  import { IMessage, RoomMember } from '../types/types';
2
- import { store } from '../roomStore';
3
- import { fixUnnamedArrayFromApi, getUnnamedUsers } from './getUnnamedUsers';
4
- import { getUserByXmppUsername } from '../networking/api-requests/roomMembers.api';
2
+ import { getUnnamedUsers } from './getUnnamedUsers';
3
+ import { requestUsers } from './userResolver';
5
4
 
6
5
  export const checkUniqueUsers = (messages: IMessage[]) => {
7
6
  const unnamedUsers = getUnnamedUsers(messages);
8
7
 
9
8
  if (unnamedUsers.length > 0) {
10
- const getApiUsers = async () => {
11
- const fixedUsers = await fixUnnamedArrayFromApi(unnamedUsers);
12
- return fixedUsers;
13
- };
14
- const newUsers = getApiUsers();
15
- return newUsers;
9
+ // Resolved (debounced, de-duplicated, written to usersSet) by the shared
10
+ // resolver; nothing to hand back to the caller.
11
+ requestUsers(unnamedUsers.map((u) => u.id));
16
12
  }
13
+ return undefined;
17
14
  };
18
15
 
16
+ // Fire-and-forget: the shared resolver debounces, de-duplicates and merges
17
+ // the profile into usersSet itself. Kept async/returning null so older call
18
+ // sites that await it keep working.
19
19
  export const checkSingleUser = async (
20
20
  usersSet: Record<string, RoomMember>,
21
21
  xmppUsername: string
22
22
  ) => {
23
- if (usersSet[xmppUsername]) {return;}
24
-
25
- const fixedUser = await getUserByXmppUsername(
26
- xmppUsername,
27
- store.getState().chatSettingStore.user.token
28
- );
29
-
30
- return fixedUser;
23
+ if (!xmppUsername) {
24
+ return null;
25
+ }
26
+ if (usersSet[xmppUsername]) return;
27
+ requestUsers([xmppUsername]);
28
+ return null;
31
29
  };
@@ -7,6 +7,8 @@ import React from 'react';
7
7
  import { MODAL_TYPES } from './MODAL_TYPES';
8
8
  import ChatProfileModal from '../../components/Modals/ChatProfileModal/ChatProfileModal';
9
9
  import FilePreviewModal from '../../components/Modals/FilePreviewModal/FilePreviewModal';
10
+ import MessageSearchModal from '../../components/Modals/MessageSearchModal/MessageSearchModal';
11
+ import PublicChatsModal from '../../components/Modals/PublicChatsModal/PublicChatsModal';
10
12
  import NewChatModal from '../../components/Modals/NewChatModal/NewChatModal';
11
13
  import BlockedUsersModal from '../../components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal';
12
14
  import DocumentSharesModal from '../../components/Modals/SettingsModals/DocumentShares/DocumentSharesModal';
@@ -34,4 +36,6 @@ export const MODAL_COMPONENTS: Record<
34
36
  [MODAL_TYPES.PROFILE_SHARES]: ProfileSharesModal,
35
37
  [MODAL_TYPES.BLOCKED_USERS]: BlockedUsersModal,
36
38
  [MODAL_TYPES.FILE_PREVIEW]: FilePreviewModal,
39
+ [MODAL_TYPES.MESSAGE_SEARCH]: MessageSearchModal,
40
+ [MODAL_TYPES.PUBLIC_CHATS]: PublicChatsModal,
37
41
  };
@@ -26,4 +26,7 @@ export const MODAL_TYPES = {
26
26
  FILE_PREVIEW: 'file_preview',
27
27
 
28
28
  NEW_CHAT: 'new_chat',
29
+
30
+ MESSAGE_SEARCH: 'message_search',
31
+ PUBLIC_CHATS: 'public_chats',
29
32
  };