@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.
- package/CHANGELOG.md +34 -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 +53 -4
- 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/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 +54 -79
- 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 +318 -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/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 +15 -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 +54 -5
- 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/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 +54 -79
- 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 +318 -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/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 +13 -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/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 +2 -0
- 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/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 +90 -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 +50 -9
- 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/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 +56 -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 +312 -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/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 +11 -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 +95 -5
- package/src/version.ts +1 -1
|
@@ -0,0 +1,542 @@
|
|
|
1
|
+
import http from '../networking/apiClient';
|
|
2
|
+
import {
|
|
3
|
+
lookupUser,
|
|
4
|
+
resetUserLookupRoute,
|
|
5
|
+
} from '../networking/api-requests/roomMembers.api';
|
|
6
|
+
import { dedupeMembers } from './dedupeMembers';
|
|
7
|
+
import { store } from '../roomStore';
|
|
8
|
+
import { mergeUsersSet } from '../roomStore/roomsSlice';
|
|
9
|
+
import { updateUser } from '../roomStore/chatSettingsSlice';
|
|
10
|
+
import { isSafeKey, hasSafeIdSegments } from '../roomStore/safeKey';
|
|
11
|
+
import { normalizeXmppUsername } from './xmppUsername';
|
|
12
|
+
import { toLocalPart } from './xmppIdShape';
|
|
13
|
+
import { getSessionAppId } from './sessionAppId';
|
|
14
|
+
import type { RoomMember } from '../types/types';
|
|
15
|
+
|
|
16
|
+
// Lazy user resolution.
|
|
17
|
+
//
|
|
18
|
+
// GET /v1/chats/my returns at most 30 members of a big room (plus
|
|
19
|
+
// `usersCnt`), so senders of older messages are unknown to usersSet. The
|
|
20
|
+
// source of truth for a name is the backend user record, fetched here:
|
|
21
|
+
// - one user: GET /v1/apps/users/<appId_userId>, falling back to
|
|
22
|
+
// GET /v2/chats/users?xmppUsername=<appId_userId> when the backend does
|
|
23
|
+
// not take our token on v1 (see lookupUser in roomMembers.api.ts)
|
|
24
|
+
// - GET /v2/chats/users?chatName=<roomLocal>&limit=500 a room directory
|
|
25
|
+
// Results go into rooms.usersSet through mergeUsersSet (names render from
|
|
26
|
+
// usersSet at render time, so nothing else needs rewriting). Only display fields are kept: the
|
|
27
|
+
// endpoint also returns email and tags, which must never reach the
|
|
28
|
+
// persisted usersSet.
|
|
29
|
+
|
|
30
|
+
export type RoomDirectoryState = 'idle' | 'loading' | 'done' | 'error';
|
|
31
|
+
|
|
32
|
+
const DEBOUNCE_MS = 150;
|
|
33
|
+
const CONCURRENCY = 4;
|
|
34
|
+
const SINGLE_FETCH_LIMIT = 10;
|
|
35
|
+
const MAX_PENDING = 200;
|
|
36
|
+
const NOT_FOUND_TTL_MS = 10 * 60_000;
|
|
37
|
+
const BACKOFF_STEPS_MS = [5_000, 30_000];
|
|
38
|
+
const DIRECTORY_PAGE_LIMIT = 500;
|
|
39
|
+
const DIRECTORY_MAX_PAGES = 200;
|
|
40
|
+
const DIRECTORY_MAX_STALE_PAGES = 5;
|
|
41
|
+
const INSERT_BUFFER_MS = 100;
|
|
42
|
+
|
|
43
|
+
type NegativeKind = 'notfound' | 'forbidden' | 'error';
|
|
44
|
+
type Negative = { until: number; kind: NegativeKind; attempts: number };
|
|
45
|
+
|
|
46
|
+
let generation = 0;
|
|
47
|
+
const pending = new Set<string>();
|
|
48
|
+
const inflight = new Set<string>();
|
|
49
|
+
const negative = new Map<string, Negative>();
|
|
50
|
+
let debounceTimer: ReturnType<typeof setTimeout> | null = null;
|
|
51
|
+
let activeWorkers = 0;
|
|
52
|
+
const queue: string[] = [];
|
|
53
|
+
let insertBuffer: RoomMember[] = [];
|
|
54
|
+
const refreshTimers = new Map<string, ReturnType<typeof setTimeout>>();
|
|
55
|
+
const refreshAgain = new Set<string>();
|
|
56
|
+
// ids whose in-progress fetch was asked for by refreshUser
|
|
57
|
+
const refreshForced = new Set<string>();
|
|
58
|
+
let insertTimer: ReturnType<typeof setTimeout> | null = null;
|
|
59
|
+
|
|
60
|
+
const dirState = new Map<string, RoomDirectoryState>();
|
|
61
|
+
const dirInflight = new Map<string, Promise<void>>();
|
|
62
|
+
// A failed directory is not retried for a while: without this a dead
|
|
63
|
+
// endpoint turned every debounce pass into another directory request.
|
|
64
|
+
const DIRECTORY_RETRY_MS = 30_000;
|
|
65
|
+
const dirFailedAt = new Map<string, number>();
|
|
66
|
+
const dirCoolingDown = (jid: string): boolean =>
|
|
67
|
+
Date.now() - (dirFailedAt.get(jid) ?? -Infinity) < DIRECTORY_RETRY_MS;
|
|
68
|
+
// The directory members of each room in server order, grown page by page.
|
|
69
|
+
const dirMembers = new Map<string, RoomMember[]>();
|
|
70
|
+
const listeners = new Set<() => void>();
|
|
71
|
+
|
|
72
|
+
const notify = () => {
|
|
73
|
+
listeners.forEach((l) => {
|
|
74
|
+
try {
|
|
75
|
+
l();
|
|
76
|
+
} catch {
|
|
77
|
+
// a broken subscriber must not stop the others
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/** Re-render hook: called when a directory state or a negative cache entry changes. */
|
|
83
|
+
export const subscribeUserResolver = (listener: () => void): (() => void) => {
|
|
84
|
+
listeners.add(listener);
|
|
85
|
+
return () => {
|
|
86
|
+
listeners.delete(listener);
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
let sessionIdentity = '';
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* The signed-in account is the session identity: when another account signs
|
|
94
|
+
* in, every cache and in-flight result of the previous one is dropped (a
|
|
95
|
+
* token refresh for the same account must not). No token (logout, or a
|
|
96
|
+
* transient rehydrate gap) just yields '' and does no work.
|
|
97
|
+
*/
|
|
98
|
+
const getToken = (): string => {
|
|
99
|
+
const u = store.getState().chatSettingStore?.user as any;
|
|
100
|
+
const token = u?.token || '';
|
|
101
|
+
const identity = String(u?.xmppUsername || u?._id || '');
|
|
102
|
+
if (token && identity && sessionIdentity && identity !== sessionIdentity) {
|
|
103
|
+
resetUserResolver();
|
|
104
|
+
}
|
|
105
|
+
if (token && identity) sessionIdentity = identity;
|
|
106
|
+
return token;
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
/** `appId_userId@host/res`, `appId_userId`, or a doubled prefix -> `appId_userId`. */
|
|
110
|
+
const normalizeId = (raw: unknown): string => {
|
|
111
|
+
if (typeof raw !== 'string') return '';
|
|
112
|
+
const local = toLocalPart(raw.split('/')[0]).trim();
|
|
113
|
+
if (!local || local === 'undefined') return '';
|
|
114
|
+
return normalizeXmppUsername(local);
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
const isLookupable = (id: string): boolean => {
|
|
118
|
+
if (!id || /\s/.test(id) || !isSafeKey(id)) return false;
|
|
119
|
+
// Only appId_userId shaped ids can exist on the backend.
|
|
120
|
+
if (!id.includes('_')) return false;
|
|
121
|
+
if (!hasSafeIdSegments(id)) return false;
|
|
122
|
+
const appId = getSessionAppId();
|
|
123
|
+
if (appId && (id === appId || id === `${appId}_${appId}`)) return false;
|
|
124
|
+
return true;
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
const sanitizeUser = (raw: any, fallbackId?: string): RoomMember | null => {
|
|
128
|
+
if (!raw || typeof raw !== 'object') return null;
|
|
129
|
+
const xmppUsername = normalizeId(raw.xmppUsername) || fallbackId || '';
|
|
130
|
+
if (!isSafeKey(xmppUsername)) return null;
|
|
131
|
+
const user: RoomMember = {
|
|
132
|
+
_id: String(raw._id ?? ''),
|
|
133
|
+
xmppUsername,
|
|
134
|
+
firstName: typeof raw.firstName === 'string' ? raw.firstName : '',
|
|
135
|
+
lastName: typeof raw.lastName === 'string' ? raw.lastName : '',
|
|
136
|
+
};
|
|
137
|
+
if (typeof raw.profileImage === 'string' && raw.profileImage) {
|
|
138
|
+
user.profileImage = raw.profileImage;
|
|
139
|
+
}
|
|
140
|
+
return user;
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
// One dispatch for the whole batch. Display fields are laid over whatever the
|
|
144
|
+
// entry already carries (role, jid, ...) so a lookup never strips what the
|
|
145
|
+
// REST member list put there. RN renders names from usersSet at render time,
|
|
146
|
+
// so no message rewrite is needed.
|
|
147
|
+
const insertIntoUsersSet = (users: RoomMember[]) => {
|
|
148
|
+
if (!users.length) return;
|
|
149
|
+
const existing = store.getState().rooms?.usersSet || {};
|
|
150
|
+
const members: Record<string, RoomMember> = {};
|
|
151
|
+
for (const u of users) {
|
|
152
|
+
if (!isSafeKey(u?.xmppUsername)) continue;
|
|
153
|
+
members[u.xmppUsername] = { ...(existing[u.xmppUsername] || {}), ...u };
|
|
154
|
+
}
|
|
155
|
+
if (Object.keys(members).length) store.dispatch(mergeUsersSet({ members }));
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
const flushInserts = () => {
|
|
159
|
+
if (insertTimer) {
|
|
160
|
+
clearTimeout(insertTimer);
|
|
161
|
+
insertTimer = null;
|
|
162
|
+
}
|
|
163
|
+
if (!insertBuffer.length) return;
|
|
164
|
+
const batch = insertBuffer;
|
|
165
|
+
insertBuffer = [];
|
|
166
|
+
insertIntoUsersSet(batch);
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
const bufferInsert = (users: RoomMember[]) => {
|
|
170
|
+
if (!users.length) return;
|
|
171
|
+
insertBuffer.push(...users);
|
|
172
|
+
if (!insertTimer) insertTimer = setTimeout(flushInserts, INSERT_BUFFER_MS);
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
const markNegative = (id: string, kind: NegativeKind) => {
|
|
176
|
+
const prev = negative.get(id);
|
|
177
|
+
const attempts = (prev?.kind === 'error' ? prev.attempts : 0) + 1;
|
|
178
|
+
const ttl =
|
|
179
|
+
kind !== 'error'
|
|
180
|
+
? NOT_FOUND_TTL_MS
|
|
181
|
+
: BACKOFF_STEPS_MS[Math.min(attempts - 1, BACKOFF_STEPS_MS.length - 1)];
|
|
182
|
+
negative.set(id, { until: Date.now() + ttl, kind, attempts });
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
const isNegative = (id: string): boolean => {
|
|
186
|
+
const n = negative.get(id);
|
|
187
|
+
if (!n) return false;
|
|
188
|
+
if (n.until <= Date.now()) {
|
|
189
|
+
// keep an expired error entry so attempts keep escalating the backoff
|
|
190
|
+
if (n.kind !== 'error') negative.delete(id);
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
return true;
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* True for an id the backend answered 404 for: the user really is gone.
|
|
198
|
+
* (An id merely not resolved yet is NOT "not found".)
|
|
199
|
+
*/
|
|
200
|
+
export const isUserNotFound = (rawId: string): boolean => {
|
|
201
|
+
const n = negative.get(normalizeId(rawId));
|
|
202
|
+
return Boolean(n && n.kind === 'notfound' && n.until > Date.now());
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Where a sender's lookup stands, for the display chain:
|
|
207
|
+
* - resolved: in usersSet
|
|
208
|
+
* - pending: queued, in flight, or not requested yet (a bubble just mounted)
|
|
209
|
+
* - notfound / forbidden: the backend answered, nothing to show from it
|
|
210
|
+
* - failed: the last attempt errored (backoff), or the lookup is exhausted
|
|
211
|
+
* - unavailable: this id can never be looked up (plain handle) or there is
|
|
212
|
+
* no session token, so nothing is coming
|
|
213
|
+
*/
|
|
214
|
+
export type UserLookupStatus =
|
|
215
|
+
| 'resolved'
|
|
216
|
+
| 'pending'
|
|
217
|
+
| 'notfound'
|
|
218
|
+
| 'forbidden'
|
|
219
|
+
| 'failed'
|
|
220
|
+
| 'unavailable';
|
|
221
|
+
|
|
222
|
+
export const getUserLookupStatus = (rawId: string): UserLookupStatus => {
|
|
223
|
+
const id = normalizeId(rawId);
|
|
224
|
+
if (!id) return 'unavailable';
|
|
225
|
+
if (store.getState().rooms?.usersSet?.[id]) return 'resolved';
|
|
226
|
+
const n = negative.get(id);
|
|
227
|
+
// an answer recorded a moment ago wins over the in-flight bookkeeping that
|
|
228
|
+
// is cleared right after it
|
|
229
|
+
if (n && isNegative(id)) return n.kind === 'error' ? 'failed' : n.kind;
|
|
230
|
+
if (pending.has(id) || inflight.has(id) || queue.includes(id)) {
|
|
231
|
+
return 'pending';
|
|
232
|
+
}
|
|
233
|
+
if (n && n.kind === 'error') return 'failed';
|
|
234
|
+
if (!isLookupable(id) || !getToken()) return 'unavailable';
|
|
235
|
+
return 'pending';
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
// A refreshed profile that is the signed-in user's own also updates the
|
|
239
|
+
// session user (chatSettingStore.user), which feeds the own-profile UI.
|
|
240
|
+
// Only the display fields, and only when something actually changed.
|
|
241
|
+
const applyToSessionUser = (id: string, fresh: RoomMember) => {
|
|
242
|
+
const me = store.getState().chatSettingStore?.user as any;
|
|
243
|
+
if (!me || normalizeId(me.xmppUsername) !== id) return;
|
|
244
|
+
const updates: Record<string, string> = {};
|
|
245
|
+
if (fresh.firstName !== undefined && fresh.firstName !== me.firstName) {
|
|
246
|
+
updates.firstName = fresh.firstName;
|
|
247
|
+
}
|
|
248
|
+
if (fresh.lastName !== undefined && fresh.lastName !== me.lastName) {
|
|
249
|
+
updates.lastName = fresh.lastName;
|
|
250
|
+
}
|
|
251
|
+
if (fresh.profileImage && fresh.profileImage !== me.profileImage) {
|
|
252
|
+
updates.profileImage = fresh.profileImage;
|
|
253
|
+
}
|
|
254
|
+
if (Object.keys(updates).length) store.dispatch(updateUser({ updates }));
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
const fetchOne = async (id: string, gen: number): Promise<void> => {
|
|
258
|
+
const token = getToken();
|
|
259
|
+
if (!token) return;
|
|
260
|
+
const outcome = await lookupUser(id, token);
|
|
261
|
+
if (gen !== generation) return;
|
|
262
|
+
if (outcome.status === 'ok') {
|
|
263
|
+
const user = sanitizeUser(outcome.user, id);
|
|
264
|
+
if (user) {
|
|
265
|
+
negative.delete(id);
|
|
266
|
+
bufferInsert([user]);
|
|
267
|
+
if (refreshForced.delete(id)) applyToSessionUser(id, user);
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
markNegative(id, 'notfound');
|
|
271
|
+
} else {
|
|
272
|
+
markNegative(id, outcome.status);
|
|
273
|
+
}
|
|
274
|
+
notify();
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
const pump = (gen: number) => {
|
|
278
|
+
while (activeWorkers < CONCURRENCY && queue.length) {
|
|
279
|
+
const id = queue.shift() as string;
|
|
280
|
+
activeWorkers++;
|
|
281
|
+
inflight.add(id);
|
|
282
|
+
fetchOne(id, gen).finally(() => {
|
|
283
|
+
if (gen !== generation) return;
|
|
284
|
+
inflight.delete(id);
|
|
285
|
+
activeWorkers--;
|
|
286
|
+
// a refresh asked for while this fetch was running: its answer may
|
|
287
|
+
// predate the change, so fetch once more
|
|
288
|
+
if (refreshAgain.delete(id) && !queue.includes(id)) queue.push(id);
|
|
289
|
+
if (queue.length) pump(gen);
|
|
290
|
+
else if (activeWorkers === 0) flushInserts();
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
const knownUsers = (): Record<string, RoomMember> =>
|
|
296
|
+
store.getState().rooms?.usersSet || {};
|
|
297
|
+
|
|
298
|
+
/** The room, if any, whose unknown senders among `ids` justify one directory fetch. */
|
|
299
|
+
const pickDirectoryRoom = (ids: string[]): string | null => {
|
|
300
|
+
const idSet = new Set(ids);
|
|
301
|
+
const rooms = store.getState().rooms?.rooms || {};
|
|
302
|
+
let best: string | null = null;
|
|
303
|
+
let bestCount = SINGLE_FETCH_LIMIT;
|
|
304
|
+
for (const [jid, room] of Object.entries(rooms)) {
|
|
305
|
+
const cnt = Number((room as any)?.usersCnt || 0);
|
|
306
|
+
const have = Array.isArray((room as any)?.members)
|
|
307
|
+
? (room as any).members.length
|
|
308
|
+
: 0;
|
|
309
|
+
if (!(have < cnt) || dirState.get(jid) === 'done' || dirCoolingDown(jid)) {
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
const seen = new Set<string>();
|
|
313
|
+
for (const m of (room as any).messages || []) {
|
|
314
|
+
const uid = normalizeId(m?.user?.id);
|
|
315
|
+
if (uid && idSet.has(uid)) seen.add(uid);
|
|
316
|
+
}
|
|
317
|
+
if (seen.size > bestCount) {
|
|
318
|
+
best = jid;
|
|
319
|
+
bestCount = seen.size;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return best;
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
const flush = () => {
|
|
326
|
+
debounceTimer = null;
|
|
327
|
+
const gen = generation;
|
|
328
|
+
const users = knownUsers();
|
|
329
|
+
const ids = [...pending].filter(
|
|
330
|
+
(id) => !users[id] && !inflight.has(id) && !isNegative(id)
|
|
331
|
+
);
|
|
332
|
+
pending.clear();
|
|
333
|
+
if (!ids.length) return;
|
|
334
|
+
|
|
335
|
+
if (ids.length > SINGLE_FETCH_LIMIT) {
|
|
336
|
+
const roomJid = pickDirectoryRoom(ids);
|
|
337
|
+
if (roomJid) {
|
|
338
|
+
ensureRoomDirectory(roomJid).then(() => {
|
|
339
|
+
if (gen !== generation) return;
|
|
340
|
+
// whoever the directory did not contain (left the room) still gets
|
|
341
|
+
// the per-user lookup
|
|
342
|
+
requestUsers(ids);
|
|
343
|
+
});
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
for (const id of ids) if (!queue.includes(id)) queue.push(id);
|
|
348
|
+
pump(gen);
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Ask for the profiles of these senders. Cheap to call from anywhere (a
|
|
353
|
+
* bubble mounting, a history batch parse): known, in-flight and recently
|
|
354
|
+
* failed ids are dropped, the rest are debounced into one pass.
|
|
355
|
+
*/
|
|
356
|
+
export function requestUsers(ids: string[]): void {
|
|
357
|
+
if (!Array.isArray(ids) || !ids.length) return;
|
|
358
|
+
if (!getToken()) return;
|
|
359
|
+
const users = knownUsers();
|
|
360
|
+
let added = false;
|
|
361
|
+
for (const raw of ids) {
|
|
362
|
+
const id = normalizeId(raw);
|
|
363
|
+
if (!isLookupable(id)) continue;
|
|
364
|
+
if (users[id] || inflight.has(id) || pending.has(id) || isNegative(id)) {
|
|
365
|
+
continue;
|
|
366
|
+
}
|
|
367
|
+
pending.add(id);
|
|
368
|
+
added = true;
|
|
369
|
+
if (pending.size > MAX_PENDING) {
|
|
370
|
+
// drop the oldest
|
|
371
|
+
const oldest = pending.values().next().value as string;
|
|
372
|
+
pending.delete(oldest);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
if (!added) return;
|
|
376
|
+
if (debounceTimer) clearTimeout(debounceTimer);
|
|
377
|
+
debounceTimer = setTimeout(flush, DEBOUNCE_MS);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
const REFRESH_DEBOUNCE_MS = 500;
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Re-fetch one user's profile even though it is already in usersSet, because
|
|
384
|
+
* the server said it changed (ethora-event user-profile-updated). Bypasses
|
|
385
|
+
* the cache and forgets a negative-cache entry, but shares everything else
|
|
386
|
+
* with requestUsers: the same route chain (lookupUser), the same worker
|
|
387
|
+
* queue and concurrency cap, one request at a time per user. Calls for the
|
|
388
|
+
* same user within REFRESH_DEBOUNCE_MS coalesce into one fetch. The answer
|
|
389
|
+
* goes through mergeUsersSet (display fields only), so existing bubbles are
|
|
390
|
+
* re-named. Never throws.
|
|
391
|
+
*/
|
|
392
|
+
export function refreshUser(rawId: string): void {
|
|
393
|
+
const id = normalizeId(rawId);
|
|
394
|
+
if (!isLookupable(id) || !getToken()) return;
|
|
395
|
+
const prior = refreshTimers.get(id);
|
|
396
|
+
if (prior) clearTimeout(prior);
|
|
397
|
+
const gen = generation;
|
|
398
|
+
refreshTimers.set(
|
|
399
|
+
id,
|
|
400
|
+
setTimeout(() => {
|
|
401
|
+
refreshTimers.delete(id);
|
|
402
|
+
if (gen !== generation) return;
|
|
403
|
+
negative.delete(id);
|
|
404
|
+
refreshForced.add(id);
|
|
405
|
+
if (inflight.has(id)) {
|
|
406
|
+
refreshAgain.add(id);
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
if (!queue.includes(id)) queue.push(id);
|
|
410
|
+
pump(gen);
|
|
411
|
+
}, REFRESH_DEBOUNCE_MS)
|
|
412
|
+
);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
const EMPTY_DIRECTORY: RoomMember[] = [];
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* Members loaded so far by ensureRoomDirectory for this room (a new array
|
|
419
|
+
* identity after every page, a stable empty array before any).
|
|
420
|
+
*/
|
|
421
|
+
export const getRoomDirectoryMembers = (roomJID: string): RoomMember[] =>
|
|
422
|
+
dirMembers.get(roomJID) || EMPTY_DIRECTORY;
|
|
423
|
+
|
|
424
|
+
/** requestUsers for the senders of a batch of messages (history page, jump window). */
|
|
425
|
+
export function requestSendersOf(
|
|
426
|
+
messages: ReadonlyArray<{ user?: { id?: string } } | null | undefined> | undefined
|
|
427
|
+
): void {
|
|
428
|
+
if (!messages?.length) return;
|
|
429
|
+
const ids = new Set<string>();
|
|
430
|
+
for (const m of messages) {
|
|
431
|
+
const id = m?.user?.id;
|
|
432
|
+
if (id) ids.add(id);
|
|
433
|
+
}
|
|
434
|
+
if (ids.size) requestUsers([...ids]);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
export const getRoomDirectoryState = (roomJID: string): RoomDirectoryState =>
|
|
438
|
+
dirState.get(roomJID) || 'idle';
|
|
439
|
+
|
|
440
|
+
const setDirState = (roomJID: string, state: RoomDirectoryState) => {
|
|
441
|
+
if (dirState.get(roomJID) === state) return;
|
|
442
|
+
dirState.set(roomJID, state);
|
|
443
|
+
notify();
|
|
444
|
+
};
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* Loads every member of one room into usersSet, once. Pages are not
|
|
448
|
+
* guaranteed to be full, so it stops on an empty page or offset >= total,
|
|
449
|
+
* never on `items.length < limit`.
|
|
450
|
+
*/
|
|
451
|
+
export function ensureRoomDirectory(roomJID: string): Promise<void> {
|
|
452
|
+
if (!roomJID || typeof roomJID !== 'string') return Promise.resolve();
|
|
453
|
+
if (dirState.get(roomJID) === 'done') return Promise.resolve();
|
|
454
|
+
const running = dirInflight.get(roomJID);
|
|
455
|
+
if (running) return running;
|
|
456
|
+
if (dirCoolingDown(roomJID)) return Promise.resolve();
|
|
457
|
+
const token = getToken();
|
|
458
|
+
const chatName = toLocalPart(roomJID);
|
|
459
|
+
if (!token || !chatName) return Promise.resolve();
|
|
460
|
+
|
|
461
|
+
const gen = generation;
|
|
462
|
+
setDirState(roomJID, 'loading');
|
|
463
|
+
const job = (async () => {
|
|
464
|
+
let offset = 0;
|
|
465
|
+
let total = Infinity;
|
|
466
|
+
let stale = 0;
|
|
467
|
+
try {
|
|
468
|
+
for (let page = 0; page < DIRECTORY_MAX_PAGES; page++) {
|
|
469
|
+
const res = await http.get('/v2/chats/users', {
|
|
470
|
+
params: { chatName, limit: DIRECTORY_PAGE_LIMIT, offset },
|
|
471
|
+
headers: { Authorization: token },
|
|
472
|
+
});
|
|
473
|
+
if (gen !== generation) return;
|
|
474
|
+
const data = res?.data || {};
|
|
475
|
+
const items: any[] = Array.isArray(data.items)
|
|
476
|
+
? data.items
|
|
477
|
+
: Array.isArray(data.results)
|
|
478
|
+
? data.results
|
|
479
|
+
: [];
|
|
480
|
+
if (!items.length) break;
|
|
481
|
+
const batch = items
|
|
482
|
+
.map((item) => sanitizeUser(item))
|
|
483
|
+
.filter((u): u is RoomMember => Boolean(u));
|
|
484
|
+
// The backend can repeat the same user across pages (total counts the
|
|
485
|
+
// repeats), so merge by identity: first occurrence wins.
|
|
486
|
+
const before = dirMembers.get(roomJID) || EMPTY_DIRECTORY;
|
|
487
|
+
const merged = dedupeMembers([...before, ...batch]);
|
|
488
|
+
const added = merged.length - before.length;
|
|
489
|
+
if (added > 0) {
|
|
490
|
+
insertIntoUsersSet(batch);
|
|
491
|
+
dirMembers.set(roomJID, merged);
|
|
492
|
+
notify();
|
|
493
|
+
}
|
|
494
|
+
offset += items.length;
|
|
495
|
+
// Pages made only of repeats are normal at the tail (the real
|
|
496
|
+
// 435/11/3/1 shape), but a run of them means the server ignores
|
|
497
|
+
// offset: stop instead of walking to the page cap.
|
|
498
|
+
stale = added > 0 ? 0 : stale + 1;
|
|
499
|
+
if (stale >= DIRECTORY_MAX_STALE_PAGES) break;
|
|
500
|
+
const t = Number(data.total ?? data.pagination?.total);
|
|
501
|
+
if (Number.isFinite(t)) total = t;
|
|
502
|
+
if (offset >= total) break;
|
|
503
|
+
}
|
|
504
|
+
if (gen === generation) setDirState(roomJID, 'done');
|
|
505
|
+
} catch {
|
|
506
|
+
if (gen === generation) {
|
|
507
|
+
dirFailedAt.set(roomJID, Date.now());
|
|
508
|
+
setDirState(roomJID, 'error');
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
})().finally(() => {
|
|
512
|
+
if (dirInflight.get(roomJID) === job) dirInflight.delete(roomJID);
|
|
513
|
+
});
|
|
514
|
+
dirInflight.set(roomJID, job);
|
|
515
|
+
return job;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
/** For tests and logout: drops every cache, timer and in-flight result. */
|
|
519
|
+
export function resetUserResolver(): void {
|
|
520
|
+
generation++;
|
|
521
|
+
sessionIdentity = '';
|
|
522
|
+
pending.clear();
|
|
523
|
+
inflight.clear();
|
|
524
|
+
negative.clear();
|
|
525
|
+
resetUserLookupRoute();
|
|
526
|
+
queue.length = 0;
|
|
527
|
+
activeWorkers = 0;
|
|
528
|
+
insertBuffer = [];
|
|
529
|
+
refreshTimers.forEach((t) => clearTimeout(t));
|
|
530
|
+
refreshTimers.clear();
|
|
531
|
+
refreshAgain.clear();
|
|
532
|
+
refreshForced.clear();
|
|
533
|
+
if (debounceTimer) clearTimeout(debounceTimer);
|
|
534
|
+
debounceTimer = null;
|
|
535
|
+
if (insertTimer) clearTimeout(insertTimer);
|
|
536
|
+
insertTimer = null;
|
|
537
|
+
dirState.clear();
|
|
538
|
+
dirInflight.clear();
|
|
539
|
+
dirFailedAt.clear();
|
|
540
|
+
dirMembers.clear();
|
|
541
|
+
notify();
|
|
542
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Pure string-shape helpers for xmpp local ids/JIDs - no dependency on the
|
|
2
|
+
// redux store. Kept separate from xmppUsername.ts (which imports `store`
|
|
3
|
+
// for normalizeXmppUsername/isSameXmppUsername) so this file can be safely
|
|
4
|
+
// imported from the redux reducer graph itself (roomsSlice.ts,
|
|
5
|
+
// createUserNameFromSetUser.ts): those are pulled in by roomStore/index.ts
|
|
6
|
+
// to build the root reducer, and importing anything that in turn imports
|
|
7
|
+
// `store` from roomStore/index.ts there creates a circular dependency back
|
|
8
|
+
// into the module that is still assembling the store.
|
|
9
|
+
|
|
10
|
+
// Strips a value that the local part of an XMPP JID may carry, leaving
|
|
11
|
+
// just the bare resource (anything before `@`). XMPP allows resources
|
|
12
|
+
// with `@` only in escaped form so the simple split is enough here.
|
|
13
|
+
export const toLocalPart = (value?: string): string => {
|
|
14
|
+
if (!value) return '';
|
|
15
|
+
return String(value).split('@')[0];
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
// A 24-character hex string is a Mongo ObjectId - the shape of both the
|
|
19
|
+
// appId and the userId that make up an Ethora xmpp username.
|
|
20
|
+
const HEX24 = '[0-9a-fA-F]{24}';
|
|
21
|
+
// `<appId>_<userId>` (the normal shape) or a bare id on its own (seen on
|
|
22
|
+
// system/local entries that never went through the appId_userId join).
|
|
23
|
+
// Anchored end to end so a human handle that merely contains 24 hex chars
|
|
24
|
+
// somewhere (unlikely, but not impossible) is never caught by accident.
|
|
25
|
+
const UUID =
|
|
26
|
+
'[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}';
|
|
27
|
+
// `<appId>_<uuid>` or `<appId>_<hex24>`, optionally followed by further
|
|
28
|
+
// `_<token>` segments (appId is hex24 on most deployments, any alphanumeric
|
|
29
|
+
// token on others). A bare id, or a two-segment mongo id, is the original
|
|
30
|
+
// shape.
|
|
31
|
+
const OPAQUE_XMPP_USER_ID_RE = new RegExp(
|
|
32
|
+
`^(?:${HEX24}(?:_${HEX24})?|[A-Za-z0-9]+_(?:${HEX24}|${UUID})(?:_[0-9A-Za-z-]+)*)$`
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* True when `value` (a full JID or already-bare local part) is a
|
|
37
|
+
* machine-generated Ethora id rather than anything a human would recognize
|
|
38
|
+
* as their own name - `<24 hex>_<24 hex>`, `<appId>_<uuid>` or a bare 24-hex
|
|
39
|
+
* id. Kept narrow on purpose: a handle a person actually picked is never
|
|
40
|
+
* this shape, so it is never mistaken for one.
|
|
41
|
+
*/
|
|
42
|
+
export const isOpaqueXmppUserId = (value: string | undefined | null): boolean => {
|
|
43
|
+
const local = toLocalPart(value || '').trim();
|
|
44
|
+
if (!local) return false;
|
|
45
|
+
return OPAQUE_XMPP_USER_ID_RE.test(local);
|
|
46
|
+
};
|
|
@@ -9,6 +9,10 @@ import { AppDispatch, RootState } from '../roomStore';
|
|
|
9
9
|
import { useXmppClient } from '../context/xmppProvider';
|
|
10
10
|
import { chatAutoEnterer } from '../helpers/chatAutoEnterer';
|
|
11
11
|
import { initRoomsPresence } from '../helpers/initRoomsPresence';
|
|
12
|
+
import {
|
|
13
|
+
loadRoomsThenJoinInBackground,
|
|
14
|
+
startBackgroundJoinSweep,
|
|
15
|
+
} from '../helpers/backgroundJoinSweep';
|
|
12
16
|
import { updateMessagesTillLast } from '../helpers/updateMessagesTillLast';
|
|
13
17
|
import { refreshAuthTokensQuietly } from '../networking/authRefresh';
|
|
14
18
|
import { setLangSource, setConfig } from '../roomStore/chatSettingsSlice';
|
|
@@ -21,6 +25,10 @@ import useGetNewArchRoom from './useGetNewArchRoom';
|
|
|
21
25
|
import { getRoomsWithRetry } from '../helpers/getRoomsWithRetry';
|
|
22
26
|
import { shallowEqual } from '../helpers/shallowEqual';
|
|
23
27
|
|
|
28
|
+
// The room list ends its loading state right after /chats/my; joining every
|
|
29
|
+
// room is a background sweep nobody waits for (see helpers/backgroundJoinSweep).
|
|
30
|
+
export { loadRoomsThenJoinInBackground, startBackgroundJoinSweep };
|
|
31
|
+
|
|
24
32
|
interface useChatWrapperInitProps {
|
|
25
33
|
roomJID: string | null | undefined;
|
|
26
34
|
wasAutoSelected: boolean;
|
|
@@ -104,9 +112,14 @@ const useChatWrapperInit = ({
|
|
|
104
112
|
dispatch(
|
|
105
113
|
setIsLoading({ loading: true, loadingText: 'Loading rooms...' })
|
|
106
114
|
);
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
115
|
+
// The list is usable as soon as the rooms fetch returns (rooms come
|
|
116
|
+
// seeded with lastMessage / unread). Joining them all runs in the
|
|
117
|
+
// background, open room first.
|
|
118
|
+
return loadRoomsThenJoinInBackground(
|
|
119
|
+
client,
|
|
120
|
+
() => syncRooms(client, config),
|
|
121
|
+
() => dispatch(setIsLoading({ loading: false, loadingText: undefined }))
|
|
122
|
+
);
|
|
110
123
|
};
|
|
111
124
|
|
|
112
125
|
useEffect(() => {
|
|
@@ -150,7 +163,9 @@ const useChatWrapperInit = ({
|
|
|
150
163
|
Object.keys(roomsList).length
|
|
151
164
|
);
|
|
152
165
|
setInited(true);
|
|
153
|
-
|
|
166
|
+
// Persisted rooms: join (background sweep) + push subscribe
|
|
167
|
+
// without holding the private-store / unread step behind it.
|
|
168
|
+
initRoomsPresence(newClient, roomsList).catch(() => undefined);
|
|
154
169
|
} else {
|
|
155
170
|
if (config?.newArch) {
|
|
156
171
|
console.log(' Loading rooms with newArch');
|
|
@@ -231,6 +246,9 @@ const useChatWrapperInit = ({
|
|
|
231
246
|
}
|
|
232
247
|
}
|
|
233
248
|
setInited(true);
|
|
249
|
+
// Rooms that appeared since the bootstrap sweep (a /chats/my that
|
|
250
|
+
// returned late) get joined too; a no-op when nothing is left.
|
|
251
|
+
startBackgroundJoinSweep(client);
|
|
234
252
|
console.log(' Getting chats private store for existing client');
|
|
235
253
|
try {
|
|
236
254
|
// See the "new client" branch above: getChatsPrivateStoreRequestStanza
|