@ethora/chat-component-rn 26.9.0 → 26.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (761) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +19 -0
  3. package/lib/commonjs/assets/icons.js +2 -2
  4. package/lib/commonjs/assets/icons.js.map +1 -1
  5. package/lib/commonjs/components/Header/HeaderRoomList.js +22 -6
  6. package/lib/commonjs/components/Header/HeaderRoomList.js.map +1 -1
  7. package/lib/commonjs/components/InputComponents/Search.js +38 -1
  8. package/lib/commonjs/components/InputComponents/Search.js.map +1 -1
  9. package/lib/commonjs/components/MainComponents/ArchivedMessageCard.js +166 -0
  10. package/lib/commonjs/components/MainComponents/ArchivedMessageCard.js.map +1 -0
  11. package/lib/commonjs/components/MainComponents/ChatHeader.js +22 -5
  12. package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
  13. package/lib/commonjs/components/MainComponents/ChatRoom.js +56 -25
  14. package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
  15. package/lib/commonjs/components/MainComponents/ChatWrapper.js +53 -4
  16. package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
  17. package/lib/commonjs/components/MainComponents/MediaMessage.js +18 -3
  18. package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
  19. package/lib/commonjs/components/MainComponents/MessageList.js +739 -42
  20. package/lib/commonjs/components/MainComponents/MessageList.js.map +1 -1
  21. package/lib/commonjs/components/MainComponents/MessageSearchButton.js +58 -0
  22. package/lib/commonjs/components/MainComponents/MessageSearchButton.js.map +1 -0
  23. package/lib/commonjs/components/MainComponents/ReduxWrapper.js +15 -6
  24. package/lib/commonjs/components/MainComponents/ReduxWrapper.js.map +1 -1
  25. package/lib/commonjs/components/MainComponents/RoomList.js +110 -1
  26. package/lib/commonjs/components/MainComponents/RoomList.js.map +1 -1
  27. package/lib/commonjs/components/Menu/HeaderRoomListMenu.js +14 -3
  28. package/lib/commonjs/components/Menu/HeaderRoomListMenu.js.map +1 -1
  29. package/lib/commonjs/components/MessageBubble/BubbleHighlight.js +112 -0
  30. package/lib/commonjs/components/MessageBubble/BubbleHighlight.js.map +1 -0
  31. package/lib/commonjs/components/MessageBubble/Message.js +169 -125
  32. package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
  33. package/lib/commonjs/components/MessageBubble/MessageInteractions.js +98 -78
  34. package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
  35. package/lib/commonjs/components/MessageBubble/messageMenuLayout.js +50 -0
  36. package/lib/commonjs/components/MessageBubble/messageMenuLayout.js.map +1 -0
  37. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +73 -37
  38. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  39. package/lib/commonjs/components/Modals/MessageSearchModal/MessageHitResults.js +253 -0
  40. package/lib/commonjs/components/Modals/MessageSearchModal/MessageHitResults.js.map +1 -0
  41. package/lib/commonjs/components/Modals/MessageSearchModal/MessageSearchModal.js +488 -0
  42. package/lib/commonjs/components/Modals/MessageSearchModal/MessageSearchModal.js.map +1 -0
  43. package/lib/commonjs/components/Modals/MessageSearchModal/openHit.js +51 -0
  44. package/lib/commonjs/components/Modals/MessageSearchModal/openHit.js.map +1 -0
  45. package/lib/commonjs/components/Modals/MessageSearchModal/resolveSender.js +47 -0
  46. package/lib/commonjs/components/Modals/MessageSearchModal/resolveSender.js.map +1 -0
  47. package/lib/commonjs/components/Modals/MessageSearchModal/searchFilters.js +83 -0
  48. package/lib/commonjs/components/Modals/MessageSearchModal/searchFilters.js.map +1 -0
  49. package/lib/commonjs/components/Modals/MessageSearchModal/snippet.js +61 -0
  50. package/lib/commonjs/components/Modals/MessageSearchModal/snippet.js.map +1 -0
  51. package/lib/commonjs/components/Modals/MessageSearchModal/useMessageSearch.js +136 -0
  52. package/lib/commonjs/components/Modals/MessageSearchModal/useMessageSearch.js.map +1 -0
  53. package/lib/commonjs/components/Modals/PublicChatsModal/PublicChatsModal.js +306 -0
  54. package/lib/commonjs/components/Modals/PublicChatsModal/PublicChatsModal.js.map +1 -0
  55. package/lib/commonjs/components/Modals/PublicChatsModal/publicChatsLogic.js +36 -0
  56. package/lib/commonjs/components/Modals/PublicChatsModal/publicChatsLogic.js.map +1 -0
  57. package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js +8 -1
  58. package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
  59. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +13 -2
  60. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
  61. package/lib/commonjs/components/RoomComponents/SwipeableRoomRow.js +38 -6
  62. package/lib/commonjs/components/RoomComponents/SwipeableRoomRow.js.map +1 -1
  63. package/lib/commonjs/components/Thread/ThreadHeader.js +3 -1
  64. package/lib/commonjs/components/Thread/ThreadHeader.js.map +1 -1
  65. package/lib/commonjs/components/Thread/ThreadWrapper.js +90 -10
  66. package/lib/commonjs/components/Thread/ThreadWrapper.js.map +1 -1
  67. package/lib/commonjs/components/styled/AudioDecoderHost.js +338 -0
  68. package/lib/commonjs/components/styled/AudioDecoderHost.js.map +1 -0
  69. package/lib/commonjs/components/styled/AudioMessage.js +493 -420
  70. package/lib/commonjs/components/styled/AudioMessage.js.map +1 -1
  71. package/lib/commonjs/components/styled/SendInput.js +31 -5
  72. package/lib/commonjs/components/styled/SendInput.js.map +1 -1
  73. package/lib/commonjs/context/MessageNotificationContext.js +14 -4
  74. package/lib/commonjs/context/MessageNotificationContext.js.map +1 -1
  75. package/lib/commonjs/context/xmppProvider.js +54 -79
  76. package/lib/commonjs/context/xmppProvider.js.map +1 -1
  77. package/lib/commonjs/helpers/audioWaveform.js +165 -0
  78. package/lib/commonjs/helpers/audioWaveform.js.map +1 -0
  79. package/lib/commonjs/helpers/backgroundJoinSweep.js +36 -0
  80. package/lib/commonjs/helpers/backgroundJoinSweep.js.map +1 -0
  81. package/lib/commonjs/helpers/bubbleHighlight.js +44 -0
  82. package/lib/commonjs/helpers/bubbleHighlight.js.map +1 -0
  83. package/lib/commonjs/helpers/checkUniqueUsers.js +14 -12
  84. package/lib/commonjs/helpers/checkUniqueUsers.js.map +1 -1
  85. package/lib/commonjs/helpers/constants/MODAL_COMPONENTS.js +5 -1
  86. package/lib/commonjs/helpers/constants/MODAL_COMPONENTS.js.map +1 -1
  87. package/lib/commonjs/helpers/constants/MODAL_TYPES.js +3 -1
  88. package/lib/commonjs/helpers/constants/MODAL_TYPES.js.map +1 -1
  89. package/lib/commonjs/helpers/createRoomFromApi.js +40 -3
  90. package/lib/commonjs/helpers/createRoomFromApi.js.map +1 -1
  91. package/lib/commonjs/helpers/dedupeMembers.js +34 -0
  92. package/lib/commonjs/helpers/dedupeMembers.js.map +1 -0
  93. package/lib/commonjs/helpers/ethoraLogger.js +56 -0
  94. package/lib/commonjs/helpers/ethoraLogger.js.map +1 -0
  95. package/lib/commonjs/helpers/getUnnamedUsers.js +9 -4
  96. package/lib/commonjs/helpers/getUnnamedUsers.js.map +1 -1
  97. package/lib/commonjs/helpers/historyPreloadConfig.js +44 -0
  98. package/lib/commonjs/helpers/historyPreloadConfig.js.map +1 -0
  99. package/lib/commonjs/helpers/historyPreloadScheduler.js +372 -137
  100. package/lib/commonjs/helpers/historyPreloadScheduler.js.map +1 -1
  101. package/lib/commonjs/helpers/initRoomsPresence.js +17 -5
  102. package/lib/commonjs/helpers/initRoomsPresence.js.map +1 -1
  103. package/lib/commonjs/helpers/insertMessageWithDelimiter.js +5 -0
  104. package/lib/commonjs/helpers/insertMessageWithDelimiter.js.map +1 -1
  105. package/lib/commonjs/helpers/isLikelyMucJid.js +67 -0
  106. package/lib/commonjs/helpers/isLikelyMucJid.js.map +1 -0
  107. package/lib/commonjs/helpers/isMessageSearchEnabled.js +18 -0
  108. package/lib/commonjs/helpers/isMessageSearchEnabled.js.map +1 -0
  109. package/lib/commonjs/helpers/joiningRoom.js +14 -0
  110. package/lib/commonjs/helpers/joiningRoom.js.map +1 -0
  111. package/lib/commonjs/helpers/jumpThread.js +100 -0
  112. package/lib/commonjs/helpers/jumpThread.js.map +1 -0
  113. package/lib/commonjs/helpers/jumpToMessage.js +58 -0
  114. package/lib/commonjs/helpers/jumpToMessage.js.map +1 -0
  115. package/lib/commonjs/helpers/jumpWindow.js +187 -0
  116. package/lib/commonjs/helpers/jumpWindow.js.map +1 -0
  117. package/lib/commonjs/helpers/loadRoomHistory.js +75 -0
  118. package/lib/commonjs/helpers/loadRoomHistory.js.map +1 -0
  119. package/lib/commonjs/helpers/notificationPolicy.js +77 -0
  120. package/lib/commonjs/helpers/notificationPolicy.js.map +1 -0
  121. package/lib/commonjs/helpers/openRoomAtMessage.js +47 -0
  122. package/lib/commonjs/helpers/openRoomAtMessage.js.map +1 -0
  123. package/lib/commonjs/helpers/openThreadForJump.js +72 -0
  124. package/lib/commonjs/helpers/openThreadForJump.js.map +1 -0
  125. package/lib/commonjs/helpers/parseMessageReference.js +27 -8
  126. package/lib/commonjs/helpers/parseMessageReference.js.map +1 -1
  127. package/lib/commonjs/helpers/publicChatsEntry.js +17 -0
  128. package/lib/commonjs/helpers/publicChatsEntry.js.map +1 -0
  129. package/lib/commonjs/helpers/roomActivityScore.js +37 -0
  130. package/lib/commonjs/helpers/roomActivityScore.js.map +1 -0
  131. package/lib/commonjs/helpers/roomUserCount.js +36 -0
  132. package/lib/commonjs/helpers/roomUserCount.js.map +1 -0
  133. package/lib/commonjs/helpers/runConfiguredHistoryPreload.js +68 -0
  134. package/lib/commonjs/helpers/runConfiguredHistoryPreload.js.map +1 -0
  135. package/lib/commonjs/helpers/sessionAppId.js +24 -0
  136. package/lib/commonjs/helpers/sessionAppId.js.map +1 -0
  137. package/lib/commonjs/helpers/timestamp.js +43 -0
  138. package/lib/commonjs/helpers/timestamp.js.map +1 -0
  139. package/lib/commonjs/helpers/userResolver.js +517 -0
  140. package/lib/commonjs/helpers/userResolver.js.map +1 -0
  141. package/lib/commonjs/helpers/xmppIdShape.js +52 -0
  142. package/lib/commonjs/helpers/xmppIdShape.js.map +1 -0
  143. package/lib/commonjs/hooks/useChatWrapperInit.js +27 -5
  144. package/lib/commonjs/hooks/useChatWrapperInit.js.map +1 -1
  145. package/lib/commonjs/hooks/useHeapSender.js +54 -3
  146. package/lib/commonjs/hooks/useHeapSender.js.map +1 -1
  147. package/lib/commonjs/hooks/useJumpToMessage.js +411 -0
  148. package/lib/commonjs/hooks/useJumpToMessage.js.map +1 -0
  149. package/lib/commonjs/hooks/useMessageLoaderQueue.js +32 -5
  150. package/lib/commonjs/hooks/useMessageLoaderQueue.js.map +1 -1
  151. package/lib/commonjs/hooks/useMessageQueue.js +13 -5
  152. package/lib/commonjs/hooks/useMessageQueue.js.map +1 -1
  153. package/lib/commonjs/hooks/useRoomDirectory.js +29 -0
  154. package/lib/commonjs/hooks/useRoomDirectory.js.map +1 -0
  155. package/lib/commonjs/hooks/useRoomInitialization.js +27 -5
  156. package/lib/commonjs/hooks/useRoomInitialization.js.map +1 -1
  157. package/lib/commonjs/hooks/useRoomMute.js +62 -0
  158. package/lib/commonjs/hooks/useRoomMute.js.map +1 -0
  159. package/lib/commonjs/hooks/useRoomState.js +3 -1
  160. package/lib/commonjs/hooks/useRoomState.js.map +1 -1
  161. package/lib/commonjs/hooks/useSendMessage.js +13 -3
  162. package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
  163. package/lib/commonjs/i18n/strings.js +318 -6
  164. package/lib/commonjs/i18n/strings.js.map +1 -1
  165. package/lib/commonjs/networking/api-requests/messageSearch.api.js +87 -0
  166. package/lib/commonjs/networking/api-requests/messageSearch.api.js.map +1 -0
  167. package/lib/commonjs/networking/api-requests/publicChats.api.js +48 -0
  168. package/lib/commonjs/networking/api-requests/publicChats.api.js.map +1 -0
  169. package/lib/commonjs/networking/api-requests/roomMembers.api.js +253 -4
  170. package/lib/commonjs/networking/api-requests/roomMembers.api.js.map +1 -1
  171. package/lib/commonjs/networking/api-requests/rooms.api.js +48 -12
  172. package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
  173. package/lib/commonjs/networking/api-requests/xmppToken.api.js +71 -0
  174. package/lib/commonjs/networking/api-requests/xmppToken.api.js.map +1 -0
  175. package/lib/commonjs/networking/ethoraEvents.js +227 -0
  176. package/lib/commonjs/networking/ethoraEvents.js.map +1 -0
  177. package/lib/commonjs/networking/stanzaHandlers.js +153 -16
  178. package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
  179. package/lib/commonjs/networking/xmpp/allRoomPresences.xmpp.js +124 -3
  180. package/lib/commonjs/networking/xmpp/allRoomPresences.xmpp.js.map +1 -1
  181. package/lib/commonjs/networking/xmpp/getHistory.xmpp.js +319 -35
  182. package/lib/commonjs/networking/xmpp/getHistory.xmpp.js.map +1 -1
  183. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js +7 -0
  184. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  185. package/lib/commonjs/networking/xmpp/historyCursor.js +101 -0
  186. package/lib/commonjs/networking/xmpp/historyCursor.js.map +1 -0
  187. package/lib/commonjs/networking/xmpp/mamQueryIds.js +17 -0
  188. package/lib/commonjs/networking/xmpp/mamQueryIds.js.map +1 -0
  189. package/lib/commonjs/networking/xmpp/mamRouter.js +24 -9
  190. package/lib/commonjs/networking/xmpp/mamRouter.js.map +1 -1
  191. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js +70 -65
  192. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  193. package/lib/commonjs/networking/xmpp/roomJoinSweep.js +389 -0
  194. package/lib/commonjs/networking/xmpp/roomJoinSweep.js.map +1 -0
  195. package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js +0 -1
  196. package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
  197. package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js +0 -1
  198. package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
  199. package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +0 -1
  200. package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
  201. package/lib/commonjs/networking/xmppClient.js +269 -41
  202. package/lib/commonjs/networking/xmppClient.js.map +1 -1
  203. package/lib/commonjs/networking/xmppCredentials.js +80 -0
  204. package/lib/commonjs/networking/xmppCredentials.js.map +1 -0
  205. package/lib/commonjs/roomStore/Middleware/jumpThreadMiddleware.js +158 -0
  206. package/lib/commonjs/roomStore/Middleware/jumpThreadMiddleware.js.map +1 -0
  207. package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js +6 -0
  208. package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
  209. package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js +45 -7
  210. package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js.map +1 -1
  211. package/lib/commonjs/roomStore/chatSettingsSlice.js +15 -1
  212. package/lib/commonjs/roomStore/chatSettingsSlice.js.map +1 -1
  213. package/lib/commonjs/roomStore/index.js +13 -3
  214. package/lib/commonjs/roomStore/index.js.map +1 -1
  215. package/lib/commonjs/roomStore/persistence.js +48 -1
  216. package/lib/commonjs/roomStore/persistence.js.map +1 -1
  217. package/lib/commonjs/roomStore/roomsSlice.js +474 -60
  218. package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
  219. package/lib/commonjs/roomStore/safeKey.js +44 -0
  220. package/lib/commonjs/roomStore/safeKey.js.map +1 -0
  221. package/lib/commonjs/roomStore/usersSetCap.js +37 -0
  222. package/lib/commonjs/roomStore/usersSetCap.js.map +1 -0
  223. package/lib/commonjs/version.js +1 -1
  224. package/lib/commonjs/version.js.map +1 -1
  225. package/lib/module/assets/icons.js +1 -1
  226. package/lib/module/assets/icons.js.map +1 -1
  227. package/lib/module/components/Header/HeaderRoomList.js +23 -7
  228. package/lib/module/components/Header/HeaderRoomList.js.map +1 -1
  229. package/lib/module/components/InputComponents/Search.js +39 -2
  230. package/lib/module/components/InputComponents/Search.js.map +1 -1
  231. package/lib/module/components/MainComponents/ArchivedMessageCard.js +161 -0
  232. package/lib/module/components/MainComponents/ArchivedMessageCard.js.map +1 -0
  233. package/lib/module/components/MainComponents/ChatHeader.js +22 -5
  234. package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
  235. package/lib/module/components/MainComponents/ChatRoom.js +57 -26
  236. package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
  237. package/lib/module/components/MainComponents/ChatWrapper.js +54 -5
  238. package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
  239. package/lib/module/components/MainComponents/MediaMessage.js +18 -3
  240. package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
  241. package/lib/module/components/MainComponents/MessageList.js +740 -42
  242. package/lib/module/components/MainComponents/MessageList.js.map +1 -1
  243. package/lib/module/components/MainComponents/MessageSearchButton.js +48 -0
  244. package/lib/module/components/MainComponents/MessageSearchButton.js.map +1 -0
  245. package/lib/module/components/MainComponents/ReduxWrapper.js +15 -7
  246. package/lib/module/components/MainComponents/ReduxWrapper.js.map +1 -1
  247. package/lib/module/components/MainComponents/RoomList.js +111 -2
  248. package/lib/module/components/MainComponents/RoomList.js.map +1 -1
  249. package/lib/module/components/Menu/HeaderRoomListMenu.js +15 -4
  250. package/lib/module/components/Menu/HeaderRoomListMenu.js.map +1 -1
  251. package/lib/module/components/MessageBubble/BubbleHighlight.js +106 -0
  252. package/lib/module/components/MessageBubble/BubbleHighlight.js.map +1 -0
  253. package/lib/module/components/MessageBubble/Message.js +172 -127
  254. package/lib/module/components/MessageBubble/Message.js.map +1 -1
  255. package/lib/module/components/MessageBubble/MessageInteractions.js +98 -78
  256. package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
  257. package/lib/module/components/MessageBubble/messageMenuLayout.js +45 -0
  258. package/lib/module/components/MessageBubble/messageMenuLayout.js.map +1 -0
  259. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +74 -38
  260. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  261. package/lib/module/components/Modals/MessageSearchModal/MessageHitResults.js +243 -0
  262. package/lib/module/components/Modals/MessageSearchModal/MessageHitResults.js.map +1 -0
  263. package/lib/module/components/Modals/MessageSearchModal/MessageSearchModal.js +482 -0
  264. package/lib/module/components/Modals/MessageSearchModal/MessageSearchModal.js.map +1 -0
  265. package/lib/module/components/Modals/MessageSearchModal/openHit.js +45 -0
  266. package/lib/module/components/Modals/MessageSearchModal/openHit.js.map +1 -0
  267. package/lib/module/components/Modals/MessageSearchModal/resolveSender.js +41 -0
  268. package/lib/module/components/Modals/MessageSearchModal/resolveSender.js.map +1 -0
  269. package/lib/module/components/Modals/MessageSearchModal/searchFilters.js +74 -0
  270. package/lib/module/components/Modals/MessageSearchModal/searchFilters.js.map +1 -0
  271. package/lib/module/components/Modals/MessageSearchModal/snippet.js +57 -0
  272. package/lib/module/components/Modals/MessageSearchModal/snippet.js.map +1 -0
  273. package/lib/module/components/Modals/MessageSearchModal/useMessageSearch.js +131 -0
  274. package/lib/module/components/Modals/MessageSearchModal/useMessageSearch.js.map +1 -0
  275. package/lib/module/components/Modals/PublicChatsModal/PublicChatsModal.js +300 -0
  276. package/lib/module/components/Modals/PublicChatsModal/PublicChatsModal.js.map +1 -0
  277. package/lib/module/components/Modals/PublicChatsModal/publicChatsLogic.js +30 -0
  278. package/lib/module/components/Modals/PublicChatsModal/publicChatsLogic.js.map +1 -0
  279. package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js +8 -1
  280. package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
  281. package/lib/module/components/RoomComponents/ChatRoomItem.js +14 -3
  282. package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
  283. package/lib/module/components/RoomComponents/SwipeableRoomRow.js +39 -7
  284. package/lib/module/components/RoomComponents/SwipeableRoomRow.js.map +1 -1
  285. package/lib/module/components/Thread/ThreadHeader.js +3 -1
  286. package/lib/module/components/Thread/ThreadHeader.js.map +1 -1
  287. package/lib/module/components/Thread/ThreadWrapper.js +89 -9
  288. package/lib/module/components/Thread/ThreadWrapper.js.map +1 -1
  289. package/lib/module/components/styled/AudioDecoderHost.js +332 -0
  290. package/lib/module/components/styled/AudioDecoderHost.js.map +1 -0
  291. package/lib/module/components/styled/AudioMessage.js +495 -422
  292. package/lib/module/components/styled/AudioMessage.js.map +1 -1
  293. package/lib/module/components/styled/SendInput.js +32 -6
  294. package/lib/module/components/styled/SendInput.js.map +1 -1
  295. package/lib/module/context/MessageNotificationContext.js +15 -5
  296. package/lib/module/context/MessageNotificationContext.js.map +1 -1
  297. package/lib/module/context/xmppProvider.js +54 -79
  298. package/lib/module/context/xmppProvider.js.map +1 -1
  299. package/lib/module/helpers/audioWaveform.js +153 -0
  300. package/lib/module/helpers/audioWaveform.js.map +1 -0
  301. package/lib/module/helpers/backgroundJoinSweep.js +30 -0
  302. package/lib/module/helpers/backgroundJoinSweep.js.map +1 -0
  303. package/lib/module/helpers/bubbleHighlight.js +38 -0
  304. package/lib/module/helpers/bubbleHighlight.js.map +1 -0
  305. package/lib/module/helpers/checkUniqueUsers.js +15 -13
  306. package/lib/module/helpers/checkUniqueUsers.js.map +1 -1
  307. package/lib/module/helpers/constants/MODAL_COMPONENTS.js +5 -1
  308. package/lib/module/helpers/constants/MODAL_COMPONENTS.js.map +1 -1
  309. package/lib/module/helpers/constants/MODAL_TYPES.js +3 -1
  310. package/lib/module/helpers/constants/MODAL_TYPES.js.map +1 -1
  311. package/lib/module/helpers/createRoomFromApi.js +37 -3
  312. package/lib/module/helpers/createRoomFromApi.js.map +1 -1
  313. package/lib/module/helpers/dedupeMembers.js +28 -0
  314. package/lib/module/helpers/dedupeMembers.js.map +1 -0
  315. package/lib/module/helpers/ethoraLogger.js +52 -0
  316. package/lib/module/helpers/ethoraLogger.js.map +1 -0
  317. package/lib/module/helpers/getUnnamedUsers.js +9 -4
  318. package/lib/module/helpers/getUnnamedUsers.js.map +1 -1
  319. package/lib/module/helpers/historyPreloadConfig.js +39 -0
  320. package/lib/module/helpers/historyPreloadConfig.js.map +1 -0
  321. package/lib/module/helpers/historyPreloadScheduler.js +368 -134
  322. package/lib/module/helpers/historyPreloadScheduler.js.map +1 -1
  323. package/lib/module/helpers/initRoomsPresence.js +18 -5
  324. package/lib/module/helpers/initRoomsPresence.js.map +1 -1
  325. package/lib/module/helpers/insertMessageWithDelimiter.js +5 -0
  326. package/lib/module/helpers/insertMessageWithDelimiter.js.map +1 -1
  327. package/lib/module/helpers/isLikelyMucJid.js +60 -0
  328. package/lib/module/helpers/isLikelyMucJid.js.map +1 -0
  329. package/lib/module/helpers/isMessageSearchEnabled.js +13 -0
  330. package/lib/module/helpers/isMessageSearchEnabled.js.map +1 -0
  331. package/lib/module/helpers/joiningRoom.js +9 -0
  332. package/lib/module/helpers/joiningRoom.js.map +1 -0
  333. package/lib/module/helpers/jumpThread.js +83 -0
  334. package/lib/module/helpers/jumpThread.js.map +1 -0
  335. package/lib/module/helpers/jumpToMessage.js +52 -0
  336. package/lib/module/helpers/jumpToMessage.js.map +1 -0
  337. package/lib/module/helpers/jumpWindow.js +177 -0
  338. package/lib/module/helpers/jumpWindow.js.map +1 -0
  339. package/lib/module/helpers/loadRoomHistory.js +69 -0
  340. package/lib/module/helpers/loadRoomHistory.js.map +1 -0
  341. package/lib/module/helpers/notificationPolicy.js +70 -0
  342. package/lib/module/helpers/notificationPolicy.js.map +1 -0
  343. package/lib/module/helpers/openRoomAtMessage.js +41 -0
  344. package/lib/module/helpers/openRoomAtMessage.js.map +1 -0
  345. package/lib/module/helpers/openThreadForJump.js +68 -0
  346. package/lib/module/helpers/openThreadForJump.js.map +1 -0
  347. package/lib/module/helpers/parseMessageReference.js +26 -6
  348. package/lib/module/helpers/parseMessageReference.js.map +1 -1
  349. package/lib/module/helpers/publicChatsEntry.js +12 -0
  350. package/lib/module/helpers/publicChatsEntry.js.map +1 -0
  351. package/lib/module/helpers/roomActivityScore.js +30 -0
  352. package/lib/module/helpers/roomActivityScore.js.map +1 -0
  353. package/lib/module/helpers/roomUserCount.js +29 -0
  354. package/lib/module/helpers/roomUserCount.js.map +1 -0
  355. package/lib/module/helpers/runConfiguredHistoryPreload.js +63 -0
  356. package/lib/module/helpers/runConfiguredHistoryPreload.js.map +1 -0
  357. package/lib/module/helpers/sessionAppId.js +20 -0
  358. package/lib/module/helpers/sessionAppId.js.map +1 -0
  359. package/lib/module/helpers/timestamp.js +37 -0
  360. package/lib/module/helpers/timestamp.js.map +1 -0
  361. package/lib/module/helpers/userResolver.js +503 -0
  362. package/lib/module/helpers/userResolver.js.map +1 -0
  363. package/lib/module/helpers/xmppIdShape.js +46 -0
  364. package/lib/module/helpers/xmppIdShape.js.map +1 -0
  365. package/lib/module/hooks/useChatWrapperInit.js +16 -5
  366. package/lib/module/hooks/useChatWrapperInit.js.map +1 -1
  367. package/lib/module/hooks/useHeapSender.js +54 -3
  368. package/lib/module/hooks/useHeapSender.js.map +1 -1
  369. package/lib/module/hooks/useJumpToMessage.js +389 -0
  370. package/lib/module/hooks/useJumpToMessage.js.map +1 -0
  371. package/lib/module/hooks/useMessageLoaderQueue.js +32 -5
  372. package/lib/module/hooks/useMessageLoaderQueue.js.map +1 -1
  373. package/lib/module/hooks/useMessageQueue.js +13 -5
  374. package/lib/module/hooks/useMessageQueue.js.map +1 -1
  375. package/lib/module/hooks/useRoomDirectory.js +24 -0
  376. package/lib/module/hooks/useRoomDirectory.js.map +1 -0
  377. package/lib/module/hooks/useRoomInitialization.js +29 -7
  378. package/lib/module/hooks/useRoomInitialization.js.map +1 -1
  379. package/lib/module/hooks/useRoomMute.js +58 -0
  380. package/lib/module/hooks/useRoomMute.js.map +1 -0
  381. package/lib/module/hooks/useRoomState.js +3 -1
  382. package/lib/module/hooks/useRoomState.js.map +1 -1
  383. package/lib/module/hooks/useSendMessage.js +13 -3
  384. package/lib/module/hooks/useSendMessage.js.map +1 -1
  385. package/lib/module/i18n/strings.js +318 -6
  386. package/lib/module/i18n/strings.js.map +1 -1
  387. package/lib/module/networking/api-requests/messageSearch.api.js +81 -0
  388. package/lib/module/networking/api-requests/messageSearch.api.js.map +1 -0
  389. package/lib/module/networking/api-requests/publicChats.api.js +43 -0
  390. package/lib/module/networking/api-requests/publicChats.api.js.map +1 -0
  391. package/lib/module/networking/api-requests/roomMembers.api.js +248 -4
  392. package/lib/module/networking/api-requests/roomMembers.api.js.map +1 -1
  393. package/lib/module/networking/api-requests/rooms.api.js +48 -12
  394. package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
  395. package/lib/module/networking/api-requests/xmppToken.api.js +66 -0
  396. package/lib/module/networking/api-requests/xmppToken.api.js.map +1 -0
  397. package/lib/module/networking/ethoraEvents.js +220 -0
  398. package/lib/module/networking/ethoraEvents.js.map +1 -0
  399. package/lib/module/networking/stanzaHandlers.js +155 -18
  400. package/lib/module/networking/stanzaHandlers.js.map +1 -1
  401. package/lib/module/networking/xmpp/allRoomPresences.xmpp.js +125 -3
  402. package/lib/module/networking/xmpp/allRoomPresences.xmpp.js.map +1 -1
  403. package/lib/module/networking/xmpp/getHistory.xmpp.js +318 -35
  404. package/lib/module/networking/xmpp/getHistory.xmpp.js.map +1 -1
  405. package/lib/module/networking/xmpp/handleStanzas.xmpp.js +7 -0
  406. package/lib/module/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  407. package/lib/module/networking/xmpp/historyCursor.js +95 -0
  408. package/lib/module/networking/xmpp/historyCursor.js.map +1 -0
  409. package/lib/module/networking/xmpp/mamQueryIds.js +12 -0
  410. package/lib/module/networking/xmpp/mamQueryIds.js.map +1 -0
  411. package/lib/module/networking/xmpp/mamRouter.js +22 -8
  412. package/lib/module/networking/xmpp/mamRouter.js.map +1 -1
  413. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js +68 -62
  414. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  415. package/lib/module/networking/xmpp/roomJoinSweep.js +385 -0
  416. package/lib/module/networking/xmpp/roomJoinSweep.js.map +1 -0
  417. package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js +0 -1
  418. package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
  419. package/lib/module/networking/xmpp/sendTextMessage.xmpp.js +0 -1
  420. package/lib/module/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
  421. package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +0 -1
  422. package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
  423. package/lib/module/networking/xmppClient.js +269 -41
  424. package/lib/module/networking/xmppClient.js.map +1 -1
  425. package/lib/module/networking/xmppCredentials.js +76 -0
  426. package/lib/module/networking/xmppCredentials.js.map +1 -0
  427. package/lib/module/roomStore/Middleware/jumpThreadMiddleware.js +153 -0
  428. package/lib/module/roomStore/Middleware/jumpThreadMiddleware.js.map +1 -0
  429. package/lib/module/roomStore/Middleware/reactionsMiddleware.js +6 -0
  430. package/lib/module/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
  431. package/lib/module/roomStore/Middleware/unreadMidlleware.js +46 -7
  432. package/lib/module/roomStore/Middleware/unreadMidlleware.js.map +1 -1
  433. package/lib/module/roomStore/chatSettingsSlice.js +13 -0
  434. package/lib/module/roomStore/chatSettingsSlice.js.map +1 -1
  435. package/lib/module/roomStore/index.js +7 -3
  436. package/lib/module/roomStore/index.js.map +1 -1
  437. package/lib/module/roomStore/persistence.js +46 -1
  438. package/lib/module/roomStore/persistence.js.map +1 -1
  439. package/lib/module/roomStore/roomsSlice.js +459 -58
  440. package/lib/module/roomStore/roomsSlice.js.map +1 -1
  441. package/lib/module/roomStore/safeKey.js +37 -0
  442. package/lib/module/roomStore/safeKey.js.map +1 -0
  443. package/lib/module/roomStore/usersSetCap.js +32 -0
  444. package/lib/module/roomStore/usersSetCap.js.map +1 -0
  445. package/lib/module/version.js +1 -1
  446. package/lib/module/version.js.map +1 -1
  447. package/lib/typescript/assets/icons.d.ts +4 -0
  448. package/lib/typescript/assets/icons.d.ts.map +1 -1
  449. package/lib/typescript/components/Header/HeaderRoomList.d.ts.map +1 -1
  450. package/lib/typescript/components/InputComponents/Search.d.ts.map +1 -1
  451. package/lib/typescript/components/MainComponents/ArchivedMessageCard.d.ts +12 -0
  452. package/lib/typescript/components/MainComponents/ArchivedMessageCard.d.ts.map +1 -0
  453. package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
  454. package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
  455. package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
  456. package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
  457. package/lib/typescript/components/MainComponents/MessageList.d.ts +22 -1
  458. package/lib/typescript/components/MainComponents/MessageList.d.ts.map +1 -1
  459. package/lib/typescript/components/MainComponents/MessageSearchButton.d.ts +7 -0
  460. package/lib/typescript/components/MainComponents/MessageSearchButton.d.ts.map +1 -0
  461. package/lib/typescript/components/MainComponents/ReduxWrapper.d.ts.map +1 -1
  462. package/lib/typescript/components/MainComponents/RoomList.d.ts.map +1 -1
  463. package/lib/typescript/components/Menu/HeaderRoomListMenu.d.ts.map +1 -1
  464. package/lib/typescript/components/MessageBubble/BubbleHighlight.d.ts +12 -0
  465. package/lib/typescript/components/MessageBubble/BubbleHighlight.d.ts.map +1 -0
  466. package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
  467. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts +5 -0
  468. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts.map +1 -1
  469. package/lib/typescript/components/MessageBubble/messageMenuLayout.d.ts +29 -0
  470. package/lib/typescript/components/MessageBubble/messageMenuLayout.d.ts.map +1 -0
  471. package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts +2 -0
  472. package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
  473. package/lib/typescript/components/Modals/MessageSearchModal/MessageHitResults.d.ts +44 -0
  474. package/lib/typescript/components/Modals/MessageSearchModal/MessageHitResults.d.ts.map +1 -0
  475. package/lib/typescript/components/Modals/MessageSearchModal/MessageSearchModal.d.ts +12 -0
  476. package/lib/typescript/components/Modals/MessageSearchModal/MessageSearchModal.d.ts.map +1 -0
  477. package/lib/typescript/components/Modals/MessageSearchModal/openHit.d.ts +15 -0
  478. package/lib/typescript/components/Modals/MessageSearchModal/openHit.d.ts.map +1 -0
  479. package/lib/typescript/components/Modals/MessageSearchModal/resolveSender.d.ts +34 -0
  480. package/lib/typescript/components/Modals/MessageSearchModal/resolveSender.d.ts.map +1 -0
  481. package/lib/typescript/components/Modals/MessageSearchModal/searchFilters.d.ts +41 -0
  482. package/lib/typescript/components/Modals/MessageSearchModal/searchFilters.d.ts.map +1 -0
  483. package/lib/typescript/components/Modals/MessageSearchModal/snippet.d.ts +15 -0
  484. package/lib/typescript/components/Modals/MessageSearchModal/snippet.d.ts.map +1 -0
  485. package/lib/typescript/components/Modals/MessageSearchModal/useMessageSearch.d.ts +23 -0
  486. package/lib/typescript/components/Modals/MessageSearchModal/useMessageSearch.d.ts.map +1 -0
  487. package/lib/typescript/components/Modals/PublicChatsModal/PublicChatsModal.d.ts +16 -0
  488. package/lib/typescript/components/Modals/PublicChatsModal/PublicChatsModal.d.ts.map +1 -0
  489. package/lib/typescript/components/Modals/PublicChatsModal/publicChatsLogic.d.ts +14 -0
  490. package/lib/typescript/components/Modals/PublicChatsModal/publicChatsLogic.d.ts.map +1 -0
  491. package/lib/typescript/components/Modals/SelectUsersModal/SelectUsersModal.d.ts.map +1 -1
  492. package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
  493. package/lib/typescript/components/RoomComponents/SwipeableRoomRow.d.ts +5 -1
  494. package/lib/typescript/components/RoomComponents/SwipeableRoomRow.d.ts.map +1 -1
  495. package/lib/typescript/components/Thread/ThreadHeader.d.ts.map +1 -1
  496. package/lib/typescript/components/Thread/ThreadWrapper.d.ts +1 -0
  497. package/lib/typescript/components/Thread/ThreadWrapper.d.ts.map +1 -1
  498. package/lib/typescript/components/styled/AudioDecoderHost.d.ts +39 -0
  499. package/lib/typescript/components/styled/AudioDecoderHost.d.ts.map +1 -0
  500. package/lib/typescript/components/styled/AudioMessage.d.ts +14 -1
  501. package/lib/typescript/components/styled/AudioMessage.d.ts.map +1 -1
  502. package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
  503. package/lib/typescript/context/MessageNotificationContext.d.ts.map +1 -1
  504. package/lib/typescript/context/xmppProvider.d.ts +2 -0
  505. package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
  506. package/lib/typescript/helpers/audioWaveform.d.ts +54 -0
  507. package/lib/typescript/helpers/audioWaveform.d.ts.map +1 -0
  508. package/lib/typescript/helpers/backgroundJoinSweep.d.ts +14 -0
  509. package/lib/typescript/helpers/backgroundJoinSweep.d.ts.map +1 -0
  510. package/lib/typescript/helpers/bubbleHighlight.d.ts +17 -0
  511. package/lib/typescript/helpers/bubbleHighlight.d.ts.map +1 -0
  512. package/lib/typescript/helpers/checkUniqueUsers.d.ts +2 -2
  513. package/lib/typescript/helpers/checkUniqueUsers.d.ts.map +1 -1
  514. package/lib/typescript/helpers/constants/MODAL_COMPONENTS.d.ts.map +1 -1
  515. package/lib/typescript/helpers/constants/MODAL_TYPES.d.ts +2 -0
  516. package/lib/typescript/helpers/constants/MODAL_TYPES.d.ts.map +1 -1
  517. package/lib/typescript/helpers/createRoomFromApi.d.ts +25 -0
  518. package/lib/typescript/helpers/createRoomFromApi.d.ts.map +1 -1
  519. package/lib/typescript/helpers/dedupeMembers.d.ts +11 -0
  520. package/lib/typescript/helpers/dedupeMembers.d.ts.map +1 -0
  521. package/lib/typescript/helpers/ethoraLogger.d.ts +13 -0
  522. package/lib/typescript/helpers/ethoraLogger.d.ts.map +1 -0
  523. package/lib/typescript/helpers/getUnnamedUsers.d.ts.map +1 -1
  524. package/lib/typescript/helpers/historyPreloadConfig.d.ts +26 -0
  525. package/lib/typescript/helpers/historyPreloadConfig.d.ts.map +1 -0
  526. package/lib/typescript/helpers/historyPreloadScheduler.d.ts +8 -4
  527. package/lib/typescript/helpers/historyPreloadScheduler.d.ts.map +1 -1
  528. package/lib/typescript/helpers/initRoomsPresence.d.ts +7 -0
  529. package/lib/typescript/helpers/initRoomsPresence.d.ts.map +1 -1
  530. package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts.map +1 -1
  531. package/lib/typescript/helpers/isLikelyMucJid.d.ts +19 -0
  532. package/lib/typescript/helpers/isLikelyMucJid.d.ts.map +1 -0
  533. package/lib/typescript/helpers/isMessageSearchEnabled.d.ts +12 -0
  534. package/lib/typescript/helpers/isMessageSearchEnabled.d.ts.map +1 -0
  535. package/lib/typescript/helpers/joiningRoom.d.ts +7 -0
  536. package/lib/typescript/helpers/joiningRoom.d.ts.map +1 -0
  537. package/lib/typescript/helpers/jumpThread.d.ts +48 -0
  538. package/lib/typescript/helpers/jumpThread.d.ts.map +1 -0
  539. package/lib/typescript/helpers/jumpToMessage.d.ts +26 -0
  540. package/lib/typescript/helpers/jumpToMessage.d.ts.map +1 -0
  541. package/lib/typescript/helpers/jumpWindow.d.ts +74 -0
  542. package/lib/typescript/helpers/jumpWindow.d.ts.map +1 -0
  543. package/lib/typescript/helpers/loadRoomHistory.d.ts +34 -0
  544. package/lib/typescript/helpers/loadRoomHistory.d.ts.map +1 -0
  545. package/lib/typescript/helpers/notificationPolicy.d.ts +42 -0
  546. package/lib/typescript/helpers/notificationPolicy.d.ts.map +1 -0
  547. package/lib/typescript/helpers/openRoomAtMessage.d.ts +17 -0
  548. package/lib/typescript/helpers/openRoomAtMessage.d.ts.map +1 -0
  549. package/lib/typescript/helpers/openThreadForJump.d.ts +27 -0
  550. package/lib/typescript/helpers/openThreadForJump.d.ts.map +1 -0
  551. package/lib/typescript/helpers/parseMessageReference.d.ts +18 -5
  552. package/lib/typescript/helpers/parseMessageReference.d.ts.map +1 -1
  553. package/lib/typescript/helpers/publicChatsEntry.d.ts +11 -0
  554. package/lib/typescript/helpers/publicChatsEntry.d.ts.map +1 -0
  555. package/lib/typescript/helpers/roomActivityScore.d.ts +5 -0
  556. package/lib/typescript/helpers/roomActivityScore.d.ts.map +1 -0
  557. package/lib/typescript/helpers/roomUserCount.d.ts +20 -0
  558. package/lib/typescript/helpers/roomUserCount.d.ts.map +1 -0
  559. package/lib/typescript/helpers/runConfiguredHistoryPreload.d.ts +21 -0
  560. package/lib/typescript/helpers/runConfiguredHistoryPreload.d.ts.map +1 -0
  561. package/lib/typescript/helpers/sessionAppId.d.ts +8 -0
  562. package/lib/typescript/helpers/sessionAppId.d.ts.map +1 -0
  563. package/lib/typescript/helpers/timestamp.d.ts +3 -0
  564. package/lib/typescript/helpers/timestamp.d.ts.map +1 -0
  565. package/lib/typescript/helpers/userResolver.d.ts +58 -0
  566. package/lib/typescript/helpers/userResolver.d.ts.map +1 -0
  567. package/lib/typescript/helpers/xmppIdShape.d.ts +10 -0
  568. package/lib/typescript/helpers/xmppIdShape.d.ts.map +1 -0
  569. package/lib/typescript/hooks/useChatWrapperInit.d.ts +2 -0
  570. package/lib/typescript/hooks/useChatWrapperInit.d.ts.map +1 -1
  571. package/lib/typescript/hooks/useHeapSender.d.ts.map +1 -1
  572. package/lib/typescript/hooks/useJumpToMessage.d.ts +116 -0
  573. package/lib/typescript/hooks/useJumpToMessage.d.ts.map +1 -0
  574. package/lib/typescript/hooks/useMessageLoaderQueue.d.ts.map +1 -1
  575. package/lib/typescript/hooks/useMessageQueue.d.ts.map +1 -1
  576. package/lib/typescript/hooks/useRoomDirectory.d.ts +12 -0
  577. package/lib/typescript/hooks/useRoomDirectory.d.ts.map +1 -0
  578. package/lib/typescript/hooks/useRoomInitialization.d.ts.map +1 -1
  579. package/lib/typescript/hooks/useRoomMute.d.ts +8 -0
  580. package/lib/typescript/hooks/useRoomMute.d.ts.map +1 -0
  581. package/lib/typescript/hooks/useRoomState.d.ts +1 -0
  582. package/lib/typescript/hooks/useRoomState.d.ts.map +1 -1
  583. package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
  584. package/lib/typescript/i18n/strings.d.ts.map +1 -1
  585. package/lib/typescript/networking/api-requests/messageSearch.api.d.ts +57 -0
  586. package/lib/typescript/networking/api-requests/messageSearch.api.d.ts.map +1 -0
  587. package/lib/typescript/networking/api-requests/publicChats.api.d.ts +24 -0
  588. package/lib/typescript/networking/api-requests/publicChats.api.d.ts.map +1 -0
  589. package/lib/typescript/networking/api-requests/roomMembers.api.d.ts +19 -1
  590. package/lib/typescript/networking/api-requests/roomMembers.api.d.ts.map +1 -1
  591. package/lib/typescript/networking/api-requests/rooms.api.d.ts.map +1 -1
  592. package/lib/typescript/networking/api-requests/xmppToken.api.d.ts +2 -0
  593. package/lib/typescript/networking/api-requests/xmppToken.api.d.ts.map +1 -0
  594. package/lib/typescript/networking/ethoraEvents.d.ts +45 -0
  595. package/lib/typescript/networking/ethoraEvents.d.ts.map +1 -0
  596. package/lib/typescript/networking/stanzaHandlers.d.ts +1 -1
  597. package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
  598. package/lib/typescript/networking/xmpp/allRoomPresences.xmpp.d.ts +32 -1
  599. package/lib/typescript/networking/xmpp/allRoomPresences.xmpp.d.ts.map +1 -1
  600. package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts +64 -0
  601. package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts.map +1 -1
  602. package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts.map +1 -1
  603. package/lib/typescript/networking/xmpp/historyCursor.d.ts +35 -0
  604. package/lib/typescript/networking/xmpp/historyCursor.d.ts.map +1 -0
  605. package/lib/typescript/networking/xmpp/mamQueryIds.d.ts +10 -0
  606. package/lib/typescript/networking/xmpp/mamQueryIds.d.ts.map +1 -0
  607. package/lib/typescript/networking/xmpp/mamRouter.d.ts +7 -0
  608. package/lib/typescript/networking/xmpp/mamRouter.d.ts.map +1 -1
  609. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts +13 -2
  610. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts.map +1 -1
  611. package/lib/typescript/networking/xmpp/roomJoinSweep.d.ts +82 -0
  612. package/lib/typescript/networking/xmpp/roomJoinSweep.d.ts.map +1 -0
  613. package/lib/typescript/networking/xmpp/sendMediaMessage.xmpp.d.ts.map +1 -1
  614. package/lib/typescript/networking/xmpp/sendTextMessage.xmpp.d.ts.map +1 -1
  615. package/lib/typescript/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.d.ts.map +1 -1
  616. package/lib/typescript/networking/xmppClient.d.ts +90 -4
  617. package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
  618. package/lib/typescript/networking/xmppCredentials.d.ts +12 -0
  619. package/lib/typescript/networking/xmppCredentials.d.ts.map +1 -0
  620. package/lib/typescript/roomStore/Middleware/jumpThreadMiddleware.d.ts +3 -0
  621. package/lib/typescript/roomStore/Middleware/jumpThreadMiddleware.d.ts.map +1 -0
  622. package/lib/typescript/roomStore/Middleware/reactionsMiddleware.d.ts.map +1 -1
  623. package/lib/typescript/roomStore/Middleware/unreadMidlleware.d.ts.map +1 -1
  624. package/lib/typescript/roomStore/chatSettingsSlice.d.ts +8 -1
  625. package/lib/typescript/roomStore/chatSettingsSlice.d.ts.map +1 -1
  626. package/lib/typescript/roomStore/index.d.ts +2 -1
  627. package/lib/typescript/roomStore/index.d.ts.map +1 -1
  628. package/lib/typescript/roomStore/persistence.d.ts +8 -0
  629. package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
  630. package/lib/typescript/roomStore/roomsSlice.d.ts +138 -2
  631. package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
  632. package/lib/typescript/roomStore/safeKey.d.ts +13 -0
  633. package/lib/typescript/roomStore/safeKey.d.ts.map +1 -0
  634. package/lib/typescript/roomStore/usersSetCap.d.ts +16 -0
  635. package/lib/typescript/roomStore/usersSetCap.d.ts.map +1 -0
  636. package/lib/typescript/types/models/media.model.d.ts +2 -0
  637. package/lib/typescript/types/models/media.model.d.ts.map +1 -1
  638. package/lib/typescript/types/models/room.model.d.ts +18 -5
  639. package/lib/typescript/types/models/room.model.d.ts.map +1 -1
  640. package/lib/typescript/types/models/xmpp.model.d.ts +8 -1
  641. package/lib/typescript/types/models/xmpp.model.d.ts.map +1 -1
  642. package/lib/typescript/types/types.d.ts +90 -5
  643. package/lib/typescript/types/types.d.ts.map +1 -1
  644. package/lib/typescript/version.d.ts +1 -1
  645. package/lib/typescript/version.d.ts.map +1 -1
  646. package/package.json +1 -1
  647. package/src/assets/icons.tsx +13 -0
  648. package/src/components/Header/HeaderRoomList.tsx +21 -4
  649. package/src/components/InputComponents/Search.tsx +33 -0
  650. package/src/components/MainComponents/ArchivedMessageCard.tsx +139 -0
  651. package/src/components/MainComponents/ChatHeader.tsx +19 -3
  652. package/src/components/MainComponents/ChatRoom.tsx +60 -23
  653. package/src/components/MainComponents/ChatWrapper.tsx +50 -9
  654. package/src/components/MainComponents/MediaMessage.tsx +17 -0
  655. package/src/components/MainComponents/MessageList.tsx +823 -84
  656. package/src/components/MainComponents/MessageSearchButton.tsx +48 -0
  657. package/src/components/MainComponents/ReduxWrapper.tsx +16 -5
  658. package/src/components/MainComponents/RoomList.tsx +125 -0
  659. package/src/components/Menu/HeaderRoomListMenu.tsx +26 -2
  660. package/src/components/MessageBubble/BubbleHighlight.tsx +106 -0
  661. package/src/components/MessageBubble/Message.tsx +265 -177
  662. package/src/components/MessageBubble/MessageInteractions.tsx +109 -86
  663. package/src/components/MessageBubble/messageMenuLayout.ts +59 -0
  664. package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +92 -21
  665. package/src/components/Modals/MessageSearchModal/MessageHitResults.tsx +271 -0
  666. package/src/components/Modals/MessageSearchModal/MessageSearchModal.tsx +487 -0
  667. package/src/components/Modals/MessageSearchModal/openHit.ts +50 -0
  668. package/src/components/Modals/MessageSearchModal/resolveSender.ts +57 -0
  669. package/src/components/Modals/MessageSearchModal/searchFilters.ts +109 -0
  670. package/src/components/Modals/MessageSearchModal/snippet.ts +58 -0
  671. package/src/components/Modals/MessageSearchModal/useMessageSearch.ts +151 -0
  672. package/src/components/Modals/PublicChatsModal/PublicChatsModal.tsx +288 -0
  673. package/src/components/Modals/PublicChatsModal/publicChatsLogic.ts +36 -0
  674. package/src/components/Modals/SelectUsersModal/SelectUsersModal.tsx +8 -1
  675. package/src/components/RoomComponents/ChatRoomItem.tsx +16 -3
  676. package/src/components/RoomComponents/SwipeableRoomRow.tsx +39 -6
  677. package/src/components/Thread/ThreadHeader.tsx +3 -1
  678. package/src/components/Thread/ThreadWrapper.tsx +96 -10
  679. package/src/components/styled/AudioDecoderHost.tsx +351 -0
  680. package/src/components/styled/AudioMessage.tsx +482 -425
  681. package/src/components/styled/SendInput.tsx +42 -4
  682. package/src/context/MessageNotificationContext.tsx +19 -5
  683. package/src/context/xmppProvider.tsx +56 -91
  684. package/src/helpers/audioWaveform.ts +142 -0
  685. package/src/helpers/backgroundJoinSweep.ts +35 -0
  686. package/src/helpers/bubbleHighlight.ts +47 -0
  687. package/src/helpers/checkUniqueUsers.tsx +15 -17
  688. package/src/helpers/constants/MODAL_COMPONENTS.tsx +4 -0
  689. package/src/helpers/constants/MODAL_TYPES.ts +3 -0
  690. package/src/helpers/createRoomFromApi.tsx +45 -4
  691. package/src/helpers/dedupeMembers.ts +29 -0
  692. package/src/helpers/ethoraLogger.ts +50 -0
  693. package/src/helpers/getUnnamedUsers.ts +7 -4
  694. package/src/helpers/historyPreloadConfig.ts +68 -0
  695. package/src/helpers/historyPreloadScheduler.ts +437 -199
  696. package/src/helpers/initRoomsPresence.ts +20 -7
  697. package/src/helpers/insertMessageWithDelimiter.ts +3 -0
  698. package/src/helpers/isLikelyMucJid.ts +72 -0
  699. package/src/helpers/isMessageSearchEnabled.ts +18 -0
  700. package/src/helpers/joiningRoom.ts +13 -0
  701. package/src/helpers/jumpThread.ts +102 -0
  702. package/src/helpers/jumpToMessage.ts +57 -0
  703. package/src/helpers/jumpWindow.ts +212 -0
  704. package/src/helpers/loadRoomHistory.ts +83 -0
  705. package/src/helpers/notificationPolicy.ts +82 -0
  706. package/src/helpers/openRoomAtMessage.ts +38 -0
  707. package/src/helpers/openThreadForJump.ts +96 -0
  708. package/src/helpers/parseMessageReference.ts +37 -8
  709. package/src/helpers/publicChatsEntry.ts +15 -0
  710. package/src/helpers/roomActivityScore.ts +45 -0
  711. package/src/helpers/roomUserCount.ts +44 -0
  712. package/src/helpers/runConfiguredHistoryPreload.ts +76 -0
  713. package/src/helpers/sessionAppId.ts +17 -0
  714. package/src/helpers/timestamp.ts +44 -0
  715. package/src/helpers/userResolver.ts +542 -0
  716. package/src/helpers/xmppIdShape.ts +46 -0
  717. package/src/hooks/useChatWrapperInit.ts +22 -4
  718. package/src/hooks/useHeapSender.tsx +54 -3
  719. package/src/hooks/useJumpToMessage.ts +538 -0
  720. package/src/hooks/useMessageLoaderQueue.tsx +40 -4
  721. package/src/hooks/useMessageQueue.ts +9 -5
  722. package/src/hooks/useRoomDirectory.ts +39 -0
  723. package/src/hooks/useRoomInitialization.tsx +33 -7
  724. package/src/hooks/useRoomMute.ts +42 -0
  725. package/src/hooks/useRoomState.tsx +6 -0
  726. package/src/hooks/useSendMessage.tsx +14 -2
  727. package/src/i18n/strings.ts +312 -0
  728. package/src/networking/api-requests/messageSearch.api.ts +130 -0
  729. package/src/networking/api-requests/publicChats.api.ts +71 -0
  730. package/src/networking/api-requests/roomMembers.api.ts +263 -11
  731. package/src/networking/api-requests/rooms.api.ts +52 -12
  732. package/src/networking/api-requests/xmppToken.api.ts +62 -0
  733. package/src/networking/ethoraEvents.ts +262 -0
  734. package/src/networking/stanzaHandlers.ts +145 -19
  735. package/src/networking/xmpp/allRoomPresences.xmpp.ts +155 -5
  736. package/src/networking/xmpp/getHistory.xmpp.ts +433 -47
  737. package/src/networking/xmpp/handleStanzas.xmpp.ts +8 -0
  738. package/src/networking/xmpp/historyCursor.ts +124 -0
  739. package/src/networking/xmpp/mamQueryIds.ts +11 -0
  740. package/src/networking/xmpp/mamRouter.ts +24 -10
  741. package/src/networking/xmpp/presenceInRoom.xmpp.ts +91 -68
  742. package/src/networking/xmpp/roomJoinSweep.ts +412 -0
  743. package/src/networking/xmpp/sendMediaMessage.xmpp.ts +0 -1
  744. package/src/networking/xmpp/sendTextMessage.xmpp.ts +0 -1
  745. package/src/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.ts +0 -1
  746. package/src/networking/xmppClient.ts +323 -47
  747. package/src/networking/xmppCredentials.ts +87 -0
  748. package/src/roomStore/Middleware/jumpThreadMiddleware.ts +163 -0
  749. package/src/roomStore/Middleware/reactionsMiddleware.tsx +4 -0
  750. package/src/roomStore/Middleware/unreadMidlleware.tsx +59 -11
  751. package/src/roomStore/chatSettingsSlice.ts +11 -0
  752. package/src/roomStore/index.ts +10 -3
  753. package/src/roomStore/persistence.ts +54 -0
  754. package/src/roomStore/roomsSlice.ts +547 -65
  755. package/src/roomStore/safeKey.ts +49 -0
  756. package/src/roomStore/usersSetCap.ts +37 -0
  757. package/src/types/models/media.model.ts +4 -0
  758. package/src/types/models/room.model.ts +18 -5
  759. package/src/types/models/xmpp.model.ts +15 -1
  760. package/src/types/types.ts +95 -5
  761. package/src/version.ts +1 -1
