@ethora/chat-component-rn 26.9.1 → 26.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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 +288 -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 +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/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 +288 -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.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 +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/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 +282 -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 +93 -5
- package/src/version.ts +1 -1
|
@@ -3,17 +3,20 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.mergeUsersSet = exports.editRoomMessage = exports.deleteRoomMessage = exports.deleteRoom = exports.deleteAllRooms = exports.default = exports.compareStanzaIds = exports.clearVisibleRoom = exports.clearReadBoundary = exports.clearPendingNotificationJid = exports.applyRoomsPreloadBatch = exports.applyReactionToMessage = exports.applyPrivateStoreMarkers = exports.addRooms = exports.addRoomViaApi = exports.addRoomMessages = exports.addRoomMessage = exports.addRoom = exports.UNREAD_CAP_PAGE = exports.RUNTIME_MESSAGE_LIMIT = exports.RUNTIME_MESSAGE_CEILING = void 0;
|
|
6
|
+
exports.mergeUsersSet = exports.editRoomMessage = exports.deleteRoomMessage = exports.deleteRoom = exports.deleteAllRooms = exports.default = exports.compareStanzaIds = exports.clearVisibleRoom = exports.clearReadBoundary = exports.clearPendingNotificationJid = exports.clearPendingJump = exports.clearJumpWindow = exports.clearJoiningRoom = exports.clearArchivedMessage = exports.applyRoomsPreloadBatch = exports.applyReactionToMessage = exports.applyPrivateStoreMarkers = exports.appendJumpWindowMessages = exports.addRooms = exports.addRoomViaApi = exports.addRoomMessages = exports.addRoomMessage = exports.addRoomFromApi = exports.addRoom = exports.UNREAD_CAP_PAGE = exports.RUNTIME_MESSAGE_LIMIT = exports.RUNTIME_MESSAGE_CEILING = exports.JUMP_WINDOW_MAX_MESSAGES = void 0;
|
|
7
7
|
Object.defineProperty(exports, "msgSortableMs", {
|
|
8
8
|
enumerable: true,
|
|
9
9
|
get: function () {
|
|
10
10
|
return _msgSortableMs.msgSortableMs;
|
|
11
11
|
}
|
|
12
12
|
});
|
|
13
|
-
exports.updateRoom = exports.setVisibleRoom = exports.setUnreadSyncing = exports.setUnreadCounts = exports.setRoomRole = exports.setRoomNoMessages = exports.setRoomMessages = exports.setReadBoundary = exports.setReactions = exports.setPendingNotificationJid = exports.setLogoutState = exports.setLastViewedTimestamp = exports.setIsLoading = exports.setEditAction = exports.setCurrentRoom = exports.setComposing = exports.setCloseActiveMessage = exports.setActiveMessage = exports.roomsStore = void 0;
|
|
13
|
+
exports.updateRoom = exports.showArchivedMessage = exports.setVisibleRoom = exports.setUnreadSyncing = exports.setUnreadCounts = exports.setRoomRole = exports.setRoomNoMessages = exports.setRoomMessages = exports.setReadBoundary = exports.setReactions = exports.setPendingNotificationJid = exports.setMessageTranslation = exports.setLogoutState = exports.setLastViewedTimestamp = exports.setJumpWindow = exports.setJoiningRoom = exports.setIsLoading = exports.setEditAction = exports.setCurrentRoom = exports.setComposing = exports.setCloseActiveMessage = exports.setActiveMessage = exports.roomsStore = exports.requestJumpToMessage = exports.removeRoomMessage = exports.prependJumpWindowMessages = void 0;
|
|
14
14
|
var _toolkit = require("@reduxjs/toolkit");
|
|
15
15
|
var _insertMessageWithDelimiter = require("../helpers/insertMessageWithDelimiter");
|
|
16
16
|
var _msgSortableMs = require("../helpers/msgSortableMs");
|
|
17
|
+
var _safeKey = require("./safeKey");
|
|
18
|
+
var _usersSetCap = require("./usersSetCap");
|
|
19
|
+
var _roomUserCount = require("../helpers/roomUserCount");
|
|
17
20
|
var _pushSubscriptionService = require("../services/pushSubscriptionService");
|
|
18
21
|
// Per-room runtime message cap. Mirrors the persistence layer's
|
|
19
22
|
// MESSAGE_LIMIT so what's in memory matches what's on disk; otherwise
|
|
@@ -155,6 +158,65 @@ const insertRoomMessage = (state, roomJID, message, start) => {
|
|
|
155
158
|
atHead
|
|
156
159
|
};
|
|
157
160
|
};
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Keeps the jump window's separate copy of a message in step with the live
|
|
164
|
+
* list: an echo of a message the reader sees flips it from "sending" to
|
|
165
|
+
* delivered there too, call-log entries collapse per callId, and (only for a
|
|
166
|
+
* live single-message add, `allowAppend`) a reader parked at the LIVE END of
|
|
167
|
+
* a window (hasNewer false) sees what arrives next. While hasNewer is true
|
|
168
|
+
* the window is not adjacent to the tail and the message waits in
|
|
169
|
+
* room.messages until the reader returns to live.
|
|
170
|
+
*/
|
|
171
|
+
const syncJumpWindowWithMessage = (state, roomJID, message, start, allowAppend) => {
|
|
172
|
+
const win = state.jumpWindow;
|
|
173
|
+
if (!win || win.roomJID !== roomJID || isCallSignalMessage(message)) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const incomingCallLog = message.callLog;
|
|
177
|
+
if (incomingCallLog?.callId) {
|
|
178
|
+
const wi = win.messages.findIndex(msg => msg.callLog?.callId === incomingCallLog.callId);
|
|
179
|
+
if (wi !== -1) {
|
|
180
|
+
const wExisting = win.messages[wi];
|
|
181
|
+
const wMerged = mergeCallLogEntries(wExisting, message);
|
|
182
|
+
if (wMerged !== wExisting) {
|
|
183
|
+
win.messages[wi] = wMerged;
|
|
184
|
+
}
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (win.messages.length === 0) {
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
const isKnownMessage = msg => msg.id === message.id || !!message.xmppId && msg.id === message.xmppId || !!msg.xmppId && msg.xmppId === message.id;
|
|
192
|
+
const wi = win.messages.findIndex(isKnownMessage);
|
|
193
|
+
if (wi !== -1) {
|
|
194
|
+
const prev = win.messages[wi];
|
|
195
|
+
const next = {
|
|
196
|
+
...prev
|
|
197
|
+
};
|
|
198
|
+
for (const [key, value] of Object.entries(message)) {
|
|
199
|
+
if (value !== undefined && (0, _safeKey.isSafeKey)(key)) {
|
|
200
|
+
next[key] = value;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// The sender identity captured on first insert wins, as in the live
|
|
204
|
+
// list (the echo parses a different id form).
|
|
205
|
+
next.user = prev.user;
|
|
206
|
+
next.pending = false;
|
|
207
|
+
win.messages[wi] = next;
|
|
208
|
+
} else if (allowAppend && !win.hasNewer && !start) {
|
|
209
|
+
win.messages.push({
|
|
210
|
+
...message
|
|
211
|
+
});
|
|
212
|
+
if (win.messages.length > JUMP_WINDOW_MAX_MESSAGES) {
|
|
213
|
+
win.messages = win.messages.slice(-JUMP_WINDOW_MAX_MESSAGES);
|
|
214
|
+
const oldest = Number(win.messages[0].id);
|
|
215
|
+
win.olderCursor = Number.isFinite(oldest) ? oldest : win.olderCursor;
|
|
216
|
+
win.hasOlder = true;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
};
|
|
158
220
|
const capAfterGrowth = (messages, lengthBefore, atHead) => {
|
|
159
221
|
if (atHead) {
|
|
160
222
|
enforceMessageCap(messages, RUNTIME_MESSAGE_CEILING);
|
|
@@ -176,6 +238,9 @@ const bumpLastMessageTimestamp = (state, roomJID, message) => {
|
|
|
176
238
|
}
|
|
177
239
|
};
|
|
178
240
|
const upsertRoom = (state, roomData) => {
|
|
241
|
+
if (!(0, _safeKey.isSafeKey)(roomData?.jid)) {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
179
244
|
const existing = state.rooms[roomData.jid];
|
|
180
245
|
let lastViewed;
|
|
181
246
|
const serverMarker = state.privateStoreMarkers?.[roomData.jid] || 0;
|
|
@@ -200,11 +265,17 @@ const upsertRoom = (state, roomData) => {
|
|
|
200
265
|
const existingMessages = Array.isArray(existing?.messages) ? existing.messages : [];
|
|
201
266
|
state.rooms[roomData.jid] = {
|
|
202
267
|
...roomData,
|
|
268
|
+
usersCnt: resolveIncomingUsersCnt(roomData, existing),
|
|
269
|
+
// A seed for the room-list preview: take the freshest API value but
|
|
270
|
+
// never let a payload without one erase what is already there.
|
|
271
|
+
lastMessage: roomData.lastMessage ?? existing?.lastMessage,
|
|
272
|
+
...resolveApiUnread(state, roomData.jid, roomData, existing),
|
|
203
273
|
icon: roomData.icon !== undefined ? roomData.icon : existing?.icon,
|
|
204
274
|
roomBg: roomData.roomBg !== undefined ? roomData.roomBg : existing?.roomBg,
|
|
205
275
|
messages: existingMessages.length > 0 ? existingMessages : incomingMessages,
|
|
206
276
|
lastViewedTimestamp: lastViewed,
|
|
207
|
-
|
|
277
|
+
// A server-seeded count must not badge a room that is open right now.
|
|
278
|
+
unreadMessages: roomData.apiUnreadCount !== undefined && (state.activeRoomJID === roomData.jid || state.visibleRoomJID === roomData.jid) ? existing?.unreadMessages ?? 0 : roomData.unreadMessages ?? existing?.unreadMessages ?? 0,
|
|
208
279
|
unreadBaselineTimestamp: existing?.unreadBaselineTimestamp ?? existing?.lastViewedTimestamp ?? roomData.unreadBaselineTimestamp ?? 0
|
|
209
280
|
};
|
|
210
281
|
};
|
|
@@ -375,6 +446,40 @@ function mergeHistoryIntoCache(existing, fetched) {
|
|
|
375
446
|
const merged = collapseCallLogDuplicates(Array.from(byId.values()).sort(byMs));
|
|
376
447
|
return [...capTail(merged), ...pending];
|
|
377
448
|
}
|
|
449
|
+
|
|
450
|
+
/** A message found in the archive that the chat cannot show in place. */
|
|
451
|
+
|
|
452
|
+
/** A request to scroll a room's transcript to one message. */
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
* A short slice of a room's archive around one message, shown INSTEAD of the
|
|
456
|
+
* live list while the reader is away from the tail (a search jump to a message
|
|
457
|
+
* far back). Separate from room.messages on purpose: it is not contiguous with
|
|
458
|
+
* the live history, so it must not touch messageStats or historyComplete.
|
|
459
|
+
* Never persisted.
|
|
460
|
+
*/
|
|
461
|
+
|
|
462
|
+
/** The window is trimmed on the far side past this many messages. */
|
|
463
|
+
const JUMP_WINDOW_MAX_MESSAGES = exports.JUMP_WINDOW_MAX_MESSAGES = 300;
|
|
464
|
+
const mergeWindowMessages = (a, b) => {
|
|
465
|
+
const seen = new Set();
|
|
466
|
+
const merged = [];
|
|
467
|
+
for (const message of [...a, ...b]) {
|
|
468
|
+
const key = String(message.id);
|
|
469
|
+
if (seen.has(key)) {
|
|
470
|
+
continue;
|
|
471
|
+
}
|
|
472
|
+
seen.add(key);
|
|
473
|
+
merged.push(message);
|
|
474
|
+
}
|
|
475
|
+
const num = message => {
|
|
476
|
+
const id = Number(message.id);
|
|
477
|
+
return Number.isFinite(id) && id > 0 ? id : new Date(message.date).getTime();
|
|
478
|
+
};
|
|
479
|
+
// Archive ids are microsecond stanza ids and ascending in time; fall back to
|
|
480
|
+
// the date when an id is not numeric.
|
|
481
|
+
return merged.sort((x, y) => num(x) - num(y));
|
|
482
|
+
};
|
|
378
483
|
const initialState = {
|
|
379
484
|
rooms: {},
|
|
380
485
|
activeRoomJID: null,
|
|
@@ -389,14 +494,89 @@ const initialState = {
|
|
|
389
494
|
},
|
|
390
495
|
pendingNotificationJid: null,
|
|
391
496
|
privateStoreMarkers: {},
|
|
497
|
+
pendingJump: null,
|
|
498
|
+
joiningRoomJID: null,
|
|
392
499
|
readBoundaries: {},
|
|
500
|
+
usersSet: {},
|
|
501
|
+
jumpWindow: null,
|
|
502
|
+
archivedMessage: null,
|
|
393
503
|
pendingReactions: {}
|
|
394
504
|
};
|
|
395
505
|
const isValidRoomJid = jid => {
|
|
396
|
-
if (
|
|
397
|
-
|
|
506
|
+
if (!(0, _safeKey.isSafeKey)(jid)) {
|
|
507
|
+
return false;
|
|
508
|
+
}
|
|
509
|
+
if (!jid.includes('@')) {
|
|
510
|
+
return false;
|
|
511
|
+
}
|
|
398
512
|
return true;
|
|
399
513
|
};
|
|
514
|
+
|
|
515
|
+
/**
|
|
516
|
+
* Visits every stored copy of one message: the live copy in
|
|
517
|
+
* state.rooms[jid].messages and, when a jump window is open on that room, the
|
|
518
|
+
* window's separate copy. The window is a second list of the same messages, so
|
|
519
|
+
* every reducer that mutates ONE message must go through this or the reader
|
|
520
|
+
* sees stale edits/reactions/delivery state while away from the live tail.
|
|
521
|
+
* `matches` is an id, or a predicate when a reducer also matches on xmppId.
|
|
522
|
+
*/
|
|
523
|
+
const forEachMessageCopy = (state, jid, matches, fn) => {
|
|
524
|
+
const pred = typeof matches === 'function' ? matches : message => message.id === matches;
|
|
525
|
+
const live = state.rooms[jid]?.messages;
|
|
526
|
+
if (Array.isArray(live)) {
|
|
527
|
+
for (const message of live) {
|
|
528
|
+
if (pred(message)) {
|
|
529
|
+
fn(message);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
const win = state.jumpWindow;
|
|
534
|
+
if (win && win.roomJID === jid && Array.isArray(win.messages)) {
|
|
535
|
+
for (const message of win.messages) {
|
|
536
|
+
if (pred(message)) {
|
|
537
|
+
fn(message);
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
};
|
|
542
|
+
|
|
543
|
+
/**
|
|
544
|
+
* usersCnt after a /chats/my refresh. The API reports the true total in
|
|
545
|
+
* `usersCnt` but at most 30 `members` for a big room, so the members array
|
|
546
|
+
* length is only a floor; and a count already known (a larger one from an
|
|
547
|
+
* earlier response or a live join) is never lowered by a refresh.
|
|
548
|
+
*/
|
|
549
|
+
const resolveIncomingUsersCnt = (incoming, existing) => {
|
|
550
|
+
const apiTotal = typeof incoming.usersCnt === 'number' && incoming.usersCnt > 0 ? incoming.usersCnt : 0;
|
|
551
|
+
const membersLen = Array.isArray(incoming.members) ? incoming.members.length : 0;
|
|
552
|
+
const next = Math.max(apiTotal, membersLen);
|
|
553
|
+
return Math.max(next, existing ? (0, _roomUserCount.getRoomUserCount)(existing) : 0);
|
|
554
|
+
};
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* The server-reported unread snapshot of a room after an incoming /chats/my
|
|
558
|
+
* item: the freshest API value wins while the user is not looking at the
|
|
559
|
+
* room; one being read right now keeps none. Absent from the response =
|
|
560
|
+
* keep what an earlier, richer response set.
|
|
561
|
+
*/
|
|
562
|
+
const resolveApiUnread = (state, jid, incoming, existing) => {
|
|
563
|
+
if (state.activeRoomJID === jid || state.visibleRoomJID === jid) {
|
|
564
|
+
return {
|
|
565
|
+
apiUnreadCount: undefined,
|
|
566
|
+
apiUnreadSeededAt: undefined
|
|
567
|
+
};
|
|
568
|
+
}
|
|
569
|
+
if (incoming.apiUnreadCount !== undefined) {
|
|
570
|
+
return {
|
|
571
|
+
apiUnreadCount: incoming.apiUnreadCount,
|
|
572
|
+
apiUnreadSeededAt: incoming.apiUnreadSeededAt ?? Date.now()
|
|
573
|
+
};
|
|
574
|
+
}
|
|
575
|
+
return {
|
|
576
|
+
apiUnreadCount: existing?.apiUnreadCount,
|
|
577
|
+
apiUnreadSeededAt: existing?.apiUnreadSeededAt
|
|
578
|
+
};
|
|
579
|
+
};
|
|
400
580
|
const addRoomViaApi = exports.addRoomViaApi = (0, _toolkit.createAsyncThunk)('roomMessages/addRoomViaApi', async ({
|
|
401
581
|
room,
|
|
402
582
|
xmpp
|
|
@@ -449,6 +629,9 @@ const reducers = {
|
|
|
449
629
|
const {
|
|
450
630
|
jid
|
|
451
631
|
} = action.payload;
|
|
632
|
+
if (!(0, _safeKey.isSafeKey)(jid)) {
|
|
633
|
+
return;
|
|
634
|
+
}
|
|
452
635
|
if (state.rooms[jid]) {
|
|
453
636
|
delete state.rooms[jid];
|
|
454
637
|
if (state.visibleRoomJID === jid) {
|
|
@@ -461,19 +644,40 @@ const reducers = {
|
|
|
461
644
|
jid,
|
|
462
645
|
updates
|
|
463
646
|
} = action.payload;
|
|
647
|
+
if (!(0, _safeKey.isSafeKey)(jid)) {
|
|
648
|
+
return;
|
|
649
|
+
}
|
|
464
650
|
const existingRoom = state.rooms[jid];
|
|
465
|
-
if (existingRoom) {
|
|
466
|
-
|
|
467
|
-
...existingRoom,
|
|
468
|
-
...updates
|
|
469
|
-
};
|
|
651
|
+
if (!existingRoom) {
|
|
652
|
+
return;
|
|
470
653
|
}
|
|
654
|
+
const merged = {
|
|
655
|
+
...existingRoom,
|
|
656
|
+
...updates
|
|
657
|
+
};
|
|
658
|
+
if (typeof updates.usersCnt === 'number') {
|
|
659
|
+
// An explicit count (a live join or leave) is taken as given, with the
|
|
660
|
+
// known members as a floor.
|
|
661
|
+
const newMembers = Array.isArray(updates.members) ? updates.members : existingRoom.members;
|
|
662
|
+
const floor = Array.isArray(newMembers) ? newMembers.length : 0;
|
|
663
|
+
merged.usersCnt = Math.max(updates.usersCnt, floor);
|
|
664
|
+
} else if (Array.isArray(updates.members)) {
|
|
665
|
+
// A members-only refresh of a truncated big room (usersCnt > the
|
|
666
|
+
// first page) must not collapse the true total to the page length.
|
|
667
|
+
const prevMembers = Array.isArray(existingRoom.members) ? existingRoom.members.length : 0;
|
|
668
|
+
const prevCnt = typeof existingRoom.usersCnt === 'number' ? existingRoom.usersCnt : 0;
|
|
669
|
+
merged.usersCnt = prevCnt > prevMembers ? Math.max(prevCnt, updates.members.length) : updates.members.length;
|
|
670
|
+
}
|
|
671
|
+
state.rooms[jid] = merged;
|
|
471
672
|
},
|
|
472
673
|
setRoomMessages(state, action) {
|
|
473
674
|
const {
|
|
474
675
|
roomJID,
|
|
475
676
|
messages
|
|
476
677
|
} = action.payload;
|
|
678
|
+
if (!(0, _safeKey.isSafeKey)(roomJID)) {
|
|
679
|
+
return;
|
|
680
|
+
}
|
|
477
681
|
if (state.rooms[roomJID]) {
|
|
478
682
|
// Cap to the runtime limit on replace too — guards against a
|
|
479
683
|
// single MAM page returning more than the limit (would balloon
|
|
@@ -487,6 +691,9 @@ const reducers = {
|
|
|
487
691
|
roomJID,
|
|
488
692
|
messageId
|
|
489
693
|
} = action.payload;
|
|
694
|
+
if (!(0, _safeKey.isSafeKey)(roomJID)) {
|
|
695
|
+
return;
|
|
696
|
+
}
|
|
490
697
|
const room = state.rooms[roomJID];
|
|
491
698
|
if (!room?.messages) {
|
|
492
699
|
return;
|
|
@@ -503,11 +710,9 @@ const reducers = {
|
|
|
503
710
|
}
|
|
504
711
|
return;
|
|
505
712
|
}
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
message.reaction = undefined;
|
|
510
|
-
}
|
|
713
|
+
forEachMessageCopy(state, roomJID, messageId, message => {
|
|
714
|
+
message.isDeleted = true;
|
|
715
|
+
message.reaction = undefined;
|
|
511
716
|
});
|
|
512
717
|
},
|
|
513
718
|
setEditAction: (state, action) => {
|
|
@@ -528,30 +733,77 @@ const reducers = {
|
|
|
528
733
|
messageId,
|
|
529
734
|
text
|
|
530
735
|
} = action.payload;
|
|
531
|
-
if (
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
736
|
+
if (!(0, _safeKey.isSafeKey)(roomJID)) {
|
|
737
|
+
return;
|
|
738
|
+
}
|
|
739
|
+
// Edited in place on every copy (live list and jump window).
|
|
740
|
+
forEachMessageCopy(state, roomJID, messageId, message => {
|
|
741
|
+
message.body = text;
|
|
742
|
+
// Flag the correction so the bubble can render an "edited" marker.
|
|
743
|
+
// Covers both the author's own edit and edits from other users -
|
|
744
|
+
// every <replace> echo flows through here.
|
|
745
|
+
message.isEdited = true;
|
|
746
|
+
});
|
|
747
|
+
},
|
|
748
|
+
/**
|
|
749
|
+
* Hard removal, unlike `deleteRoomMessage`'s tombstone. For optimistic
|
|
750
|
+
* messages that never made it onto the wire.
|
|
751
|
+
*/
|
|
752
|
+
removeRoomMessage(state, action) {
|
|
753
|
+
const {
|
|
754
|
+
roomJID,
|
|
755
|
+
messageId
|
|
756
|
+
} = action.payload;
|
|
757
|
+
if (!(0, _safeKey.isSafeKey)(roomJID)) {
|
|
758
|
+
return;
|
|
759
|
+
}
|
|
760
|
+
if (state.rooms[roomJID]?.messages) {
|
|
761
|
+
state.rooms[roomJID].messages = state.rooms[roomJID].messages.filter(message => message.id !== messageId);
|
|
762
|
+
}
|
|
763
|
+
const win = state.jumpWindow;
|
|
764
|
+
if (win && win.roomJID === roomJID) {
|
|
765
|
+
win.messages = win.messages.filter(message => message.id !== messageId);
|
|
541
766
|
}
|
|
542
767
|
},
|
|
768
|
+
/**
|
|
769
|
+
* Caches one translation onto the message it belongs to, keyed by the
|
|
770
|
+
* locale tag the translate service echoed back. Applied to the live
|
|
771
|
+
* copy and the jump window's copy.
|
|
772
|
+
*/
|
|
773
|
+
setMessageTranslation(state, action) {
|
|
774
|
+
const {
|
|
775
|
+
roomJID,
|
|
776
|
+
messageId,
|
|
777
|
+
locale,
|
|
778
|
+
entry
|
|
779
|
+
} = action.payload;
|
|
780
|
+
if (!(0, _safeKey.isSafeKey)(roomJID) || !(0, _safeKey.isSafeKey)(locale)) {
|
|
781
|
+
return;
|
|
782
|
+
}
|
|
783
|
+
forEachMessageCopy(state, roomJID, messageId, message => {
|
|
784
|
+
if (!message.translations) {
|
|
785
|
+
message.translations = {};
|
|
786
|
+
}
|
|
787
|
+
message.translations[locale] = entry;
|
|
788
|
+
});
|
|
789
|
+
},
|
|
543
790
|
addRoomMessage(state, action) {
|
|
544
791
|
const {
|
|
545
792
|
roomJID,
|
|
546
793
|
message,
|
|
547
794
|
start
|
|
548
795
|
} = action.payload;
|
|
796
|
+
if (!(0, _safeKey.isSafeKey)(roomJID)) {
|
|
797
|
+
return;
|
|
798
|
+
}
|
|
549
799
|
const lengthBefore = state.rooms[roomJID]?.messages?.length || 0;
|
|
550
800
|
const outcome = insertRoomMessage(state, roomJID, message, start);
|
|
551
801
|
if (outcome.grew) {
|
|
552
802
|
capAfterGrowth(state.rooms[roomJID].messages, lengthBefore, outcome.atHead);
|
|
553
803
|
}
|
|
554
804
|
bumpLastMessageTimestamp(state, roomJID, message);
|
|
805
|
+
// Keep the jump window's copy in step with the live list.
|
|
806
|
+
syncJumpWindowWithMessage(state, roomJID, message, start, true);
|
|
555
807
|
},
|
|
556
808
|
/**
|
|
557
809
|
* A whole page of messages (a MAM history page) in ONE action: the same
|
|
@@ -565,7 +817,7 @@ const reducers = {
|
|
|
565
817
|
messages,
|
|
566
818
|
start
|
|
567
819
|
} = action.payload;
|
|
568
|
-
if (!state.rooms[roomJID] || !Array.isArray(messages)) {
|
|
820
|
+
if (!(0, _safeKey.isSafeKey)(roomJID) || !state.rooms[roomJID] || !Array.isArray(messages)) {
|
|
569
821
|
return;
|
|
570
822
|
}
|
|
571
823
|
const lengthBefore = state.rooms[roomJID].messages?.length || 0;
|
|
@@ -583,6 +835,9 @@ const reducers = {
|
|
|
583
835
|
if (!newest || Number(message?.id) > Number(newest.id)) {
|
|
584
836
|
newest = message;
|
|
585
837
|
}
|
|
838
|
+
// History pages never append to a reader's jump window (they are not
|
|
839
|
+
// "the newest message"); they only refresh copies it already holds.
|
|
840
|
+
syncJumpWindowWithMessage(state, roomJID, message, start, false);
|
|
586
841
|
}
|
|
587
842
|
if (grew) {
|
|
588
843
|
// A page that only prepended older history is never trimmed.
|
|
@@ -594,6 +849,7 @@ const reducers = {
|
|
|
594
849
|
},
|
|
595
850
|
deleteAllRooms(state) {
|
|
596
851
|
state.rooms = {};
|
|
852
|
+
state.jumpWindow = null;
|
|
597
853
|
state.visibleRoomJID = null;
|
|
598
854
|
state.privateStoreMarkers = {};
|
|
599
855
|
state.readBoundaries = {};
|
|
@@ -605,6 +861,9 @@ const reducers = {
|
|
|
605
861
|
composing,
|
|
606
862
|
composingList
|
|
607
863
|
} = action.payload;
|
|
864
|
+
if (!(0, _safeKey.isSafeKey)(chatJID) || !state.rooms[chatJID]) {
|
|
865
|
+
return;
|
|
866
|
+
}
|
|
608
867
|
state.rooms[chatJID].composing = composing;
|
|
609
868
|
state.rooms[chatJID].composingList = composingList;
|
|
610
869
|
},
|
|
@@ -614,7 +873,7 @@ const reducers = {
|
|
|
614
873
|
loading,
|
|
615
874
|
loadingText
|
|
616
875
|
} = action.payload;
|
|
617
|
-
if (chatJID && state.rooms?.[chatJID]) {
|
|
876
|
+
if ((0, _safeKey.isSafeKey)(chatJID) && state.rooms?.[chatJID]) {
|
|
618
877
|
state.rooms[chatJID].isLoading = loading;
|
|
619
878
|
}
|
|
620
879
|
state.isLoading = loading;
|
|
@@ -628,7 +887,7 @@ const reducers = {
|
|
|
628
887
|
chatJID,
|
|
629
888
|
timestamp
|
|
630
889
|
} = action.payload;
|
|
631
|
-
if (state.rooms[chatJID]) {
|
|
890
|
+
if ((0, _safeKey.isSafeKey)(chatJID) && state.rooms[chatJID]) {
|
|
632
891
|
state.rooms[chatJID].lastViewedTimestamp = timestamp;
|
|
633
892
|
// A non-positive timestamp means "no persisted marker yet" and
|
|
634
893
|
// must not inflate unread from history that predates the first
|
|
@@ -679,7 +938,7 @@ const reducers = {
|
|
|
679
938
|
}
|
|
680
939
|
for (const jid of Object.keys(markers)) {
|
|
681
940
|
const ts = Number(markers[jid]);
|
|
682
|
-
if (!jid || !Number.isFinite(ts) || ts <= 0) {
|
|
941
|
+
if (!(0, _safeKey.isSafeKey)(jid) || !Number.isFinite(ts) || ts <= 0) {
|
|
683
942
|
continue;
|
|
684
943
|
}
|
|
685
944
|
const room = state.rooms[jid];
|
|
@@ -723,7 +982,7 @@ const reducers = {
|
|
|
723
982
|
jid,
|
|
724
983
|
ts
|
|
725
984
|
} = action.payload;
|
|
726
|
-
if (!jid) {
|
|
985
|
+
if (!(0, _safeKey.isSafeKey)(jid)) {
|
|
727
986
|
return;
|
|
728
987
|
}
|
|
729
988
|
if (!state.readBoundaries) {
|
|
@@ -745,7 +1004,7 @@ const reducers = {
|
|
|
745
1004
|
const {
|
|
746
1005
|
jid
|
|
747
1006
|
} = action.payload;
|
|
748
|
-
if (jid && state.readBoundaries) {
|
|
1007
|
+
if ((0, _safeKey.isSafeKey)(jid) && state.readBoundaries) {
|
|
749
1008
|
delete state.readBoundaries[jid];
|
|
750
1009
|
}
|
|
751
1010
|
},
|
|
@@ -754,7 +1013,7 @@ const reducers = {
|
|
|
754
1013
|
chatJID,
|
|
755
1014
|
role
|
|
756
1015
|
} = action.payload;
|
|
757
|
-
if (state.rooms[chatJID]) {
|
|
1016
|
+
if ((0, _safeKey.isSafeKey)(chatJID) && state.rooms[chatJID]) {
|
|
758
1017
|
state.rooms[chatJID].role = role;
|
|
759
1018
|
}
|
|
760
1019
|
},
|
|
@@ -763,20 +1022,40 @@ const reducers = {
|
|
|
763
1022
|
value,
|
|
764
1023
|
chatJID
|
|
765
1024
|
} = action.payload;
|
|
766
|
-
if (chatJID) {
|
|
1025
|
+
if ((0, _safeKey.isSafeKey)(chatJID) && state.rooms[chatJID]) {
|
|
767
1026
|
state.rooms[chatJID].noMessages = value;
|
|
768
1027
|
}
|
|
769
1028
|
},
|
|
770
1029
|
setCurrentRoom: (state, action) => {
|
|
771
1030
|
// Accept null/empty so callers can clear the active room (e.g.
|
|
772
1031
|
// back button from chat → return to RoomList). Mirrors web.
|
|
773
|
-
|
|
1032
|
+
const {
|
|
1033
|
+
roomJID
|
|
1034
|
+
} = action.payload;
|
|
1035
|
+
if (roomJID && !(0, _safeKey.isSafeKey)(roomJID)) {
|
|
1036
|
+
return;
|
|
1037
|
+
}
|
|
1038
|
+
state.activeRoomJID = roomJID || '';
|
|
1039
|
+
// Opening a room reads it: the server's earlier unread count no longer
|
|
1040
|
+
// applies (the unread middleware would otherwise bring it back the
|
|
1041
|
+
// moment the user leaves the room again).
|
|
1042
|
+
if (roomJID && state.rooms[roomJID]?.apiUnreadCount !== undefined) {
|
|
1043
|
+
state.rooms[roomJID].apiUnreadCount = undefined;
|
|
1044
|
+
state.rooms[roomJID].apiUnreadSeededAt = undefined;
|
|
1045
|
+
state.rooms[roomJID].unreadMessages = 0;
|
|
1046
|
+
}
|
|
774
1047
|
},
|
|
775
1048
|
setVisibleRoom: (state, action) => {
|
|
776
|
-
|
|
1049
|
+
const requested = action.payload.roomJID;
|
|
1050
|
+
if (requested && !(0, _safeKey.isSafeKey)(requested)) {
|
|
1051
|
+
return;
|
|
1052
|
+
}
|
|
1053
|
+
state.visibleRoomJID = requested || null;
|
|
777
1054
|
const jid = state.visibleRoomJID;
|
|
778
1055
|
if (jid && state.rooms[jid]) {
|
|
779
1056
|
state.rooms[jid].unreadMessages = 0;
|
|
1057
|
+
state.rooms[jid].apiUnreadCount = undefined;
|
|
1058
|
+
state.rooms[jid].apiUnreadSeededAt = undefined;
|
|
780
1059
|
}
|
|
781
1060
|
},
|
|
782
1061
|
clearVisibleRoom: state => {
|
|
@@ -799,6 +1078,81 @@ const reducers = {
|
|
|
799
1078
|
clearPendingNotificationJid: state => {
|
|
800
1079
|
state.pendingNotificationJid = null;
|
|
801
1080
|
},
|
|
1081
|
+
requestJumpToMessage: (state, action) => {
|
|
1082
|
+
const ids = action.payload.ids.filter(Boolean);
|
|
1083
|
+
const canMatchByContent = Boolean(action.payload.createdAt && action.payload.body);
|
|
1084
|
+
if (!action.payload.roomJID || ids.length === 0 && !canMatchByContent) {
|
|
1085
|
+
return;
|
|
1086
|
+
}
|
|
1087
|
+
state.pendingJump = {
|
|
1088
|
+
roomJID: action.payload.roomJID,
|
|
1089
|
+
ids,
|
|
1090
|
+
createdAt: action.payload.createdAt,
|
|
1091
|
+
body: action.payload.body,
|
|
1092
|
+
preview: action.payload.preview,
|
|
1093
|
+
at: Date.now()
|
|
1094
|
+
};
|
|
1095
|
+
},
|
|
1096
|
+
clearPendingJump: state => {
|
|
1097
|
+
state.pendingJump = null;
|
|
1098
|
+
},
|
|
1099
|
+
showArchivedMessage: (state, action) => {
|
|
1100
|
+
state.archivedMessage = action.payload;
|
|
1101
|
+
},
|
|
1102
|
+
clearArchivedMessage: state => {
|
|
1103
|
+
state.archivedMessage = null;
|
|
1104
|
+
},
|
|
1105
|
+
setJumpWindow: (state, action) => {
|
|
1106
|
+
state.jumpWindow = {
|
|
1107
|
+
...action.payload,
|
|
1108
|
+
messages: mergeWindowMessages(action.payload.messages, [])
|
|
1109
|
+
};
|
|
1110
|
+
},
|
|
1111
|
+
prependJumpWindowMessages: (state, action) => {
|
|
1112
|
+
const win = state.jumpWindow;
|
|
1113
|
+
if (!win || win.roomJID !== action.payload.roomJID) {
|
|
1114
|
+
return;
|
|
1115
|
+
}
|
|
1116
|
+
win.messages = mergeWindowMessages(action.payload.messages, win.messages);
|
|
1117
|
+
win.olderCursor = action.payload.olderCursor;
|
|
1118
|
+
win.hasOlder = action.payload.hasOlder;
|
|
1119
|
+
if (win.messages.length > JUMP_WINDOW_MAX_MESSAGES) {
|
|
1120
|
+
// Reader is going up: drop the far (newest) side and page it again if
|
|
1121
|
+
// they come back down.
|
|
1122
|
+
win.messages = win.messages.slice(0, JUMP_WINDOW_MAX_MESSAGES);
|
|
1123
|
+
const newest = Number(win.messages[win.messages.length - 1].id);
|
|
1124
|
+
win.newerCursor = Number.isFinite(newest) ? newest : win.newerCursor;
|
|
1125
|
+
win.hasNewer = true;
|
|
1126
|
+
}
|
|
1127
|
+
},
|
|
1128
|
+
appendJumpWindowMessages: (state, action) => {
|
|
1129
|
+
const win = state.jumpWindow;
|
|
1130
|
+
if (!win || win.roomJID !== action.payload.roomJID) {
|
|
1131
|
+
return;
|
|
1132
|
+
}
|
|
1133
|
+
win.messages = mergeWindowMessages(win.messages, action.payload.messages);
|
|
1134
|
+
win.newerCursor = action.payload.newerCursor;
|
|
1135
|
+
win.hasNewer = action.payload.hasNewer;
|
|
1136
|
+
if (win.messages.length > JUMP_WINDOW_MAX_MESSAGES) {
|
|
1137
|
+
win.messages = win.messages.slice(-JUMP_WINDOW_MAX_MESSAGES);
|
|
1138
|
+
const oldest = Number(win.messages[0].id);
|
|
1139
|
+
win.olderCursor = Number.isFinite(oldest) ? oldest : win.olderCursor;
|
|
1140
|
+
win.hasOlder = true;
|
|
1141
|
+
}
|
|
1142
|
+
},
|
|
1143
|
+
clearJumpWindow: state => {
|
|
1144
|
+
state.jumpWindow = null;
|
|
1145
|
+
},
|
|
1146
|
+
setJoiningRoom: (state, action) => {
|
|
1147
|
+
state.joiningRoomJID = action.payload || null;
|
|
1148
|
+
},
|
|
1149
|
+
// Only clears when it still names that room, so a slow join for a room
|
|
1150
|
+
// the user already left cannot wipe the join of the current one.
|
|
1151
|
+
clearJoiningRoom: (state, action) => {
|
|
1152
|
+
if (state.joiningRoomJID === action.payload) {
|
|
1153
|
+
state.joiningRoomJID = null;
|
|
1154
|
+
}
|
|
1155
|
+
},
|
|
802
1156
|
/**
|
|
803
1157
|
* Stamp a message in `state.rooms[roomJID].messages` with an updated
|
|
804
1158
|
* reactions list. The reactionsMiddleware listens for this action to
|
|
@@ -813,13 +1167,21 @@ const reducers = {
|
|
|
813
1167
|
data,
|
|
814
1168
|
latestReactionTimestamp
|
|
815
1169
|
} = action.payload;
|
|
816
|
-
if (!from) {
|
|
1170
|
+
if (!(0, _safeKey.isSafeKey)(roomJID) || !from) {
|
|
817
1171
|
return;
|
|
818
1172
|
}
|
|
819
|
-
|
|
820
|
-
const
|
|
821
|
-
if (
|
|
822
|
-
|
|
1173
|
+
// `fromId` becomes a property name on the message's reaction map.
|
|
1174
|
+
const fromId = String(from).split('/')[0].split('@')[0];
|
|
1175
|
+
if (!(0, _safeKey.isSafeKey)(fromId)) {
|
|
1176
|
+
return;
|
|
1177
|
+
}
|
|
1178
|
+
let found = false;
|
|
1179
|
+
// Applied on every stored copy (live list and jump window).
|
|
1180
|
+
forEachMessageCopy(state, roomJID, msg => msg?.id === messageId || msg?.xmppId === messageId, message => {
|
|
1181
|
+
found = true;
|
|
1182
|
+
applyReactionToMessage(message, from, reactions, data, latestReactionTimestamp);
|
|
1183
|
+
});
|
|
1184
|
+
if (found) {
|
|
823
1185
|
return;
|
|
824
1186
|
}
|
|
825
1187
|
// The message is not loaded (yet): keep the reaction for it.
|
|
@@ -846,27 +1208,42 @@ const reducers = {
|
|
|
846
1208
|
state.isUnreadSyncing = false;
|
|
847
1209
|
state.privateStoreMarkers = {};
|
|
848
1210
|
state.readBoundaries = {};
|
|
1211
|
+
state.usersSet = {};
|
|
1212
|
+
state.jumpWindow = null;
|
|
1213
|
+
state.archivedMessage = null;
|
|
1214
|
+
state.pendingJump = null;
|
|
849
1215
|
},
|
|
850
1216
|
setActiveMessage: (state, action) => {
|
|
851
1217
|
const {
|
|
852
1218
|
id,
|
|
853
1219
|
chatJID
|
|
854
1220
|
} = action.payload;
|
|
855
|
-
state.rooms[chatJID]
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
1221
|
+
if (!(0, _safeKey.isSafeKey)(chatJID) || !state.rooms[chatJID]) {
|
|
1222
|
+
return;
|
|
1223
|
+
}
|
|
1224
|
+
const flag = message => {
|
|
1225
|
+
message.activeMessage = message.id === id;
|
|
1226
|
+
};
|
|
1227
|
+
state.rooms[chatJID].messages.forEach(flag);
|
|
1228
|
+
if (state.jumpWindow?.roomJID === chatJID) {
|
|
1229
|
+
state.jumpWindow.messages.forEach(flag);
|
|
1230
|
+
}
|
|
862
1231
|
},
|
|
863
1232
|
setCloseActiveMessage: (state, action) => {
|
|
864
1233
|
const {
|
|
865
1234
|
chatJID
|
|
866
1235
|
} = action.payload;
|
|
867
|
-
state.rooms[chatJID]
|
|
1236
|
+
if (!(0, _safeKey.isSafeKey)(chatJID) || !state.rooms[chatJID]) {
|
|
1237
|
+
return;
|
|
1238
|
+
}
|
|
1239
|
+
state.rooms[chatJID].messages.forEach(message => {
|
|
868
1240
|
message.activeMessage = false;
|
|
869
1241
|
});
|
|
1242
|
+
if (state.jumpWindow?.roomJID === chatJID) {
|
|
1243
|
+
state.jumpWindow.messages.forEach(message => {
|
|
1244
|
+
message.activeMessage = false;
|
|
1245
|
+
});
|
|
1246
|
+
}
|
|
870
1247
|
},
|
|
871
1248
|
/**
|
|
872
1249
|
* Batched update used by the history preload scheduler. Each patch is
|
|
@@ -885,15 +1262,14 @@ const reducers = {
|
|
|
885
1262
|
...existing,
|
|
886
1263
|
...room,
|
|
887
1264
|
title: room.title || existing?.title || room.title,
|
|
888
|
-
usersCnt: (
|
|
889
|
-
const incoming = typeof room.usersCnt === 'number' && room.usersCnt > 0 ? room.usersCnt : 0;
|
|
890
|
-
const previous = typeof existing?.usersCnt === 'number' && existing.usersCnt > 0 ? existing.usersCnt : 0;
|
|
891
|
-
if (incoming === 0 && previous === 0) return room.usersCnt;
|
|
892
|
-
return Math.max(incoming, previous);
|
|
893
|
-
})(),
|
|
1265
|
+
usersCnt: resolveIncomingUsersCnt(room, existing),
|
|
894
1266
|
icon: room.icon ?? existing?.icon,
|
|
895
1267
|
messages: existingMessages.length > 0 ? existingMessages : incomingMessages,
|
|
1268
|
+
// A seed for the room-list preview (the API's `lastMessage`): take the
|
|
1269
|
+
// freshest value, never let a refresh without one erase it.
|
|
1270
|
+
lastMessage: room.lastMessage ?? existing?.lastMessage,
|
|
896
1271
|
unreadMessages: existing?.unreadMessages ?? room.unreadMessages ?? 0,
|
|
1272
|
+
...resolveApiUnread(state, room.jid, room, existing),
|
|
897
1273
|
lastViewedTimestamp: existing?.lastViewedTimestamp ?? room.lastViewedTimestamp ?? 0,
|
|
898
1274
|
unreadBaselineTimestamp: existing?.unreadBaselineTimestamp ?? existing?.lastViewedTimestamp ?? room.unreadBaselineTimestamp ?? room.lastViewedTimestamp ?? 0,
|
|
899
1275
|
composingList: existing?.composingList ?? room.composingList,
|
|
@@ -909,8 +1285,11 @@ const reducers = {
|
|
|
909
1285
|
rooms
|
|
910
1286
|
} = action.payload;
|
|
911
1287
|
for (const patch of rooms) {
|
|
1288
|
+
if (!(0, _safeKey.isSafeKey)(patch?.jid)) {
|
|
1289
|
+
continue;
|
|
1290
|
+
}
|
|
912
1291
|
const room = state.rooms[patch.jid];
|
|
913
|
-
if (!room) {
|
|
1292
|
+
if (!room || typeof room !== 'object' || Array.isArray(room)) {
|
|
914
1293
|
continue;
|
|
915
1294
|
}
|
|
916
1295
|
if (typeof patch.historyPreloadState !== 'undefined') {
|
|
@@ -922,6 +1301,12 @@ const reducers = {
|
|
|
922
1301
|
if (typeof patch.historyComplete !== 'undefined') {
|
|
923
1302
|
room.historyComplete = patch.historyComplete;
|
|
924
1303
|
}
|
|
1304
|
+
if (patch.messageStats) {
|
|
1305
|
+
room.messageStats = {
|
|
1306
|
+
...room.messageStats,
|
|
1307
|
+
...patch.messageStats
|
|
1308
|
+
};
|
|
1309
|
+
}
|
|
925
1310
|
if (Array.isArray(patch.messages)) {
|
|
926
1311
|
for (const m of patch.messages) {
|
|
927
1312
|
takePendingReactions(state, patch.jid, m);
|
|
@@ -939,10 +1324,13 @@ const reducers = {
|
|
|
939
1324
|
// part and the full jid so either lookup style hits — a message's
|
|
940
1325
|
// `user.id` can be either depending on how it was parsed.
|
|
941
1326
|
mergeUsersSet(state, action) {
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
1327
|
+
// A real merge with a cap: fresh entries win (and move to the newest
|
|
1328
|
+
// position), entries fetched lazily earlier stay, the oldest-inserted
|
|
1329
|
+
// are evicted past USERS_SET_CAP. Unsafe keys are skipped.
|
|
1330
|
+
if (!state.usersSet || typeof state.usersSet !== 'object') {
|
|
1331
|
+
state.usersSet = {};
|
|
1332
|
+
}
|
|
1333
|
+
(0, _usersSetCap.mergeUsersSet)(state.usersSet, action.payload?.members || {});
|
|
946
1334
|
}
|
|
947
1335
|
};
|
|
948
1336
|
const roomsStore = exports.roomsStore = (0, _toolkit.createSlice)({
|
|
@@ -1062,11 +1450,37 @@ const {
|
|
|
1062
1450
|
setUnreadCounts,
|
|
1063
1451
|
setPendingNotificationJid,
|
|
1064
1452
|
clearPendingNotificationJid,
|
|
1453
|
+
requestJumpToMessage,
|
|
1454
|
+
clearPendingJump,
|
|
1455
|
+
setJoiningRoom,
|
|
1456
|
+
clearJoiningRoom,
|
|
1065
1457
|
setReactions,
|
|
1066
|
-
mergeUsersSet
|
|
1458
|
+
mergeUsersSet,
|
|
1459
|
+
removeRoomMessage,
|
|
1460
|
+
addRoomFromApi,
|
|
1461
|
+
setMessageTranslation,
|
|
1462
|
+
showArchivedMessage,
|
|
1463
|
+
clearArchivedMessage,
|
|
1464
|
+
setJumpWindow,
|
|
1465
|
+
prependJumpWindowMessages,
|
|
1466
|
+
appendJumpWindowMessages,
|
|
1467
|
+
clearJumpWindow
|
|
1067
1468
|
} = roomsStore.actions;
|
|
1469
|
+
exports.clearJumpWindow = clearJumpWindow;
|
|
1470
|
+
exports.appendJumpWindowMessages = appendJumpWindowMessages;
|
|
1471
|
+
exports.prependJumpWindowMessages = prependJumpWindowMessages;
|
|
1472
|
+
exports.setJumpWindow = setJumpWindow;
|
|
1473
|
+
exports.clearArchivedMessage = clearArchivedMessage;
|
|
1474
|
+
exports.showArchivedMessage = showArchivedMessage;
|
|
1475
|
+
exports.setMessageTranslation = setMessageTranslation;
|
|
1476
|
+
exports.addRoomFromApi = addRoomFromApi;
|
|
1477
|
+
exports.removeRoomMessage = removeRoomMessage;
|
|
1068
1478
|
exports.mergeUsersSet = mergeUsersSet;
|
|
1069
1479
|
exports.setReactions = setReactions;
|
|
1480
|
+
exports.clearJoiningRoom = clearJoiningRoom;
|
|
1481
|
+
exports.setJoiningRoom = setJoiningRoom;
|
|
1482
|
+
exports.clearPendingJump = clearPendingJump;
|
|
1483
|
+
exports.requestJumpToMessage = requestJumpToMessage;
|
|
1070
1484
|
exports.clearPendingNotificationJid = clearPendingNotificationJid;
|
|
1071
1485
|
exports.setPendingNotificationJid = setPendingNotificationJid;
|
|
1072
1486
|
exports.setUnreadCounts = setUnreadCounts;
|