@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,6 +3,9 @@
|
|
|
3
3
|
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
|
|
4
4
|
import { insertMessageWithDelimiter } from '../helpers/insertMessageWithDelimiter';
|
|
5
5
|
import { msgSortableMs } from '../helpers/msgSortableMs';
|
|
6
|
+
import { isSafeKey } from './safeKey';
|
|
7
|
+
import { mergeUsersSet as mergeIntoUsersSet } from './usersSetCap';
|
|
8
|
+
import { getRoomUserCount } from '../helpers/roomUserCount';
|
|
6
9
|
import { subscribeRoomForPush } from '../services/pushSubscriptionService';
|
|
7
10
|
|
|
8
11
|
// Per-room runtime message cap. Mirrors the persistence layer's
|
|
@@ -145,6 +148,65 @@ const insertRoomMessage = (state, roomJID, message, start) => {
|
|
|
145
148
|
atHead
|
|
146
149
|
};
|
|
147
150
|
};
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Keeps the jump window's separate copy of a message in step with the live
|
|
154
|
+
* list: an echo of a message the reader sees flips it from "sending" to
|
|
155
|
+
* delivered there too, call-log entries collapse per callId, and (only for a
|
|
156
|
+
* live single-message add, `allowAppend`) a reader parked at the LIVE END of
|
|
157
|
+
* a window (hasNewer false) sees what arrives next. While hasNewer is true
|
|
158
|
+
* the window is not adjacent to the tail and the message waits in
|
|
159
|
+
* room.messages until the reader returns to live.
|
|
160
|
+
*/
|
|
161
|
+
const syncJumpWindowWithMessage = (state, roomJID, message, start, allowAppend) => {
|
|
162
|
+
const win = state.jumpWindow;
|
|
163
|
+
if (!win || win.roomJID !== roomJID || isCallSignalMessage(message)) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const incomingCallLog = message.callLog;
|
|
167
|
+
if (incomingCallLog?.callId) {
|
|
168
|
+
const wi = win.messages.findIndex(msg => msg.callLog?.callId === incomingCallLog.callId);
|
|
169
|
+
if (wi !== -1) {
|
|
170
|
+
const wExisting = win.messages[wi];
|
|
171
|
+
const wMerged = mergeCallLogEntries(wExisting, message);
|
|
172
|
+
if (wMerged !== wExisting) {
|
|
173
|
+
win.messages[wi] = wMerged;
|
|
174
|
+
}
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (win.messages.length === 0) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const isKnownMessage = msg => msg.id === message.id || !!message.xmppId && msg.id === message.xmppId || !!msg.xmppId && msg.xmppId === message.id;
|
|
182
|
+
const wi = win.messages.findIndex(isKnownMessage);
|
|
183
|
+
if (wi !== -1) {
|
|
184
|
+
const prev = win.messages[wi];
|
|
185
|
+
const next = {
|
|
186
|
+
...prev
|
|
187
|
+
};
|
|
188
|
+
for (const [key, value] of Object.entries(message)) {
|
|
189
|
+
if (value !== undefined && isSafeKey(key)) {
|
|
190
|
+
next[key] = value;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// The sender identity captured on first insert wins, as in the live
|
|
194
|
+
// list (the echo parses a different id form).
|
|
195
|
+
next.user = prev.user;
|
|
196
|
+
next.pending = false;
|
|
197
|
+
win.messages[wi] = next;
|
|
198
|
+
} else if (allowAppend && !win.hasNewer && !start) {
|
|
199
|
+
win.messages.push({
|
|
200
|
+
...message
|
|
201
|
+
});
|
|
202
|
+
if (win.messages.length > JUMP_WINDOW_MAX_MESSAGES) {
|
|
203
|
+
win.messages = win.messages.slice(-JUMP_WINDOW_MAX_MESSAGES);
|
|
204
|
+
const oldest = Number(win.messages[0].id);
|
|
205
|
+
win.olderCursor = Number.isFinite(oldest) ? oldest : win.olderCursor;
|
|
206
|
+
win.hasOlder = true;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
};
|
|
148
210
|
const capAfterGrowth = (messages, lengthBefore, atHead) => {
|
|
149
211
|
if (atHead) {
|
|
150
212
|
enforceMessageCap(messages, RUNTIME_MESSAGE_CEILING);
|
|
@@ -166,6 +228,9 @@ const bumpLastMessageTimestamp = (state, roomJID, message) => {
|
|
|
166
228
|
}
|
|
167
229
|
};
|
|
168
230
|
const upsertRoom = (state, roomData) => {
|
|
231
|
+
if (!isSafeKey(roomData?.jid)) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
169
234
|
const existing = state.rooms[roomData.jid];
|
|
170
235
|
let lastViewed;
|
|
171
236
|
const serverMarker = state.privateStoreMarkers?.[roomData.jid] || 0;
|
|
@@ -190,11 +255,17 @@ const upsertRoom = (state, roomData) => {
|
|
|
190
255
|
const existingMessages = Array.isArray(existing?.messages) ? existing.messages : [];
|
|
191
256
|
state.rooms[roomData.jid] = {
|
|
192
257
|
...roomData,
|
|
258
|
+
usersCnt: resolveIncomingUsersCnt(roomData, existing),
|
|
259
|
+
// A seed for the room-list preview: take the freshest API value but
|
|
260
|
+
// never let a payload without one erase what is already there.
|
|
261
|
+
lastMessage: roomData.lastMessage ?? existing?.lastMessage,
|
|
262
|
+
...resolveApiUnread(state, roomData.jid, roomData, existing),
|
|
193
263
|
icon: roomData.icon !== undefined ? roomData.icon : existing?.icon,
|
|
194
264
|
roomBg: roomData.roomBg !== undefined ? roomData.roomBg : existing?.roomBg,
|
|
195
265
|
messages: existingMessages.length > 0 ? existingMessages : incomingMessages,
|
|
196
266
|
lastViewedTimestamp: lastViewed,
|
|
197
|
-
|
|
267
|
+
// A server-seeded count must not badge a room that is open right now.
|
|
268
|
+
unreadMessages: roomData.apiUnreadCount !== undefined && (state.activeRoomJID === roomData.jid || state.visibleRoomJID === roomData.jid) ? existing?.unreadMessages ?? 0 : roomData.unreadMessages ?? existing?.unreadMessages ?? 0,
|
|
198
269
|
unreadBaselineTimestamp: existing?.unreadBaselineTimestamp ?? existing?.lastViewedTimestamp ?? roomData.unreadBaselineTimestamp ?? 0
|
|
199
270
|
};
|
|
200
271
|
};
|
|
@@ -363,6 +434,40 @@ function mergeHistoryIntoCache(existing, fetched) {
|
|
|
363
434
|
const merged = collapseCallLogDuplicates(Array.from(byId.values()).sort(byMs));
|
|
364
435
|
return [...capTail(merged), ...pending];
|
|
365
436
|
}
|
|
437
|
+
|
|
438
|
+
/** A message found in the archive that the chat cannot show in place. */
|
|
439
|
+
|
|
440
|
+
/** A request to scroll a room's transcript to one message. */
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* A short slice of a room's archive around one message, shown INSTEAD of the
|
|
444
|
+
* live list while the reader is away from the tail (a search jump to a message
|
|
445
|
+
* far back). Separate from room.messages on purpose: it is not contiguous with
|
|
446
|
+
* the live history, so it must not touch messageStats or historyComplete.
|
|
447
|
+
* Never persisted.
|
|
448
|
+
*/
|
|
449
|
+
|
|
450
|
+
/** The window is trimmed on the far side past this many messages. */
|
|
451
|
+
export const JUMP_WINDOW_MAX_MESSAGES = 300;
|
|
452
|
+
const mergeWindowMessages = (a, b) => {
|
|
453
|
+
const seen = new Set();
|
|
454
|
+
const merged = [];
|
|
455
|
+
for (const message of [...a, ...b]) {
|
|
456
|
+
const key = String(message.id);
|
|
457
|
+
if (seen.has(key)) {
|
|
458
|
+
continue;
|
|
459
|
+
}
|
|
460
|
+
seen.add(key);
|
|
461
|
+
merged.push(message);
|
|
462
|
+
}
|
|
463
|
+
const num = message => {
|
|
464
|
+
const id = Number(message.id);
|
|
465
|
+
return Number.isFinite(id) && id > 0 ? id : new Date(message.date).getTime();
|
|
466
|
+
};
|
|
467
|
+
// Archive ids are microsecond stanza ids and ascending in time; fall back to
|
|
468
|
+
// the date when an id is not numeric.
|
|
469
|
+
return merged.sort((x, y) => num(x) - num(y));
|
|
470
|
+
};
|
|
366
471
|
const initialState = {
|
|
367
472
|
rooms: {},
|
|
368
473
|
activeRoomJID: null,
|
|
@@ -377,14 +482,89 @@ const initialState = {
|
|
|
377
482
|
},
|
|
378
483
|
pendingNotificationJid: null,
|
|
379
484
|
privateStoreMarkers: {},
|
|
485
|
+
pendingJump: null,
|
|
486
|
+
joiningRoomJID: null,
|
|
380
487
|
readBoundaries: {},
|
|
488
|
+
usersSet: {},
|
|
489
|
+
jumpWindow: null,
|
|
490
|
+
archivedMessage: null,
|
|
381
491
|
pendingReactions: {}
|
|
382
492
|
};
|
|
383
493
|
const isValidRoomJid = jid => {
|
|
384
|
-
if (
|
|
385
|
-
|
|
494
|
+
if (!isSafeKey(jid)) {
|
|
495
|
+
return false;
|
|
496
|
+
}
|
|
497
|
+
if (!jid.includes('@')) {
|
|
498
|
+
return false;
|
|
499
|
+
}
|
|
386
500
|
return true;
|
|
387
501
|
};
|
|
502
|
+
|
|
503
|
+
/**
|
|
504
|
+
* Visits every stored copy of one message: the live copy in
|
|
505
|
+
* state.rooms[jid].messages and, when a jump window is open on that room, the
|
|
506
|
+
* window's separate copy. The window is a second list of the same messages, so
|
|
507
|
+
* every reducer that mutates ONE message must go through this or the reader
|
|
508
|
+
* sees stale edits/reactions/delivery state while away from the live tail.
|
|
509
|
+
* `matches` is an id, or a predicate when a reducer also matches on xmppId.
|
|
510
|
+
*/
|
|
511
|
+
const forEachMessageCopy = (state, jid, matches, fn) => {
|
|
512
|
+
const pred = typeof matches === 'function' ? matches : message => message.id === matches;
|
|
513
|
+
const live = state.rooms[jid]?.messages;
|
|
514
|
+
if (Array.isArray(live)) {
|
|
515
|
+
for (const message of live) {
|
|
516
|
+
if (pred(message)) {
|
|
517
|
+
fn(message);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
const win = state.jumpWindow;
|
|
522
|
+
if (win && win.roomJID === jid && Array.isArray(win.messages)) {
|
|
523
|
+
for (const message of win.messages) {
|
|
524
|
+
if (pred(message)) {
|
|
525
|
+
fn(message);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
};
|
|
530
|
+
|
|
531
|
+
/**
|
|
532
|
+
* usersCnt after a /chats/my refresh. The API reports the true total in
|
|
533
|
+
* `usersCnt` but at most 30 `members` for a big room, so the members array
|
|
534
|
+
* length is only a floor; and a count already known (a larger one from an
|
|
535
|
+
* earlier response or a live join) is never lowered by a refresh.
|
|
536
|
+
*/
|
|
537
|
+
const resolveIncomingUsersCnt = (incoming, existing) => {
|
|
538
|
+
const apiTotal = typeof incoming.usersCnt === 'number' && incoming.usersCnt > 0 ? incoming.usersCnt : 0;
|
|
539
|
+
const membersLen = Array.isArray(incoming.members) ? incoming.members.length : 0;
|
|
540
|
+
const next = Math.max(apiTotal, membersLen);
|
|
541
|
+
return Math.max(next, existing ? getRoomUserCount(existing) : 0);
|
|
542
|
+
};
|
|
543
|
+
|
|
544
|
+
/**
|
|
545
|
+
* The server-reported unread snapshot of a room after an incoming /chats/my
|
|
546
|
+
* item: the freshest API value wins while the user is not looking at the
|
|
547
|
+
* room; one being read right now keeps none. Absent from the response =
|
|
548
|
+
* keep what an earlier, richer response set.
|
|
549
|
+
*/
|
|
550
|
+
const resolveApiUnread = (state, jid, incoming, existing) => {
|
|
551
|
+
if (state.activeRoomJID === jid || state.visibleRoomJID === jid) {
|
|
552
|
+
return {
|
|
553
|
+
apiUnreadCount: undefined,
|
|
554
|
+
apiUnreadSeededAt: undefined
|
|
555
|
+
};
|
|
556
|
+
}
|
|
557
|
+
if (incoming.apiUnreadCount !== undefined) {
|
|
558
|
+
return {
|
|
559
|
+
apiUnreadCount: incoming.apiUnreadCount,
|
|
560
|
+
apiUnreadSeededAt: incoming.apiUnreadSeededAt ?? Date.now()
|
|
561
|
+
};
|
|
562
|
+
}
|
|
563
|
+
return {
|
|
564
|
+
apiUnreadCount: existing?.apiUnreadCount,
|
|
565
|
+
apiUnreadSeededAt: existing?.apiUnreadSeededAt
|
|
566
|
+
};
|
|
567
|
+
};
|
|
388
568
|
export const addRoomViaApi = createAsyncThunk('roomMessages/addRoomViaApi', async ({
|
|
389
569
|
room,
|
|
390
570
|
xmpp
|
|
@@ -437,6 +617,9 @@ const reducers = {
|
|
|
437
617
|
const {
|
|
438
618
|
jid
|
|
439
619
|
} = action.payload;
|
|
620
|
+
if (!isSafeKey(jid)) {
|
|
621
|
+
return;
|
|
622
|
+
}
|
|
440
623
|
if (state.rooms[jid]) {
|
|
441
624
|
delete state.rooms[jid];
|
|
442
625
|
if (state.visibleRoomJID === jid) {
|
|
@@ -449,19 +632,40 @@ const reducers = {
|
|
|
449
632
|
jid,
|
|
450
633
|
updates
|
|
451
634
|
} = action.payload;
|
|
635
|
+
if (!isSafeKey(jid)) {
|
|
636
|
+
return;
|
|
637
|
+
}
|
|
452
638
|
const existingRoom = state.rooms[jid];
|
|
453
|
-
if (existingRoom) {
|
|
454
|
-
|
|
455
|
-
...existingRoom,
|
|
456
|
-
...updates
|
|
457
|
-
};
|
|
639
|
+
if (!existingRoom) {
|
|
640
|
+
return;
|
|
458
641
|
}
|
|
642
|
+
const merged = {
|
|
643
|
+
...existingRoom,
|
|
644
|
+
...updates
|
|
645
|
+
};
|
|
646
|
+
if (typeof updates.usersCnt === 'number') {
|
|
647
|
+
// An explicit count (a live join or leave) is taken as given, with the
|
|
648
|
+
// known members as a floor.
|
|
649
|
+
const newMembers = Array.isArray(updates.members) ? updates.members : existingRoom.members;
|
|
650
|
+
const floor = Array.isArray(newMembers) ? newMembers.length : 0;
|
|
651
|
+
merged.usersCnt = Math.max(updates.usersCnt, floor);
|
|
652
|
+
} else if (Array.isArray(updates.members)) {
|
|
653
|
+
// A members-only refresh of a truncated big room (usersCnt > the
|
|
654
|
+
// first page) must not collapse the true total to the page length.
|
|
655
|
+
const prevMembers = Array.isArray(existingRoom.members) ? existingRoom.members.length : 0;
|
|
656
|
+
const prevCnt = typeof existingRoom.usersCnt === 'number' ? existingRoom.usersCnt : 0;
|
|
657
|
+
merged.usersCnt = prevCnt > prevMembers ? Math.max(prevCnt, updates.members.length) : updates.members.length;
|
|
658
|
+
}
|
|
659
|
+
state.rooms[jid] = merged;
|
|
459
660
|
},
|
|
460
661
|
setRoomMessages(state, action) {
|
|
461
662
|
const {
|
|
462
663
|
roomJID,
|
|
463
664
|
messages
|
|
464
665
|
} = action.payload;
|
|
666
|
+
if (!isSafeKey(roomJID)) {
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
465
669
|
if (state.rooms[roomJID]) {
|
|
466
670
|
// Cap to the runtime limit on replace too — guards against a
|
|
467
671
|
// single MAM page returning more than the limit (would balloon
|
|
@@ -475,6 +679,9 @@ const reducers = {
|
|
|
475
679
|
roomJID,
|
|
476
680
|
messageId
|
|
477
681
|
} = action.payload;
|
|
682
|
+
if (!isSafeKey(roomJID)) {
|
|
683
|
+
return;
|
|
684
|
+
}
|
|
478
685
|
const room = state.rooms[roomJID];
|
|
479
686
|
if (!room?.messages) {
|
|
480
687
|
return;
|
|
@@ -491,11 +698,9 @@ const reducers = {
|
|
|
491
698
|
}
|
|
492
699
|
return;
|
|
493
700
|
}
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
message.reaction = undefined;
|
|
498
|
-
}
|
|
701
|
+
forEachMessageCopy(state, roomJID, messageId, message => {
|
|
702
|
+
message.isDeleted = true;
|
|
703
|
+
message.reaction = undefined;
|
|
499
704
|
});
|
|
500
705
|
},
|
|
501
706
|
setEditAction: (state, action) => {
|
|
@@ -516,30 +721,77 @@ const reducers = {
|
|
|
516
721
|
messageId,
|
|
517
722
|
text
|
|
518
723
|
} = action.payload;
|
|
519
|
-
if (
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
724
|
+
if (!isSafeKey(roomJID)) {
|
|
725
|
+
return;
|
|
726
|
+
}
|
|
727
|
+
// Edited in place on every copy (live list and jump window).
|
|
728
|
+
forEachMessageCopy(state, roomJID, messageId, message => {
|
|
729
|
+
message.body = text;
|
|
730
|
+
// Flag the correction so the bubble can render an "edited" marker.
|
|
731
|
+
// Covers both the author's own edit and edits from other users -
|
|
732
|
+
// every <replace> echo flows through here.
|
|
733
|
+
message.isEdited = true;
|
|
734
|
+
});
|
|
735
|
+
},
|
|
736
|
+
/**
|
|
737
|
+
* Hard removal, unlike `deleteRoomMessage`'s tombstone. For optimistic
|
|
738
|
+
* messages that never made it onto the wire.
|
|
739
|
+
*/
|
|
740
|
+
removeRoomMessage(state, action) {
|
|
741
|
+
const {
|
|
742
|
+
roomJID,
|
|
743
|
+
messageId
|
|
744
|
+
} = action.payload;
|
|
745
|
+
if (!isSafeKey(roomJID)) {
|
|
746
|
+
return;
|
|
747
|
+
}
|
|
748
|
+
if (state.rooms[roomJID]?.messages) {
|
|
749
|
+
state.rooms[roomJID].messages = state.rooms[roomJID].messages.filter(message => message.id !== messageId);
|
|
750
|
+
}
|
|
751
|
+
const win = state.jumpWindow;
|
|
752
|
+
if (win && win.roomJID === roomJID) {
|
|
753
|
+
win.messages = win.messages.filter(message => message.id !== messageId);
|
|
529
754
|
}
|
|
530
755
|
},
|
|
756
|
+
/**
|
|
757
|
+
* Caches one translation onto the message it belongs to, keyed by the
|
|
758
|
+
* locale tag the translate service echoed back. Applied to the live
|
|
759
|
+
* copy and the jump window's copy.
|
|
760
|
+
*/
|
|
761
|
+
setMessageTranslation(state, action) {
|
|
762
|
+
const {
|
|
763
|
+
roomJID,
|
|
764
|
+
messageId,
|
|
765
|
+
locale,
|
|
766
|
+
entry
|
|
767
|
+
} = action.payload;
|
|
768
|
+
if (!isSafeKey(roomJID) || !isSafeKey(locale)) {
|
|
769
|
+
return;
|
|
770
|
+
}
|
|
771
|
+
forEachMessageCopy(state, roomJID, messageId, message => {
|
|
772
|
+
if (!message.translations) {
|
|
773
|
+
message.translations = {};
|
|
774
|
+
}
|
|
775
|
+
message.translations[locale] = entry;
|
|
776
|
+
});
|
|
777
|
+
},
|
|
531
778
|
addRoomMessage(state, action) {
|
|
532
779
|
const {
|
|
533
780
|
roomJID,
|
|
534
781
|
message,
|
|
535
782
|
start
|
|
536
783
|
} = action.payload;
|
|
784
|
+
if (!isSafeKey(roomJID)) {
|
|
785
|
+
return;
|
|
786
|
+
}
|
|
537
787
|
const lengthBefore = state.rooms[roomJID]?.messages?.length || 0;
|
|
538
788
|
const outcome = insertRoomMessage(state, roomJID, message, start);
|
|
539
789
|
if (outcome.grew) {
|
|
540
790
|
capAfterGrowth(state.rooms[roomJID].messages, lengthBefore, outcome.atHead);
|
|
541
791
|
}
|
|
542
792
|
bumpLastMessageTimestamp(state, roomJID, message);
|
|
793
|
+
// Keep the jump window's copy in step with the live list.
|
|
794
|
+
syncJumpWindowWithMessage(state, roomJID, message, start, true);
|
|
543
795
|
},
|
|
544
796
|
/**
|
|
545
797
|
* A whole page of messages (a MAM history page) in ONE action: the same
|
|
@@ -553,7 +805,7 @@ const reducers = {
|
|
|
553
805
|
messages,
|
|
554
806
|
start
|
|
555
807
|
} = action.payload;
|
|
556
|
-
if (!state.rooms[roomJID] || !Array.isArray(messages)) {
|
|
808
|
+
if (!isSafeKey(roomJID) || !state.rooms[roomJID] || !Array.isArray(messages)) {
|
|
557
809
|
return;
|
|
558
810
|
}
|
|
559
811
|
const lengthBefore = state.rooms[roomJID].messages?.length || 0;
|
|
@@ -571,6 +823,9 @@ const reducers = {
|
|
|
571
823
|
if (!newest || Number(message?.id) > Number(newest.id)) {
|
|
572
824
|
newest = message;
|
|
573
825
|
}
|
|
826
|
+
// History pages never append to a reader's jump window (they are not
|
|
827
|
+
// "the newest message"); they only refresh copies it already holds.
|
|
828
|
+
syncJumpWindowWithMessage(state, roomJID, message, start, false);
|
|
574
829
|
}
|
|
575
830
|
if (grew) {
|
|
576
831
|
// A page that only prepended older history is never trimmed.
|
|
@@ -582,6 +837,7 @@ const reducers = {
|
|
|
582
837
|
},
|
|
583
838
|
deleteAllRooms(state) {
|
|
584
839
|
state.rooms = {};
|
|
840
|
+
state.jumpWindow = null;
|
|
585
841
|
state.visibleRoomJID = null;
|
|
586
842
|
state.privateStoreMarkers = {};
|
|
587
843
|
state.readBoundaries = {};
|
|
@@ -593,6 +849,9 @@ const reducers = {
|
|
|
593
849
|
composing,
|
|
594
850
|
composingList
|
|
595
851
|
} = action.payload;
|
|
852
|
+
if (!isSafeKey(chatJID) || !state.rooms[chatJID]) {
|
|
853
|
+
return;
|
|
854
|
+
}
|
|
596
855
|
state.rooms[chatJID].composing = composing;
|
|
597
856
|
state.rooms[chatJID].composingList = composingList;
|
|
598
857
|
},
|
|
@@ -602,7 +861,7 @@ const reducers = {
|
|
|
602
861
|
loading,
|
|
603
862
|
loadingText
|
|
604
863
|
} = action.payload;
|
|
605
|
-
if (chatJID && state.rooms?.[chatJID]) {
|
|
864
|
+
if (isSafeKey(chatJID) && state.rooms?.[chatJID]) {
|
|
606
865
|
state.rooms[chatJID].isLoading = loading;
|
|
607
866
|
}
|
|
608
867
|
state.isLoading = loading;
|
|
@@ -616,7 +875,7 @@ const reducers = {
|
|
|
616
875
|
chatJID,
|
|
617
876
|
timestamp
|
|
618
877
|
} = action.payload;
|
|
619
|
-
if (state.rooms[chatJID]) {
|
|
878
|
+
if (isSafeKey(chatJID) && state.rooms[chatJID]) {
|
|
620
879
|
state.rooms[chatJID].lastViewedTimestamp = timestamp;
|
|
621
880
|
// A non-positive timestamp means "no persisted marker yet" and
|
|
622
881
|
// must not inflate unread from history that predates the first
|
|
@@ -667,7 +926,7 @@ const reducers = {
|
|
|
667
926
|
}
|
|
668
927
|
for (const jid of Object.keys(markers)) {
|
|
669
928
|
const ts = Number(markers[jid]);
|
|
670
|
-
if (!jid || !Number.isFinite(ts) || ts <= 0) {
|
|
929
|
+
if (!isSafeKey(jid) || !Number.isFinite(ts) || ts <= 0) {
|
|
671
930
|
continue;
|
|
672
931
|
}
|
|
673
932
|
const room = state.rooms[jid];
|
|
@@ -711,7 +970,7 @@ const reducers = {
|
|
|
711
970
|
jid,
|
|
712
971
|
ts
|
|
713
972
|
} = action.payload;
|
|
714
|
-
if (!jid) {
|
|
973
|
+
if (!isSafeKey(jid)) {
|
|
715
974
|
return;
|
|
716
975
|
}
|
|
717
976
|
if (!state.readBoundaries) {
|
|
@@ -733,7 +992,7 @@ const reducers = {
|
|
|
733
992
|
const {
|
|
734
993
|
jid
|
|
735
994
|
} = action.payload;
|
|
736
|
-
if (jid && state.readBoundaries) {
|
|
995
|
+
if (isSafeKey(jid) && state.readBoundaries) {
|
|
737
996
|
delete state.readBoundaries[jid];
|
|
738
997
|
}
|
|
739
998
|
},
|
|
@@ -742,7 +1001,7 @@ const reducers = {
|
|
|
742
1001
|
chatJID,
|
|
743
1002
|
role
|
|
744
1003
|
} = action.payload;
|
|
745
|
-
if (state.rooms[chatJID]) {
|
|
1004
|
+
if (isSafeKey(chatJID) && state.rooms[chatJID]) {
|
|
746
1005
|
state.rooms[chatJID].role = role;
|
|
747
1006
|
}
|
|
748
1007
|
},
|
|
@@ -751,20 +1010,40 @@ const reducers = {
|
|
|
751
1010
|
value,
|
|
752
1011
|
chatJID
|
|
753
1012
|
} = action.payload;
|
|
754
|
-
if (chatJID) {
|
|
1013
|
+
if (isSafeKey(chatJID) && state.rooms[chatJID]) {
|
|
755
1014
|
state.rooms[chatJID].noMessages = value;
|
|
756
1015
|
}
|
|
757
1016
|
},
|
|
758
1017
|
setCurrentRoom: (state, action) => {
|
|
759
1018
|
// Accept null/empty so callers can clear the active room (e.g.
|
|
760
1019
|
// back button from chat → return to RoomList). Mirrors web.
|
|
761
|
-
|
|
1020
|
+
const {
|
|
1021
|
+
roomJID
|
|
1022
|
+
} = action.payload;
|
|
1023
|
+
if (roomJID && !isSafeKey(roomJID)) {
|
|
1024
|
+
return;
|
|
1025
|
+
}
|
|
1026
|
+
state.activeRoomJID = roomJID || '';
|
|
1027
|
+
// Opening a room reads it: the server's earlier unread count no longer
|
|
1028
|
+
// applies (the unread middleware would otherwise bring it back the
|
|
1029
|
+
// moment the user leaves the room again).
|
|
1030
|
+
if (roomJID && state.rooms[roomJID]?.apiUnreadCount !== undefined) {
|
|
1031
|
+
state.rooms[roomJID].apiUnreadCount = undefined;
|
|
1032
|
+
state.rooms[roomJID].apiUnreadSeededAt = undefined;
|
|
1033
|
+
state.rooms[roomJID].unreadMessages = 0;
|
|
1034
|
+
}
|
|
762
1035
|
},
|
|
763
1036
|
setVisibleRoom: (state, action) => {
|
|
764
|
-
|
|
1037
|
+
const requested = action.payload.roomJID;
|
|
1038
|
+
if (requested && !isSafeKey(requested)) {
|
|
1039
|
+
return;
|
|
1040
|
+
}
|
|
1041
|
+
state.visibleRoomJID = requested || null;
|
|
765
1042
|
const jid = state.visibleRoomJID;
|
|
766
1043
|
if (jid && state.rooms[jid]) {
|
|
767
1044
|
state.rooms[jid].unreadMessages = 0;
|
|
1045
|
+
state.rooms[jid].apiUnreadCount = undefined;
|
|
1046
|
+
state.rooms[jid].apiUnreadSeededAt = undefined;
|
|
768
1047
|
}
|
|
769
1048
|
},
|
|
770
1049
|
clearVisibleRoom: state => {
|
|
@@ -787,6 +1066,81 @@ const reducers = {
|
|
|
787
1066
|
clearPendingNotificationJid: state => {
|
|
788
1067
|
state.pendingNotificationJid = null;
|
|
789
1068
|
},
|
|
1069
|
+
requestJumpToMessage: (state, action) => {
|
|
1070
|
+
const ids = action.payload.ids.filter(Boolean);
|
|
1071
|
+
const canMatchByContent = Boolean(action.payload.createdAt && action.payload.body);
|
|
1072
|
+
if (!action.payload.roomJID || ids.length === 0 && !canMatchByContent) {
|
|
1073
|
+
return;
|
|
1074
|
+
}
|
|
1075
|
+
state.pendingJump = {
|
|
1076
|
+
roomJID: action.payload.roomJID,
|
|
1077
|
+
ids,
|
|
1078
|
+
createdAt: action.payload.createdAt,
|
|
1079
|
+
body: action.payload.body,
|
|
1080
|
+
preview: action.payload.preview,
|
|
1081
|
+
at: Date.now()
|
|
1082
|
+
};
|
|
1083
|
+
},
|
|
1084
|
+
clearPendingJump: state => {
|
|
1085
|
+
state.pendingJump = null;
|
|
1086
|
+
},
|
|
1087
|
+
showArchivedMessage: (state, action) => {
|
|
1088
|
+
state.archivedMessage = action.payload;
|
|
1089
|
+
},
|
|
1090
|
+
clearArchivedMessage: state => {
|
|
1091
|
+
state.archivedMessage = null;
|
|
1092
|
+
},
|
|
1093
|
+
setJumpWindow: (state, action) => {
|
|
1094
|
+
state.jumpWindow = {
|
|
1095
|
+
...action.payload,
|
|
1096
|
+
messages: mergeWindowMessages(action.payload.messages, [])
|
|
1097
|
+
};
|
|
1098
|
+
},
|
|
1099
|
+
prependJumpWindowMessages: (state, action) => {
|
|
1100
|
+
const win = state.jumpWindow;
|
|
1101
|
+
if (!win || win.roomJID !== action.payload.roomJID) {
|
|
1102
|
+
return;
|
|
1103
|
+
}
|
|
1104
|
+
win.messages = mergeWindowMessages(action.payload.messages, win.messages);
|
|
1105
|
+
win.olderCursor = action.payload.olderCursor;
|
|
1106
|
+
win.hasOlder = action.payload.hasOlder;
|
|
1107
|
+
if (win.messages.length > JUMP_WINDOW_MAX_MESSAGES) {
|
|
1108
|
+
// Reader is going up: drop the far (newest) side and page it again if
|
|
1109
|
+
// they come back down.
|
|
1110
|
+
win.messages = win.messages.slice(0, JUMP_WINDOW_MAX_MESSAGES);
|
|
1111
|
+
const newest = Number(win.messages[win.messages.length - 1].id);
|
|
1112
|
+
win.newerCursor = Number.isFinite(newest) ? newest : win.newerCursor;
|
|
1113
|
+
win.hasNewer = true;
|
|
1114
|
+
}
|
|
1115
|
+
},
|
|
1116
|
+
appendJumpWindowMessages: (state, action) => {
|
|
1117
|
+
const win = state.jumpWindow;
|
|
1118
|
+
if (!win || win.roomJID !== action.payload.roomJID) {
|
|
1119
|
+
return;
|
|
1120
|
+
}
|
|
1121
|
+
win.messages = mergeWindowMessages(win.messages, action.payload.messages);
|
|
1122
|
+
win.newerCursor = action.payload.newerCursor;
|
|
1123
|
+
win.hasNewer = action.payload.hasNewer;
|
|
1124
|
+
if (win.messages.length > JUMP_WINDOW_MAX_MESSAGES) {
|
|
1125
|
+
win.messages = win.messages.slice(-JUMP_WINDOW_MAX_MESSAGES);
|
|
1126
|
+
const oldest = Number(win.messages[0].id);
|
|
1127
|
+
win.olderCursor = Number.isFinite(oldest) ? oldest : win.olderCursor;
|
|
1128
|
+
win.hasOlder = true;
|
|
1129
|
+
}
|
|
1130
|
+
},
|
|
1131
|
+
clearJumpWindow: state => {
|
|
1132
|
+
state.jumpWindow = null;
|
|
1133
|
+
},
|
|
1134
|
+
setJoiningRoom: (state, action) => {
|
|
1135
|
+
state.joiningRoomJID = action.payload || null;
|
|
1136
|
+
},
|
|
1137
|
+
// Only clears when it still names that room, so a slow join for a room
|
|
1138
|
+
// the user already left cannot wipe the join of the current one.
|
|
1139
|
+
clearJoiningRoom: (state, action) => {
|
|
1140
|
+
if (state.joiningRoomJID === action.payload) {
|
|
1141
|
+
state.joiningRoomJID = null;
|
|
1142
|
+
}
|
|
1143
|
+
},
|
|
790
1144
|
/**
|
|
791
1145
|
* Stamp a message in `state.rooms[roomJID].messages` with an updated
|
|
792
1146
|
* reactions list. The reactionsMiddleware listens for this action to
|
|
@@ -801,13 +1155,21 @@ const reducers = {
|
|
|
801
1155
|
data,
|
|
802
1156
|
latestReactionTimestamp
|
|
803
1157
|
} = action.payload;
|
|
804
|
-
if (!from) {
|
|
1158
|
+
if (!isSafeKey(roomJID) || !from) {
|
|
805
1159
|
return;
|
|
806
1160
|
}
|
|
807
|
-
|
|
808
|
-
const
|
|
809
|
-
if (
|
|
810
|
-
|
|
1161
|
+
// `fromId` becomes a property name on the message's reaction map.
|
|
1162
|
+
const fromId = String(from).split('/')[0].split('@')[0];
|
|
1163
|
+
if (!isSafeKey(fromId)) {
|
|
1164
|
+
return;
|
|
1165
|
+
}
|
|
1166
|
+
let found = false;
|
|
1167
|
+
// Applied on every stored copy (live list and jump window).
|
|
1168
|
+
forEachMessageCopy(state, roomJID, msg => msg?.id === messageId || msg?.xmppId === messageId, message => {
|
|
1169
|
+
found = true;
|
|
1170
|
+
applyReactionToMessage(message, from, reactions, data, latestReactionTimestamp);
|
|
1171
|
+
});
|
|
1172
|
+
if (found) {
|
|
811
1173
|
return;
|
|
812
1174
|
}
|
|
813
1175
|
// The message is not loaded (yet): keep the reaction for it.
|
|
@@ -834,27 +1196,42 @@ const reducers = {
|
|
|
834
1196
|
state.isUnreadSyncing = false;
|
|
835
1197
|
state.privateStoreMarkers = {};
|
|
836
1198
|
state.readBoundaries = {};
|
|
1199
|
+
state.usersSet = {};
|
|
1200
|
+
state.jumpWindow = null;
|
|
1201
|
+
state.archivedMessage = null;
|
|
1202
|
+
state.pendingJump = null;
|
|
837
1203
|
},
|
|
838
1204
|
setActiveMessage: (state, action) => {
|
|
839
1205
|
const {
|
|
840
1206
|
id,
|
|
841
1207
|
chatJID
|
|
842
1208
|
} = action.payload;
|
|
843
|
-
state.rooms[chatJID]
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
1209
|
+
if (!isSafeKey(chatJID) || !state.rooms[chatJID]) {
|
|
1210
|
+
return;
|
|
1211
|
+
}
|
|
1212
|
+
const flag = message => {
|
|
1213
|
+
message.activeMessage = message.id === id;
|
|
1214
|
+
};
|
|
1215
|
+
state.rooms[chatJID].messages.forEach(flag);
|
|
1216
|
+
if (state.jumpWindow?.roomJID === chatJID) {
|
|
1217
|
+
state.jumpWindow.messages.forEach(flag);
|
|
1218
|
+
}
|
|
850
1219
|
},
|
|
851
1220
|
setCloseActiveMessage: (state, action) => {
|
|
852
1221
|
const {
|
|
853
1222
|
chatJID
|
|
854
1223
|
} = action.payload;
|
|
855
|
-
state.rooms[chatJID]
|
|
1224
|
+
if (!isSafeKey(chatJID) || !state.rooms[chatJID]) {
|
|
1225
|
+
return;
|
|
1226
|
+
}
|
|
1227
|
+
state.rooms[chatJID].messages.forEach(message => {
|
|
856
1228
|
message.activeMessage = false;
|
|
857
1229
|
});
|
|
1230
|
+
if (state.jumpWindow?.roomJID === chatJID) {
|
|
1231
|
+
state.jumpWindow.messages.forEach(message => {
|
|
1232
|
+
message.activeMessage = false;
|
|
1233
|
+
});
|
|
1234
|
+
}
|
|
858
1235
|
},
|
|
859
1236
|
/**
|
|
860
1237
|
* Batched update used by the history preload scheduler. Each patch is
|
|
@@ -873,15 +1250,14 @@ const reducers = {
|
|
|
873
1250
|
...existing,
|
|
874
1251
|
...room,
|
|
875
1252
|
title: room.title || existing?.title || room.title,
|
|
876
|
-
usersCnt: (
|
|
877
|
-
const incoming = typeof room.usersCnt === 'number' && room.usersCnt > 0 ? room.usersCnt : 0;
|
|
878
|
-
const previous = typeof existing?.usersCnt === 'number' && existing.usersCnt > 0 ? existing.usersCnt : 0;
|
|
879
|
-
if (incoming === 0 && previous === 0) return room.usersCnt;
|
|
880
|
-
return Math.max(incoming, previous);
|
|
881
|
-
})(),
|
|
1253
|
+
usersCnt: resolveIncomingUsersCnt(room, existing),
|
|
882
1254
|
icon: room.icon ?? existing?.icon,
|
|
883
1255
|
messages: existingMessages.length > 0 ? existingMessages : incomingMessages,
|
|
1256
|
+
// A seed for the room-list preview (the API's `lastMessage`): take the
|
|
1257
|
+
// freshest value, never let a refresh without one erase it.
|
|
1258
|
+
lastMessage: room.lastMessage ?? existing?.lastMessage,
|
|
884
1259
|
unreadMessages: existing?.unreadMessages ?? room.unreadMessages ?? 0,
|
|
1260
|
+
...resolveApiUnread(state, room.jid, room, existing),
|
|
885
1261
|
lastViewedTimestamp: existing?.lastViewedTimestamp ?? room.lastViewedTimestamp ?? 0,
|
|
886
1262
|
unreadBaselineTimestamp: existing?.unreadBaselineTimestamp ?? existing?.lastViewedTimestamp ?? room.unreadBaselineTimestamp ?? room.lastViewedTimestamp ?? 0,
|
|
887
1263
|
composingList: existing?.composingList ?? room.composingList,
|
|
@@ -897,8 +1273,11 @@ const reducers = {
|
|
|
897
1273
|
rooms
|
|
898
1274
|
} = action.payload;
|
|
899
1275
|
for (const patch of rooms) {
|
|
1276
|
+
if (!isSafeKey(patch?.jid)) {
|
|
1277
|
+
continue;
|
|
1278
|
+
}
|
|
900
1279
|
const room = state.rooms[patch.jid];
|
|
901
|
-
if (!room) {
|
|
1280
|
+
if (!room || typeof room !== 'object' || Array.isArray(room)) {
|
|
902
1281
|
continue;
|
|
903
1282
|
}
|
|
904
1283
|
if (typeof patch.historyPreloadState !== 'undefined') {
|
|
@@ -910,6 +1289,12 @@ const reducers = {
|
|
|
910
1289
|
if (typeof patch.historyComplete !== 'undefined') {
|
|
911
1290
|
room.historyComplete = patch.historyComplete;
|
|
912
1291
|
}
|
|
1292
|
+
if (patch.messageStats) {
|
|
1293
|
+
room.messageStats = {
|
|
1294
|
+
...room.messageStats,
|
|
1295
|
+
...patch.messageStats
|
|
1296
|
+
};
|
|
1297
|
+
}
|
|
913
1298
|
if (Array.isArray(patch.messages)) {
|
|
914
1299
|
for (const m of patch.messages) {
|
|
915
1300
|
takePendingReactions(state, patch.jid, m);
|
|
@@ -927,10 +1312,13 @@ const reducers = {
|
|
|
927
1312
|
// part and the full jid so either lookup style hits — a message's
|
|
928
1313
|
// `user.id` can be either depending on how it was parsed.
|
|
929
1314
|
mergeUsersSet(state, action) {
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
1315
|
+
// A real merge with a cap: fresh entries win (and move to the newest
|
|
1316
|
+
// position), entries fetched lazily earlier stay, the oldest-inserted
|
|
1317
|
+
// are evicted past USERS_SET_CAP. Unsafe keys are skipped.
|
|
1318
|
+
if (!state.usersSet || typeof state.usersSet !== 'object') {
|
|
1319
|
+
state.usersSet = {};
|
|
1320
|
+
}
|
|
1321
|
+
mergeIntoUsersSet(state.usersSet, action.payload?.members || {});
|
|
934
1322
|
}
|
|
935
1323
|
};
|
|
936
1324
|
export const roomsStore = createSlice({
|
|
@@ -1050,8 +1438,21 @@ export const {
|
|
|
1050
1438
|
setUnreadCounts,
|
|
1051
1439
|
setPendingNotificationJid,
|
|
1052
1440
|
clearPendingNotificationJid,
|
|
1441
|
+
requestJumpToMessage,
|
|
1442
|
+
clearPendingJump,
|
|
1443
|
+
setJoiningRoom,
|
|
1444
|
+
clearJoiningRoom,
|
|
1053
1445
|
setReactions,
|
|
1054
|
-
mergeUsersSet
|
|
1446
|
+
mergeUsersSet,
|
|
1447
|
+
removeRoomMessage,
|
|
1448
|
+
addRoomFromApi,
|
|
1449
|
+
setMessageTranslation,
|
|
1450
|
+
showArchivedMessage,
|
|
1451
|
+
clearArchivedMessage,
|
|
1452
|
+
setJumpWindow,
|
|
1453
|
+
prependJumpWindowMessages,
|
|
1454
|
+
appendJumpWindowMessages,
|
|
1455
|
+
clearJumpWindow
|
|
1055
1456
|
} = roomsStore.actions;
|
|
1056
1457
|
export default roomsStore.reducer;
|
|
1057
1458
|
//# sourceMappingURL=roomsSlice.js.map
|