@@ -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';
@@ -103,10 +103,16 @@ const subscribeAllRoomsForPush = (client: any, reason: string) => {
103
103
  .catch((e) => devPushLog('warn', `${reason}: mucsub subscribe failed`, e));
104
104
  };
105
105
 
106
+ /** Emitted once the session ended because the XMPP password is gone for good. */
107
+ export const SESSION_LOST_EVENT = 'ethora:sessionLost';
108
+
106
109
  export const XmppProvider: React.FC<XmppProviderProps> = ({ children, config, isVisible }) => {
107
110
  const [client, setClient] = useState<XmppClient | null>(null);
108
111
  const [providerBootstrapStatus, setProviderBootstrapStatus] =
109
112
  useState<ProviderBootstrapStatus>('idle');
113
+ // Bumped by "Retry": the bootstrap effect keys on it, so a retry re-runs
114
+ // the bootstrap with the same config instead of waiting for a change.
115
+ const [bootstrapNonce, setBootstrapNonce] = useState(0);
110
116
 
111
117
  // Track which "init mode" this provider runs in. When config.initBeforeLoad
112
118
  // is true, the provider owns bootstrap and ChatWrapper just waits.
@@ -126,62 +132,7 @@ export const XmppProvider: React.FC<XmppProviderProps> = ({ children, config, is
126
132
  // Returns last-known cached creds if nothing usable is available so
127
133
  // the XmppClient at least doesn't crash on `undefined.password`.
128
134
  const credentialsProvider = useMemo<XmppCredentialsProvider>(() => {
129
- return async () => {
130
- // 1. Make sure the REST tokens are fresh before re-minting XMPP
131
- // creds. This used to call `config.refreshTokens.refreshFunction`
132
- // directly and then fall into step 2, which refreshes again —
133
- // two rotations back to back, which the new backend scheme
134
- // reads as a race at best and token reuse at worst. One call to
135
- // the shared rotation point covers both the consumer-supplied
136
- // function and the built-in endpoint.
137
- if (config?.refreshTokens?.enabled) {
138
- const rotated = await refreshAuthTokensQuietly({ force: true });
139
-
140
- if (rotated?.xmppPassword) {
141
- const rotatedUser = store.getState().chatSettingStore.user;
142
- return {
143
- username:
144
- rotatedUser?.xmppUsername ||
145
- rotatedUser?.defaultWallet?.walletAddress ||
146
- '',
147
- password: rotated.xmppPassword,
148
- };
149
- }
150
- }
151
-
152
- // 2. Re-mint XMPP creds via the right priority chain for the
153
- // current auth mode. This call ALWAYS hydrates (unlike
154
- // `resolveInitBeforeLoadUser` which short-circuits when a
155
- // cached user already has xmppCredentials).
156
- const fresh = await refreshUserCredentialsForXmpp(config).catch(
157
- (err) => {
158
- devPushLog('warn', 'XMPP creds refresh: full chain failed', err);
159
- return null;
160
- }
161
- );
162
- if (fresh) {
163
- applyResolvedUserToStore(fresh);
164
- return {
165
- username:
166
- fresh.xmppUsername ||
167
- fresh.defaultWallet?.walletAddress ||
168
- '',
169
- password: fresh.xmppPassword || '',
170
- };
171
- }
172
-
173
- // 3. Last-resort: return the cached creds so reconnect() can
174
- // still attempt a connection. If the original failure was
175
- // a stale JWT this will fail again and the user has to
176
- // re-mount the chat — but at least we don't break the
177
- // transient-network-blip case where the cached creds are
178
- // still valid.
179
- const u = store.getState().chatSettingStore.user;
180
- return {
181
- username: u?.xmppUsername || u?.defaultWallet?.walletAddress || '',
182
- password: u?.xmppPassword || '',
183
- };
184
- };
135
+ return () => recoverXmppCredentials(config);
185
136
  }, [
186
137
  config?.jwtLogin?.enabled,
187
138
  config?.jwtLogin?.token,
@@ -248,6 +199,10 @@ export const XmppProvider: React.FC<XmppProviderProps> = ({ children, config, is
248
199
  .performLogout()
249
200
  .catch(() => {})
250
201
  .finally(() => {
202
+ // The chat says so on its own screen (ChatWrapper's overlay)
203
+ // for a host that keeps it mounted; the host is told too, so
204
+ // it can route to its sign-in.
205
+ DeviceEventEmitter.emit(SESSION_LOST_EVENT);
251
206
  try {
252
207
  Promise.resolve(config?.logout?.onAfterLogout?.()).catch(() => {});
253
208
  } catch {
@@ -258,23 +213,30 @@ export const XmppProvider: React.FC<XmppProviderProps> = ({ children, config, is
258
213
 
259
214
  // Re-join MUC rooms on every 'online'. After a reconnect the new
260
215
  // XMPP stream isn't a member of any room, so a sent message gets a
261
- // local double-tick but never reaches the room (bug #21). Re-sending
262
- // presence on reconnect fixes delivery. On the very first connect
263
- // the room list isn't loaded yet so this joins nothing — the
264
- // 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.
265
223
  created.setOnOnline(() => {
266
224
  const underlying = (created as any).client;
267
225
  if (!underlying) {return;}
268
- // The headers say "Updating…" until the rooms are joined again and
226
+ // The headers say "Updating..." until the rooms are joined again and
269
227
  // the archive caught up - a stream that is up is not yet a chat
270
228
  // that is. Same tick as the client's own 'online', so the title
271
229
  // never shows the plain state in between.
272
230
  store.dispatch(setConnectionState('syncing'));
273
- 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?.())
274
235
  .catch((e) =>
275
- devPushLog('warn', 'reconnect: allRoomPresences re-join failed', e)
276
- )
277
- .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');
278
240
  // Also refresh the private store so unread / lastViewed markers
279
241
  // are accurate after a long reconnect — the MUC re-join above only
280
242
  // restores delivery, not unread state. Idempotent on first connect.
@@ -448,7 +410,7 @@ export const XmppProvider: React.FC<XmppProviderProps> = ({ children, config, is
448
410
  }
449
411
  }
450
412
 
451
- // Kick off REST /chats/my; allRoomPresences below needs the
413
+ // Kick off REST /chats/my; the background join sweep below needs the
452
414
  // room list to be in redux, otherwise it joins 0 MUCs and the
453
415
  // user receives zero realtime messages until they manually tap
454
416
  // into each room. Track the promise so we can await it before
@@ -485,14 +447,15 @@ export const XmppProvider: React.FC<XmppProviderProps> = ({ children, config, is
485
447
  try {
486
448
  await restRoomsPromise;
487
449
  } catch {}
488
- try {
489
- const roomCount = Object.keys(store.getState().rooms.rooms || {}).length;
490
- devPushLog('xmpp', `initBeforeLoad: joining ${roomCount} rooms via presence…`);
491
- await allRoomPresences((c as any).client);
492
- devPushLog('xmpp', 'initBeforeLoad: allRoomPresences ok');
493
- } catch (e) {
494
- devPushLog('warn', 'initBeforeLoad: allRoomPresences failed', e);
495
- }
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.
496
459
  subscribeAllRoomsForPush((c as any).client, 'initBeforeLoad');
497
460
 
498
461
  store.dispatch(setStoreClient(c));
@@ -503,21 +466,14 @@ export const XmppProvider: React.FC<XmppProviderProps> = ({ children, config, is
503
466
  setProviderBootstrapStatus('ready');
504
467
  devPushLog('rn', 'initBeforeLoad: READY');
505
468
 
506
- // Background-prefetch history for every room (fire-and-forget).
507
- const qos = config?.historyQoS;
508
- const activeRoomJID = store.getState().rooms.activeRoomJID || null;
509
- const defaultRoomJids =
510
- (config?.defaultRooms as any[])?.map((r) =>
511
- typeof r === 'string' ? r : r?.jid
512
- ).filter(Boolean) || [];
513
- 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({
514
474
  client: c,
515
475
  signal: abortController.signal,
516
- selectedRoomJid: activeRoomJID,
517
- defaultRoomJids,
518
- concurrency: qos?.stagedPreloadConcurrency,
519
- pageSize: qos?.stagedPreloadFirstPassSize,
520
- roomLimit: qos?.preloadTopKRooms,
476
+ config,
521
477
  }).catch((err) => console.warn('History preload scheduler failed', err));
522
478
  } catch (error: any) {
523
479
  if (cancelled || abortController.signal.aborted) {return;}
@@ -584,6 +540,7 @@ export const XmppProvider: React.FC<XmppProviderProps> = ({ children, config, is
584
540
  config?.jwtLogin?.enabled,
585
541
  config?.jwtLogin?.token,
586
542
  config?.xmppSettings?.devServer,
543
+ bootstrapNonce,
587
544
  ]);
588
545
 
589
546
  // -----------------------------------------------------------
@@ -701,7 +658,14 @@ export const XmppProvider: React.FC<XmppProviderProps> = ({ children, config, is
701
658
  // only USED here for the one-shot stamp+flush, matching customer
702
659
  // #42: leaving (or backgrounding) a room while scrolled up must not
703
660
  // mark messages the user never reached as read.
704
- 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
+ }
705
669
  let boundaryTs: number | null = null;
706
670
  if (visibleRoomJID) {
707
671
  boundaryTs = state.rooms?.readBoundaries?.[visibleRoomJID] ?? null;
@@ -933,6 +897,7 @@ export const XmppProvider: React.FC<XmppProviderProps> = ({ children, config, is
933
897
  completedBootstrapKeyRef.current = '';
934
898
  inflightBootstrapKeyRef.current = '';
935
899
  setProviderBootstrapStatus('idle');
900
+ setBootstrapNonce((n) => n + 1);
936
901
  });
937
902
  return () => sub.remove();
938
903
  }, []);
@@ -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
+ );