@ethora/chat-component-rn 26.9.1 → 26.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/README.md +19 -0
- package/lib/commonjs/assets/icons.js +2 -2
- package/lib/commonjs/assets/icons.js.map +1 -1
- package/lib/commonjs/components/Header/HeaderRoomList.js +22 -6
- package/lib/commonjs/components/Header/HeaderRoomList.js.map +1 -1
- package/lib/commonjs/components/InputComponents/Search.js +38 -1
- package/lib/commonjs/components/InputComponents/Search.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ArchivedMessageCard.js +166 -0
- package/lib/commonjs/components/MainComponents/ArchivedMessageCard.js.map +1 -0
- package/lib/commonjs/components/MainComponents/ChatHeader.js +22 -5
- package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatRoom.js +56 -25
- package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatWrapper.js +31 -1
- package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MediaMessage.js +18 -3
- package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MessageList.js +739 -42
- package/lib/commonjs/components/MainComponents/MessageList.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MessageSearchButton.js +58 -0
- package/lib/commonjs/components/MainComponents/MessageSearchButton.js.map +1 -0
- package/lib/commonjs/components/MainComponents/ReduxWrapper.js +15 -6
- package/lib/commonjs/components/MainComponents/ReduxWrapper.js.map +1 -1
- package/lib/commonjs/components/MainComponents/RoomList.js +110 -1
- package/lib/commonjs/components/MainComponents/RoomList.js.map +1 -1
- package/lib/commonjs/components/Menu/HeaderRoomListMenu.js +14 -3
- package/lib/commonjs/components/Menu/HeaderRoomListMenu.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/BubbleHighlight.js +112 -0
- package/lib/commonjs/components/MessageBubble/BubbleHighlight.js.map +1 -0
- package/lib/commonjs/components/MessageBubble/Message.js +169 -125
- package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/MessageInteractions.js +98 -78
- package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/messageMenuLayout.js +50 -0
- package/lib/commonjs/components/MessageBubble/messageMenuLayout.js.map +1 -0
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +73 -37
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/commonjs/components/Modals/MessageSearchModal/MessageHitResults.js +253 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/MessageHitResults.js.map +1 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/MessageSearchModal.js +488 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/MessageSearchModal.js.map +1 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/openHit.js +51 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/openHit.js.map +1 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/resolveSender.js +47 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/resolveSender.js.map +1 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/searchFilters.js +83 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/searchFilters.js.map +1 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/snippet.js +61 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/snippet.js.map +1 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/useMessageSearch.js +136 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/useMessageSearch.js.map +1 -0
- package/lib/commonjs/components/Modals/PublicChatsModal/PublicChatsModal.js +306 -0
- package/lib/commonjs/components/Modals/PublicChatsModal/PublicChatsModal.js.map +1 -0
- package/lib/commonjs/components/Modals/PublicChatsModal/publicChatsLogic.js +36 -0
- package/lib/commonjs/components/Modals/PublicChatsModal/publicChatsLogic.js.map +1 -0
- package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js +8 -1
- package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.js +14 -12
- package/lib/commonjs/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.js +41 -39
- package/lib/commonjs/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js +137 -50
- package/lib/commonjs/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/ProfileShares/ProfileShares.js +15 -13
- package/lib/commonjs/components/Modals/SettingsModals/ProfileShares/ProfileShares.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/Referrals/Referrals.js +57 -55
- package/lib/commonjs/components/Modals/SettingsModals/Referrals/Referrals.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/SharedStyledComponents.js +15 -1
- package/lib/commonjs/components/Modals/SettingsModals/SharedStyledComponents.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/Visibility/VisibilityModal.js +61 -59
- package/lib/commonjs/components/Modals/SettingsModals/Visibility/VisibilityModal.js.map +1 -1
- package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js +8 -3
- package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +13 -2
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/SwipeableRoomRow.js +38 -6
- package/lib/commonjs/components/RoomComponents/SwipeableRoomRow.js.map +1 -1
- package/lib/commonjs/components/Thread/ThreadHeader.js +3 -1
- package/lib/commonjs/components/Thread/ThreadHeader.js.map +1 -1
- package/lib/commonjs/components/Thread/ThreadWrapper.js +90 -10
- package/lib/commonjs/components/Thread/ThreadWrapper.js.map +1 -1
- package/lib/commonjs/components/styled/AudioDecoderHost.js +338 -0
- package/lib/commonjs/components/styled/AudioDecoderHost.js.map +1 -0
- package/lib/commonjs/components/styled/AudioMessage.js +493 -420
- package/lib/commonjs/components/styled/AudioMessage.js.map +1 -1
- package/lib/commonjs/components/styled/SendInput.js +31 -5
- package/lib/commonjs/components/styled/SendInput.js.map +1 -1
- package/lib/commonjs/context/MessageNotificationContext.js +14 -4
- package/lib/commonjs/context/MessageNotificationContext.js.map +1 -1
- package/lib/commonjs/context/xmppProvider.js +41 -77
- package/lib/commonjs/context/xmppProvider.js.map +1 -1
- package/lib/commonjs/helpers/audioWaveform.js +165 -0
- package/lib/commonjs/helpers/audioWaveform.js.map +1 -0
- package/lib/commonjs/helpers/backgroundJoinSweep.js +36 -0
- package/lib/commonjs/helpers/backgroundJoinSweep.js.map +1 -0
- package/lib/commonjs/helpers/bubbleHighlight.js +44 -0
- package/lib/commonjs/helpers/bubbleHighlight.js.map +1 -0
- package/lib/commonjs/helpers/checkUniqueUsers.js +14 -12
- package/lib/commonjs/helpers/checkUniqueUsers.js.map +1 -1
- package/lib/commonjs/helpers/constants/MODAL_COMPONENTS.js +5 -1
- package/lib/commonjs/helpers/constants/MODAL_COMPONENTS.js.map +1 -1
- package/lib/commonjs/helpers/constants/MODAL_TYPES.js +3 -1
- package/lib/commonjs/helpers/constants/MODAL_TYPES.js.map +1 -1
- package/lib/commonjs/helpers/createRoomFromApi.js +40 -3
- package/lib/commonjs/helpers/createRoomFromApi.js.map +1 -1
- package/lib/commonjs/helpers/dedupeMembers.js +34 -0
- package/lib/commonjs/helpers/dedupeMembers.js.map +1 -0
- package/lib/commonjs/helpers/ethoraLogger.js +56 -0
- package/lib/commonjs/helpers/ethoraLogger.js.map +1 -0
- package/lib/commonjs/helpers/getUnnamedUsers.js +9 -4
- package/lib/commonjs/helpers/getUnnamedUsers.js.map +1 -1
- package/lib/commonjs/helpers/historyPreloadConfig.js +44 -0
- package/lib/commonjs/helpers/historyPreloadConfig.js.map +1 -0
- package/lib/commonjs/helpers/historyPreloadScheduler.js +372 -137
- package/lib/commonjs/helpers/historyPreloadScheduler.js.map +1 -1
- package/lib/commonjs/helpers/initRoomsPresence.js +17 -5
- package/lib/commonjs/helpers/initRoomsPresence.js.map +1 -1
- package/lib/commonjs/helpers/insertMessageWithDelimiter.js +5 -0
- package/lib/commonjs/helpers/insertMessageWithDelimiter.js.map +1 -1
- package/lib/commonjs/helpers/isLikelyMucJid.js +67 -0
- package/lib/commonjs/helpers/isLikelyMucJid.js.map +1 -0
- package/lib/commonjs/helpers/isMessageSearchEnabled.js +18 -0
- package/lib/commonjs/helpers/isMessageSearchEnabled.js.map +1 -0
- package/lib/commonjs/helpers/joiningRoom.js +14 -0
- package/lib/commonjs/helpers/joiningRoom.js.map +1 -0
- package/lib/commonjs/helpers/jumpThread.js +100 -0
- package/lib/commonjs/helpers/jumpThread.js.map +1 -0
- package/lib/commonjs/helpers/jumpToMessage.js +58 -0
- package/lib/commonjs/helpers/jumpToMessage.js.map +1 -0
- package/lib/commonjs/helpers/jumpWindow.js +187 -0
- package/lib/commonjs/helpers/jumpWindow.js.map +1 -0
- package/lib/commonjs/helpers/loadRoomHistory.js +75 -0
- package/lib/commonjs/helpers/loadRoomHistory.js.map +1 -0
- package/lib/commonjs/helpers/notificationPolicy.js +77 -0
- package/lib/commonjs/helpers/notificationPolicy.js.map +1 -0
- package/lib/commonjs/helpers/openRoomAtMessage.js +47 -0
- package/lib/commonjs/helpers/openRoomAtMessage.js.map +1 -0
- package/lib/commonjs/helpers/openThreadForJump.js +72 -0
- package/lib/commonjs/helpers/openThreadForJump.js.map +1 -0
- package/lib/commonjs/helpers/parseMessageReference.js +27 -8
- package/lib/commonjs/helpers/parseMessageReference.js.map +1 -1
- package/lib/commonjs/helpers/publicChatsEntry.js +17 -0
- package/lib/commonjs/helpers/publicChatsEntry.js.map +1 -0
- package/lib/commonjs/helpers/roomActivityScore.js +37 -0
- package/lib/commonjs/helpers/roomActivityScore.js.map +1 -0
- package/lib/commonjs/helpers/roomUserCount.js +36 -0
- package/lib/commonjs/helpers/roomUserCount.js.map +1 -0
- package/lib/commonjs/helpers/runConfiguredHistoryPreload.js +68 -0
- package/lib/commonjs/helpers/runConfiguredHistoryPreload.js.map +1 -0
- package/lib/commonjs/helpers/sessionAppId.js +24 -0
- package/lib/commonjs/helpers/sessionAppId.js.map +1 -0
- package/lib/commonjs/helpers/timestamp.js +43 -0
- package/lib/commonjs/helpers/timestamp.js.map +1 -0
- package/lib/commonjs/helpers/userResolver.js +517 -0
- package/lib/commonjs/helpers/userResolver.js.map +1 -0
- package/lib/commonjs/helpers/xmppIdShape.js +52 -0
- package/lib/commonjs/helpers/xmppIdShape.js.map +1 -0
- package/lib/commonjs/hooks/useChatWrapperInit.js +27 -5
- package/lib/commonjs/hooks/useChatWrapperInit.js.map +1 -1
- package/lib/commonjs/hooks/useHeapSender.js +54 -3
- package/lib/commonjs/hooks/useHeapSender.js.map +1 -1
- package/lib/commonjs/hooks/useJumpToMessage.js +411 -0
- package/lib/commonjs/hooks/useJumpToMessage.js.map +1 -0
- package/lib/commonjs/hooks/useMessageLoaderQueue.js +32 -5
- package/lib/commonjs/hooks/useMessageLoaderQueue.js.map +1 -1
- package/lib/commonjs/hooks/useMessageQueue.js +13 -5
- package/lib/commonjs/hooks/useMessageQueue.js.map +1 -1
- package/lib/commonjs/hooks/useRoomDirectory.js +29 -0
- package/lib/commonjs/hooks/useRoomDirectory.js.map +1 -0
- package/lib/commonjs/hooks/useRoomInitialization.js +27 -5
- package/lib/commonjs/hooks/useRoomInitialization.js.map +1 -1
- package/lib/commonjs/hooks/useRoomMute.js +62 -0
- package/lib/commonjs/hooks/useRoomMute.js.map +1 -0
- package/lib/commonjs/hooks/useRoomState.js +3 -1
- package/lib/commonjs/hooks/useRoomState.js.map +1 -1
- package/lib/commonjs/hooks/useSendMessage.js +13 -3
- package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
- package/lib/commonjs/i18n/strings.js +312 -6
- package/lib/commonjs/i18n/strings.js.map +1 -1
- package/lib/commonjs/networking/api-requests/messageSearch.api.js +87 -0
- package/lib/commonjs/networking/api-requests/messageSearch.api.js.map +1 -0
- package/lib/commonjs/networking/api-requests/publicChats.api.js +48 -0
- package/lib/commonjs/networking/api-requests/publicChats.api.js.map +1 -0
- package/lib/commonjs/networking/api-requests/roomMembers.api.js +253 -4
- package/lib/commonjs/networking/api-requests/roomMembers.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/rooms.api.js +48 -12
- package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/user.api.js +32 -3
- package/lib/commonjs/networking/api-requests/user.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/xmppToken.api.js +71 -0
- package/lib/commonjs/networking/api-requests/xmppToken.api.js.map +1 -0
- package/lib/commonjs/networking/ethoraEvents.js +227 -0
- package/lib/commonjs/networking/ethoraEvents.js.map +1 -0
- package/lib/commonjs/networking/stanzaHandlers.js +153 -16
- package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
- package/lib/commonjs/networking/xmpp/allRoomPresences.xmpp.js +124 -3
- package/lib/commonjs/networking/xmpp/allRoomPresences.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/getHistory.xmpp.js +319 -35
- package/lib/commonjs/networking/xmpp/getHistory.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js +7 -0
- package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/historyCursor.js +101 -0
- package/lib/commonjs/networking/xmpp/historyCursor.js.map +1 -0
- package/lib/commonjs/networking/xmpp/mamQueryIds.js +17 -0
- package/lib/commonjs/networking/xmpp/mamQueryIds.js.map +1 -0
- package/lib/commonjs/networking/xmpp/mamRouter.js +24 -9
- package/lib/commonjs/networking/xmpp/mamRouter.js.map +1 -1
- package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js +70 -65
- package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/roomJoinSweep.js +389 -0
- package/lib/commonjs/networking/xmpp/roomJoinSweep.js.map +1 -0
- package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js +0 -1
- package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js +0 -1
- package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +0 -1
- package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmppClient.js +269 -41
- package/lib/commonjs/networking/xmppClient.js.map +1 -1
- package/lib/commonjs/networking/xmppCredentials.js +80 -0
- package/lib/commonjs/networking/xmppCredentials.js.map +1 -0
- package/lib/commonjs/roomStore/Middleware/jumpThreadMiddleware.js +158 -0
- package/lib/commonjs/roomStore/Middleware/jumpThreadMiddleware.js.map +1 -0
- package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js +6 -0
- package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
- package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js +45 -7
- package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js.map +1 -1
- package/lib/commonjs/roomStore/chatSettingsSlice.js +21 -1
- package/lib/commonjs/roomStore/chatSettingsSlice.js.map +1 -1
- package/lib/commonjs/roomStore/index.js +13 -3
- package/lib/commonjs/roomStore/index.js.map +1 -1
- package/lib/commonjs/roomStore/persistence.js +48 -1
- package/lib/commonjs/roomStore/persistence.js.map +1 -1
- package/lib/commonjs/roomStore/roomsSlice.js +474 -60
- package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
- package/lib/commonjs/roomStore/safeKey.js +44 -0
- package/lib/commonjs/roomStore/safeKey.js.map +1 -0
- package/lib/commonjs/roomStore/usersSetCap.js +37 -0
- package/lib/commonjs/roomStore/usersSetCap.js.map +1 -0
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/assets/icons.js +1 -1
- package/lib/module/assets/icons.js.map +1 -1
- package/lib/module/components/Header/HeaderRoomList.js +23 -7
- package/lib/module/components/Header/HeaderRoomList.js.map +1 -1
- package/lib/module/components/InputComponents/Search.js +39 -2
- package/lib/module/components/InputComponents/Search.js.map +1 -1
- package/lib/module/components/MainComponents/ArchivedMessageCard.js +161 -0
- package/lib/module/components/MainComponents/ArchivedMessageCard.js.map +1 -0
- package/lib/module/components/MainComponents/ChatHeader.js +22 -5
- package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/module/components/MainComponents/ChatRoom.js +57 -26
- package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/module/components/MainComponents/ChatWrapper.js +31 -1
- package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
- package/lib/module/components/MainComponents/MediaMessage.js +18 -3
- package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
- package/lib/module/components/MainComponents/MessageList.js +740 -42
- package/lib/module/components/MainComponents/MessageList.js.map +1 -1
- package/lib/module/components/MainComponents/MessageSearchButton.js +48 -0
- package/lib/module/components/MainComponents/MessageSearchButton.js.map +1 -0
- package/lib/module/components/MainComponents/ReduxWrapper.js +15 -7
- package/lib/module/components/MainComponents/ReduxWrapper.js.map +1 -1
- package/lib/module/components/MainComponents/RoomList.js +111 -2
- package/lib/module/components/MainComponents/RoomList.js.map +1 -1
- package/lib/module/components/Menu/HeaderRoomListMenu.js +15 -4
- package/lib/module/components/Menu/HeaderRoomListMenu.js.map +1 -1
- package/lib/module/components/MessageBubble/BubbleHighlight.js +106 -0
- package/lib/module/components/MessageBubble/BubbleHighlight.js.map +1 -0
- package/lib/module/components/MessageBubble/Message.js +172 -127
- package/lib/module/components/MessageBubble/Message.js.map +1 -1
- package/lib/module/components/MessageBubble/MessageInteractions.js +98 -78
- package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
- package/lib/module/components/MessageBubble/messageMenuLayout.js +45 -0
- package/lib/module/components/MessageBubble/messageMenuLayout.js.map +1 -0
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +74 -38
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/module/components/Modals/MessageSearchModal/MessageHitResults.js +243 -0
- package/lib/module/components/Modals/MessageSearchModal/MessageHitResults.js.map +1 -0
- package/lib/module/components/Modals/MessageSearchModal/MessageSearchModal.js +482 -0
- package/lib/module/components/Modals/MessageSearchModal/MessageSearchModal.js.map +1 -0
- package/lib/module/components/Modals/MessageSearchModal/openHit.js +45 -0
- package/lib/module/components/Modals/MessageSearchModal/openHit.js.map +1 -0
- package/lib/module/components/Modals/MessageSearchModal/resolveSender.js +41 -0
- package/lib/module/components/Modals/MessageSearchModal/resolveSender.js.map +1 -0
- package/lib/module/components/Modals/MessageSearchModal/searchFilters.js +74 -0
- package/lib/module/components/Modals/MessageSearchModal/searchFilters.js.map +1 -0
- package/lib/module/components/Modals/MessageSearchModal/snippet.js +57 -0
- package/lib/module/components/Modals/MessageSearchModal/snippet.js.map +1 -0
- package/lib/module/components/Modals/MessageSearchModal/useMessageSearch.js +131 -0
- package/lib/module/components/Modals/MessageSearchModal/useMessageSearch.js.map +1 -0
- package/lib/module/components/Modals/PublicChatsModal/PublicChatsModal.js +300 -0
- package/lib/module/components/Modals/PublicChatsModal/PublicChatsModal.js.map +1 -0
- package/lib/module/components/Modals/PublicChatsModal/publicChatsLogic.js +30 -0
- package/lib/module/components/Modals/PublicChatsModal/publicChatsLogic.js.map +1 -0
- package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js +8 -1
- package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.js +15 -13
- package/lib/module/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.js +42 -40
- package/lib/module/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js +138 -52
- package/lib/module/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/ProfileShares/ProfileShares.js +16 -14
- package/lib/module/components/Modals/SettingsModals/ProfileShares/ProfileShares.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/Referrals/Referrals.js +58 -56
- package/lib/module/components/Modals/SettingsModals/Referrals/Referrals.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/SharedStyledComponents.js +14 -0
- package/lib/module/components/Modals/SettingsModals/SharedStyledComponents.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/Visibility/VisibilityModal.js +62 -60
- package/lib/module/components/Modals/SettingsModals/Visibility/VisibilityModal.js.map +1 -1
- package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js +9 -4
- package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
- package/lib/module/components/RoomComponents/ChatRoomItem.js +14 -3
- package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
- package/lib/module/components/RoomComponents/SwipeableRoomRow.js +39 -7
- package/lib/module/components/RoomComponents/SwipeableRoomRow.js.map +1 -1
- package/lib/module/components/Thread/ThreadHeader.js +3 -1
- package/lib/module/components/Thread/ThreadHeader.js.map +1 -1
- package/lib/module/components/Thread/ThreadWrapper.js +89 -9
- package/lib/module/components/Thread/ThreadWrapper.js.map +1 -1
- package/lib/module/components/styled/AudioDecoderHost.js +332 -0
- package/lib/module/components/styled/AudioDecoderHost.js.map +1 -0
- package/lib/module/components/styled/AudioMessage.js +495 -422
- package/lib/module/components/styled/AudioMessage.js.map +1 -1
- package/lib/module/components/styled/SendInput.js +32 -6
- package/lib/module/components/styled/SendInput.js.map +1 -1
- package/lib/module/context/MessageNotificationContext.js +15 -5
- package/lib/module/context/MessageNotificationContext.js.map +1 -1
- package/lib/module/context/xmppProvider.js +42 -78
- package/lib/module/context/xmppProvider.js.map +1 -1
- package/lib/module/helpers/audioWaveform.js +153 -0
- package/lib/module/helpers/audioWaveform.js.map +1 -0
- package/lib/module/helpers/backgroundJoinSweep.js +30 -0
- package/lib/module/helpers/backgroundJoinSweep.js.map +1 -0
- package/lib/module/helpers/bubbleHighlight.js +38 -0
- package/lib/module/helpers/bubbleHighlight.js.map +1 -0
- package/lib/module/helpers/checkUniqueUsers.js +15 -13
- package/lib/module/helpers/checkUniqueUsers.js.map +1 -1
- package/lib/module/helpers/constants/MODAL_COMPONENTS.js +5 -1
- package/lib/module/helpers/constants/MODAL_COMPONENTS.js.map +1 -1
- package/lib/module/helpers/constants/MODAL_TYPES.js +3 -1
- package/lib/module/helpers/constants/MODAL_TYPES.js.map +1 -1
- package/lib/module/helpers/createRoomFromApi.js +37 -3
- package/lib/module/helpers/createRoomFromApi.js.map +1 -1
- package/lib/module/helpers/dedupeMembers.js +28 -0
- package/lib/module/helpers/dedupeMembers.js.map +1 -0
- package/lib/module/helpers/ethoraLogger.js +52 -0
- package/lib/module/helpers/ethoraLogger.js.map +1 -0
- package/lib/module/helpers/getUnnamedUsers.js +9 -4
- package/lib/module/helpers/getUnnamedUsers.js.map +1 -1
- package/lib/module/helpers/historyPreloadConfig.js +39 -0
- package/lib/module/helpers/historyPreloadConfig.js.map +1 -0
- package/lib/module/helpers/historyPreloadScheduler.js +368 -134
- package/lib/module/helpers/historyPreloadScheduler.js.map +1 -1
- package/lib/module/helpers/initRoomsPresence.js +18 -5
- package/lib/module/helpers/initRoomsPresence.js.map +1 -1
- package/lib/module/helpers/insertMessageWithDelimiter.js +5 -0
- package/lib/module/helpers/insertMessageWithDelimiter.js.map +1 -1
- package/lib/module/helpers/isLikelyMucJid.js +60 -0
- package/lib/module/helpers/isLikelyMucJid.js.map +1 -0
- package/lib/module/helpers/isMessageSearchEnabled.js +13 -0
- package/lib/module/helpers/isMessageSearchEnabled.js.map +1 -0
- package/lib/module/helpers/joiningRoom.js +9 -0
- package/lib/module/helpers/joiningRoom.js.map +1 -0
- package/lib/module/helpers/jumpThread.js +83 -0
- package/lib/module/helpers/jumpThread.js.map +1 -0
- package/lib/module/helpers/jumpToMessage.js +52 -0
- package/lib/module/helpers/jumpToMessage.js.map +1 -0
- package/lib/module/helpers/jumpWindow.js +177 -0
- package/lib/module/helpers/jumpWindow.js.map +1 -0
- package/lib/module/helpers/loadRoomHistory.js +69 -0
- package/lib/module/helpers/loadRoomHistory.js.map +1 -0
- package/lib/module/helpers/notificationPolicy.js +70 -0
- package/lib/module/helpers/notificationPolicy.js.map +1 -0
- package/lib/module/helpers/openRoomAtMessage.js +41 -0
- package/lib/module/helpers/openRoomAtMessage.js.map +1 -0
- package/lib/module/helpers/openThreadForJump.js +68 -0
- package/lib/module/helpers/openThreadForJump.js.map +1 -0
- package/lib/module/helpers/parseMessageReference.js +26 -6
- package/lib/module/helpers/parseMessageReference.js.map +1 -1
- package/lib/module/helpers/publicChatsEntry.js +12 -0
- package/lib/module/helpers/publicChatsEntry.js.map +1 -0
- package/lib/module/helpers/roomActivityScore.js +30 -0
- package/lib/module/helpers/roomActivityScore.js.map +1 -0
- package/lib/module/helpers/roomUserCount.js +29 -0
- package/lib/module/helpers/roomUserCount.js.map +1 -0
- package/lib/module/helpers/runConfiguredHistoryPreload.js +63 -0
- package/lib/module/helpers/runConfiguredHistoryPreload.js.map +1 -0
- package/lib/module/helpers/sessionAppId.js +20 -0
- package/lib/module/helpers/sessionAppId.js.map +1 -0
- package/lib/module/helpers/timestamp.js +37 -0
- package/lib/module/helpers/timestamp.js.map +1 -0
- package/lib/module/helpers/userResolver.js +503 -0
- package/lib/module/helpers/userResolver.js.map +1 -0
- package/lib/module/helpers/xmppIdShape.js +46 -0
- package/lib/module/helpers/xmppIdShape.js.map +1 -0
- package/lib/module/hooks/useChatWrapperInit.js +16 -5
- package/lib/module/hooks/useChatWrapperInit.js.map +1 -1
- package/lib/module/hooks/useHeapSender.js +54 -3
- package/lib/module/hooks/useHeapSender.js.map +1 -1
- package/lib/module/hooks/useJumpToMessage.js +389 -0
- package/lib/module/hooks/useJumpToMessage.js.map +1 -0
- package/lib/module/hooks/useMessageLoaderQueue.js +32 -5
- package/lib/module/hooks/useMessageLoaderQueue.js.map +1 -1
- package/lib/module/hooks/useMessageQueue.js +13 -5
- package/lib/module/hooks/useMessageQueue.js.map +1 -1
- package/lib/module/hooks/useRoomDirectory.js +24 -0
- package/lib/module/hooks/useRoomDirectory.js.map +1 -0
- package/lib/module/hooks/useRoomInitialization.js +29 -7
- package/lib/module/hooks/useRoomInitialization.js.map +1 -1
- package/lib/module/hooks/useRoomMute.js +58 -0
- package/lib/module/hooks/useRoomMute.js.map +1 -0
- package/lib/module/hooks/useRoomState.js +3 -1
- package/lib/module/hooks/useRoomState.js.map +1 -1
- package/lib/module/hooks/useSendMessage.js +13 -3
- package/lib/module/hooks/useSendMessage.js.map +1 -1
- package/lib/module/i18n/strings.js +312 -6
- package/lib/module/i18n/strings.js.map +1 -1
- package/lib/module/networking/api-requests/messageSearch.api.js +81 -0
- package/lib/module/networking/api-requests/messageSearch.api.js.map +1 -0
- package/lib/module/networking/api-requests/publicChats.api.js +43 -0
- package/lib/module/networking/api-requests/publicChats.api.js.map +1 -0
- package/lib/module/networking/api-requests/roomMembers.api.js +248 -4
- package/lib/module/networking/api-requests/roomMembers.api.js.map +1 -1
- package/lib/module/networking/api-requests/rooms.api.js +48 -12
- package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
- package/lib/module/networking/api-requests/user.api.js +31 -3
- package/lib/module/networking/api-requests/user.api.js.map +1 -1
- package/lib/module/networking/api-requests/xmppToken.api.js +66 -0
- package/lib/module/networking/api-requests/xmppToken.api.js.map +1 -0
- package/lib/module/networking/ethoraEvents.js +220 -0
- package/lib/module/networking/ethoraEvents.js.map +1 -0
- package/lib/module/networking/stanzaHandlers.js +155 -18
- package/lib/module/networking/stanzaHandlers.js.map +1 -1
- package/lib/module/networking/xmpp/allRoomPresences.xmpp.js +125 -3
- package/lib/module/networking/xmpp/allRoomPresences.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/getHistory.xmpp.js +318 -35
- package/lib/module/networking/xmpp/getHistory.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/handleStanzas.xmpp.js +7 -0
- package/lib/module/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/historyCursor.js +95 -0
- package/lib/module/networking/xmpp/historyCursor.js.map +1 -0
- package/lib/module/networking/xmpp/mamQueryIds.js +12 -0
- package/lib/module/networking/xmpp/mamQueryIds.js.map +1 -0
- package/lib/module/networking/xmpp/mamRouter.js +22 -8
- package/lib/module/networking/xmpp/mamRouter.js.map +1 -1
- package/lib/module/networking/xmpp/presenceInRoom.xmpp.js +68 -62
- package/lib/module/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/roomJoinSweep.js +385 -0
- package/lib/module/networking/xmpp/roomJoinSweep.js.map +1 -0
- package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js +0 -1
- package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/sendTextMessage.xmpp.js +0 -1
- package/lib/module/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +0 -1
- package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
- package/lib/module/networking/xmppClient.js +269 -41
- package/lib/module/networking/xmppClient.js.map +1 -1
- package/lib/module/networking/xmppCredentials.js +76 -0
- package/lib/module/networking/xmppCredentials.js.map +1 -0
- package/lib/module/roomStore/Middleware/jumpThreadMiddleware.js +153 -0
- package/lib/module/roomStore/Middleware/jumpThreadMiddleware.js.map +1 -0
- package/lib/module/roomStore/Middleware/reactionsMiddleware.js +6 -0
- package/lib/module/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
- package/lib/module/roomStore/Middleware/unreadMidlleware.js +46 -7
- package/lib/module/roomStore/Middleware/unreadMidlleware.js.map +1 -1
- package/lib/module/roomStore/chatSettingsSlice.js +19 -0
- package/lib/module/roomStore/chatSettingsSlice.js.map +1 -1
- package/lib/module/roomStore/index.js +7 -3
- package/lib/module/roomStore/index.js.map +1 -1
- package/lib/module/roomStore/persistence.js +46 -1
- package/lib/module/roomStore/persistence.js.map +1 -1
- package/lib/module/roomStore/roomsSlice.js +459 -58
- package/lib/module/roomStore/roomsSlice.js.map +1 -1
- package/lib/module/roomStore/safeKey.js +37 -0
- package/lib/module/roomStore/safeKey.js.map +1 -0
- package/lib/module/roomStore/usersSetCap.js +32 -0
- package/lib/module/roomStore/usersSetCap.js.map +1 -0
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/assets/icons.d.ts +4 -0
- package/lib/typescript/assets/icons.d.ts.map +1 -1
- package/lib/typescript/components/Header/HeaderRoomList.d.ts.map +1 -1
- package/lib/typescript/components/InputComponents/Search.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ArchivedMessageCard.d.ts +12 -0
- package/lib/typescript/components/MainComponents/ArchivedMessageCard.d.ts.map +1 -0
- package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MessageList.d.ts +22 -1
- package/lib/typescript/components/MainComponents/MessageList.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MessageSearchButton.d.ts +7 -0
- package/lib/typescript/components/MainComponents/MessageSearchButton.d.ts.map +1 -0
- package/lib/typescript/components/MainComponents/ReduxWrapper.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/RoomList.d.ts.map +1 -1
- package/lib/typescript/components/Menu/HeaderRoomListMenu.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/BubbleHighlight.d.ts +12 -0
- package/lib/typescript/components/MessageBubble/BubbleHighlight.d.ts.map +1 -0
- package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts +5 -0
- package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/messageMenuLayout.d.ts +29 -0
- package/lib/typescript/components/MessageBubble/messageMenuLayout.d.ts.map +1 -0
- package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts +2 -0
- package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/MessageSearchModal/MessageHitResults.d.ts +44 -0
- package/lib/typescript/components/Modals/MessageSearchModal/MessageHitResults.d.ts.map +1 -0
- package/lib/typescript/components/Modals/MessageSearchModal/MessageSearchModal.d.ts +12 -0
- package/lib/typescript/components/Modals/MessageSearchModal/MessageSearchModal.d.ts.map +1 -0
- package/lib/typescript/components/Modals/MessageSearchModal/openHit.d.ts +15 -0
- package/lib/typescript/components/Modals/MessageSearchModal/openHit.d.ts.map +1 -0
- package/lib/typescript/components/Modals/MessageSearchModal/resolveSender.d.ts +34 -0
- package/lib/typescript/components/Modals/MessageSearchModal/resolveSender.d.ts.map +1 -0
- package/lib/typescript/components/Modals/MessageSearchModal/searchFilters.d.ts +41 -0
- package/lib/typescript/components/Modals/MessageSearchModal/searchFilters.d.ts.map +1 -0
- package/lib/typescript/components/Modals/MessageSearchModal/snippet.d.ts +15 -0
- package/lib/typescript/components/Modals/MessageSearchModal/snippet.d.ts.map +1 -0
- package/lib/typescript/components/Modals/MessageSearchModal/useMessageSearch.d.ts +23 -0
- package/lib/typescript/components/Modals/MessageSearchModal/useMessageSearch.d.ts.map +1 -0
- package/lib/typescript/components/Modals/PublicChatsModal/PublicChatsModal.d.ts +16 -0
- package/lib/typescript/components/Modals/PublicChatsModal/PublicChatsModal.d.ts.map +1 -0
- package/lib/typescript/components/Modals/PublicChatsModal/publicChatsLogic.d.ts +14 -0
- package/lib/typescript/components/Modals/PublicChatsModal/publicChatsLogic.d.ts.map +1 -0
- package/lib/typescript/components/Modals/SelectUsersModal/SelectUsersModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/ProfileShares/ProfileShares.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/Referrals/Referrals.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/SharedStyledComponents.d.ts +1 -0
- package/lib/typescript/components/Modals/SettingsModals/SharedStyledComponents.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/Visibility/VisibilityModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/UserSettingsModal/UserSettingsModal.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/SwipeableRoomRow.d.ts +5 -1
- package/lib/typescript/components/RoomComponents/SwipeableRoomRow.d.ts.map +1 -1
- package/lib/typescript/components/Thread/ThreadHeader.d.ts.map +1 -1
- package/lib/typescript/components/Thread/ThreadWrapper.d.ts +1 -0
- package/lib/typescript/components/Thread/ThreadWrapper.d.ts.map +1 -1
- package/lib/typescript/components/styled/AudioDecoderHost.d.ts +39 -0
- package/lib/typescript/components/styled/AudioDecoderHost.d.ts.map +1 -0
- package/lib/typescript/components/styled/AudioMessage.d.ts +14 -1
- package/lib/typescript/components/styled/AudioMessage.d.ts.map +1 -1
- package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
- package/lib/typescript/context/MessageNotificationContext.d.ts.map +1 -1
- package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
- package/lib/typescript/helpers/audioWaveform.d.ts +54 -0
- package/lib/typescript/helpers/audioWaveform.d.ts.map +1 -0
- package/lib/typescript/helpers/backgroundJoinSweep.d.ts +14 -0
- package/lib/typescript/helpers/backgroundJoinSweep.d.ts.map +1 -0
- package/lib/typescript/helpers/bubbleHighlight.d.ts +17 -0
- package/lib/typescript/helpers/bubbleHighlight.d.ts.map +1 -0
- package/lib/typescript/helpers/checkUniqueUsers.d.ts +2 -2
- package/lib/typescript/helpers/checkUniqueUsers.d.ts.map +1 -1
- package/lib/typescript/helpers/constants/MODAL_COMPONENTS.d.ts.map +1 -1
- package/lib/typescript/helpers/constants/MODAL_TYPES.d.ts +2 -0
- package/lib/typescript/helpers/constants/MODAL_TYPES.d.ts.map +1 -1
- package/lib/typescript/helpers/createRoomFromApi.d.ts +25 -0
- package/lib/typescript/helpers/createRoomFromApi.d.ts.map +1 -1
- package/lib/typescript/helpers/dedupeMembers.d.ts +11 -0
- package/lib/typescript/helpers/dedupeMembers.d.ts.map +1 -0
- package/lib/typescript/helpers/ethoraLogger.d.ts +13 -0
- package/lib/typescript/helpers/ethoraLogger.d.ts.map +1 -0
- package/lib/typescript/helpers/getUnnamedUsers.d.ts.map +1 -1
- package/lib/typescript/helpers/historyPreloadConfig.d.ts +26 -0
- package/lib/typescript/helpers/historyPreloadConfig.d.ts.map +1 -0
- package/lib/typescript/helpers/historyPreloadScheduler.d.ts +8 -4
- package/lib/typescript/helpers/historyPreloadScheduler.d.ts.map +1 -1
- package/lib/typescript/helpers/initRoomsPresence.d.ts +7 -0
- package/lib/typescript/helpers/initRoomsPresence.d.ts.map +1 -1
- package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts.map +1 -1
- package/lib/typescript/helpers/isLikelyMucJid.d.ts +19 -0
- package/lib/typescript/helpers/isLikelyMucJid.d.ts.map +1 -0
- package/lib/typescript/helpers/isMessageSearchEnabled.d.ts +12 -0
- package/lib/typescript/helpers/isMessageSearchEnabled.d.ts.map +1 -0
- package/lib/typescript/helpers/joiningRoom.d.ts +7 -0
- package/lib/typescript/helpers/joiningRoom.d.ts.map +1 -0
- package/lib/typescript/helpers/jumpThread.d.ts +48 -0
- package/lib/typescript/helpers/jumpThread.d.ts.map +1 -0
- package/lib/typescript/helpers/jumpToMessage.d.ts +26 -0
- package/lib/typescript/helpers/jumpToMessage.d.ts.map +1 -0
- package/lib/typescript/helpers/jumpWindow.d.ts +74 -0
- package/lib/typescript/helpers/jumpWindow.d.ts.map +1 -0
- package/lib/typescript/helpers/loadRoomHistory.d.ts +34 -0
- package/lib/typescript/helpers/loadRoomHistory.d.ts.map +1 -0
- package/lib/typescript/helpers/notificationPolicy.d.ts +42 -0
- package/lib/typescript/helpers/notificationPolicy.d.ts.map +1 -0
- package/lib/typescript/helpers/openRoomAtMessage.d.ts +17 -0
- package/lib/typescript/helpers/openRoomAtMessage.d.ts.map +1 -0
- package/lib/typescript/helpers/openThreadForJump.d.ts +27 -0
- package/lib/typescript/helpers/openThreadForJump.d.ts.map +1 -0
- package/lib/typescript/helpers/parseMessageReference.d.ts +18 -5
- package/lib/typescript/helpers/parseMessageReference.d.ts.map +1 -1
- package/lib/typescript/helpers/publicChatsEntry.d.ts +11 -0
- package/lib/typescript/helpers/publicChatsEntry.d.ts.map +1 -0
- package/lib/typescript/helpers/roomActivityScore.d.ts +5 -0
- package/lib/typescript/helpers/roomActivityScore.d.ts.map +1 -0
- package/lib/typescript/helpers/roomUserCount.d.ts +20 -0
- package/lib/typescript/helpers/roomUserCount.d.ts.map +1 -0
- package/lib/typescript/helpers/runConfiguredHistoryPreload.d.ts +21 -0
- package/lib/typescript/helpers/runConfiguredHistoryPreload.d.ts.map +1 -0
- package/lib/typescript/helpers/sessionAppId.d.ts +8 -0
- package/lib/typescript/helpers/sessionAppId.d.ts.map +1 -0
- package/lib/typescript/helpers/timestamp.d.ts +3 -0
- package/lib/typescript/helpers/timestamp.d.ts.map +1 -0
- package/lib/typescript/helpers/userResolver.d.ts +58 -0
- package/lib/typescript/helpers/userResolver.d.ts.map +1 -0
- package/lib/typescript/helpers/xmppIdShape.d.ts +10 -0
- package/lib/typescript/helpers/xmppIdShape.d.ts.map +1 -0
- package/lib/typescript/hooks/useChatWrapperInit.d.ts +2 -0
- package/lib/typescript/hooks/useChatWrapperInit.d.ts.map +1 -1
- package/lib/typescript/hooks/useHeapSender.d.ts.map +1 -1
- package/lib/typescript/hooks/useJumpToMessage.d.ts +116 -0
- package/lib/typescript/hooks/useJumpToMessage.d.ts.map +1 -0
- package/lib/typescript/hooks/useMessageLoaderQueue.d.ts.map +1 -1
- package/lib/typescript/hooks/useMessageQueue.d.ts.map +1 -1
- package/lib/typescript/hooks/useRoomDirectory.d.ts +12 -0
- package/lib/typescript/hooks/useRoomDirectory.d.ts.map +1 -0
- package/lib/typescript/hooks/useRoomInitialization.d.ts.map +1 -1
- package/lib/typescript/hooks/useRoomMute.d.ts +8 -0
- package/lib/typescript/hooks/useRoomMute.d.ts.map +1 -0
- package/lib/typescript/hooks/useRoomState.d.ts +1 -0
- package/lib/typescript/hooks/useRoomState.d.ts.map +1 -1
- package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
- package/lib/typescript/i18n/strings.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/messageSearch.api.d.ts +57 -0
- package/lib/typescript/networking/api-requests/messageSearch.api.d.ts.map +1 -0
- package/lib/typescript/networking/api-requests/publicChats.api.d.ts +24 -0
- package/lib/typescript/networking/api-requests/publicChats.api.d.ts.map +1 -0
- package/lib/typescript/networking/api-requests/roomMembers.api.d.ts +19 -1
- package/lib/typescript/networking/api-requests/roomMembers.api.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/rooms.api.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/user.api.d.ts +8 -0
- package/lib/typescript/networking/api-requests/user.api.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/xmppToken.api.d.ts +2 -0
- package/lib/typescript/networking/api-requests/xmppToken.api.d.ts.map +1 -0
- package/lib/typescript/networking/ethoraEvents.d.ts +45 -0
- package/lib/typescript/networking/ethoraEvents.d.ts.map +1 -0
- package/lib/typescript/networking/stanzaHandlers.d.ts +1 -1
- package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/allRoomPresences.xmpp.d.ts +32 -1
- package/lib/typescript/networking/xmpp/allRoomPresences.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts +64 -0
- package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/historyCursor.d.ts +35 -0
- package/lib/typescript/networking/xmpp/historyCursor.d.ts.map +1 -0
- package/lib/typescript/networking/xmpp/mamQueryIds.d.ts +10 -0
- package/lib/typescript/networking/xmpp/mamQueryIds.d.ts.map +1 -0
- package/lib/typescript/networking/xmpp/mamRouter.d.ts +7 -0
- package/lib/typescript/networking/xmpp/mamRouter.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts +13 -2
- package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/roomJoinSweep.d.ts +82 -0
- package/lib/typescript/networking/xmpp/roomJoinSweep.d.ts.map +1 -0
- package/lib/typescript/networking/xmpp/sendMediaMessage.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/sendTextMessage.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmppClient.d.ts +90 -4
- package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
- package/lib/typescript/networking/xmppCredentials.d.ts +12 -0
- package/lib/typescript/networking/xmppCredentials.d.ts.map +1 -0
- package/lib/typescript/roomStore/Middleware/jumpThreadMiddleware.d.ts +3 -0
- package/lib/typescript/roomStore/Middleware/jumpThreadMiddleware.d.ts.map +1 -0
- package/lib/typescript/roomStore/Middleware/reactionsMiddleware.d.ts.map +1 -1
- package/lib/typescript/roomStore/Middleware/unreadMidlleware.d.ts.map +1 -1
- package/lib/typescript/roomStore/chatSettingsSlice.d.ts +8 -1
- package/lib/typescript/roomStore/chatSettingsSlice.d.ts.map +1 -1
- package/lib/typescript/roomStore/index.d.ts +2 -1
- package/lib/typescript/roomStore/index.d.ts.map +1 -1
- package/lib/typescript/roomStore/persistence.d.ts +8 -0
- package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
- package/lib/typescript/roomStore/roomsSlice.d.ts +138 -2
- package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
- package/lib/typescript/roomStore/safeKey.d.ts +13 -0
- package/lib/typescript/roomStore/safeKey.d.ts.map +1 -0
- package/lib/typescript/roomStore/usersSetCap.d.ts +16 -0
- package/lib/typescript/roomStore/usersSetCap.d.ts.map +1 -0
- package/lib/typescript/types/models/media.model.d.ts +2 -0
- package/lib/typescript/types/models/media.model.d.ts.map +1 -1
- package/lib/typescript/types/models/room.model.d.ts +18 -5
- package/lib/typescript/types/models/room.model.d.ts.map +1 -1
- package/lib/typescript/types/models/xmpp.model.d.ts +8 -1
- package/lib/typescript/types/models/xmpp.model.d.ts.map +1 -1
- package/lib/typescript/types/types.d.ts +88 -5
- package/lib/typescript/types/types.d.ts.map +1 -1
- package/lib/typescript/version.d.ts +1 -1
- package/lib/typescript/version.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/assets/icons.tsx +13 -0
- package/src/components/Header/HeaderRoomList.tsx +21 -4
- package/src/components/InputComponents/Search.tsx +33 -0
- package/src/components/MainComponents/ArchivedMessageCard.tsx +139 -0
- package/src/components/MainComponents/ChatHeader.tsx +19 -3
- package/src/components/MainComponents/ChatRoom.tsx +60 -23
- package/src/components/MainComponents/ChatWrapper.tsx +23 -4
- package/src/components/MainComponents/MediaMessage.tsx +17 -0
- package/src/components/MainComponents/MessageList.tsx +823 -84
- package/src/components/MainComponents/MessageSearchButton.tsx +48 -0
- package/src/components/MainComponents/ReduxWrapper.tsx +16 -5
- package/src/components/MainComponents/RoomList.tsx +125 -0
- package/src/components/Menu/HeaderRoomListMenu.tsx +26 -2
- package/src/components/MessageBubble/BubbleHighlight.tsx +106 -0
- package/src/components/MessageBubble/Message.tsx +265 -177
- package/src/components/MessageBubble/MessageInteractions.tsx +109 -86
- package/src/components/MessageBubble/messageMenuLayout.ts +59 -0
- package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +92 -21
- package/src/components/Modals/MessageSearchModal/MessageHitResults.tsx +271 -0
- package/src/components/Modals/MessageSearchModal/MessageSearchModal.tsx +487 -0
- package/src/components/Modals/MessageSearchModal/openHit.ts +50 -0
- package/src/components/Modals/MessageSearchModal/resolveSender.ts +57 -0
- package/src/components/Modals/MessageSearchModal/searchFilters.ts +109 -0
- package/src/components/Modals/MessageSearchModal/snippet.ts +58 -0
- package/src/components/Modals/MessageSearchModal/useMessageSearch.ts +151 -0
- package/src/components/Modals/PublicChatsModal/PublicChatsModal.tsx +288 -0
- package/src/components/Modals/PublicChatsModal/publicChatsLogic.ts +36 -0
- package/src/components/Modals/SelectUsersModal/SelectUsersModal.tsx +8 -1
- package/src/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.tsx +20 -17
- package/src/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.tsx +58 -55
- package/src/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.tsx +156 -62
- package/src/components/Modals/SettingsModals/ProfileShares/ProfileShares.tsx +22 -19
- package/src/components/Modals/SettingsModals/Referrals/Referrals.tsx +48 -45
- package/src/components/Modals/SettingsModals/SharedStyledComponents.ts +11 -0
- package/src/components/Modals/SettingsModals/Visibility/VisibilityModal.tsx +63 -60
- package/src/components/Modals/UserSettingsModal/UserSettingsModal.tsx +11 -3
- package/src/components/RoomComponents/ChatRoomItem.tsx +16 -3
- package/src/components/RoomComponents/SwipeableRoomRow.tsx +39 -6
- package/src/components/Thread/ThreadHeader.tsx +3 -1
- package/src/components/Thread/ThreadWrapper.tsx +96 -10
- package/src/components/styled/AudioDecoderHost.tsx +351 -0
- package/src/components/styled/AudioMessage.tsx +482 -425
- package/src/components/styled/SendInput.tsx +42 -4
- package/src/context/MessageNotificationContext.tsx +19 -5
- package/src/context/xmppProvider.tsx +44 -91
- package/src/helpers/audioWaveform.ts +142 -0
- package/src/helpers/backgroundJoinSweep.ts +35 -0
- package/src/helpers/bubbleHighlight.ts +47 -0
- package/src/helpers/checkUniqueUsers.tsx +15 -17
- package/src/helpers/constants/MODAL_COMPONENTS.tsx +4 -0
- package/src/helpers/constants/MODAL_TYPES.ts +3 -0
- package/src/helpers/createRoomFromApi.tsx +45 -4
- package/src/helpers/dedupeMembers.ts +29 -0
- package/src/helpers/ethoraLogger.ts +50 -0
- package/src/helpers/getUnnamedUsers.ts +7 -4
- package/src/helpers/historyPreloadConfig.ts +68 -0
- package/src/helpers/historyPreloadScheduler.ts +437 -199
- package/src/helpers/initRoomsPresence.ts +20 -7
- package/src/helpers/insertMessageWithDelimiter.ts +3 -0
- package/src/helpers/isLikelyMucJid.ts +72 -0
- package/src/helpers/isMessageSearchEnabled.ts +18 -0
- package/src/helpers/joiningRoom.ts +13 -0
- package/src/helpers/jumpThread.ts +102 -0
- package/src/helpers/jumpToMessage.ts +57 -0
- package/src/helpers/jumpWindow.ts +212 -0
- package/src/helpers/loadRoomHistory.ts +83 -0
- package/src/helpers/notificationPolicy.ts +82 -0
- package/src/helpers/openRoomAtMessage.ts +38 -0
- package/src/helpers/openThreadForJump.ts +96 -0
- package/src/helpers/parseMessageReference.ts +37 -8
- package/src/helpers/publicChatsEntry.ts +15 -0
- package/src/helpers/roomActivityScore.ts +45 -0
- package/src/helpers/roomUserCount.ts +44 -0
- package/src/helpers/runConfiguredHistoryPreload.ts +76 -0
- package/src/helpers/sessionAppId.ts +17 -0
- package/src/helpers/timestamp.ts +44 -0
- package/src/helpers/userResolver.ts +542 -0
- package/src/helpers/xmppIdShape.ts +46 -0
- package/src/hooks/useChatWrapperInit.ts +22 -4
- package/src/hooks/useHeapSender.tsx +54 -3
- package/src/hooks/useJumpToMessage.ts +538 -0
- package/src/hooks/useMessageLoaderQueue.tsx +40 -4
- package/src/hooks/useMessageQueue.ts +9 -5
- package/src/hooks/useRoomDirectory.ts +39 -0
- package/src/hooks/useRoomInitialization.tsx +33 -7
- package/src/hooks/useRoomMute.ts +42 -0
- package/src/hooks/useRoomState.tsx +6 -0
- package/src/hooks/useSendMessage.tsx +14 -2
- package/src/i18n/strings.ts +306 -0
- package/src/networking/api-requests/messageSearch.api.ts +130 -0
- package/src/networking/api-requests/publicChats.api.ts +71 -0
- package/src/networking/api-requests/roomMembers.api.ts +263 -11
- package/src/networking/api-requests/rooms.api.ts +52 -12
- package/src/networking/api-requests/user.api.ts +28 -2
- package/src/networking/api-requests/xmppToken.api.ts +62 -0
- package/src/networking/ethoraEvents.ts +262 -0
- package/src/networking/stanzaHandlers.ts +145 -19
- package/src/networking/xmpp/allRoomPresences.xmpp.ts +155 -5
- package/src/networking/xmpp/getHistory.xmpp.ts +433 -47
- package/src/networking/xmpp/handleStanzas.xmpp.ts +8 -0
- package/src/networking/xmpp/historyCursor.ts +124 -0
- package/src/networking/xmpp/mamQueryIds.ts +11 -0
- package/src/networking/xmpp/mamRouter.ts +24 -10
- package/src/networking/xmpp/presenceInRoom.xmpp.ts +91 -68
- package/src/networking/xmpp/roomJoinSweep.ts +412 -0
- package/src/networking/xmpp/sendMediaMessage.xmpp.ts +0 -1
- package/src/networking/xmpp/sendTextMessage.xmpp.ts +0 -1
- package/src/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.ts +0 -1
- package/src/networking/xmppClient.ts +323 -47
- package/src/networking/xmppCredentials.ts +87 -0
- package/src/roomStore/Middleware/jumpThreadMiddleware.ts +163 -0
- package/src/roomStore/Middleware/reactionsMiddleware.tsx +4 -0
- package/src/roomStore/Middleware/unreadMidlleware.tsx +59 -11
- package/src/roomStore/chatSettingsSlice.ts +17 -0
- package/src/roomStore/index.ts +10 -3
- package/src/roomStore/persistence.ts +54 -0
- package/src/roomStore/roomsSlice.ts +547 -65
- package/src/roomStore/safeKey.ts +49 -0
- package/src/roomStore/usersSetCap.ts +37 -0
- package/src/types/models/media.model.ts +4 -0
- package/src/types/models/room.model.ts +18 -5
- package/src/types/models/xmpp.model.ts +15 -1
- package/src/types/types.ts +93 -5
- package/src/version.ts +1 -1
|
@@ -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
|