@ethora/chat-component-rn 26.9.1 → 26.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/README.md +19 -0
- package/lib/commonjs/assets/icons.js +2 -2
- package/lib/commonjs/assets/icons.js.map +1 -1
- package/lib/commonjs/components/Header/HeaderRoomList.js +22 -6
- package/lib/commonjs/components/Header/HeaderRoomList.js.map +1 -1
- package/lib/commonjs/components/InputComponents/Search.js +38 -1
- package/lib/commonjs/components/InputComponents/Search.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ArchivedMessageCard.js +166 -0
- package/lib/commonjs/components/MainComponents/ArchivedMessageCard.js.map +1 -0
- package/lib/commonjs/components/MainComponents/ChatHeader.js +22 -5
- package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatRoom.js +56 -25
- package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatWrapper.js +31 -1
- package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MediaMessage.js +18 -3
- package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MessageList.js +739 -42
- package/lib/commonjs/components/MainComponents/MessageList.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MessageSearchButton.js +58 -0
- package/lib/commonjs/components/MainComponents/MessageSearchButton.js.map +1 -0
- package/lib/commonjs/components/MainComponents/ReduxWrapper.js +15 -6
- package/lib/commonjs/components/MainComponents/ReduxWrapper.js.map +1 -1
- package/lib/commonjs/components/MainComponents/RoomList.js +110 -1
- package/lib/commonjs/components/MainComponents/RoomList.js.map +1 -1
- package/lib/commonjs/components/Menu/HeaderRoomListMenu.js +14 -3
- package/lib/commonjs/components/Menu/HeaderRoomListMenu.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/BubbleHighlight.js +112 -0
- package/lib/commonjs/components/MessageBubble/BubbleHighlight.js.map +1 -0
- package/lib/commonjs/components/MessageBubble/Message.js +169 -125
- package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/MessageInteractions.js +98 -78
- package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/messageMenuLayout.js +50 -0
- package/lib/commonjs/components/MessageBubble/messageMenuLayout.js.map +1 -0
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +73 -37
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/commonjs/components/Modals/MessageSearchModal/MessageHitResults.js +253 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/MessageHitResults.js.map +1 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/MessageSearchModal.js +488 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/MessageSearchModal.js.map +1 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/openHit.js +51 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/openHit.js.map +1 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/resolveSender.js +47 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/resolveSender.js.map +1 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/searchFilters.js +83 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/searchFilters.js.map +1 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/snippet.js +61 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/snippet.js.map +1 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/useMessageSearch.js +136 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/useMessageSearch.js.map +1 -0
- package/lib/commonjs/components/Modals/PublicChatsModal/PublicChatsModal.js +306 -0
- package/lib/commonjs/components/Modals/PublicChatsModal/PublicChatsModal.js.map +1 -0
- package/lib/commonjs/components/Modals/PublicChatsModal/publicChatsLogic.js +36 -0
- package/lib/commonjs/components/Modals/PublicChatsModal/publicChatsLogic.js.map +1 -0
- package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js +8 -1
- package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.js +14 -12
- package/lib/commonjs/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.js +41 -39
- package/lib/commonjs/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js +137 -50
- package/lib/commonjs/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/ProfileShares/ProfileShares.js +15 -13
- package/lib/commonjs/components/Modals/SettingsModals/ProfileShares/ProfileShares.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/Referrals/Referrals.js +57 -55
- package/lib/commonjs/components/Modals/SettingsModals/Referrals/Referrals.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/SharedStyledComponents.js +15 -1
- package/lib/commonjs/components/Modals/SettingsModals/SharedStyledComponents.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/Visibility/VisibilityModal.js +61 -59
- package/lib/commonjs/components/Modals/SettingsModals/Visibility/VisibilityModal.js.map +1 -1
- package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js +8 -3
- package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +13 -2
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/SwipeableRoomRow.js +38 -6
- package/lib/commonjs/components/RoomComponents/SwipeableRoomRow.js.map +1 -1
- package/lib/commonjs/components/Thread/ThreadHeader.js +3 -1
- package/lib/commonjs/components/Thread/ThreadHeader.js.map +1 -1
- package/lib/commonjs/components/Thread/ThreadWrapper.js +90 -10
- package/lib/commonjs/components/Thread/ThreadWrapper.js.map +1 -1
- package/lib/commonjs/components/styled/AudioDecoderHost.js +338 -0
- package/lib/commonjs/components/styled/AudioDecoderHost.js.map +1 -0
- package/lib/commonjs/components/styled/AudioMessage.js +493 -420
- package/lib/commonjs/components/styled/AudioMessage.js.map +1 -1
- package/lib/commonjs/components/styled/SendInput.js +31 -5
- package/lib/commonjs/components/styled/SendInput.js.map +1 -1
- package/lib/commonjs/context/MessageNotificationContext.js +14 -4
- package/lib/commonjs/context/MessageNotificationContext.js.map +1 -1
- package/lib/commonjs/context/xmppProvider.js +41 -77
- package/lib/commonjs/context/xmppProvider.js.map +1 -1
- package/lib/commonjs/helpers/audioWaveform.js +165 -0
- package/lib/commonjs/helpers/audioWaveform.js.map +1 -0
- package/lib/commonjs/helpers/backgroundJoinSweep.js +36 -0
- package/lib/commonjs/helpers/backgroundJoinSweep.js.map +1 -0
- package/lib/commonjs/helpers/bubbleHighlight.js +44 -0
- package/lib/commonjs/helpers/bubbleHighlight.js.map +1 -0
- package/lib/commonjs/helpers/checkUniqueUsers.js +14 -12
- package/lib/commonjs/helpers/checkUniqueUsers.js.map +1 -1
- package/lib/commonjs/helpers/constants/MODAL_COMPONENTS.js +5 -1
- package/lib/commonjs/helpers/constants/MODAL_COMPONENTS.js.map +1 -1
- package/lib/commonjs/helpers/constants/MODAL_TYPES.js +3 -1
- package/lib/commonjs/helpers/constants/MODAL_TYPES.js.map +1 -1
- package/lib/commonjs/helpers/createRoomFromApi.js +40 -3
- package/lib/commonjs/helpers/createRoomFromApi.js.map +1 -1
- package/lib/commonjs/helpers/dedupeMembers.js +34 -0
- package/lib/commonjs/helpers/dedupeMembers.js.map +1 -0
- package/lib/commonjs/helpers/ethoraLogger.js +56 -0
- package/lib/commonjs/helpers/ethoraLogger.js.map +1 -0
- package/lib/commonjs/helpers/getUnnamedUsers.js +9 -4
- package/lib/commonjs/helpers/getUnnamedUsers.js.map +1 -1
- package/lib/commonjs/helpers/historyPreloadConfig.js +44 -0
- package/lib/commonjs/helpers/historyPreloadConfig.js.map +1 -0
- package/lib/commonjs/helpers/historyPreloadScheduler.js +372 -137
- package/lib/commonjs/helpers/historyPreloadScheduler.js.map +1 -1
- package/lib/commonjs/helpers/initRoomsPresence.js +17 -5
- package/lib/commonjs/helpers/initRoomsPresence.js.map +1 -1
- package/lib/commonjs/helpers/insertMessageWithDelimiter.js +5 -0
- package/lib/commonjs/helpers/insertMessageWithDelimiter.js.map +1 -1
- package/lib/commonjs/helpers/isLikelyMucJid.js +67 -0
- package/lib/commonjs/helpers/isLikelyMucJid.js.map +1 -0
- package/lib/commonjs/helpers/isMessageSearchEnabled.js +18 -0
- package/lib/commonjs/helpers/isMessageSearchEnabled.js.map +1 -0
- package/lib/commonjs/helpers/joiningRoom.js +14 -0
- package/lib/commonjs/helpers/joiningRoom.js.map +1 -0
- package/lib/commonjs/helpers/jumpThread.js +100 -0
- package/lib/commonjs/helpers/jumpThread.js.map +1 -0
- package/lib/commonjs/helpers/jumpToMessage.js +58 -0
- package/lib/commonjs/helpers/jumpToMessage.js.map +1 -0
- package/lib/commonjs/helpers/jumpWindow.js +187 -0
- package/lib/commonjs/helpers/jumpWindow.js.map +1 -0
- package/lib/commonjs/helpers/loadRoomHistory.js +75 -0
- package/lib/commonjs/helpers/loadRoomHistory.js.map +1 -0
- package/lib/commonjs/helpers/notificationPolicy.js +77 -0
- package/lib/commonjs/helpers/notificationPolicy.js.map +1 -0
- package/lib/commonjs/helpers/openRoomAtMessage.js +47 -0
- package/lib/commonjs/helpers/openRoomAtMessage.js.map +1 -0
- package/lib/commonjs/helpers/openThreadForJump.js +72 -0
- package/lib/commonjs/helpers/openThreadForJump.js.map +1 -0
- package/lib/commonjs/helpers/parseMessageReference.js +27 -8
- package/lib/commonjs/helpers/parseMessageReference.js.map +1 -1
- package/lib/commonjs/helpers/publicChatsEntry.js +17 -0
- package/lib/commonjs/helpers/publicChatsEntry.js.map +1 -0
- package/lib/commonjs/helpers/roomActivityScore.js +37 -0
- package/lib/commonjs/helpers/roomActivityScore.js.map +1 -0
- package/lib/commonjs/helpers/roomUserCount.js +36 -0
- package/lib/commonjs/helpers/roomUserCount.js.map +1 -0
- package/lib/commonjs/helpers/runConfiguredHistoryPreload.js +68 -0
- package/lib/commonjs/helpers/runConfiguredHistoryPreload.js.map +1 -0
- package/lib/commonjs/helpers/sessionAppId.js +24 -0
- package/lib/commonjs/helpers/sessionAppId.js.map +1 -0
- package/lib/commonjs/helpers/timestamp.js +43 -0
- package/lib/commonjs/helpers/timestamp.js.map +1 -0
- package/lib/commonjs/helpers/userResolver.js +517 -0
- package/lib/commonjs/helpers/userResolver.js.map +1 -0
- package/lib/commonjs/helpers/xmppIdShape.js +52 -0
- package/lib/commonjs/helpers/xmppIdShape.js.map +1 -0
- package/lib/commonjs/hooks/useChatWrapperInit.js +27 -5
- package/lib/commonjs/hooks/useChatWrapperInit.js.map +1 -1
- package/lib/commonjs/hooks/useHeapSender.js +54 -3
- package/lib/commonjs/hooks/useHeapSender.js.map +1 -1
- package/lib/commonjs/hooks/useJumpToMessage.js +411 -0
- package/lib/commonjs/hooks/useJumpToMessage.js.map +1 -0
- package/lib/commonjs/hooks/useMessageLoaderQueue.js +32 -5
- package/lib/commonjs/hooks/useMessageLoaderQueue.js.map +1 -1
- package/lib/commonjs/hooks/useMessageQueue.js +13 -5
- package/lib/commonjs/hooks/useMessageQueue.js.map +1 -1
- package/lib/commonjs/hooks/useRoomDirectory.js +29 -0
- package/lib/commonjs/hooks/useRoomDirectory.js.map +1 -0
- package/lib/commonjs/hooks/useRoomInitialization.js +27 -5
- package/lib/commonjs/hooks/useRoomInitialization.js.map +1 -1
- package/lib/commonjs/hooks/useRoomMute.js +62 -0
- package/lib/commonjs/hooks/useRoomMute.js.map +1 -0
- package/lib/commonjs/hooks/useRoomState.js +3 -1
- package/lib/commonjs/hooks/useRoomState.js.map +1 -1
- package/lib/commonjs/hooks/useSendMessage.js +13 -3
- package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
- package/lib/commonjs/i18n/strings.js +312 -6
- package/lib/commonjs/i18n/strings.js.map +1 -1
- package/lib/commonjs/networking/api-requests/messageSearch.api.js +87 -0
- package/lib/commonjs/networking/api-requests/messageSearch.api.js.map +1 -0
- package/lib/commonjs/networking/api-requests/publicChats.api.js +48 -0
- package/lib/commonjs/networking/api-requests/publicChats.api.js.map +1 -0
- package/lib/commonjs/networking/api-requests/roomMembers.api.js +253 -4
- package/lib/commonjs/networking/api-requests/roomMembers.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/rooms.api.js +48 -12
- package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/user.api.js +32 -3
- package/lib/commonjs/networking/api-requests/user.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/xmppToken.api.js +71 -0
- package/lib/commonjs/networking/api-requests/xmppToken.api.js.map +1 -0
- package/lib/commonjs/networking/ethoraEvents.js +227 -0
- package/lib/commonjs/networking/ethoraEvents.js.map +1 -0
- package/lib/commonjs/networking/stanzaHandlers.js +153 -16
- package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
- package/lib/commonjs/networking/xmpp/allRoomPresences.xmpp.js +124 -3
- package/lib/commonjs/networking/xmpp/allRoomPresences.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/getHistory.xmpp.js +319 -35
- package/lib/commonjs/networking/xmpp/getHistory.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js +7 -0
- package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/historyCursor.js +101 -0
- package/lib/commonjs/networking/xmpp/historyCursor.js.map +1 -0
- package/lib/commonjs/networking/xmpp/mamQueryIds.js +17 -0
- package/lib/commonjs/networking/xmpp/mamQueryIds.js.map +1 -0
- package/lib/commonjs/networking/xmpp/mamRouter.js +24 -9
- package/lib/commonjs/networking/xmpp/mamRouter.js.map +1 -1
- package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js +70 -65
- package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/roomJoinSweep.js +389 -0
- package/lib/commonjs/networking/xmpp/roomJoinSweep.js.map +1 -0
- package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js +0 -1
- package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js +0 -1
- package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +0 -1
- package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmppClient.js +269 -41
- package/lib/commonjs/networking/xmppClient.js.map +1 -1
- package/lib/commonjs/networking/xmppCredentials.js +80 -0
- package/lib/commonjs/networking/xmppCredentials.js.map +1 -0
- package/lib/commonjs/roomStore/Middleware/jumpThreadMiddleware.js +158 -0
- package/lib/commonjs/roomStore/Middleware/jumpThreadMiddleware.js.map +1 -0
- package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js +6 -0
- package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
- package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js +45 -7
- package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js.map +1 -1
- package/lib/commonjs/roomStore/chatSettingsSlice.js +21 -1
- package/lib/commonjs/roomStore/chatSettingsSlice.js.map +1 -1
- package/lib/commonjs/roomStore/index.js +13 -3
- package/lib/commonjs/roomStore/index.js.map +1 -1
- package/lib/commonjs/roomStore/persistence.js +48 -1
- package/lib/commonjs/roomStore/persistence.js.map +1 -1
- package/lib/commonjs/roomStore/roomsSlice.js +474 -60
- package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
- package/lib/commonjs/roomStore/safeKey.js +44 -0
- package/lib/commonjs/roomStore/safeKey.js.map +1 -0
- package/lib/commonjs/roomStore/usersSetCap.js +37 -0
- package/lib/commonjs/roomStore/usersSetCap.js.map +1 -0
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/assets/icons.js +1 -1
- package/lib/module/assets/icons.js.map +1 -1
- package/lib/module/components/Header/HeaderRoomList.js +23 -7
- package/lib/module/components/Header/HeaderRoomList.js.map +1 -1
- package/lib/module/components/InputComponents/Search.js +39 -2
- package/lib/module/components/InputComponents/Search.js.map +1 -1
- package/lib/module/components/MainComponents/ArchivedMessageCard.js +161 -0
- package/lib/module/components/MainComponents/ArchivedMessageCard.js.map +1 -0
- package/lib/module/components/MainComponents/ChatHeader.js +22 -5
- package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/module/components/MainComponents/ChatRoom.js +57 -26
- package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/module/components/MainComponents/ChatWrapper.js +31 -1
- package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
- package/lib/module/components/MainComponents/MediaMessage.js +18 -3
- package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
- package/lib/module/components/MainComponents/MessageList.js +740 -42
- package/lib/module/components/MainComponents/MessageList.js.map +1 -1
- package/lib/module/components/MainComponents/MessageSearchButton.js +48 -0
- package/lib/module/components/MainComponents/MessageSearchButton.js.map +1 -0
- package/lib/module/components/MainComponents/ReduxWrapper.js +15 -7
- package/lib/module/components/MainComponents/ReduxWrapper.js.map +1 -1
- package/lib/module/components/MainComponents/RoomList.js +111 -2
- package/lib/module/components/MainComponents/RoomList.js.map +1 -1
- package/lib/module/components/Menu/HeaderRoomListMenu.js +15 -4
- package/lib/module/components/Menu/HeaderRoomListMenu.js.map +1 -1
- package/lib/module/components/MessageBubble/BubbleHighlight.js +106 -0
- package/lib/module/components/MessageBubble/BubbleHighlight.js.map +1 -0
- package/lib/module/components/MessageBubble/Message.js +172 -127
- package/lib/module/components/MessageBubble/Message.js.map +1 -1
- package/lib/module/components/MessageBubble/MessageInteractions.js +98 -78
- package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
- package/lib/module/components/MessageBubble/messageMenuLayout.js +45 -0
- package/lib/module/components/MessageBubble/messageMenuLayout.js.map +1 -0
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +74 -38
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/module/components/Modals/MessageSearchModal/MessageHitResults.js +243 -0
- package/lib/module/components/Modals/MessageSearchModal/MessageHitResults.js.map +1 -0
- package/lib/module/components/Modals/MessageSearchModal/MessageSearchModal.js +482 -0
- package/lib/module/components/Modals/MessageSearchModal/MessageSearchModal.js.map +1 -0
- package/lib/module/components/Modals/MessageSearchModal/openHit.js +45 -0
- package/lib/module/components/Modals/MessageSearchModal/openHit.js.map +1 -0
- package/lib/module/components/Modals/MessageSearchModal/resolveSender.js +41 -0
- package/lib/module/components/Modals/MessageSearchModal/resolveSender.js.map +1 -0
- package/lib/module/components/Modals/MessageSearchModal/searchFilters.js +74 -0
- package/lib/module/components/Modals/MessageSearchModal/searchFilters.js.map +1 -0
- package/lib/module/components/Modals/MessageSearchModal/snippet.js +57 -0
- package/lib/module/components/Modals/MessageSearchModal/snippet.js.map +1 -0
- package/lib/module/components/Modals/MessageSearchModal/useMessageSearch.js +131 -0
- package/lib/module/components/Modals/MessageSearchModal/useMessageSearch.js.map +1 -0
- package/lib/module/components/Modals/PublicChatsModal/PublicChatsModal.js +300 -0
- package/lib/module/components/Modals/PublicChatsModal/PublicChatsModal.js.map +1 -0
- package/lib/module/components/Modals/PublicChatsModal/publicChatsLogic.js +30 -0
- package/lib/module/components/Modals/PublicChatsModal/publicChatsLogic.js.map +1 -0
- package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js +8 -1
- package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.js +15 -13
- package/lib/module/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.js +42 -40
- package/lib/module/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js +138 -52
- package/lib/module/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/ProfileShares/ProfileShares.js +16 -14
- package/lib/module/components/Modals/SettingsModals/ProfileShares/ProfileShares.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/Referrals/Referrals.js +58 -56
- package/lib/module/components/Modals/SettingsModals/Referrals/Referrals.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/SharedStyledComponents.js +14 -0
- package/lib/module/components/Modals/SettingsModals/SharedStyledComponents.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/Visibility/VisibilityModal.js +62 -60
- package/lib/module/components/Modals/SettingsModals/Visibility/VisibilityModal.js.map +1 -1
- package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js +9 -4
- package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
- package/lib/module/components/RoomComponents/ChatRoomItem.js +14 -3
- package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
- package/lib/module/components/RoomComponents/SwipeableRoomRow.js +39 -7
- package/lib/module/components/RoomComponents/SwipeableRoomRow.js.map +1 -1
- package/lib/module/components/Thread/ThreadHeader.js +3 -1
- package/lib/module/components/Thread/ThreadHeader.js.map +1 -1
- package/lib/module/components/Thread/ThreadWrapper.js +89 -9
- package/lib/module/components/Thread/ThreadWrapper.js.map +1 -1
- package/lib/module/components/styled/AudioDecoderHost.js +332 -0
- package/lib/module/components/styled/AudioDecoderHost.js.map +1 -0
- package/lib/module/components/styled/AudioMessage.js +495 -422
- package/lib/module/components/styled/AudioMessage.js.map +1 -1
- package/lib/module/components/styled/SendInput.js +32 -6
- package/lib/module/components/styled/SendInput.js.map +1 -1
- package/lib/module/context/MessageNotificationContext.js +15 -5
- package/lib/module/context/MessageNotificationContext.js.map +1 -1
- package/lib/module/context/xmppProvider.js +42 -78
- package/lib/module/context/xmppProvider.js.map +1 -1
- package/lib/module/helpers/audioWaveform.js +153 -0
- package/lib/module/helpers/audioWaveform.js.map +1 -0
- package/lib/module/helpers/backgroundJoinSweep.js +30 -0
- package/lib/module/helpers/backgroundJoinSweep.js.map +1 -0
- package/lib/module/helpers/bubbleHighlight.js +38 -0
- package/lib/module/helpers/bubbleHighlight.js.map +1 -0
- package/lib/module/helpers/checkUniqueUsers.js +15 -13
- package/lib/module/helpers/checkUniqueUsers.js.map +1 -1
- package/lib/module/helpers/constants/MODAL_COMPONENTS.js +5 -1
- package/lib/module/helpers/constants/MODAL_COMPONENTS.js.map +1 -1
- package/lib/module/helpers/constants/MODAL_TYPES.js +3 -1
- package/lib/module/helpers/constants/MODAL_TYPES.js.map +1 -1
- package/lib/module/helpers/createRoomFromApi.js +37 -3
- package/lib/module/helpers/createRoomFromApi.js.map +1 -1
- package/lib/module/helpers/dedupeMembers.js +28 -0
- package/lib/module/helpers/dedupeMembers.js.map +1 -0
- package/lib/module/helpers/ethoraLogger.js +52 -0
- package/lib/module/helpers/ethoraLogger.js.map +1 -0
- package/lib/module/helpers/getUnnamedUsers.js +9 -4
- package/lib/module/helpers/getUnnamedUsers.js.map +1 -1
- package/lib/module/helpers/historyPreloadConfig.js +39 -0
- package/lib/module/helpers/historyPreloadConfig.js.map +1 -0
- package/lib/module/helpers/historyPreloadScheduler.js +368 -134
- package/lib/module/helpers/historyPreloadScheduler.js.map +1 -1
- package/lib/module/helpers/initRoomsPresence.js +18 -5
- package/lib/module/helpers/initRoomsPresence.js.map +1 -1
- package/lib/module/helpers/insertMessageWithDelimiter.js +5 -0
- package/lib/module/helpers/insertMessageWithDelimiter.js.map +1 -1
- package/lib/module/helpers/isLikelyMucJid.js +60 -0
- package/lib/module/helpers/isLikelyMucJid.js.map +1 -0
- package/lib/module/helpers/isMessageSearchEnabled.js +13 -0
- package/lib/module/helpers/isMessageSearchEnabled.js.map +1 -0
- package/lib/module/helpers/joiningRoom.js +9 -0
- package/lib/module/helpers/joiningRoom.js.map +1 -0
- package/lib/module/helpers/jumpThread.js +83 -0
- package/lib/module/helpers/jumpThread.js.map +1 -0
- package/lib/module/helpers/jumpToMessage.js +52 -0
- package/lib/module/helpers/jumpToMessage.js.map +1 -0
- package/lib/module/helpers/jumpWindow.js +177 -0
- package/lib/module/helpers/jumpWindow.js.map +1 -0
- package/lib/module/helpers/loadRoomHistory.js +69 -0
- package/lib/module/helpers/loadRoomHistory.js.map +1 -0
- package/lib/module/helpers/notificationPolicy.js +70 -0
- package/lib/module/helpers/notificationPolicy.js.map +1 -0
- package/lib/module/helpers/openRoomAtMessage.js +41 -0
- package/lib/module/helpers/openRoomAtMessage.js.map +1 -0
- package/lib/module/helpers/openThreadForJump.js +68 -0
- package/lib/module/helpers/openThreadForJump.js.map +1 -0
- package/lib/module/helpers/parseMessageReference.js +26 -6
- package/lib/module/helpers/parseMessageReference.js.map +1 -1
- package/lib/module/helpers/publicChatsEntry.js +12 -0
- package/lib/module/helpers/publicChatsEntry.js.map +1 -0
- package/lib/module/helpers/roomActivityScore.js +30 -0
- package/lib/module/helpers/roomActivityScore.js.map +1 -0
- package/lib/module/helpers/roomUserCount.js +29 -0
- package/lib/module/helpers/roomUserCount.js.map +1 -0
- package/lib/module/helpers/runConfiguredHistoryPreload.js +63 -0
- package/lib/module/helpers/runConfiguredHistoryPreload.js.map +1 -0
- package/lib/module/helpers/sessionAppId.js +20 -0
- package/lib/module/helpers/sessionAppId.js.map +1 -0
- package/lib/module/helpers/timestamp.js +37 -0
- package/lib/module/helpers/timestamp.js.map +1 -0
- package/lib/module/helpers/userResolver.js +503 -0
- package/lib/module/helpers/userResolver.js.map +1 -0
- package/lib/module/helpers/xmppIdShape.js +46 -0
- package/lib/module/helpers/xmppIdShape.js.map +1 -0
- package/lib/module/hooks/useChatWrapperInit.js +16 -5
- package/lib/module/hooks/useChatWrapperInit.js.map +1 -1
- package/lib/module/hooks/useHeapSender.js +54 -3
- package/lib/module/hooks/useHeapSender.js.map +1 -1
- package/lib/module/hooks/useJumpToMessage.js +389 -0
- package/lib/module/hooks/useJumpToMessage.js.map +1 -0
- package/lib/module/hooks/useMessageLoaderQueue.js +32 -5
- package/lib/module/hooks/useMessageLoaderQueue.js.map +1 -1
- package/lib/module/hooks/useMessageQueue.js +13 -5
- package/lib/module/hooks/useMessageQueue.js.map +1 -1
- package/lib/module/hooks/useRoomDirectory.js +24 -0
- package/lib/module/hooks/useRoomDirectory.js.map +1 -0
- package/lib/module/hooks/useRoomInitialization.js +29 -7
- package/lib/module/hooks/useRoomInitialization.js.map +1 -1
- package/lib/module/hooks/useRoomMute.js +58 -0
- package/lib/module/hooks/useRoomMute.js.map +1 -0
- package/lib/module/hooks/useRoomState.js +3 -1
- package/lib/module/hooks/useRoomState.js.map +1 -1
- package/lib/module/hooks/useSendMessage.js +13 -3
- package/lib/module/hooks/useSendMessage.js.map +1 -1
- package/lib/module/i18n/strings.js +312 -6
- package/lib/module/i18n/strings.js.map +1 -1
- package/lib/module/networking/api-requests/messageSearch.api.js +81 -0
- package/lib/module/networking/api-requests/messageSearch.api.js.map +1 -0
- package/lib/module/networking/api-requests/publicChats.api.js +43 -0
- package/lib/module/networking/api-requests/publicChats.api.js.map +1 -0
- package/lib/module/networking/api-requests/roomMembers.api.js +248 -4
- package/lib/module/networking/api-requests/roomMembers.api.js.map +1 -1
- package/lib/module/networking/api-requests/rooms.api.js +48 -12
- package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
- package/lib/module/networking/api-requests/user.api.js +31 -3
- package/lib/module/networking/api-requests/user.api.js.map +1 -1
- package/lib/module/networking/api-requests/xmppToken.api.js +66 -0
- package/lib/module/networking/api-requests/xmppToken.api.js.map +1 -0
- package/lib/module/networking/ethoraEvents.js +220 -0
- package/lib/module/networking/ethoraEvents.js.map +1 -0
- package/lib/module/networking/stanzaHandlers.js +155 -18
- package/lib/module/networking/stanzaHandlers.js.map +1 -1
- package/lib/module/networking/xmpp/allRoomPresences.xmpp.js +125 -3
- package/lib/module/networking/xmpp/allRoomPresences.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/getHistory.xmpp.js +318 -35
- package/lib/module/networking/xmpp/getHistory.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/handleStanzas.xmpp.js +7 -0
- package/lib/module/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/historyCursor.js +95 -0
- package/lib/module/networking/xmpp/historyCursor.js.map +1 -0
- package/lib/module/networking/xmpp/mamQueryIds.js +12 -0
- package/lib/module/networking/xmpp/mamQueryIds.js.map +1 -0
- package/lib/module/networking/xmpp/mamRouter.js +22 -8
- package/lib/module/networking/xmpp/mamRouter.js.map +1 -1
- package/lib/module/networking/xmpp/presenceInRoom.xmpp.js +68 -62
- package/lib/module/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/roomJoinSweep.js +385 -0
- package/lib/module/networking/xmpp/roomJoinSweep.js.map +1 -0
- package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js +0 -1
- package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/sendTextMessage.xmpp.js +0 -1
- package/lib/module/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +0 -1
- package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
- package/lib/module/networking/xmppClient.js +269 -41
- package/lib/module/networking/xmppClient.js.map +1 -1
- package/lib/module/networking/xmppCredentials.js +76 -0
- package/lib/module/networking/xmppCredentials.js.map +1 -0
- package/lib/module/roomStore/Middleware/jumpThreadMiddleware.js +153 -0
- package/lib/module/roomStore/Middleware/jumpThreadMiddleware.js.map +1 -0
- package/lib/module/roomStore/Middleware/reactionsMiddleware.js +6 -0
- package/lib/module/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
- package/lib/module/roomStore/Middleware/unreadMidlleware.js +46 -7
- package/lib/module/roomStore/Middleware/unreadMidlleware.js.map +1 -1
- package/lib/module/roomStore/chatSettingsSlice.js +19 -0
- package/lib/module/roomStore/chatSettingsSlice.js.map +1 -1
- package/lib/module/roomStore/index.js +7 -3
- package/lib/module/roomStore/index.js.map +1 -1
- package/lib/module/roomStore/persistence.js +46 -1
- package/lib/module/roomStore/persistence.js.map +1 -1
- package/lib/module/roomStore/roomsSlice.js +459 -58
- package/lib/module/roomStore/roomsSlice.js.map +1 -1
- package/lib/module/roomStore/safeKey.js +37 -0
- package/lib/module/roomStore/safeKey.js.map +1 -0
- package/lib/module/roomStore/usersSetCap.js +32 -0
- package/lib/module/roomStore/usersSetCap.js.map +1 -0
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/assets/icons.d.ts +4 -0
- package/lib/typescript/assets/icons.d.ts.map +1 -1
- package/lib/typescript/components/Header/HeaderRoomList.d.ts.map +1 -1
- package/lib/typescript/components/InputComponents/Search.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ArchivedMessageCard.d.ts +12 -0
- package/lib/typescript/components/MainComponents/ArchivedMessageCard.d.ts.map +1 -0
- package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MessageList.d.ts +22 -1
- package/lib/typescript/components/MainComponents/MessageList.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MessageSearchButton.d.ts +7 -0
- package/lib/typescript/components/MainComponents/MessageSearchButton.d.ts.map +1 -0
- package/lib/typescript/components/MainComponents/ReduxWrapper.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/RoomList.d.ts.map +1 -1
- package/lib/typescript/components/Menu/HeaderRoomListMenu.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/BubbleHighlight.d.ts +12 -0
- package/lib/typescript/components/MessageBubble/BubbleHighlight.d.ts.map +1 -0
- package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts +5 -0
- package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/messageMenuLayout.d.ts +29 -0
- package/lib/typescript/components/MessageBubble/messageMenuLayout.d.ts.map +1 -0
- package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts +2 -0
- package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/MessageSearchModal/MessageHitResults.d.ts +44 -0
- package/lib/typescript/components/Modals/MessageSearchModal/MessageHitResults.d.ts.map +1 -0
- package/lib/typescript/components/Modals/MessageSearchModal/MessageSearchModal.d.ts +12 -0
- package/lib/typescript/components/Modals/MessageSearchModal/MessageSearchModal.d.ts.map +1 -0
- package/lib/typescript/components/Modals/MessageSearchModal/openHit.d.ts +15 -0
- package/lib/typescript/components/Modals/MessageSearchModal/openHit.d.ts.map +1 -0
- package/lib/typescript/components/Modals/MessageSearchModal/resolveSender.d.ts +34 -0
- package/lib/typescript/components/Modals/MessageSearchModal/resolveSender.d.ts.map +1 -0
- package/lib/typescript/components/Modals/MessageSearchModal/searchFilters.d.ts +41 -0
- package/lib/typescript/components/Modals/MessageSearchModal/searchFilters.d.ts.map +1 -0
- package/lib/typescript/components/Modals/MessageSearchModal/snippet.d.ts +15 -0
- package/lib/typescript/components/Modals/MessageSearchModal/snippet.d.ts.map +1 -0
- package/lib/typescript/components/Modals/MessageSearchModal/useMessageSearch.d.ts +23 -0
- package/lib/typescript/components/Modals/MessageSearchModal/useMessageSearch.d.ts.map +1 -0
- package/lib/typescript/components/Modals/PublicChatsModal/PublicChatsModal.d.ts +16 -0
- package/lib/typescript/components/Modals/PublicChatsModal/PublicChatsModal.d.ts.map +1 -0
- package/lib/typescript/components/Modals/PublicChatsModal/publicChatsLogic.d.ts +14 -0
- package/lib/typescript/components/Modals/PublicChatsModal/publicChatsLogic.d.ts.map +1 -0
- package/lib/typescript/components/Modals/SelectUsersModal/SelectUsersModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/ProfileShares/ProfileShares.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/Referrals/Referrals.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/SharedStyledComponents.d.ts +1 -0
- package/lib/typescript/components/Modals/SettingsModals/SharedStyledComponents.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/Visibility/VisibilityModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/UserSettingsModal/UserSettingsModal.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/SwipeableRoomRow.d.ts +5 -1
- package/lib/typescript/components/RoomComponents/SwipeableRoomRow.d.ts.map +1 -1
- package/lib/typescript/components/Thread/ThreadHeader.d.ts.map +1 -1
- package/lib/typescript/components/Thread/ThreadWrapper.d.ts +1 -0
- package/lib/typescript/components/Thread/ThreadWrapper.d.ts.map +1 -1
- package/lib/typescript/components/styled/AudioDecoderHost.d.ts +39 -0
- package/lib/typescript/components/styled/AudioDecoderHost.d.ts.map +1 -0
- package/lib/typescript/components/styled/AudioMessage.d.ts +14 -1
- package/lib/typescript/components/styled/AudioMessage.d.ts.map +1 -1
- package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
- package/lib/typescript/context/MessageNotificationContext.d.ts.map +1 -1
- package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
- package/lib/typescript/helpers/audioWaveform.d.ts +54 -0
- package/lib/typescript/helpers/audioWaveform.d.ts.map +1 -0
- package/lib/typescript/helpers/backgroundJoinSweep.d.ts +14 -0
- package/lib/typescript/helpers/backgroundJoinSweep.d.ts.map +1 -0
- package/lib/typescript/helpers/bubbleHighlight.d.ts +17 -0
- package/lib/typescript/helpers/bubbleHighlight.d.ts.map +1 -0
- package/lib/typescript/helpers/checkUniqueUsers.d.ts +2 -2
- package/lib/typescript/helpers/checkUniqueUsers.d.ts.map +1 -1
- package/lib/typescript/helpers/constants/MODAL_COMPONENTS.d.ts.map +1 -1
- package/lib/typescript/helpers/constants/MODAL_TYPES.d.ts +2 -0
- package/lib/typescript/helpers/constants/MODAL_TYPES.d.ts.map +1 -1
- package/lib/typescript/helpers/createRoomFromApi.d.ts +25 -0
- package/lib/typescript/helpers/createRoomFromApi.d.ts.map +1 -1
- package/lib/typescript/helpers/dedupeMembers.d.ts +11 -0
- package/lib/typescript/helpers/dedupeMembers.d.ts.map +1 -0
- package/lib/typescript/helpers/ethoraLogger.d.ts +13 -0
- package/lib/typescript/helpers/ethoraLogger.d.ts.map +1 -0
- package/lib/typescript/helpers/getUnnamedUsers.d.ts.map +1 -1
- package/lib/typescript/helpers/historyPreloadConfig.d.ts +26 -0
- package/lib/typescript/helpers/historyPreloadConfig.d.ts.map +1 -0
- package/lib/typescript/helpers/historyPreloadScheduler.d.ts +8 -4
- package/lib/typescript/helpers/historyPreloadScheduler.d.ts.map +1 -1
- package/lib/typescript/helpers/initRoomsPresence.d.ts +7 -0
- package/lib/typescript/helpers/initRoomsPresence.d.ts.map +1 -1
- package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts.map +1 -1
- package/lib/typescript/helpers/isLikelyMucJid.d.ts +19 -0
- package/lib/typescript/helpers/isLikelyMucJid.d.ts.map +1 -0
- package/lib/typescript/helpers/isMessageSearchEnabled.d.ts +12 -0
- package/lib/typescript/helpers/isMessageSearchEnabled.d.ts.map +1 -0
- package/lib/typescript/helpers/joiningRoom.d.ts +7 -0
- package/lib/typescript/helpers/joiningRoom.d.ts.map +1 -0
- package/lib/typescript/helpers/jumpThread.d.ts +48 -0
- package/lib/typescript/helpers/jumpThread.d.ts.map +1 -0
- package/lib/typescript/helpers/jumpToMessage.d.ts +26 -0
- package/lib/typescript/helpers/jumpToMessage.d.ts.map +1 -0
- package/lib/typescript/helpers/jumpWindow.d.ts +74 -0
- package/lib/typescript/helpers/jumpWindow.d.ts.map +1 -0
- package/lib/typescript/helpers/loadRoomHistory.d.ts +34 -0
- package/lib/typescript/helpers/loadRoomHistory.d.ts.map +1 -0
- package/lib/typescript/helpers/notificationPolicy.d.ts +42 -0
- package/lib/typescript/helpers/notificationPolicy.d.ts.map +1 -0
- package/lib/typescript/helpers/openRoomAtMessage.d.ts +17 -0
- package/lib/typescript/helpers/openRoomAtMessage.d.ts.map +1 -0
- package/lib/typescript/helpers/openThreadForJump.d.ts +27 -0
- package/lib/typescript/helpers/openThreadForJump.d.ts.map +1 -0
- package/lib/typescript/helpers/parseMessageReference.d.ts +18 -5
- package/lib/typescript/helpers/parseMessageReference.d.ts.map +1 -1
- package/lib/typescript/helpers/publicChatsEntry.d.ts +11 -0
- package/lib/typescript/helpers/publicChatsEntry.d.ts.map +1 -0
- package/lib/typescript/helpers/roomActivityScore.d.ts +5 -0
- package/lib/typescript/helpers/roomActivityScore.d.ts.map +1 -0
- package/lib/typescript/helpers/roomUserCount.d.ts +20 -0
- package/lib/typescript/helpers/roomUserCount.d.ts.map +1 -0
- package/lib/typescript/helpers/runConfiguredHistoryPreload.d.ts +21 -0
- package/lib/typescript/helpers/runConfiguredHistoryPreload.d.ts.map +1 -0
- package/lib/typescript/helpers/sessionAppId.d.ts +8 -0
- package/lib/typescript/helpers/sessionAppId.d.ts.map +1 -0
- package/lib/typescript/helpers/timestamp.d.ts +3 -0
- package/lib/typescript/helpers/timestamp.d.ts.map +1 -0
- package/lib/typescript/helpers/userResolver.d.ts +58 -0
- package/lib/typescript/helpers/userResolver.d.ts.map +1 -0
- package/lib/typescript/helpers/xmppIdShape.d.ts +10 -0
- package/lib/typescript/helpers/xmppIdShape.d.ts.map +1 -0
- package/lib/typescript/hooks/useChatWrapperInit.d.ts +2 -0
- package/lib/typescript/hooks/useChatWrapperInit.d.ts.map +1 -1
- package/lib/typescript/hooks/useHeapSender.d.ts.map +1 -1
- package/lib/typescript/hooks/useJumpToMessage.d.ts +116 -0
- package/lib/typescript/hooks/useJumpToMessage.d.ts.map +1 -0
- package/lib/typescript/hooks/useMessageLoaderQueue.d.ts.map +1 -1
- package/lib/typescript/hooks/useMessageQueue.d.ts.map +1 -1
- package/lib/typescript/hooks/useRoomDirectory.d.ts +12 -0
- package/lib/typescript/hooks/useRoomDirectory.d.ts.map +1 -0
- package/lib/typescript/hooks/useRoomInitialization.d.ts.map +1 -1
- package/lib/typescript/hooks/useRoomMute.d.ts +8 -0
- package/lib/typescript/hooks/useRoomMute.d.ts.map +1 -0
- package/lib/typescript/hooks/useRoomState.d.ts +1 -0
- package/lib/typescript/hooks/useRoomState.d.ts.map +1 -1
- package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
- package/lib/typescript/i18n/strings.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/messageSearch.api.d.ts +57 -0
- package/lib/typescript/networking/api-requests/messageSearch.api.d.ts.map +1 -0
- package/lib/typescript/networking/api-requests/publicChats.api.d.ts +24 -0
- package/lib/typescript/networking/api-requests/publicChats.api.d.ts.map +1 -0
- package/lib/typescript/networking/api-requests/roomMembers.api.d.ts +19 -1
- package/lib/typescript/networking/api-requests/roomMembers.api.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/rooms.api.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/user.api.d.ts +8 -0
- package/lib/typescript/networking/api-requests/user.api.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/xmppToken.api.d.ts +2 -0
- package/lib/typescript/networking/api-requests/xmppToken.api.d.ts.map +1 -0
- package/lib/typescript/networking/ethoraEvents.d.ts +45 -0
- package/lib/typescript/networking/ethoraEvents.d.ts.map +1 -0
- package/lib/typescript/networking/stanzaHandlers.d.ts +1 -1
- package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/allRoomPresences.xmpp.d.ts +32 -1
- package/lib/typescript/networking/xmpp/allRoomPresences.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts +64 -0
- package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/historyCursor.d.ts +35 -0
- package/lib/typescript/networking/xmpp/historyCursor.d.ts.map +1 -0
- package/lib/typescript/networking/xmpp/mamQueryIds.d.ts +10 -0
- package/lib/typescript/networking/xmpp/mamQueryIds.d.ts.map +1 -0
- package/lib/typescript/networking/xmpp/mamRouter.d.ts +7 -0
- package/lib/typescript/networking/xmpp/mamRouter.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts +13 -2
- package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/roomJoinSweep.d.ts +82 -0
- package/lib/typescript/networking/xmpp/roomJoinSweep.d.ts.map +1 -0
- package/lib/typescript/networking/xmpp/sendMediaMessage.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/sendTextMessage.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmppClient.d.ts +90 -4
- package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
- package/lib/typescript/networking/xmppCredentials.d.ts +12 -0
- package/lib/typescript/networking/xmppCredentials.d.ts.map +1 -0
- package/lib/typescript/roomStore/Middleware/jumpThreadMiddleware.d.ts +3 -0
- package/lib/typescript/roomStore/Middleware/jumpThreadMiddleware.d.ts.map +1 -0
- package/lib/typescript/roomStore/Middleware/reactionsMiddleware.d.ts.map +1 -1
- package/lib/typescript/roomStore/Middleware/unreadMidlleware.d.ts.map +1 -1
- package/lib/typescript/roomStore/chatSettingsSlice.d.ts +8 -1
- package/lib/typescript/roomStore/chatSettingsSlice.d.ts.map +1 -1
- package/lib/typescript/roomStore/index.d.ts +2 -1
- package/lib/typescript/roomStore/index.d.ts.map +1 -1
- package/lib/typescript/roomStore/persistence.d.ts +8 -0
- package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
- package/lib/typescript/roomStore/roomsSlice.d.ts +138 -2
- package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
- package/lib/typescript/roomStore/safeKey.d.ts +13 -0
- package/lib/typescript/roomStore/safeKey.d.ts.map +1 -0
- package/lib/typescript/roomStore/usersSetCap.d.ts +16 -0
- package/lib/typescript/roomStore/usersSetCap.d.ts.map +1 -0
- package/lib/typescript/types/models/media.model.d.ts +2 -0
- package/lib/typescript/types/models/media.model.d.ts.map +1 -1
- package/lib/typescript/types/models/room.model.d.ts +18 -5
- package/lib/typescript/types/models/room.model.d.ts.map +1 -1
- package/lib/typescript/types/models/xmpp.model.d.ts +8 -1
- package/lib/typescript/types/models/xmpp.model.d.ts.map +1 -1
- package/lib/typescript/types/types.d.ts +88 -5
- package/lib/typescript/types/types.d.ts.map +1 -1
- package/lib/typescript/version.d.ts +1 -1
- package/lib/typescript/version.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/assets/icons.tsx +13 -0
- package/src/components/Header/HeaderRoomList.tsx +21 -4
- package/src/components/InputComponents/Search.tsx +33 -0
- package/src/components/MainComponents/ArchivedMessageCard.tsx +139 -0
- package/src/components/MainComponents/ChatHeader.tsx +19 -3
- package/src/components/MainComponents/ChatRoom.tsx +60 -23
- package/src/components/MainComponents/ChatWrapper.tsx +23 -4
- package/src/components/MainComponents/MediaMessage.tsx +17 -0
- package/src/components/MainComponents/MessageList.tsx +823 -84
- package/src/components/MainComponents/MessageSearchButton.tsx +48 -0
- package/src/components/MainComponents/ReduxWrapper.tsx +16 -5
- package/src/components/MainComponents/RoomList.tsx +125 -0
- package/src/components/Menu/HeaderRoomListMenu.tsx +26 -2
- package/src/components/MessageBubble/BubbleHighlight.tsx +106 -0
- package/src/components/MessageBubble/Message.tsx +265 -177
- package/src/components/MessageBubble/MessageInteractions.tsx +109 -86
- package/src/components/MessageBubble/messageMenuLayout.ts +59 -0
- package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +92 -21
- package/src/components/Modals/MessageSearchModal/MessageHitResults.tsx +271 -0
- package/src/components/Modals/MessageSearchModal/MessageSearchModal.tsx +487 -0
- package/src/components/Modals/MessageSearchModal/openHit.ts +50 -0
- package/src/components/Modals/MessageSearchModal/resolveSender.ts +57 -0
- package/src/components/Modals/MessageSearchModal/searchFilters.ts +109 -0
- package/src/components/Modals/MessageSearchModal/snippet.ts +58 -0
- package/src/components/Modals/MessageSearchModal/useMessageSearch.ts +151 -0
- package/src/components/Modals/PublicChatsModal/PublicChatsModal.tsx +288 -0
- package/src/components/Modals/PublicChatsModal/publicChatsLogic.ts +36 -0
- package/src/components/Modals/SelectUsersModal/SelectUsersModal.tsx +8 -1
- package/src/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.tsx +20 -17
- package/src/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.tsx +58 -55
- package/src/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.tsx +156 -62
- package/src/components/Modals/SettingsModals/ProfileShares/ProfileShares.tsx +22 -19
- package/src/components/Modals/SettingsModals/Referrals/Referrals.tsx +48 -45
- package/src/components/Modals/SettingsModals/SharedStyledComponents.ts +11 -0
- package/src/components/Modals/SettingsModals/Visibility/VisibilityModal.tsx +63 -60
- package/src/components/Modals/UserSettingsModal/UserSettingsModal.tsx +11 -3
- package/src/components/RoomComponents/ChatRoomItem.tsx +16 -3
- package/src/components/RoomComponents/SwipeableRoomRow.tsx +39 -6
- package/src/components/Thread/ThreadHeader.tsx +3 -1
- package/src/components/Thread/ThreadWrapper.tsx +96 -10
- package/src/components/styled/AudioDecoderHost.tsx +351 -0
- package/src/components/styled/AudioMessage.tsx +482 -425
- package/src/components/styled/SendInput.tsx +42 -4
- package/src/context/MessageNotificationContext.tsx +19 -5
- package/src/context/xmppProvider.tsx +44 -91
- package/src/helpers/audioWaveform.ts +142 -0
- package/src/helpers/backgroundJoinSweep.ts +35 -0
- package/src/helpers/bubbleHighlight.ts +47 -0
- package/src/helpers/checkUniqueUsers.tsx +15 -17
- package/src/helpers/constants/MODAL_COMPONENTS.tsx +4 -0
- package/src/helpers/constants/MODAL_TYPES.ts +3 -0
- package/src/helpers/createRoomFromApi.tsx +45 -4
- package/src/helpers/dedupeMembers.ts +29 -0
- package/src/helpers/ethoraLogger.ts +50 -0
- package/src/helpers/getUnnamedUsers.ts +7 -4
- package/src/helpers/historyPreloadConfig.ts +68 -0
- package/src/helpers/historyPreloadScheduler.ts +437 -199
- package/src/helpers/initRoomsPresence.ts +20 -7
- package/src/helpers/insertMessageWithDelimiter.ts +3 -0
- package/src/helpers/isLikelyMucJid.ts +72 -0
- package/src/helpers/isMessageSearchEnabled.ts +18 -0
- package/src/helpers/joiningRoom.ts +13 -0
- package/src/helpers/jumpThread.ts +102 -0
- package/src/helpers/jumpToMessage.ts +57 -0
- package/src/helpers/jumpWindow.ts +212 -0
- package/src/helpers/loadRoomHistory.ts +83 -0
- package/src/helpers/notificationPolicy.ts +82 -0
- package/src/helpers/openRoomAtMessage.ts +38 -0
- package/src/helpers/openThreadForJump.ts +96 -0
- package/src/helpers/parseMessageReference.ts +37 -8
- package/src/helpers/publicChatsEntry.ts +15 -0
- package/src/helpers/roomActivityScore.ts +45 -0
- package/src/helpers/roomUserCount.ts +44 -0
- package/src/helpers/runConfiguredHistoryPreload.ts +76 -0
- package/src/helpers/sessionAppId.ts +17 -0
- package/src/helpers/timestamp.ts +44 -0
- package/src/helpers/userResolver.ts +542 -0
- package/src/helpers/xmppIdShape.ts +46 -0
- package/src/hooks/useChatWrapperInit.ts +22 -4
- package/src/hooks/useHeapSender.tsx +54 -3
- package/src/hooks/useJumpToMessage.ts +538 -0
- package/src/hooks/useMessageLoaderQueue.tsx +40 -4
- package/src/hooks/useMessageQueue.ts +9 -5
- package/src/hooks/useRoomDirectory.ts +39 -0
- package/src/hooks/useRoomInitialization.tsx +33 -7
- package/src/hooks/useRoomMute.ts +42 -0
- package/src/hooks/useRoomState.tsx +6 -0
- package/src/hooks/useSendMessage.tsx +14 -2
- package/src/i18n/strings.ts +306 -0
- package/src/networking/api-requests/messageSearch.api.ts +130 -0
- package/src/networking/api-requests/publicChats.api.ts +71 -0
- package/src/networking/api-requests/roomMembers.api.ts +263 -11
- package/src/networking/api-requests/rooms.api.ts +52 -12
- package/src/networking/api-requests/user.api.ts +28 -2
- package/src/networking/api-requests/xmppToken.api.ts +62 -0
- package/src/networking/ethoraEvents.ts +262 -0
- package/src/networking/stanzaHandlers.ts +145 -19
- package/src/networking/xmpp/allRoomPresences.xmpp.ts +155 -5
- package/src/networking/xmpp/getHistory.xmpp.ts +433 -47
- package/src/networking/xmpp/handleStanzas.xmpp.ts +8 -0
- package/src/networking/xmpp/historyCursor.ts +124 -0
- package/src/networking/xmpp/mamQueryIds.ts +11 -0
- package/src/networking/xmpp/mamRouter.ts +24 -10
- package/src/networking/xmpp/presenceInRoom.xmpp.ts +91 -68
- package/src/networking/xmpp/roomJoinSweep.ts +412 -0
- package/src/networking/xmpp/sendMediaMessage.xmpp.ts +0 -1
- package/src/networking/xmpp/sendTextMessage.xmpp.ts +0 -1
- package/src/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.ts +0 -1
- package/src/networking/xmppClient.ts +323 -47
- package/src/networking/xmppCredentials.ts +87 -0
- package/src/roomStore/Middleware/jumpThreadMiddleware.ts +163 -0
- package/src/roomStore/Middleware/reactionsMiddleware.tsx +4 -0
- package/src/roomStore/Middleware/unreadMidlleware.tsx +59 -11
- package/src/roomStore/chatSettingsSlice.ts +17 -0
- package/src/roomStore/index.ts +10 -3
- package/src/roomStore/persistence.ts +54 -0
- package/src/roomStore/roomsSlice.ts +547 -65
- package/src/roomStore/safeKey.ts +49 -0
- package/src/roomStore/usersSetCap.ts +37 -0
- package/src/types/models/media.model.ts +4 -0
- package/src/types/models/room.model.ts +18 -5
- package/src/types/models/xmpp.model.ts +15 -1
- package/src/types/types.ts +93 -5
- package/src/version.ts +1 -1
|
@@ -2,7 +2,15 @@ import XmppClient from '../networking/xmppClient';
|
|
|
2
2
|
import { IRoom } from '../types/types';
|
|
3
3
|
import { presenceInRoom } from '../networking/xmpp/presenceInRoom.xmpp';
|
|
4
4
|
import { pushSubscriptionService } from '../services/pushSubscriptionService';
|
|
5
|
+
import { startBackgroundJoinSweep } from './backgroundJoinSweep';
|
|
5
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Joins the known rooms and subscribes them for push. Callers should NOT
|
|
9
|
+
* await it on a path that gates first paint: with a real XmppClient the
|
|
10
|
+
* joins are the shared background sweep (open room first, then recent
|
|
11
|
+
* activity, bounded concurrency), started here and not waited for. Only a
|
|
12
|
+
* bare client without the sweep falls back to joining every room at once.
|
|
13
|
+
*/
|
|
6
14
|
export const initRoomsPresence = async (
|
|
7
15
|
client: XmppClient,
|
|
8
16
|
rooms: { [jid: string]: IRoom }
|
|
@@ -11,13 +19,18 @@ export const initRoomsPresence = async (
|
|
|
11
19
|
if (!client) {return null;}
|
|
12
20
|
const jids = Object.keys(rooms || {});
|
|
13
21
|
if (!jids.length) {return null;}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
|
|
23
|
+
if (typeof (client as any).sendAllPresencesAndMarkReady === 'function') {
|
|
24
|
+
startBackgroundJoinSweep(client);
|
|
25
|
+
} else {
|
|
26
|
+
await Promise.allSettled(
|
|
27
|
+
jids.map(async (jid) => {
|
|
28
|
+
try {
|
|
29
|
+
await presenceInRoom(client.client, jid);
|
|
30
|
+
} catch (e) {}
|
|
31
|
+
})
|
|
32
|
+
);
|
|
33
|
+
}
|
|
21
34
|
|
|
22
35
|
if (jids.length > 0 && client.client) {
|
|
23
36
|
const userNick = client.client.jid?.getLocal();
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { IMessage } from '../types/types';
|
|
2
2
|
import { msgSortableMs } from './msgSortableMs';
|
|
3
|
+
import { isSafeKey } from '../roomStore/safeKey';
|
|
3
4
|
|
|
4
5
|
// Robustly resolve a caller-supplied read marker to epoch milliseconds.
|
|
5
6
|
// Callers pass a plain number (the redux read boundary, or a room's
|
|
@@ -32,6 +33,8 @@ function resolveMarkerMs(
|
|
|
32
33
|
|
|
33
34
|
function deepMerge(target: any, source: any): any {
|
|
34
35
|
for (const key in source) {
|
|
36
|
+
// Never walk into the prototype chain through attacker-shaped keys.
|
|
37
|
+
if (!isSafeKey(key)) {continue;}
|
|
35
38
|
if (source[key] === undefined) {
|
|
36
39
|
// `for...in` visits a key even when its value is `undefined` — every
|
|
37
40
|
// stanza parser (getDataFromXml/createMessageFromXml) returns an
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// Real MUC room JIDs always look like `<localpart>@conference.<host>`. Various
|
|
2
|
+
// state-map iterations over `rooms.rooms` (history preload, presence sweeps,
|
|
3
|
+
// catch-up sync) can encounter non-room entries - corrupted/legacy persisted
|
|
4
|
+
// state where root-slice keys (`activeRoomJID`, `usersSet`, `subscribedRooms`,
|
|
5
|
+
// `pushSubscriptionStatus`, `rooms` itself) leaked into the rooms map, or a
|
|
6
|
+
// bare app ID without the conference suffix. Treating those as room JIDs sends
|
|
7
|
+
// MAM/presence requests for garbage names, wasting queue slots and network
|
|
8
|
+
// round-trips that could go to real rooms instead. Filter with this before
|
|
9
|
+
// any operation that fans out over "all rooms".
|
|
10
|
+
export const isLikelyMucJid = (jid: unknown): jid is string => {
|
|
11
|
+
if (typeof jid !== 'string' || !jid) return false;
|
|
12
|
+
const at = jid.indexOf('@');
|
|
13
|
+
if (at <= 0) return false;
|
|
14
|
+
const domain = jid.slice(at + 1).split('/')[0];
|
|
15
|
+
return domain.includes('.') && domain.startsWith('conference.');
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Root keys of the rooms slice. When a caller fans out over the slice itself
|
|
20
|
+
* instead of `slice.rooms`, these leak through as if they were room ids, and
|
|
21
|
+
* anything that appends the conference domain then produces real-looking but
|
|
22
|
+
* nonexistent JIDs (`usersSet@conference.host`), which the server answers with
|
|
23
|
+
* "Conference room does not exist". Cheap explicit denylist so the failure is
|
|
24
|
+
* named rather than mysterious.
|
|
25
|
+
*/
|
|
26
|
+
const ROOMS_SLICE_ROOT_KEYS = new Set([
|
|
27
|
+
'rooms',
|
|
28
|
+
'activeRoomJID',
|
|
29
|
+
'isChatUiVisible',
|
|
30
|
+
'isLoading',
|
|
31
|
+
'editAction',
|
|
32
|
+
'usersSet',
|
|
33
|
+
'presenceByRoom',
|
|
34
|
+
'reportRoom',
|
|
35
|
+
'subscribedRooms',
|
|
36
|
+
'pushSubscriptionStatus',
|
|
37
|
+
'loadingText',
|
|
38
|
+
]);
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* True when `value` can be used as the localpart of a MUC room JID, i.e. it is
|
|
42
|
+
* safe to build `${value}@conference.<host>` from it.
|
|
43
|
+
*
|
|
44
|
+
* Ethora room localparts are always `<appId>_<roomId>`, so the underscore is a
|
|
45
|
+
* reliable discriminator against slice keys, plain flags and stray strings.
|
|
46
|
+
* Callers that already hold a full JID should use `isLikelyMucJid` instead.
|
|
47
|
+
*/
|
|
48
|
+
export const isLikelyRoomLocalpart = (value: unknown): value is string => {
|
|
49
|
+
if (typeof value !== 'string') return false;
|
|
50
|
+
const v = value.trim();
|
|
51
|
+
if (!v || v.includes('@')) return false;
|
|
52
|
+
if (ROOMS_SLICE_ROOT_KEYS.has(v)) return false;
|
|
53
|
+
return v.includes('_');
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Normalise a room reference into a full MUC JID, or return null when the
|
|
58
|
+
* input cannot be one. Use at every point that would otherwise blindly do
|
|
59
|
+
* `chatJID.includes('@') ? chatJID : chatJID + '@' + conference`: that pattern
|
|
60
|
+
* silently manufactures a valid-looking JID out of any garbage handed to it,
|
|
61
|
+
* which is how slice keys ended up being joined as rooms.
|
|
62
|
+
*/
|
|
63
|
+
export const toRoomJid = (
|
|
64
|
+
chatJID: unknown,
|
|
65
|
+
conference: string | undefined
|
|
66
|
+
): string | null => {
|
|
67
|
+
if (typeof chatJID !== 'string' || !chatJID) return null;
|
|
68
|
+
if (chatJID.includes('@')) return chatJID;
|
|
69
|
+
if (!conference) return null;
|
|
70
|
+
if (!isLikelyRoomLocalpart(chatJID)) return null;
|
|
71
|
+
return `${chatJID}@${conference}`;
|
|
72
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { IConfig } from '../types/types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Single gate for every message search entry point (header button, chat
|
|
5
|
+
* profile row, the search screen and its request).
|
|
6
|
+
*
|
|
7
|
+
* Search is opt-in: it needs `enableMessageSearch: true` and an `appId` (the
|
|
8
|
+
* archive it queries is scoped by app). The deprecated `disableMessageSearch`
|
|
9
|
+
* is still honoured as a hard off.
|
|
10
|
+
*/
|
|
11
|
+
export const isMessageSearchEnabled = (
|
|
12
|
+
config?: Pick<IConfig, 'enableMessageSearch' | 'disableMessageSearch' | 'appId'> | null
|
|
13
|
+
): boolean =>
|
|
14
|
+
Boolean(config?.enableMessageSearch) &&
|
|
15
|
+
Boolean(config?.appId) &&
|
|
16
|
+
!config?.disableMessageSearch;
|
|
17
|
+
|
|
18
|
+
export default isMessageSearchEnabled;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* True while the pane should say "joining" instead of "choose a chat": the
|
|
3
|
+
* requested room is not in the list yet and a join for exactly that room is
|
|
4
|
+
* in flight (see useRoomInitialization).
|
|
5
|
+
*/
|
|
6
|
+
export const isJoiningRoom = (
|
|
7
|
+
activeRoomJID: string | null | undefined,
|
|
8
|
+
roomsList: Record<string, unknown> | undefined,
|
|
9
|
+
joiningRoomJID: string | null | undefined
|
|
10
|
+
): boolean =>
|
|
11
|
+
Boolean(activeRoomJID) &&
|
|
12
|
+
!roomsList?.[activeRoomJID as string] &&
|
|
13
|
+
joiningRoomJID === activeRoomJID;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { useSyncExternalStore } from 'react';
|
|
2
|
+
import { IMessage } from '../types/types';
|
|
3
|
+
import { parseMessageReference } from './parseMessageReference';
|
|
4
|
+
import { findMessageIndex } from './jumpToMessage';
|
|
5
|
+
|
|
6
|
+
// The id/content lookup is shared with the jump-to-message scroll helper.
|
|
7
|
+
export { findMessageIndex };
|
|
8
|
+
|
|
9
|
+
/** How long a jump request may stay pending before it is dropped. */
|
|
10
|
+
export const JUMP_TTL_MS = 60_000;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Where a jump to a thread REPLY lands, and the thread panel's parent message
|
|
14
|
+
* when that message is not in the room's live list.
|
|
15
|
+
*
|
|
16
|
+
* Replies never appear in the main list (it hides them unless they are also
|
|
17
|
+
* shown in the channel), so a jump to one has to open its parent's thread and
|
|
18
|
+
* highlight the reply there. Two things have to be remembered for that:
|
|
19
|
+
* - which list owns the jump: `at` is the pending request this entry serves,
|
|
20
|
+
* `parentId` the thread that owns it. The main list stays inert for a jump
|
|
21
|
+
* that has an owner thread, and a thread list stays inert for any jump that
|
|
22
|
+
* is not its own (see useJumpToMessage);
|
|
23
|
+
* - the parent and the replies when they exist only in a jump window or came
|
|
24
|
+
* from a separate fetch: the thread panel reads them from here, so it does
|
|
25
|
+
* not depend on the window that found them still being on screen.
|
|
26
|
+
*
|
|
27
|
+
* Kept outside redux on purpose: the room slice's thread flag lives on
|
|
28
|
+
* messages of the live list, which is exactly what these messages are not in.
|
|
29
|
+
*/
|
|
30
|
+
export interface JumpThreadState {
|
|
31
|
+
roomJID: string;
|
|
32
|
+
parentId: string;
|
|
33
|
+
/** The pending request this entry serves; null for a thread opened by hand. */
|
|
34
|
+
at: number | null;
|
|
35
|
+
/** Set only when the parent is not in the room's live messages. */
|
|
36
|
+
parent: IMessage | null;
|
|
37
|
+
/** Replies known to belong to the thread beyond the live list. */
|
|
38
|
+
replies: IMessage[];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
let state: JumpThreadState | null = null;
|
|
42
|
+
const listeners = new Set<() => void>();
|
|
43
|
+
|
|
44
|
+
const emit = () => listeners.forEach((listener) => listener());
|
|
45
|
+
|
|
46
|
+
export const getJumpThread = (): JumpThreadState | null => state;
|
|
47
|
+
|
|
48
|
+
export const setJumpThread = (next: JumpThreadState | null): void => {
|
|
49
|
+
state = next;
|
|
50
|
+
emit();
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export const clearJumpThread = (): void => {
|
|
54
|
+
if (state === null) return;
|
|
55
|
+
state = null;
|
|
56
|
+
emit();
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export const subscribeJumpThread = (listener: () => void): (() => void) => {
|
|
60
|
+
listeners.add(listener);
|
|
61
|
+
return () => {
|
|
62
|
+
listeners.delete(listener);
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export const useJumpThread = (): JumpThreadState | null =>
|
|
67
|
+
useSyncExternalStore(subscribeJumpThread, getJumpThread, getJumpThread);
|
|
68
|
+
|
|
69
|
+
/** The thread that owns the jump `at`, or null when the main list does. */
|
|
70
|
+
export const ownerThreadFor = (
|
|
71
|
+
thread: JumpThreadState | null,
|
|
72
|
+
at: number | undefined
|
|
73
|
+
): string | null =>
|
|
74
|
+
thread && at !== undefined && thread.at === at ? thread.parentId : null;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* The parent id of a message that is a thread reply and nothing else, or null:
|
|
78
|
+
* a reply also shown in the channel is in the main list, so it needs no thread.
|
|
79
|
+
*/
|
|
80
|
+
export const replyParentId = (message: IMessage): string | null => {
|
|
81
|
+
if (!message || String(message.isReply) !== 'true') return null;
|
|
82
|
+
if (String(message.showInChannel) === 'true') return null;
|
|
83
|
+
const id = parseMessageReference(message.mainMessage)?.id;
|
|
84
|
+
return id ? String(id) : null;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
/** `a` then `b`, one entry per message id, oldest first. */
|
|
88
|
+
export const mergeById = (a: IMessage[], b: IMessage[]): IMessage[] => {
|
|
89
|
+
const seen = new Set<string>();
|
|
90
|
+
const merged: IMessage[] = [];
|
|
91
|
+
for (const message of [...a, ...b]) {
|
|
92
|
+
const key = String(message.id);
|
|
93
|
+
if (seen.has(key)) continue;
|
|
94
|
+
seen.add(key);
|
|
95
|
+
merged.push(message);
|
|
96
|
+
}
|
|
97
|
+
const time = (message: IMessage) => {
|
|
98
|
+
const value = new Date(message.date).getTime();
|
|
99
|
+
return Number.isNaN(value) ? 0 : value;
|
|
100
|
+
};
|
|
101
|
+
return merged.sort((x, y) => time(x) - time(y));
|
|
102
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { IMessage } from '../types/types';
|
|
2
|
+
|
|
3
|
+
// How far apart the archive's timestamp and the transcript's may be for the
|
|
4
|
+
// same message. They are recorded by different components, so they are not
|
|
5
|
+
// identical, but never more than a moment apart.
|
|
6
|
+
export const CONTENT_MATCH_WINDOW_MS = 5000;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Index of the message a jump names.
|
|
10
|
+
*
|
|
11
|
+
* By id first (message.id is the MAM stanza id for history, xmppId the client
|
|
12
|
+
* message id). When the request has no id at all, which is common for archive
|
|
13
|
+
* rows, by content: same text, sent within a few seconds of the same time.
|
|
14
|
+
*/
|
|
15
|
+
export const findMessageIndex = (
|
|
16
|
+
messages: IMessage[],
|
|
17
|
+
ids: string[],
|
|
18
|
+
content?: { createdAt?: string; body?: string }
|
|
19
|
+
): number => {
|
|
20
|
+
if (ids.length > 0) {
|
|
21
|
+
const byId = messages.findIndex(
|
|
22
|
+
(message) =>
|
|
23
|
+
ids.includes(String(message.id)) ||
|
|
24
|
+
(message.xmppId ? ids.includes(String(message.xmppId)) : false)
|
|
25
|
+
);
|
|
26
|
+
if (byId >= 0) {return byId;}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (!content?.createdAt || !content.body) {return -1;}
|
|
30
|
+
const wanted = new Date(content.createdAt).getTime();
|
|
31
|
+
if (Number.isNaN(wanted)) {return -1;}
|
|
32
|
+
const body = content.body.trim();
|
|
33
|
+
return messages.findIndex((message) => {
|
|
34
|
+
if (String(message.body ?? '').trim() !== body) {return false;}
|
|
35
|
+
return (
|
|
36
|
+
Math.abs(new Date(message.date).getTime() - wanted) <=
|
|
37
|
+
CONTENT_MATCH_WINDOW_MS
|
|
38
|
+
);
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export const MAX_SCROLL_RETRIES = 4;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* FlatList only knows the position of rows it has measured, so
|
|
46
|
+
* scrollToIndex fails for a row far from the rendered window. The usual
|
|
47
|
+
* remedy: scroll to an estimated offset (which renders that region), then
|
|
48
|
+
* try scrollToIndex again. Returns the offset to estimate to, or null once
|
|
49
|
+
* the retry budget is spent.
|
|
50
|
+
*/
|
|
51
|
+
export const scrollRetryOffset = (
|
|
52
|
+
info: { index: number; averageItemLength: number },
|
|
53
|
+
attempt: number
|
|
54
|
+
): number | null => {
|
|
55
|
+
if (attempt >= MAX_SCROLL_RETRIES) {return null;}
|
|
56
|
+
return Math.max(0, info.averageItemLength * info.index);
|
|
57
|
+
};
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import type { HistoryWindowPage } from '../networking/xmppClient';
|
|
2
|
+
import type { JumpWindow } from '../roomStore/roomsSlice';
|
|
3
|
+
import { IMessage } from '../types/types';
|
|
4
|
+
|
|
5
|
+
/** Messages shown above / below the target when a window opens (tunable). */
|
|
6
|
+
export const JUMP_WINDOW_BEFORE = 10;
|
|
7
|
+
export const JUMP_WINDOW_AFTER = 10;
|
|
8
|
+
/** Page size for loading more once the reader scrolls toward either edge. */
|
|
9
|
+
export const JUMP_WINDOW_PAGE = 20;
|
|
10
|
+
|
|
11
|
+
/** The slice of the XMPP client the window helpers need. */
|
|
12
|
+
export interface HistoryWindowClient {
|
|
13
|
+
getHistoryWindow: (
|
|
14
|
+
chatJID: string,
|
|
15
|
+
max: number,
|
|
16
|
+
cursor: { before?: number; after?: number; start?: string; end?: string }
|
|
17
|
+
) => Promise<HistoryWindowPage>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export type JumpWindowResult =
|
|
21
|
+
/** The window around the target is ready to be shown. */
|
|
22
|
+
| { status: 'found'; window: JumpWindow }
|
|
23
|
+
/** The server answered, and the target is not in the archive. */
|
|
24
|
+
| { status: 'missing' }
|
|
25
|
+
/** No usable id, or a request failed: use the paging path instead. */
|
|
26
|
+
| { status: 'unavailable' };
|
|
27
|
+
|
|
28
|
+
// MAM stanza ids are microsecond timestamps (16 digits today).
|
|
29
|
+
const MAM_ID = /^\d{13,}$/;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* How far apart the archive's timestamp and the transcript's may be for the
|
|
33
|
+
* same message. They are recorded by different components, so they are not
|
|
34
|
+
* identical, but never more than a moment apart.
|
|
35
|
+
*/
|
|
36
|
+
export const CONTENT_MATCH_WINDOW_MS = 5000;
|
|
37
|
+
/** Rows asked for per page while locating a row by its time. */
|
|
38
|
+
const TIME_LOOKUP_PAGE = 50;
|
|
39
|
+
/** Pages of the time range read before giving up (a very busy 10 seconds). */
|
|
40
|
+
const TIME_LOOKUP_MAX_PAGES = 4;
|
|
41
|
+
|
|
42
|
+
/** What a hit with no archive id can be located by. */
|
|
43
|
+
export interface JumpContent {
|
|
44
|
+
createdAt?: string;
|
|
45
|
+
body?: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export const mamIdCandidates = (ids: string[]): string[] =>
|
|
49
|
+
Array.from(new Set(ids.map(String).filter((id) => MAM_ID.test(id))));
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Fetches about JUMP_WINDOW_BEFORE messages before the target, the target and
|
|
53
|
+
* about JUMP_WINDOW_AFTER after it: two MAM queries in parallel (the target
|
|
54
|
+
* itself comes with the "after" page, asked from one microsecond before it).
|
|
55
|
+
* Nothing is written to the store here.
|
|
56
|
+
*/
|
|
57
|
+
export async function loadJumpWindow(
|
|
58
|
+
client: HistoryWindowClient,
|
|
59
|
+
roomJID: string,
|
|
60
|
+
ids: string[],
|
|
61
|
+
content?: JumpContent
|
|
62
|
+
): Promise<JumpWindowResult> {
|
|
63
|
+
const candidates = mamIdCandidates(ids);
|
|
64
|
+
if (candidates.length === 0) {
|
|
65
|
+
return content?.createdAt && content.body
|
|
66
|
+
? loadJumpWindowByTime(client, roomJID, content)
|
|
67
|
+
: { status: 'unavailable' };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Almost always one candidate; a second is only tried when the first one is
|
|
71
|
+
// not an archive id after all (the server then simply does not return it).
|
|
72
|
+
for (const candidate of candidates) {
|
|
73
|
+
const id = Number(candidate);
|
|
74
|
+
const [older, newer] = await Promise.all([
|
|
75
|
+
client.getHistoryWindow(roomJID, JUMP_WINDOW_BEFORE, { before: id }),
|
|
76
|
+
client.getHistoryWindow(roomJID, JUMP_WINDOW_AFTER + 1, {
|
|
77
|
+
after: id - 1,
|
|
78
|
+
}),
|
|
79
|
+
]);
|
|
80
|
+
if (!older.ok || !newer.ok) return { status: 'unavailable' };
|
|
81
|
+
|
|
82
|
+
const target = newer.messages.find(
|
|
83
|
+
(message) => String(message.id) === candidate
|
|
84
|
+
);
|
|
85
|
+
if (!target) continue;
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
status: 'found',
|
|
89
|
+
window: {
|
|
90
|
+
roomJID,
|
|
91
|
+
messages: [...older.messages, ...newer.messages],
|
|
92
|
+
targetId: String(target.id),
|
|
93
|
+
olderCursor: older.first ?? id,
|
|
94
|
+
hasOlder: !older.complete && older.first !== null,
|
|
95
|
+
newerCursor: newer.last ?? id,
|
|
96
|
+
hasNewer: !newer.complete && newer.last !== null,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
// None of the ids was an archive id. A hit that also knows its text and time
|
|
101
|
+
// can still be located by them.
|
|
102
|
+
if (content?.createdAt && content.body) {
|
|
103
|
+
return loadJumpWindowByTime(client, roomJID, content);
|
|
104
|
+
}
|
|
105
|
+
return { status: 'missing' };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* For a hit with no usable archive id (older archive documents carry neither a
|
|
110
|
+
* stanza id nor a message id): ask the server for the rows within a few
|
|
111
|
+
* seconds of its timestamp (MAM start/end filter), find the one with the same
|
|
112
|
+
* text, and continue exactly as the id-based window does with that row's id.
|
|
113
|
+
* The server's answer is final: 'missing' only when it said the range holds no
|
|
114
|
+
* such row.
|
|
115
|
+
*/
|
|
116
|
+
export async function loadJumpWindowByTime(
|
|
117
|
+
client: HistoryWindowClient,
|
|
118
|
+
roomJID: string,
|
|
119
|
+
content: JumpContent
|
|
120
|
+
): Promise<JumpWindowResult> {
|
|
121
|
+
const wanted = new Date(content.createdAt ?? '').getTime();
|
|
122
|
+
const body = (content.body ?? '').trim();
|
|
123
|
+
if (Number.isNaN(wanted) || !body) return { status: 'unavailable' };
|
|
124
|
+
|
|
125
|
+
const start = new Date(wanted - CONTENT_MATCH_WINDOW_MS).toISOString();
|
|
126
|
+
const end = new Date(wanted + CONTENT_MATCH_WINDOW_MS).toISOString();
|
|
127
|
+
|
|
128
|
+
let after: number | undefined;
|
|
129
|
+
let best: IMessage | null = null;
|
|
130
|
+
for (let page = 0; page < TIME_LOOKUP_MAX_PAGES; page += 1) {
|
|
131
|
+
const result = await client.getHistoryWindow(
|
|
132
|
+
roomJID,
|
|
133
|
+
TIME_LOOKUP_PAGE,
|
|
134
|
+
after === undefined ? { start, end } : { start, end, after }
|
|
135
|
+
);
|
|
136
|
+
if (!result.ok) return { status: 'unavailable' };
|
|
137
|
+
for (const message of result.messages) {
|
|
138
|
+
if (String(message.body ?? '').trim() !== body) continue;
|
|
139
|
+
const gap = Math.abs(new Date(message.date).getTime() - wanted);
|
|
140
|
+
if (gap > CONTENT_MATCH_WINDOW_MS) continue;
|
|
141
|
+
if (
|
|
142
|
+
!best ||
|
|
143
|
+
gap < Math.abs(new Date(best.date).getTime() - wanted)
|
|
144
|
+
) {
|
|
145
|
+
best = message;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (best) break;
|
|
149
|
+
if (result.complete || result.last === null) {
|
|
150
|
+
return { status: 'missing' };
|
|
151
|
+
}
|
|
152
|
+
after = result.last;
|
|
153
|
+
}
|
|
154
|
+
if (!best) return { status: 'unavailable' };
|
|
155
|
+
|
|
156
|
+
const id = String(best.id);
|
|
157
|
+
if (!MAM_ID.test(id)) return { status: 'unavailable' };
|
|
158
|
+
return loadJumpWindow(client, roomJID, [id]);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export interface OlderWindowPage {
|
|
162
|
+
messages: IMessage[];
|
|
163
|
+
olderCursor: number | null;
|
|
164
|
+
hasOlder: boolean;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export interface NewerWindowPage {
|
|
168
|
+
messages: IMessage[];
|
|
169
|
+
newerCursor: number | null;
|
|
170
|
+
hasNewer: boolean;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** The page above the window; null when the request failed. */
|
|
174
|
+
export async function loadOlderWindowPage(
|
|
175
|
+
client: HistoryWindowClient,
|
|
176
|
+
window: JumpWindow
|
|
177
|
+
): Promise<OlderWindowPage | null> {
|
|
178
|
+
if (window.olderCursor === null) {
|
|
179
|
+
return { messages: [], olderCursor: null, hasOlder: false };
|
|
180
|
+
}
|
|
181
|
+
const page = await client.getHistoryWindow(window.roomJID, JUMP_WINDOW_PAGE, {
|
|
182
|
+
before: window.olderCursor,
|
|
183
|
+
});
|
|
184
|
+
if (!page.ok) return null;
|
|
185
|
+
// A page that does not move the cursor would be asked for again forever.
|
|
186
|
+
const progressed = page.first !== null && page.first < window.olderCursor;
|
|
187
|
+
return {
|
|
188
|
+
messages: page.messages,
|
|
189
|
+
olderCursor: progressed ? page.first : window.olderCursor,
|
|
190
|
+
hasOlder: progressed && !page.complete,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/** The page below the window; null when the request failed. */
|
|
195
|
+
export async function loadNewerWindowPage(
|
|
196
|
+
client: HistoryWindowClient,
|
|
197
|
+
window: JumpWindow
|
|
198
|
+
): Promise<NewerWindowPage | null> {
|
|
199
|
+
if (window.newerCursor === null) {
|
|
200
|
+
return { messages: [], newerCursor: null, hasNewer: false };
|
|
201
|
+
}
|
|
202
|
+
const page = await client.getHistoryWindow(window.roomJID, JUMP_WINDOW_PAGE, {
|
|
203
|
+
after: window.newerCursor,
|
|
204
|
+
});
|
|
205
|
+
if (!page.ok) return null;
|
|
206
|
+
const progressed = page.last !== null && page.last > window.newerCursor;
|
|
207
|
+
return {
|
|
208
|
+
messages: page.messages,
|
|
209
|
+
newerCursor: progressed ? page.last : window.newerCursor,
|
|
210
|
+
hasNewer: progressed && !page.complete,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { IRoom } from '../types/types';
|
|
2
|
+
|
|
3
|
+
/** The slice of the XMPP client the history loader needs. */
|
|
4
|
+
export interface HistoryPageClient {
|
|
5
|
+
getHistoryStanza: (
|
|
6
|
+
chatJID: string,
|
|
7
|
+
max: number,
|
|
8
|
+
before?: number,
|
|
9
|
+
id?: string,
|
|
10
|
+
options?: { source?: 'active' | 'send_ack' | 'background' | 'default' }
|
|
11
|
+
) => Promise<unknown>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Where the next page of older history starts when the caller names no
|
|
16
|
+
* anchor: the server's own paging cursor, or the oldest message that carries a
|
|
17
|
+
* numeric archive id, whichever is older. Never a position in the message
|
|
18
|
+
* list: a page made only of receipts or reactions adds nothing to it, so a
|
|
19
|
+
* position keeps pointing at the same message and paging stalls.
|
|
20
|
+
*/
|
|
21
|
+
export const resolveHistoryBefore = (
|
|
22
|
+
room: Pick<IRoom, 'messages' | 'messageStats'> | undefined,
|
|
23
|
+
explicit?: number
|
|
24
|
+
): number | undefined => {
|
|
25
|
+
if (typeof explicit === 'number' && Number.isFinite(explicit)) {return explicit;}
|
|
26
|
+
if (!room) {return undefined;}
|
|
27
|
+
const candidates: number[] = [];
|
|
28
|
+
const cursor = room.messageStats?.firstMessageTimestamp;
|
|
29
|
+
if (typeof cursor === 'number' && Number.isFinite(cursor)) {
|
|
30
|
+
candidates.push(cursor);
|
|
31
|
+
}
|
|
32
|
+
for (const message of room.messages ?? []) {
|
|
33
|
+
const id = Number(message.id);
|
|
34
|
+
if (Number.isFinite(id) && id > 0) {candidates.push(id);}
|
|
35
|
+
}
|
|
36
|
+
return candidates.length > 0 ? Math.min(...candidates) : undefined;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export interface LoadRoomHistoryParams {
|
|
40
|
+
client: HistoryPageClient | null | undefined;
|
|
41
|
+
/** The room as it is in the store NOW (read at call time, not from a render). */
|
|
42
|
+
room: IRoom | undefined;
|
|
43
|
+
/** Rooms with a request in flight: one request per room at a time. */
|
|
44
|
+
inFlight: Set<string>;
|
|
45
|
+
chatJID: string;
|
|
46
|
+
max: number;
|
|
47
|
+
before?: number;
|
|
48
|
+
/** Told when the first request starts and when the last one ends. */
|
|
49
|
+
onBusyChange?: (busy: boolean) => void;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* One page of older history for a room. Always settles and never rejects: a
|
|
54
|
+
* failed page must not leave the room blocked or reject into the caller's
|
|
55
|
+
* chain. Does nothing for a room that is complete, unknown, or already loading.
|
|
56
|
+
*/
|
|
57
|
+
export async function loadRoomHistory({
|
|
58
|
+
client,
|
|
59
|
+
room,
|
|
60
|
+
inFlight,
|
|
61
|
+
chatJID,
|
|
62
|
+
max,
|
|
63
|
+
before,
|
|
64
|
+
onBusyChange,
|
|
65
|
+
}: LoadRoomHistoryParams): Promise<void> {
|
|
66
|
+
if (!client || !chatJID) {return;}
|
|
67
|
+
if (inFlight.has(chatJID)) {return;}
|
|
68
|
+
if (!room || room.historyComplete) {return;}
|
|
69
|
+
|
|
70
|
+
const anchor = resolveHistoryBefore(room, before);
|
|
71
|
+
inFlight.add(chatJID);
|
|
72
|
+
onBusyChange?.(true);
|
|
73
|
+
try {
|
|
74
|
+
await client.getHistoryStanza(chatJID, max, anchor, undefined, {
|
|
75
|
+
source: 'active',
|
|
76
|
+
});
|
|
77
|
+
} catch {
|
|
78
|
+
// swallowed on purpose, see above
|
|
79
|
+
} finally {
|
|
80
|
+
inFlight.delete(chatJID);
|
|
81
|
+
onBusyChange?.(inFlight.size > 0);
|
|
82
|
+
}
|
|
83
|
+
}
|