@ethora/chat-component-rn 26.8.5 → 26.8.7
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 +26 -0
- package/README.md +95 -0
- package/lib/commonjs/assets/emojiData.js +40 -0
- package/lib/commonjs/assets/emojiData.js.map +1 -0
- package/lib/commonjs/assets/icons.js +5 -3
- package/lib/commonjs/assets/icons.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatHeader.js +35 -15
- package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatRoom.js +33 -24
- package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatWrapper.js +22 -16
- package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
- package/lib/commonjs/components/MainComponents/EncryptedSendNotice.js +47 -0
- package/lib/commonjs/components/MainComponents/EncryptedSendNotice.js.map +1 -0
- package/lib/commonjs/components/MainComponents/EncryptionCard.js +286 -0
- package/lib/commonjs/components/MainComponents/EncryptionCard.js.map +1 -0
- package/lib/commonjs/components/MainComponents/MediaMessage.js +7 -0
- package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MessageContainer.js +4 -12
- package/lib/commonjs/components/MainComponents/MessageContainer.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MessageList.js +110 -35
- package/lib/commonjs/components/MainComponents/MessageList.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ReduxWrapper.js +5 -0
- package/lib/commonjs/components/MainComponents/ReduxWrapper.js.map +1 -1
- package/lib/commonjs/components/MainComponents/RoomList.js +32 -29
- package/lib/commonjs/components/MainComponents/RoomList.js.map +1 -1
- package/lib/commonjs/components/MainComponents/RoomStack.js +133 -65
- package/lib/commonjs/components/MainComponents/RoomStack.js.map +1 -1
- package/lib/commonjs/components/MainComponents/SealedAttachment.js +231 -0
- package/lib/commonjs/components/MainComponents/SealedAttachment.js.map +1 -0
- package/lib/commonjs/components/MainComponents/SystemMessage.js +6 -2
- package/lib/commonjs/components/MainComponents/SystemMessage.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/Avatar.js +5 -1
- package/lib/commonjs/components/MessageBubble/Avatar.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/BottomReplyContainer.js +18 -21
- package/lib/commonjs/components/MessageBubble/BottomReplyContainer.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/EmojiPickerSheet.js +447 -0
- package/lib/commonjs/components/MessageBubble/EmojiPickerSheet.js.map +1 -0
- package/lib/commonjs/components/MessageBubble/Message.js +264 -136
- package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/MessageInteractions.js +215 -13
- package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/MessageReaction.js +113 -94
- package/lib/commonjs/components/MessageBubble/MessageReaction.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/MessageReply.js +66 -24
- package/lib/commonjs/components/MessageBubble/MessageReply.js.map +1 -1
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +7 -4
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js +159 -16
- package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
- package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js +4 -0
- package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
- package/lib/commonjs/components/Modals/Modal/SwipeBackLayer.js +76 -44
- package/lib/commonjs/components/Modals/Modal/SwipeBackLayer.js.map +1 -1
- package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js +29 -6
- package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
- package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js +5 -1
- package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +37 -13
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/LastMessageItem.js +6 -0
- package/lib/commonjs/components/RoomComponents/LastMessageItem.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastAudioMessage.js +2 -2
- package/lib/commonjs/components/RoomComponents/styled/LastAudioMessage.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastMessageEmoji.js +8 -9
- package/lib/commonjs/components/RoomComponents/styled/LastMessageEmoji.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js +4 -6
- package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js +2 -2
- package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastMessageSealed.js +41 -0
- package/lib/commonjs/components/RoomComponents/styled/LastMessageSealed.js.map +1 -0
- package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js +2 -2
- package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
- package/lib/commonjs/components/Thread/ThreadWrapper.js +273 -152
- package/lib/commonjs/components/Thread/ThreadWrapper.js.map +1 -1
- package/lib/commonjs/components/UsersList/UsersList.js +2 -1
- package/lib/commonjs/components/UsersList/UsersList.js.map +1 -1
- package/lib/commonjs/components/styled/DateLabel.js +6 -3
- package/lib/commonjs/components/styled/DateLabel.js.map +1 -1
- package/lib/commonjs/components/styled/SendInput.js +4 -2
- package/lib/commonjs/components/styled/SendInput.js.map +1 -1
- package/lib/commonjs/context/MessageNotificationContext.js +188 -9
- package/lib/commonjs/context/MessageNotificationContext.js.map +1 -1
- package/lib/commonjs/context/xmppProvider.js +22 -7
- package/lib/commonjs/context/xmppProvider.js.map +1 -1
- package/lib/commonjs/e2ee/crypto.js +207 -0
- package/lib/commonjs/e2ee/crypto.js.map +1 -0
- package/lib/commonjs/e2ee/deviceStore.js +84 -0
- package/lib/commonjs/e2ee/deviceStore.js.map +1 -0
- package/lib/commonjs/e2ee/fileCipher.js +95 -0
- package/lib/commonjs/e2ee/fileCipher.js.map +1 -0
- package/lib/commonjs/e2ee/fileEnvelope.js +79 -0
- package/lib/commonjs/e2ee/fileEnvelope.js.map +1 -0
- package/lib/commonjs/e2ee/index.js +210 -0
- package/lib/commonjs/e2ee/index.js.map +1 -0
- package/lib/commonjs/e2ee/limits.js +9 -0
- package/lib/commonjs/e2ee/limits.js.map +1 -0
- package/lib/commonjs/e2ee/ns.js +8 -0
- package/lib/commonjs/e2ee/ns.js.map +1 -0
- package/lib/commonjs/e2ee/omemo.js +622 -0
- package/lib/commonjs/e2ee/omemo.js.map +1 -0
- package/lib/commonjs/e2ee/protobuf.js +149 -0
- package/lib/commonjs/e2ee/protobuf.js.map +1 -0
- package/lib/commonjs/e2ee/ratchet.js +238 -0
- package/lib/commonjs/e2ee/ratchet.js.map +1 -0
- package/lib/commonjs/e2ee/sealedBody.js +23 -0
- package/lib/commonjs/e2ee/sealedBody.js.map +1 -0
- package/lib/commonjs/e2ee/sealedFiles.js +174 -0
- package/lib/commonjs/e2ee/sealedFiles.js.map +1 -0
- package/lib/commonjs/e2ee/send.js +54 -0
- package/lib/commonjs/e2ee/send.js.map +1 -0
- package/lib/commonjs/e2ee/stanza.js +114 -0
- package/lib/commonjs/e2ee/stanza.js.map +1 -0
- package/lib/commonjs/e2ee/store.js +43 -0
- package/lib/commonjs/e2ee/store.js.map +1 -0
- package/lib/commonjs/helpers/accountName.js +23 -0
- package/lib/commonjs/helpers/accountName.js.map +1 -0
- package/lib/commonjs/helpers/createMessageFromXml.js +19 -4
- package/lib/commonjs/helpers/createMessageFromXml.js.map +1 -1
- package/lib/commonjs/helpers/createRoomFromApi.js +36 -2
- package/lib/commonjs/helpers/createRoomFromApi.js.map +1 -1
- package/lib/commonjs/helpers/createUserNameFromSetUser.js +2 -1
- package/lib/commonjs/helpers/createUserNameFromSetUser.js.map +1 -1
- package/lib/commonjs/helpers/displayName.js +16 -0
- package/lib/commonjs/helpers/displayName.js.map +1 -0
- package/lib/commonjs/helpers/emoji.js +51 -0
- package/lib/commonjs/helpers/emoji.js.map +1 -0
- package/lib/commonjs/helpers/haptics.js +29 -0
- package/lib/commonjs/helpers/haptics.js.map +1 -0
- package/lib/commonjs/helpers/historyPreloadScheduler.js +32 -66
- package/lib/commonjs/helpers/historyPreloadScheduler.js.map +1 -1
- package/lib/commonjs/helpers/insertMessageWithDelimiter.js +21 -12
- package/lib/commonjs/helpers/insertMessageWithDelimiter.js.map +1 -1
- package/lib/commonjs/helpers/mamReactions.js +57 -0
- package/lib/commonjs/helpers/mamReactions.js.map +1 -0
- package/lib/commonjs/helpers/parseMessageReference.js +42 -0
- package/lib/commonjs/helpers/parseMessageReference.js.map +1 -0
- package/lib/commonjs/helpers/persistCrypto.js +5 -0
- package/lib/commonjs/helpers/persistCrypto.js.map +1 -1
- package/lib/commonjs/helpers/reactionsConfig.js +17 -0
- package/lib/commonjs/helpers/reactionsConfig.js.map +1 -0
- package/lib/commonjs/helpers/secureKeyValue.js +20 -0
- package/lib/commonjs/helpers/secureKeyValue.js.map +1 -1
- package/lib/commonjs/helpers/updateMessagesTillLast.js +17 -2
- package/lib/commonjs/helpers/updateMessagesTillLast.js.map +1 -1
- package/lib/commonjs/helpers/videoCache.js +136 -0
- package/lib/commonjs/helpers/videoCache.js.map +1 -0
- package/lib/commonjs/hooks/useHeapSender.js +3 -1
- package/lib/commonjs/hooks/useHeapSender.js.map +1 -1
- package/lib/commonjs/hooks/useLogout.js +8 -0
- package/lib/commonjs/hooks/useLogout.js.map +1 -1
- package/lib/commonjs/hooks/useMessageHeapState.js +3 -2
- package/lib/commonjs/hooks/useMessageHeapState.js.map +1 -1
- package/lib/commonjs/hooks/useRoomInitialization.js +16 -7
- package/lib/commonjs/hooks/useRoomInitialization.js.map +1 -1
- package/lib/commonjs/hooks/useSendMessage.js +85 -15
- package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
- package/lib/commonjs/hooks/useUnreadMessagesCounter.js +1 -1
- package/lib/commonjs/hooks/useUnreadMessagesCounter.js.map +1 -1
- package/lib/commonjs/i18n/strings.js +180 -0
- package/lib/commonjs/i18n/strings.js.map +1 -1
- package/lib/commonjs/main.js +13 -0
- package/lib/commonjs/main.js.map +1 -1
- package/lib/commonjs/networking/api-requests/auth.api.js +4 -1
- package/lib/commonjs/networking/api-requests/auth.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/rooms.api.js +111 -17
- package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
- package/lib/commonjs/networking/stanzaHandlers.js +106 -50
- package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
- package/lib/commonjs/networking/xmpp/getHistory.xmpp.js +29 -74
- package/lib/commonjs/networking/xmpp/getHistory.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js +44 -0
- package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/mamRouter.js +186 -0
- package/lib/commonjs/networking/xmpp/mamRouter.js.map +1 -0
- package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js +41 -4
- package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js +16 -3
- package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js +13 -6
- package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +14 -6
- package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmppClient.js +104 -23
- package/lib/commonjs/networking/xmppClient.js.map +1 -1
- package/lib/commonjs/roomStore/Middleware/newMessageMidlleware.js +29 -34
- package/lib/commonjs/roomStore/Middleware/newMessageMidlleware.js.map +1 -1
- package/lib/commonjs/roomStore/Middleware/perfMiddleware.js +51 -0
- package/lib/commonjs/roomStore/Middleware/perfMiddleware.js.map +1 -0
- package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js +66 -43
- package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
- package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js +88 -68
- package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js.map +1 -1
- package/lib/commonjs/roomStore/index.js +18 -14
- package/lib/commonjs/roomStore/index.js.map +1 -1
- package/lib/commonjs/roomStore/persistBackend.js +93 -0
- package/lib/commonjs/roomStore/persistBackend.js.map +1 -0
- package/lib/commonjs/roomStore/persistence.js +253 -51
- package/lib/commonjs/roomStore/persistence.js.map +1 -1
- package/lib/commonjs/roomStore/roomsSlice.js +282 -136
- package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
- package/lib/commonjs/theme/theme.js +3 -0
- package/lib/commonjs/theme/theme.js.map +1 -1
- package/lib/commonjs/utils/devLogger.js +14 -0
- package/lib/commonjs/utils/devLogger.js.map +1 -1
- package/lib/commonjs/version.js +1 -1
- package/lib/module/assets/emojiData.js +36 -0
- package/lib/module/assets/emojiData.js.map +1 -0
- package/lib/module/assets/icons.js +4 -2
- package/lib/module/assets/icons.js.map +1 -1
- package/lib/module/components/MainComponents/ChatHeader.js +37 -17
- package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/module/components/MainComponents/ChatRoom.js +34 -25
- package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/module/components/MainComponents/ChatWrapper.js +23 -17
- package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
- package/lib/module/components/MainComponents/EncryptedSendNotice.js +42 -0
- package/lib/module/components/MainComponents/EncryptedSendNotice.js.map +1 -0
- package/lib/module/components/MainComponents/EncryptionCard.js +281 -0
- package/lib/module/components/MainComponents/EncryptionCard.js.map +1 -0
- package/lib/module/components/MainComponents/MediaMessage.js +7 -0
- package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
- package/lib/module/components/MainComponents/MessageContainer.js +7 -14
- package/lib/module/components/MainComponents/MessageContainer.js.map +1 -1
- package/lib/module/components/MainComponents/MessageList.js +110 -35
- package/lib/module/components/MainComponents/MessageList.js.map +1 -1
- package/lib/module/components/MainComponents/ReduxWrapper.js +5 -0
- package/lib/module/components/MainComponents/ReduxWrapper.js.map +1 -1
- package/lib/module/components/MainComponents/RoomList.js +32 -29
- package/lib/module/components/MainComponents/RoomList.js.map +1 -1
- package/lib/module/components/MainComponents/RoomStack.js +131 -63
- package/lib/module/components/MainComponents/RoomStack.js.map +1 -1
- package/lib/module/components/MainComponents/SealedAttachment.js +224 -0
- package/lib/module/components/MainComponents/SealedAttachment.js.map +1 -0
- package/lib/module/components/MainComponents/SystemMessage.js +6 -2
- package/lib/module/components/MainComponents/SystemMessage.js.map +1 -1
- package/lib/module/components/MessageBubble/Avatar.js +5 -1
- package/lib/module/components/MessageBubble/Avatar.js.map +1 -1
- package/lib/module/components/MessageBubble/BottomReplyContainer.js +19 -22
- package/lib/module/components/MessageBubble/BottomReplyContainer.js.map +1 -1
- package/lib/module/components/MessageBubble/EmojiPickerSheet.js +438 -0
- package/lib/module/components/MessageBubble/EmojiPickerSheet.js.map +1 -0
- package/lib/module/components/MessageBubble/Message.js +269 -140
- package/lib/module/components/MessageBubble/Message.js.map +1 -1
- package/lib/module/components/MessageBubble/MessageInteractions.js +217 -15
- package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
- package/lib/module/components/MessageBubble/MessageReaction.js +115 -94
- package/lib/module/components/MessageBubble/MessageReaction.js.map +1 -1
- package/lib/module/components/MessageBubble/MessageReply.js +65 -24
- package/lib/module/components/MessageBubble/MessageReply.js.map +1 -1
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +7 -4
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js +161 -18
- package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
- package/lib/module/components/Modals/FilePreviewModal/PdfView.js +4 -0
- package/lib/module/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
- package/lib/module/components/Modals/Modal/SwipeBackLayer.js +76 -44
- package/lib/module/components/Modals/Modal/SwipeBackLayer.js.map +1 -1
- package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js +32 -8
- package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
- package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js +4 -0
- package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
- package/lib/module/components/RoomComponents/ChatRoomItem.js +37 -13
- package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
- package/lib/module/components/RoomComponents/LastMessageItem.js +6 -0
- package/lib/module/components/RoomComponents/LastMessageItem.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastAudioMessage.js +2 -2
- package/lib/module/components/RoomComponents/styled/LastAudioMessage.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastMessageEmoji.js +8 -9
- package/lib/module/components/RoomComponents/styled/LastMessageEmoji.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastMessageFile.js +4 -6
- package/lib/module/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js +2 -2
- package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastMessageSealed.js +36 -0
- package/lib/module/components/RoomComponents/styled/LastMessageSealed.js.map +1 -0
- package/lib/module/components/RoomComponents/styled/LastMessageVideo.js +2 -2
- package/lib/module/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
- package/lib/module/components/Thread/ThreadWrapper.js +273 -153
- package/lib/module/components/Thread/ThreadWrapper.js.map +1 -1
- package/lib/module/components/UsersList/UsersList.js +2 -1
- package/lib/module/components/UsersList/UsersList.js.map +1 -1
- package/lib/module/components/styled/DateLabel.js +6 -3
- package/lib/module/components/styled/DateLabel.js.map +1 -1
- package/lib/module/components/styled/SendInput.js +4 -2
- package/lib/module/components/styled/SendInput.js.map +1 -1
- package/lib/module/context/MessageNotificationContext.js +190 -11
- package/lib/module/context/MessageNotificationContext.js.map +1 -1
- package/lib/module/context/xmppProvider.js +22 -7
- package/lib/module/context/xmppProvider.js.map +1 -1
- package/lib/module/e2ee/crypto.js +170 -0
- package/lib/module/e2ee/crypto.js.map +1 -0
- package/lib/module/e2ee/deviceStore.js +77 -0
- package/lib/module/e2ee/deviceStore.js.map +1 -0
- package/lib/module/e2ee/fileCipher.js +90 -0
- package/lib/module/e2ee/fileCipher.js.map +1 -0
- package/lib/module/e2ee/fileEnvelope.js +66 -0
- package/lib/module/e2ee/fileEnvelope.js.map +1 -0
- package/lib/module/e2ee/index.js +185 -0
- package/lib/module/e2ee/index.js.map +1 -0
- package/lib/module/e2ee/limits.js +5 -0
- package/lib/module/e2ee/limits.js.map +1 -0
- package/lib/module/e2ee/ns.js +4 -0
- package/lib/module/e2ee/ns.js.map +1 -0
- package/lib/module/e2ee/omemo.js +610 -0
- package/lib/module/e2ee/omemo.js.map +1 -0
- package/lib/module/e2ee/protobuf.js +140 -0
- package/lib/module/e2ee/protobuf.js.map +1 -0
- package/lib/module/e2ee/ratchet.js +228 -0
- package/lib/module/e2ee/ratchet.js.map +1 -0
- package/lib/module/e2ee/sealedBody.js +19 -0
- package/lib/module/e2ee/sealedBody.js.map +1 -0
- package/lib/module/e2ee/sealedFiles.js +154 -0
- package/lib/module/e2ee/sealedFiles.js.map +1 -0
- package/lib/module/e2ee/send.js +48 -0
- package/lib/module/e2ee/send.js.map +1 -0
- package/lib/module/e2ee/stanza.js +107 -0
- package/lib/module/e2ee/stanza.js.map +1 -0
- package/lib/module/e2ee/store.js +35 -0
- package/lib/module/e2ee/store.js.map +1 -0
- package/lib/module/helpers/accountName.js +18 -0
- package/lib/module/helpers/accountName.js.map +1 -0
- package/lib/module/helpers/createMessageFromXml.js +19 -4
- package/lib/module/helpers/createMessageFromXml.js.map +1 -1
- package/lib/module/helpers/createRoomFromApi.js +36 -2
- package/lib/module/helpers/createRoomFromApi.js.map +1 -1
- package/lib/module/helpers/createUserNameFromSetUser.js +3 -1
- package/lib/module/helpers/createUserNameFromSetUser.js.map +1 -1
- package/lib/module/helpers/displayName.js +11 -0
- package/lib/module/helpers/displayName.js.map +1 -0
- package/lib/module/helpers/emoji.js +44 -0
- package/lib/module/helpers/emoji.js.map +1 -0
- package/lib/module/helpers/haptics.js +24 -0
- package/lib/module/helpers/haptics.js.map +1 -0
- package/lib/module/helpers/historyPreloadScheduler.js +32 -66
- package/lib/module/helpers/historyPreloadScheduler.js.map +1 -1
- package/lib/module/helpers/insertMessageWithDelimiter.js +21 -12
- package/lib/module/helpers/insertMessageWithDelimiter.js.map +1 -1
- package/lib/module/helpers/mamReactions.js +51 -0
- package/lib/module/helpers/mamReactions.js.map +1 -0
- package/lib/module/helpers/parseMessageReference.js +37 -0
- package/lib/module/helpers/parseMessageReference.js.map +1 -0
- package/lib/module/helpers/persistCrypto.js +4 -0
- package/lib/module/helpers/persistCrypto.js.map +1 -1
- package/lib/module/helpers/reactionsConfig.js +10 -0
- package/lib/module/helpers/reactionsConfig.js.map +1 -0
- package/lib/module/helpers/secureKeyValue.js +19 -0
- package/lib/module/helpers/secureKeyValue.js.map +1 -1
- package/lib/module/helpers/updateMessagesTillLast.js +17 -2
- package/lib/module/helpers/updateMessagesTillLast.js.map +1 -1
- package/lib/module/helpers/videoCache.js +125 -0
- package/lib/module/helpers/videoCache.js.map +1 -0
- package/lib/module/hooks/useHeapSender.js +3 -1
- package/lib/module/hooks/useHeapSender.js.map +1 -1
- package/lib/module/hooks/useLogout.js +8 -0
- package/lib/module/hooks/useLogout.js.map +1 -1
- package/lib/module/hooks/useMessageHeapState.js +3 -2
- package/lib/module/hooks/useMessageHeapState.js.map +1 -1
- package/lib/module/hooks/useRoomInitialization.js +17 -8
- package/lib/module/hooks/useRoomInitialization.js.map +1 -1
- package/lib/module/hooks/useSendMessage.js +85 -15
- package/lib/module/hooks/useSendMessage.js.map +1 -1
- package/lib/module/hooks/useUnreadMessagesCounter.js +1 -1
- package/lib/module/hooks/useUnreadMessagesCounter.js.map +1 -1
- package/lib/module/i18n/strings.js +180 -0
- package/lib/module/i18n/strings.js.map +1 -1
- package/lib/module/main.js +1 -0
- package/lib/module/main.js.map +1 -1
- package/lib/module/networking/api-requests/auth.api.js +4 -1
- package/lib/module/networking/api-requests/auth.api.js.map +1 -1
- package/lib/module/networking/api-requests/rooms.api.js +109 -18
- package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
- package/lib/module/networking/stanzaHandlers.js +107 -51
- package/lib/module/networking/stanzaHandlers.js.map +1 -1
- package/lib/module/networking/xmpp/getHistory.xmpp.js +29 -74
- package/lib/module/networking/xmpp/getHistory.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/handleStanzas.xmpp.js +42 -0
- package/lib/module/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/mamRouter.js +175 -0
- package/lib/module/networking/xmpp/mamRouter.js.map +1 -0
- package/lib/module/networking/xmpp/presenceInRoom.xmpp.js +38 -2
- package/lib/module/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js +16 -3
- package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/sendTextMessage.xmpp.js +13 -6
- package/lib/module/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +14 -6
- package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
- package/lib/module/networking/xmppClient.js +105 -24
- package/lib/module/networking/xmppClient.js.map +1 -1
- package/lib/module/roomStore/Middleware/newMessageMidlleware.js +29 -34
- package/lib/module/roomStore/Middleware/newMessageMidlleware.js.map +1 -1
- package/lib/module/roomStore/Middleware/perfMiddleware.js +45 -0
- package/lib/module/roomStore/Middleware/perfMiddleware.js.map +1 -0
- package/lib/module/roomStore/Middleware/reactionsMiddleware.js +66 -43
- package/lib/module/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
- package/lib/module/roomStore/Middleware/unreadMidlleware.js +89 -69
- package/lib/module/roomStore/Middleware/unreadMidlleware.js.map +1 -1
- package/lib/module/roomStore/index.js +19 -15
- package/lib/module/roomStore/index.js.map +1 -1
- package/lib/module/roomStore/persistBackend.js +86 -0
- package/lib/module/roomStore/persistBackend.js.map +1 -0
- package/lib/module/roomStore/persistence.js +253 -49
- package/lib/module/roomStore/persistence.js.map +1 -1
- package/lib/module/roomStore/roomsSlice.js +275 -134
- package/lib/module/roomStore/roomsSlice.js.map +1 -1
- package/lib/module/theme/theme.js +3 -0
- package/lib/module/theme/theme.js.map +1 -1
- package/lib/module/utils/devLogger.js +13 -0
- package/lib/module/utils/devLogger.js.map +1 -1
- package/lib/module/version.js +1 -1
- package/lib/typescript/assets/emojiData.d.ts +8 -0
- package/lib/typescript/assets/emojiData.d.ts.map +1 -0
- package/lib/typescript/assets/icons.d.ts +8 -0
- package/lib/typescript/assets/icons.d.ts.map +1 -1
- 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/EncryptedSendNotice.d.ts +4 -0
- package/lib/typescript/components/MainComponents/EncryptedSendNotice.d.ts.map +1 -0
- package/lib/typescript/components/MainComponents/EncryptionCard.d.ts +10 -0
- package/lib/typescript/components/MainComponents/EncryptionCard.d.ts.map +1 -0
- package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MessageContainer.d.ts +2 -2
- package/lib/typescript/components/MainComponents/MessageContainer.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MessageList.d.ts.map +1 -1
- 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/MainComponents/RoomStack.d.ts +7 -2
- package/lib/typescript/components/MainComponents/RoomStack.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/SealedAttachment.d.ts +13 -0
- package/lib/typescript/components/MainComponents/SealedAttachment.d.ts.map +1 -0
- package/lib/typescript/components/MainComponents/SystemMessage.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/Avatar.d.ts +2 -0
- package/lib/typescript/components/MessageBubble/Avatar.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/BottomReplyContainer.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/EmojiPickerSheet.d.ts +11 -0
- package/lib/typescript/components/MessageBubble/EmojiPickerSheet.d.ts.map +1 -0
- package/lib/typescript/components/MessageBubble/Message.d.ts +2 -2
- package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts +2 -0
- package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/MessageReaction.d.ts +1 -0
- package/lib/typescript/components/MessageBubble/MessageReaction.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/MessageReply.d.ts +7 -7
- package/lib/typescript/components/MessageBubble/MessageReply.d.ts.map +1 -1
- package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/FilePreviewModal/FilePreviewModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/FilePreviewModal/PdfView.d.ts.map +1 -1
- package/lib/typescript/components/Modals/Modal/SwipeBackLayer.d.ts +2 -1
- package/lib/typescript/components/Modals/Modal/SwipeBackLayer.d.ts.map +1 -1
- package/lib/typescript/components/Modals/UserProfileModal/UserProfileModal.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 +2 -2
- package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/LastMessageItem.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastAudioMessage.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessageEmoji.d.ts +3 -6
- package/lib/typescript/components/RoomComponents/styled/LastMessageEmoji.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessageSealed.d.ts +7 -0
- package/lib/typescript/components/RoomComponents/styled/LastMessageSealed.d.ts.map +1 -0
- package/lib/typescript/components/Thread/ThreadWrapper.d.ts +7 -1
- package/lib/typescript/components/Thread/ThreadWrapper.d.ts.map +1 -1
- package/lib/typescript/components/UsersList/UsersList.d.ts.map +1 -1
- package/lib/typescript/components/styled/DateLabel.d.ts +1 -0
- package/lib/typescript/components/styled/DateLabel.d.ts.map +1 -1
- package/lib/typescript/components/styled/SendInput.d.ts +1 -0
- 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/e2ee/crypto.d.ts +28 -0
- package/lib/typescript/e2ee/crypto.d.ts.map +1 -0
- package/lib/typescript/e2ee/deviceStore.d.ts +4 -0
- package/lib/typescript/e2ee/deviceStore.d.ts.map +1 -0
- package/lib/typescript/e2ee/fileCipher.d.ts +7 -0
- package/lib/typescript/e2ee/fileCipher.d.ts.map +1 -0
- package/lib/typescript/e2ee/fileEnvelope.d.ts +27 -0
- package/lib/typescript/e2ee/fileEnvelope.d.ts.map +1 -0
- package/lib/typescript/e2ee/index.d.ts +23 -0
- package/lib/typescript/e2ee/index.d.ts.map +1 -0
- package/lib/typescript/e2ee/limits.d.ts +3 -0
- package/lib/typescript/e2ee/limits.d.ts.map +1 -0
- package/lib/typescript/e2ee/ns.d.ts +2 -0
- package/lib/typescript/e2ee/ns.d.ts.map +1 -0
- package/lib/typescript/e2ee/omemo.d.ts +64 -0
- package/lib/typescript/e2ee/omemo.d.ts.map +1 -0
- package/lib/typescript/e2ee/protobuf.d.ts +25 -0
- package/lib/typescript/e2ee/protobuf.d.ts.map +1 -0
- package/lib/typescript/e2ee/ratchet.d.ts +39 -0
- package/lib/typescript/e2ee/ratchet.d.ts.map +1 -0
- package/lib/typescript/e2ee/sealedBody.d.ts +2 -0
- package/lib/typescript/e2ee/sealedBody.d.ts.map +1 -0
- package/lib/typescript/e2ee/sealedFiles.d.ts +31 -0
- package/lib/typescript/e2ee/sealedFiles.d.ts.map +1 -0
- package/lib/typescript/e2ee/send.d.ts +6 -0
- package/lib/typescript/e2ee/send.d.ts.map +1 -0
- package/lib/typescript/e2ee/stanza.d.ts +8 -0
- package/lib/typescript/e2ee/stanza.d.ts.map +1 -0
- package/lib/typescript/e2ee/store.d.ts +16 -0
- package/lib/typescript/e2ee/store.d.ts.map +1 -0
- package/lib/typescript/helpers/accountName.d.ts +7 -0
- package/lib/typescript/helpers/accountName.d.ts.map +1 -0
- package/lib/typescript/helpers/createMessageFromXml.d.ts.map +1 -1
- package/lib/typescript/helpers/createRoomFromApi.d.ts.map +1 -1
- package/lib/typescript/helpers/createUserNameFromSetUser.d.ts.map +1 -1
- package/lib/typescript/helpers/displayName.d.ts +2 -0
- package/lib/typescript/helpers/displayName.d.ts.map +1 -0
- package/lib/typescript/helpers/emoji.d.ts +6 -0
- package/lib/typescript/helpers/emoji.d.ts.map +1 -0
- package/lib/typescript/helpers/haptics.d.ts +3 -0
- package/lib/typescript/helpers/haptics.d.ts.map +1 -0
- package/lib/typescript/helpers/historyPreloadScheduler.d.ts +1 -0
- package/lib/typescript/helpers/historyPreloadScheduler.d.ts.map +1 -1
- package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts.map +1 -1
- package/lib/typescript/helpers/mamReactions.d.ts +13 -0
- package/lib/typescript/helpers/mamReactions.d.ts.map +1 -0
- package/lib/typescript/helpers/parseMessageReference.d.ts +16 -0
- package/lib/typescript/helpers/parseMessageReference.d.ts.map +1 -0
- package/lib/typescript/helpers/persistCrypto.d.ts +1 -0
- package/lib/typescript/helpers/persistCrypto.d.ts.map +1 -1
- package/lib/typescript/helpers/reactionsConfig.d.ts +5 -0
- package/lib/typescript/helpers/reactionsConfig.d.ts.map +1 -0
- package/lib/typescript/helpers/secureKeyValue.d.ts +4 -0
- package/lib/typescript/helpers/secureKeyValue.d.ts.map +1 -1
- package/lib/typescript/helpers/updateMessagesTillLast.d.ts.map +1 -1
- package/lib/typescript/helpers/videoCache.d.ts +19 -0
- package/lib/typescript/helpers/videoCache.d.ts.map +1 -0
- package/lib/typescript/hooks/useHeapSender.d.ts.map +1 -1
- package/lib/typescript/hooks/useLogout.d.ts.map +1 -1
- package/lib/typescript/hooks/useMessageHeapState.d.ts.map +1 -1
- package/lib/typescript/hooks/useRoomInitialization.d.ts +2 -2
- package/lib/typescript/hooks/useRoomInitialization.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/main.d.ts +2 -0
- package/lib/typescript/main.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/auth.api.d.ts +4 -1
- package/lib/typescript/networking/api-requests/auth.api.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/rooms.api.d.ts +22 -1
- package/lib/typescript/networking/api-requests/rooms.api.d.ts.map +1 -1
- package/lib/typescript/networking/stanzaHandlers.d.ts +4 -2
- package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts +3 -1
- package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts +1 -0
- package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/mamRouter.d.ts +23 -0
- package/lib/typescript/networking/xmpp/mamRouter.d.ts.map +1 -0
- package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts +1 -0
- package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts.map +1 -1
- 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 +22 -1
- package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
- package/lib/typescript/roomStore/Middleware/newMessageMidlleware.d.ts.map +1 -1
- package/lib/typescript/roomStore/Middleware/perfMiddleware.d.ts +4 -0
- package/lib/typescript/roomStore/Middleware/perfMiddleware.d.ts.map +1 -0
- package/lib/typescript/roomStore/Middleware/reactionsMiddleware.d.ts +9 -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/index.d.ts.map +1 -1
- package/lib/typescript/roomStore/persistBackend.d.ts +11 -0
- package/lib/typescript/roomStore/persistBackend.d.ts.map +1 -0
- package/lib/typescript/roomStore/persistence.d.ts +5 -6
- package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
- package/lib/typescript/roomStore/roomsSlice.d.ts +41 -1
- package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
- package/lib/typescript/theme/theme.d.ts +4 -1
- package/lib/typescript/theme/theme.d.ts.map +1 -1
- package/lib/typescript/types/models/message.model.d.ts +9 -0
- package/lib/typescript/types/models/message.model.d.ts.map +1 -1
- package/lib/typescript/types/models/room.model.d.ts +21 -0
- package/lib/typescript/types/models/room.model.d.ts.map +1 -1
- package/lib/typescript/types/models/xmpp.model.d.ts +6 -1
- package/lib/typescript/types/models/xmpp.model.d.ts.map +1 -1
- package/lib/typescript/types/types.d.ts +19 -3
- package/lib/typescript/types/types.d.ts.map +1 -1
- package/lib/typescript/utils/devLogger.d.ts +8 -0
- package/lib/typescript/utils/devLogger.d.ts.map +1 -1
- package/lib/typescript/version.d.ts +1 -1
- package/package.json +14 -1
- package/src/assets/emojiData.ts +2146 -0
- package/src/assets/icons.tsx +32 -5
- package/src/components/MainComponents/ChatHeader.tsx +46 -16
- package/src/components/MainComponents/ChatRoom.tsx +46 -30
- package/src/components/MainComponents/ChatWrapper.tsx +28 -10
- package/src/components/MainComponents/EncryptedSendNotice.tsx +35 -0
- package/src/components/MainComponents/EncryptionCard.tsx +287 -0
- package/src/components/MainComponents/MediaMessage.tsx +5 -0
- package/src/components/MainComponents/MessageContainer.tsx +7 -15
- package/src/components/MainComponents/MessageList.tsx +96 -43
- package/src/components/MainComponents/ReduxWrapper.tsx +5 -0
- package/src/components/MainComponents/RoomList.tsx +28 -29
- package/src/components/MainComponents/RoomStack.tsx +156 -83
- package/src/components/MainComponents/SealedAttachment.tsx +251 -0
- package/src/components/MainComponents/SystemMessage.tsx +6 -2
- package/src/components/MessageBubble/Avatar.tsx +7 -1
- package/src/components/MessageBubble/BottomReplyContainer.tsx +20 -21
- package/src/components/MessageBubble/EmojiPickerSheet.tsx +468 -0
- package/src/components/MessageBubble/Message.tsx +242 -93
- package/src/components/MessageBubble/MessageInteractions.tsx +215 -15
- package/src/components/MessageBubble/MessageReaction.tsx +120 -96
- package/src/components/MessageBubble/MessageReply.tsx +65 -32
- package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +7 -4
- package/src/components/Modals/FilePreviewModal/FilePreviewModal.tsx +181 -35
- package/src/components/Modals/FilePreviewModal/PdfView.tsx +4 -0
- package/src/components/Modals/Modal/SwipeBackLayer.tsx +114 -63
- package/src/components/Modals/UserProfileModal/UserProfileModal.tsx +53 -8
- package/src/components/Modals/UserSettingsModal/UserSettingsModal.tsx +5 -0
- package/src/components/RoomComponents/ChatRoomItem.tsx +34 -15
- package/src/components/RoomComponents/LastMessageItem.tsx +5 -0
- package/src/components/RoomComponents/styled/LastAudioMessage.tsx +3 -1
- package/src/components/RoomComponents/styled/LastMessageEmoji.tsx +7 -8
- package/src/components/RoomComponents/styled/LastMessageFile.tsx +2 -2
- package/src/components/RoomComponents/styled/LastMessagePhoto.tsx +1 -1
- package/src/components/RoomComponents/styled/LastMessageSealed.tsx +31 -0
- package/src/components/RoomComponents/styled/LastMessageVideo.tsx +1 -1
- package/src/components/Thread/ThreadWrapper.tsx +287 -198
- package/src/components/UsersList/UsersList.tsx +2 -1
- package/src/components/styled/DateLabel.tsx +7 -3
- package/src/components/styled/SendInput.tsx +5 -2
- package/src/context/MessageNotificationContext.tsx +205 -7
- package/src/context/xmppProvider.tsx +29 -9
- package/src/e2ee/crypto.ts +194 -0
- package/src/e2ee/deviceStore.ts +80 -0
- package/src/e2ee/fileCipher.ts +86 -0
- package/src/e2ee/fileEnvelope.ts +115 -0
- package/src/e2ee/index.ts +192 -0
- package/src/e2ee/limits.ts +2 -0
- package/src/e2ee/ns.ts +1 -0
- package/src/e2ee/omemo.ts +802 -0
- package/src/e2ee/protobuf.ts +188 -0
- package/src/e2ee/ratchet.ts +271 -0
- package/src/e2ee/sealedBody.ts +17 -0
- package/src/e2ee/sealedFiles.ts +181 -0
- package/src/e2ee/send.ts +70 -0
- package/src/e2ee/stanza.ts +133 -0
- package/src/e2ee/store.ts +54 -0
- package/src/helpers/accountName.ts +15 -0
- package/src/helpers/createMessageFromXml.ts +31 -6
- package/src/helpers/createRoomFromApi.tsx +37 -1
- package/src/helpers/createUserNameFromSetUser.ts +2 -1
- package/src/helpers/displayName.ts +9 -0
- package/src/helpers/emoji.ts +39 -0
- package/src/helpers/haptics.ts +19 -0
- package/src/helpers/historyPreloadScheduler.ts +37 -69
- package/src/helpers/insertMessageWithDelimiter.ts +23 -16
- package/src/helpers/mamReactions.ts +59 -0
- package/src/helpers/parseMessageReference.ts +38 -0
- package/src/helpers/persistCrypto.ts +5 -0
- package/src/helpers/reactionsConfig.ts +13 -0
- package/src/helpers/secureKeyValue.ts +15 -0
- package/src/helpers/updateMessagesTillLast.tsx +14 -2
- package/src/helpers/videoCache.ts +138 -0
- package/src/hooks/useHeapSender.tsx +3 -2
- package/src/hooks/useLogout.tsx +9 -0
- package/src/hooks/useMessageHeapState.tsx +6 -2
- package/src/hooks/useRoomInitialization.tsx +32 -15
- package/src/hooks/useSendMessage.tsx +89 -16
- package/src/hooks/useUnreadMessagesCounter.ts +1 -1
- package/src/i18n/strings.ts +180 -0
- package/src/main.ts +2 -0
- package/src/networking/api-requests/auth.api.ts +9 -1
- package/src/networking/api-requests/rooms.api.ts +121 -18
- package/src/networking/stanzaHandlers.ts +116 -60
- package/src/networking/xmpp/getHistory.xmpp.ts +44 -106
- package/src/networking/xmpp/handleStanzas.xmpp.ts +51 -0
- package/src/networking/xmpp/mamRouter.ts +176 -0
- package/src/networking/xmpp/presenceInRoom.xmpp.ts +46 -3
- package/src/networking/xmpp/sendMediaMessage.xmpp.ts +19 -1
- package/src/networking/xmpp/sendTextMessage.xmpp.ts +17 -10
- package/src/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.ts +23 -10
- package/src/networking/xmppClient.ts +111 -20
- package/src/roomStore/Middleware/newMessageMidlleware.tsx +35 -38
- package/src/roomStore/Middleware/perfMiddleware.ts +50 -0
- package/src/roomStore/Middleware/reactionsMiddleware.tsx +53 -52
- package/src/roomStore/Middleware/unreadMidlleware.tsx +92 -80
- package/src/roomStore/index.ts +28 -27
- package/src/roomStore/persistBackend.ts +93 -0
- package/src/roomStore/persistence.ts +295 -73
- package/src/roomStore/roomsSlice.ts +304 -155
- package/src/theme/theme.ts +10 -1
- package/src/types/models/message.model.ts +9 -0
- package/src/types/models/room.model.ts +22 -0
- package/src/types/models/xmpp.model.ts +4 -2
- package/src/types/types.ts +19 -3
- package/src/utils/devLogger.ts +16 -0
- package/src/version.ts +1 -1
|
@@ -10,6 +10,7 @@ import { sendTypingRequest } from './xmpp/sendTypingRequest.xmpp';
|
|
|
10
10
|
import { sendPing } from './xmpp/sendPing.xmpp';
|
|
11
11
|
import { getHistory } from './xmpp/getHistory.xmpp';
|
|
12
12
|
import { sendTextMessage } from './xmpp/sendTextMessage.xmpp';
|
|
13
|
+
import { sendMessageReaction } from './xmpp/sendMessageReaction.xmpp';
|
|
13
14
|
import { sendTextMessageWithTranslateTag } from './xmpp/sendTextMessageWithTranslateTag.xmpp';
|
|
14
15
|
import { deleteMessage } from './xmpp/deleteMessage.xmpp';
|
|
15
16
|
import { presenceInRoom } from './xmpp/presenceInRoom.xmpp';
|
|
@@ -23,7 +24,8 @@ import { editMessage } from './xmpp/editMessage.xmpp';
|
|
|
23
24
|
import { inviteRoomRequest } from './xmpp/inviteRoomRequest.xmpp';
|
|
24
25
|
import { getRooms } from './xmpp/getRooms.xmpp';
|
|
25
26
|
import { handleStanza } from './xmpp/handleStanzas.xmpp';
|
|
26
|
-
import {
|
|
27
|
+
import { onOnline as e2eeOnOnline } from '../e2ee';
|
|
28
|
+
import { pushLog as devPushLog, isDevLogActive } from '../utils/devLogger';
|
|
27
29
|
import { normalizeRoomJid } from '../helpers/normalizeRoomJid';
|
|
28
30
|
import { store } from '../roomStore';
|
|
29
31
|
import { applyPrivateStoreMarkers } from '../roomStore/roomsSlice';
|
|
@@ -69,6 +71,11 @@ function withTimeout(promise: Promise<unknown>, ms: number): Promise<void> {
|
|
|
69
71
|
// where it fails — XMPPError on stream:error, SASLError on SASL bind, or
|
|
70
72
|
// a generic Error whose message contains "not-authorized". Match all of
|
|
71
73
|
// them so we trigger the credentials refresh path consistently.
|
|
74
|
+
// Failed XMPP-password recoveries in a row before the session is ended.
|
|
75
|
+
const AUTH_RECOVERY_MAX_FAILURES = 2;
|
|
76
|
+
// Rejections (each with a fresh password) before the password counts as lost.
|
|
77
|
+
const AUTH_REJECTIONS_LIMIT = 3;
|
|
78
|
+
|
|
72
79
|
function isNotAuthorizedError(err: any): boolean {
|
|
73
80
|
if (!err) {return false;}
|
|
74
81
|
const condition =
|
|
@@ -90,6 +97,10 @@ interface HistoryOptions {
|
|
|
90
97
|
coalesceRoom?: boolean;
|
|
91
98
|
skipIfPreloaded?: boolean;
|
|
92
99
|
source?: HistorySource;
|
|
100
|
+
/** The caller merges the returned page into the store itself (the
|
|
101
|
+
* preload scheduler and the catch-up pass do, to detect gaps); the MAM
|
|
102
|
+
* router then does not apply it. Default: applied by the router. */
|
|
103
|
+
selfApplied?: boolean;
|
|
93
104
|
}
|
|
94
105
|
|
|
95
106
|
interface MamInFlightEntry {
|
|
@@ -185,6 +196,42 @@ export class XmppClient {
|
|
|
185
196
|
* (REST JWT, /users/client, etc.) and returning the resulting
|
|
186
197
|
* username + password.
|
|
187
198
|
*/
|
|
199
|
+
/**
|
|
200
|
+
* Called once when the session's XMPP password is lost for good: the
|
|
201
|
+
* server rejected it (SASL not-authorized) and the refresh chain could
|
|
202
|
+
* not produce a working one — the refresh request failed, came back
|
|
203
|
+
* without a new password, or the new one was rejected too. Network
|
|
204
|
+
* outages never get here (no rejection without a reachable server).
|
|
205
|
+
*/
|
|
206
|
+
private authLostHandler: (() => void) | null = null;
|
|
207
|
+
private authRecoveryFailures = 0;
|
|
208
|
+
private authLostFired = false;
|
|
209
|
+
// Rejections since the stream was last online — catches a refresh that
|
|
210
|
+
// keeps returning NEW passwords the server still rejects.
|
|
211
|
+
private authRejectionsSinceOnline = 0;
|
|
212
|
+
|
|
213
|
+
setAuthLostHandler(handler: (() => void) | null) {
|
|
214
|
+
this.authLostHandler = handler;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
private markAuthRecoveryFailed(reason: string) {
|
|
218
|
+
this.authRecoveryFailures += 1;
|
|
219
|
+
console.warn(
|
|
220
|
+
`[xmpp] XMPP password recovery failed (${reason}), attempt ${this.authRecoveryFailures}`
|
|
221
|
+
);
|
|
222
|
+
// One retry before giving up, so a single REST hiccup does not end the
|
|
223
|
+
// session; a second failure in a row means the password is gone.
|
|
224
|
+
if (this.authRecoveryFailures >= AUTH_RECOVERY_MAX_FAILURES && !this.authLostFired) {
|
|
225
|
+
this.authLostFired = true;
|
|
226
|
+
this.suppressReconnect = true;
|
|
227
|
+
try {
|
|
228
|
+
this.authLostHandler?.();
|
|
229
|
+
} catch (e) {
|
|
230
|
+
console.warn('[xmpp] auth-lost handler threw', e);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
188
235
|
setCredentialsProvider(provider: XmppCredentialsProvider | null) {
|
|
189
236
|
this.credentialsProvider = provider;
|
|
190
237
|
}
|
|
@@ -286,8 +333,9 @@ export class XmppClient {
|
|
|
286
333
|
before?: number;
|
|
287
334
|
id?: string;
|
|
288
335
|
source?: HistorySource;
|
|
336
|
+
selfApplied?: boolean;
|
|
289
337
|
}): Promise<any> {
|
|
290
|
-
const { chatJID, max, before, id, source = 'default' } = params;
|
|
338
|
+
const { chatJID, max, before, id, source = 'default', selfApplied } = params;
|
|
291
339
|
|
|
292
340
|
// Coalesce — if a fetch for the same room is in-flight, reuse it
|
|
293
341
|
// unless the new request is higher priority.
|
|
@@ -315,7 +363,9 @@ export class XmppClient {
|
|
|
315
363
|
const handle: { p?: Promise<any> } = {};
|
|
316
364
|
handle.p = (async () => {
|
|
317
365
|
try {
|
|
318
|
-
return await getHistory(this.client, chatJID, max, before, id
|
|
366
|
+
return await getHistory(this.client, chatJID, max, before, id, {
|
|
367
|
+
selfApplied,
|
|
368
|
+
});
|
|
319
369
|
} finally {
|
|
320
370
|
const cur = this.mamInFlightByRoom.get(chatJID);
|
|
321
371
|
if (cur && cur.promise === handle.p) {
|
|
@@ -383,7 +433,7 @@ export class XmppClient {
|
|
|
383
433
|
// Raising the cap silences the warning without masking real leaks
|
|
384
434
|
// — true leaks would still grow unboundedly past this number.
|
|
385
435
|
try {
|
|
386
|
-
(this.client as any)?.setMaxListeners?.(
|
|
436
|
+
(this.client as any)?.setMaxListeners?.(120);
|
|
387
437
|
} catch {}
|
|
388
438
|
|
|
389
439
|
// Wrap `send` so the dev logger sees outgoing stanzas too.
|
|
@@ -395,7 +445,7 @@ export class XmppClient {
|
|
|
395
445
|
const origSend = this.client.send?.bind(this.client);
|
|
396
446
|
if (origSend) {
|
|
397
447
|
const wrapped = (stanza: any) => {
|
|
398
|
-
try {
|
|
448
|
+
if (isDevLogActive()) {try {
|
|
399
449
|
const tag = stanza?.name || 'stanza';
|
|
400
450
|
const id = stanza?.attrs?.id || '';
|
|
401
451
|
const to = stanza?.attrs?.to || '';
|
|
@@ -404,7 +454,7 @@ export class XmppClient {
|
|
|
404
454
|
`→ ${tag}${id ? ` id=${id}` : ''}${to ? ` to=${to.split('/')[0]}` : ''}`,
|
|
405
455
|
stanza?.toString ? stanza.toString() : undefined
|
|
406
456
|
);
|
|
407
|
-
} catch {}
|
|
457
|
+
} catch {}}
|
|
408
458
|
const result = origSend(stanza);
|
|
409
459
|
// Most stanza helpers fire-and-forget `client.send(...)`
|
|
410
460
|
// without awaiting/catching. On @xmpp/client builds where
|
|
@@ -438,6 +488,7 @@ export class XmppClient {
|
|
|
438
488
|
console.error('Error starting xmpp client:', error);
|
|
439
489
|
if (isNotAuthorizedError(error)) {
|
|
440
490
|
this.lastAuthError = 'not-authorized';
|
|
491
|
+
this.authRejectionsSinceOnline += 1;
|
|
441
492
|
}
|
|
442
493
|
this.status = 'error';
|
|
443
494
|
// A connect-time failure lands in 'error', which — unlike a
|
|
@@ -497,6 +548,8 @@ export class XmppClient {
|
|
|
497
548
|
this.onOnline = () => {
|
|
498
549
|
console.log('XMPP online.', new Date());
|
|
499
550
|
this.status = 'online';
|
|
551
|
+
this.authRecoveryFailures = 0;
|
|
552
|
+
this.authRejectionsSinceOnline = 0;
|
|
500
553
|
this.presencesReady = true;
|
|
501
554
|
this.reconnectAttempts = 0;
|
|
502
555
|
try {
|
|
@@ -517,6 +570,11 @@ export class XmppClient {
|
|
|
517
570
|
} catch (err) {
|
|
518
571
|
console.warn('onOnline callback failed', err);
|
|
519
572
|
}
|
|
573
|
+
try {
|
|
574
|
+
e2eeOnOnline(this.client);
|
|
575
|
+
} catch (err) {
|
|
576
|
+
console.warn('e2ee onOnline failed', err);
|
|
577
|
+
}
|
|
520
578
|
// Drain any sends that were buffered while the stream was down. The
|
|
521
579
|
// presence stanzas from onOnlineCallback above were written to the
|
|
522
580
|
// socket synchronously (allRoomPresences → presenceInRoom send the
|
|
@@ -534,6 +592,7 @@ export class XmppClient {
|
|
|
534
592
|
console.error('XMPP client error:', error);
|
|
535
593
|
if (isNotAuthorizedError(error)) {
|
|
536
594
|
this.lastAuthError = 'not-authorized';
|
|
595
|
+
this.authRejectionsSinceOnline += 1;
|
|
537
596
|
}
|
|
538
597
|
try {
|
|
539
598
|
devPushLog(
|
|
@@ -545,7 +604,7 @@ export class XmppClient {
|
|
|
545
604
|
};
|
|
546
605
|
|
|
547
606
|
this.onStanza = (stanza: any) => {
|
|
548
|
-
try {
|
|
607
|
+
if (isDevLogActive()) {try {
|
|
549
608
|
const tag = stanza?.name || 'stanza';
|
|
550
609
|
const id = stanza?.attrs?.id || '';
|
|
551
610
|
const from = stanza?.attrs?.from || '';
|
|
@@ -555,7 +614,7 @@ export class XmppClient {
|
|
|
555
614
|
`← ${tag}${id ? ` id=${id}` : ''}${type ? ` type=${type}` : ''}${from ? ` from=${from.split('/')[0]}` : ''}`,
|
|
556
615
|
stanza?.toString ? stanza.toString() : undefined
|
|
557
616
|
);
|
|
558
|
-
} catch {}
|
|
617
|
+
} catch {}}
|
|
559
618
|
handleStanza.bind(this, stanza, this)();
|
|
560
619
|
};
|
|
561
620
|
|
|
@@ -739,16 +798,29 @@ export class XmppClient {
|
|
|
739
798
|
CREDENTIALS_REFRESH_MIN_INTERVAL_MS;
|
|
740
799
|
|
|
741
800
|
if (this.credentialsProvider && (authFailed || staleCreds)) {
|
|
801
|
+
const rejectedPassword = authFailed ? this.password : null;
|
|
742
802
|
try {
|
|
743
803
|
await this.refreshCredentialsOnce();
|
|
804
|
+
// The server said this password is wrong and the refresh handed
|
|
805
|
+
// back nothing new: there is no working password to connect with.
|
|
806
|
+
if (rejectedPassword !== null && (!this.password || this.password === rejectedPassword)) {
|
|
807
|
+
this.markAuthRecoveryFailed('no new XMPP password after refresh');
|
|
808
|
+
} else if (this.authRejectionsSinceOnline >= AUTH_REJECTIONS_LIMIT) {
|
|
809
|
+
this.markAuthRecoveryFailed('refreshed XMPP password rejected again');
|
|
810
|
+
}
|
|
744
811
|
} catch (err) {
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
812
|
+
if (rejectedPassword !== null) {
|
|
813
|
+
this.markAuthRecoveryFailed('refresh request failed');
|
|
814
|
+
} else {
|
|
815
|
+
// Offline is the common case here — reconnect with what we
|
|
816
|
+
// have and let the next attempt try again.
|
|
817
|
+
console.warn(
|
|
818
|
+
'XMPP credential refresh failed; reconnecting with cached creds',
|
|
819
|
+
err
|
|
820
|
+
);
|
|
821
|
+
}
|
|
751
822
|
}
|
|
823
|
+
if (this.suppressReconnect) {return;}
|
|
752
824
|
}
|
|
753
825
|
|
|
754
826
|
// Tear the OLD underlying client down FULLY before spinning up a new
|
|
@@ -903,6 +975,16 @@ export class XmppClient {
|
|
|
903
975
|
}
|
|
904
976
|
|
|
905
977
|
getRoomsStanza = async () => {
|
|
978
|
+
// Asked while the socket is down (mid-reconnect) this used to throw
|
|
979
|
+
// "Cannot read property 'write' of null". Wait for the stream instead;
|
|
980
|
+
// if it does not come back, skip — the reconnect hook re-syncs rooms.
|
|
981
|
+
if (this.status !== 'online') {
|
|
982
|
+
try {
|
|
983
|
+
await this.waitForOnline(15000);
|
|
984
|
+
} catch {
|
|
985
|
+
return;
|
|
986
|
+
}
|
|
987
|
+
}
|
|
906
988
|
await getRooms(this.client);
|
|
907
989
|
};
|
|
908
990
|
|
|
@@ -938,9 +1020,12 @@ export class XmppClient {
|
|
|
938
1020
|
before,
|
|
939
1021
|
id,
|
|
940
1022
|
source: options?.source || 'default',
|
|
1023
|
+
selfApplied: options?.selfApplied,
|
|
941
1024
|
});
|
|
942
1025
|
}
|
|
943
|
-
return await getHistory(this.client, chatJID, max, before, id
|
|
1026
|
+
return await getHistory(this.client, chatJID, max, before, id, {
|
|
1027
|
+
selfApplied: options?.selfApplied,
|
|
1028
|
+
});
|
|
944
1029
|
};
|
|
945
1030
|
|
|
946
1031
|
getLastMessageArchiveStanza(roomJID: string) {
|
|
@@ -1194,12 +1279,18 @@ export class XmppClient {
|
|
|
1194
1279
|
}
|
|
1195
1280
|
|
|
1196
1281
|
sendMessageReactionStanza(
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1282
|
+
messageId: string,
|
|
1283
|
+
roomJid: string,
|
|
1284
|
+
reactionsList: string[],
|
|
1285
|
+
data?: { firstName?: string; lastName?: string }
|
|
1201
1286
|
) {
|
|
1202
|
-
|
|
1287
|
+
sendMessageReaction(
|
|
1288
|
+
this.client,
|
|
1289
|
+
messageId,
|
|
1290
|
+
normalizeRoomJid(roomJid, this.conference),
|
|
1291
|
+
reactionsList,
|
|
1292
|
+
data || {}
|
|
1293
|
+
);
|
|
1203
1294
|
}
|
|
1204
1295
|
|
|
1205
1296
|
// Sends a groupchat message carrying a `<translate source="xx"/>` tag so
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { Middleware } from '@reduxjs/toolkit';
|
|
2
|
-
import { updateRoom } from '../roomsSlice';
|
|
3
2
|
import { clearMessageFailure } from '../roomHeapSlice';
|
|
4
3
|
import { removeOutboundSend } from '../../networking/outboundQueue';
|
|
5
|
-
import {
|
|
4
|
+
import { IMessage } from '../../types/types';
|
|
6
5
|
|
|
7
6
|
export const newMessageMidlleware: Middleware =
|
|
8
7
|
(storeAPI) => (next) => (action: any) => {
|
|
@@ -11,7 +10,9 @@ export const newMessageMidlleware: Middleware =
|
|
|
11
10
|
return next(action);
|
|
12
11
|
}
|
|
13
12
|
|
|
14
|
-
|
|
13
|
+
const isSingle = action.type === 'roomMessages/addRoomMessage';
|
|
14
|
+
const isBatch = action.type === 'roomMessages/addRoomMessages';
|
|
15
|
+
if (!isSingle && !isBatch) {
|
|
15
16
|
return next(action);
|
|
16
17
|
}
|
|
17
18
|
|
|
@@ -22,48 +23,44 @@ export const newMessageMidlleware: Middleware =
|
|
|
22
23
|
|
|
23
24
|
const result = next(action);
|
|
24
25
|
const state = storeAPI.getState();
|
|
25
|
-
const rooms: { [jid: string]: IRoom } = state.rooms.rooms;
|
|
26
|
-
|
|
27
|
-
const { roomJID, message } = action.payload;
|
|
28
|
-
|
|
29
|
-
// Un-fail on confirmed delivery. A server-confirmed copy (echo or MAM
|
|
30
|
-
// history, never `pending`) arriving for a message we'd flagged failed
|
|
31
|
-
// means the send actually went through — e.g. a slow send that completed
|
|
32
|
-
// just after the 5s watchdog window, or a queued auto-resend landing on
|
|
33
|
-
// reconnect. The failed flag is keyed by our optimistic/stanza id, which
|
|
34
|
-
// the echo carries back as `id`/`xmppId`, so clear it here and let the
|
|
35
|
-
// bubble flip to delivered instead of staying stuck on "Failed".
|
|
36
|
-
if (message && !message.pending) {
|
|
37
|
-
// The confirmed copy carries our optimistic/stanza id back as id/xmppId.
|
|
38
|
-
// Drop any still-buffered replay for it so a later reconnect flush can't
|
|
39
|
-
// re-send an already-delivered message.
|
|
40
|
-
removeOutboundSend(message.id);
|
|
41
|
-
removeOutboundSend(message.xmppId);
|
|
42
|
-
|
|
43
|
-
const failedMap = state.roomHeapSlice?.failedMessages || {};
|
|
44
|
-
const failedKey = [message.id, message.xmppId].find(
|
|
45
|
-
(k: string | undefined) => k && failedMap[k]
|
|
46
|
-
);
|
|
47
|
-
if (failedKey) {
|
|
48
|
-
storeAPI.dispatch(clearMessageFailure(failedKey as string));
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
26
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
27
|
+
// `lastMessageTimestamp` is now bumped inside the reducer itself (no
|
|
28
|
+
// second `updateRoom` pass per message). What is left here are the
|
|
29
|
+
// side effects outside the rooms slice.
|
|
30
|
+
const messages: IMessage[] = isBatch
|
|
31
|
+
? action.payload.messages || []
|
|
32
|
+
: [action.payload.message];
|
|
33
|
+
const failedMap = state.roomHeapSlice?.failedMessages || {};
|
|
34
|
+
|
|
35
|
+
for (const message of messages) {
|
|
36
|
+
// Un-fail on confirmed delivery. A server-confirmed copy (echo or MAM
|
|
37
|
+
// history, never `pending`) arriving for a message we'd flagged failed
|
|
38
|
+
// means the send actually went through — e.g. a slow send that completed
|
|
39
|
+
// just after the 5s watchdog window, or a queued auto-resend landing on
|
|
40
|
+
// reconnect. The failed flag is keyed by our optimistic/stanza id, which
|
|
41
|
+
// the echo carries back as `id`/`xmppId`, so clear it here and let the
|
|
42
|
+
// bubble flip to delivered instead of staying stuck on "Failed".
|
|
43
|
+
if (message && !message.pending) {
|
|
44
|
+
// The confirmed copy carries our optimistic/stanza id back as id/xmppId.
|
|
45
|
+
// Drop any still-buffered replay for it so a later reconnect flush can't
|
|
46
|
+
// re-send an already-delivered message.
|
|
47
|
+
removeOutboundSend(message.id);
|
|
48
|
+
if (message.xmppId) {removeOutboundSend(message.xmppId);}
|
|
49
|
+
|
|
50
|
+
const failedKey = [message.id, message.xmppId].find(
|
|
51
|
+
(k: string | undefined) => k && failedMap[k]
|
|
52
|
+
);
|
|
53
|
+
if (failedKey) {
|
|
54
|
+
storeAPI.dispatch(clearMessageFailure(failedKey as string));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
59
57
|
}
|
|
60
58
|
|
|
61
59
|
return result;
|
|
62
60
|
};
|
|
63
61
|
|
|
64
62
|
// import { Middleware, PayloadAction } from '@reduxjs/toolkit';
|
|
65
|
-
// import {
|
|
66
|
-
// import { AddRoomMessageAction, IRoom } from '../../types/types';
|
|
63
|
+
// // import { AddRoomMessageAction, IRoom } from '../../types/types';
|
|
67
64
|
// import { nanoToMs } from '../../helpers/nanoToMs';
|
|
68
65
|
|
|
69
66
|
// export const newMessageMidlleware: Middleware =
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Middleware } from '@reduxjs/toolkit';
|
|
2
|
+
|
|
3
|
+
declare const __DEV__: boolean | undefined;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Dev-only store profiler: counts dispatches and the time the reducer +
|
|
7
|
+
* middleware chain spent on them, and prints a one-line summary every
|
|
8
|
+
* 10 s while there was activity. Reads as
|
|
9
|
+
* [perf] 10s: 143 actions, 212ms in store, top: roomMessages/addRoomMessages×12 (90ms) …
|
|
10
|
+
* No-op (and not even installed) in release builds.
|
|
11
|
+
*/
|
|
12
|
+
const WINDOW_MS = 10000;
|
|
13
|
+
|
|
14
|
+
let count = 0;
|
|
15
|
+
let totalMs = 0;
|
|
16
|
+
let byType: Record<string, { n: number; ms: number }> = {};
|
|
17
|
+
let timer: ReturnType<typeof setTimeout> | null = null;
|
|
18
|
+
|
|
19
|
+
const flush = () => {
|
|
20
|
+
timer = null;
|
|
21
|
+
if (count === 0) {return;}
|
|
22
|
+
const top = Object.entries(byType)
|
|
23
|
+
.sort((a, b) => b[1].ms - a[1].ms)
|
|
24
|
+
.slice(0, 4)
|
|
25
|
+
.map(([type, v]) => `${type}×${v.n} (${v.ms.toFixed(0)}ms)`)
|
|
26
|
+
.join(', ');
|
|
27
|
+
console.log(
|
|
28
|
+
`[perf] ${WINDOW_MS / 1000}s: ${count} actions, ${totalMs.toFixed(0)}ms in store, top: ${top}`
|
|
29
|
+
);
|
|
30
|
+
count = 0;
|
|
31
|
+
totalMs = 0;
|
|
32
|
+
byType = {};
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export const perfMiddleware: Middleware = () => (next) => (action: any) => {
|
|
36
|
+
const start = Date.now();
|
|
37
|
+
const result = next(action);
|
|
38
|
+
const ms = Date.now() - start;
|
|
39
|
+
count += 1;
|
|
40
|
+
totalMs += ms;
|
|
41
|
+
const type = action?.type || '?';
|
|
42
|
+
const entry = byType[type] || (byType[type] = { n: 0, ms: 0 });
|
|
43
|
+
entry.n += 1;
|
|
44
|
+
entry.ms += ms;
|
|
45
|
+
if (!timer) {timer = setTimeout(flush, WINDOW_MS);}
|
|
46
|
+
return result;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export const isPerfProfilingEnabled = () =>
|
|
50
|
+
typeof __DEV__ !== 'undefined' && __DEV__ === true;
|
|
@@ -1,77 +1,78 @@
|
|
|
1
|
-
import { Middleware
|
|
1
|
+
import { Middleware } from '@reduxjs/toolkit';
|
|
2
2
|
import { updateRoom } from '../roomsSlice';
|
|
3
|
-
import {
|
|
4
|
-
import { nanoToMs } from '../../helpers/nanoToMs';
|
|
3
|
+
import { IMessage, IRoom } from '../../types/types';
|
|
5
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Keeps the room-list preview in step with reactions (as on web): the
|
|
7
|
+
* newest event in a room being a reaction shows "Ann: 👍"; a reactor
|
|
8
|
+
* clearing theirs puts the last real message back.
|
|
9
|
+
*
|
|
10
|
+
* Timestamps here are the server's stanza ids, the same unit as
|
|
11
|
+
* `lastMessageTimestamp` (set from message ids in the reducer), so a
|
|
12
|
+
* reaction older than the room's latest message never takes the preview.
|
|
13
|
+
*/
|
|
6
14
|
export const reactionsMiddleware: Middleware =
|
|
7
15
|
(storeAPI) => (next) => (action: any) => {
|
|
8
|
-
if (action
|
|
16
|
+
if (action?.type !== 'roomMessages/setReactions') {
|
|
9
17
|
return next(action);
|
|
10
18
|
}
|
|
11
|
-
|
|
12
19
|
if (!action.payload || typeof action.payload !== 'object') {
|
|
13
20
|
console.error('Invalid action payload for setReactions:', action);
|
|
14
21
|
return next(action);
|
|
15
22
|
}
|
|
16
|
-
|
|
17
23
|
const result = next(action);
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
24
|
+
try {
|
|
25
|
+
const payload = action.payload || {};
|
|
26
|
+
const { roomJID, reactions, latestReactionTimestamp, data } = payload;
|
|
27
|
+
const room: IRoom | undefined = storeAPI.getState().rooms?.rooms?.[roomJID];
|
|
28
|
+
if (!room) {return result;}
|
|
22
29
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const newLastMessage =
|
|
26
|
-
rooms[roomJID].messages[rooms[roomJID].messages.length - 1];
|
|
30
|
+
const ts = Number(latestReactionTimestamp) || 0;
|
|
31
|
+
const roomTs = Number(room.lastMessageTimestamp) || 0;
|
|
27
32
|
|
|
33
|
+
if (Array.isArray(reactions) && reactions[0]) {
|
|
34
|
+
// Only the newest event in the room may become the preview.
|
|
35
|
+
if (!ts || ts < roomTs) {return result;}
|
|
36
|
+
const name = `${data?.senderFirstName || ''} ${data?.senderLastName || ''}`.trim();
|
|
28
37
|
storeAPI.dispatch(
|
|
29
38
|
updateRoom({
|
|
30
39
|
jid: roomJID,
|
|
31
40
|
updates: {
|
|
32
|
-
lastMessageTimestamp:
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
41
|
+
lastMessageTimestamp: ts,
|
|
42
|
+
lastMessage: {
|
|
43
|
+
id: `reaction-${ts}`,
|
|
44
|
+
body: reactions[0],
|
|
45
|
+
emoji: reactions[0],
|
|
46
|
+
user: { id: `emoji-${ts}`, name },
|
|
47
|
+
date: new Date(Math.floor(ts / 1000)).toISOString(),
|
|
48
|
+
} as any,
|
|
36
49
|
},
|
|
37
50
|
})
|
|
38
51
|
);
|
|
39
|
-
|
|
40
|
-
const updates = {
|
|
41
|
-
lastMessageTimestamp: nanoToMs(latestReactionTimestamp) ?? 0,
|
|
42
|
-
lastMessage: {
|
|
43
|
-
...rest,
|
|
44
|
-
body: reactions[0],
|
|
45
|
-
emoji: reactions[0],
|
|
46
|
-
user: {
|
|
47
|
-
name: `${data.senderFirstName} ${data.senderLastName}`,
|
|
48
|
-
id: `emoji-${new Date().toString()}`,
|
|
49
|
-
},
|
|
50
|
-
date: new Date(nanoToMs(latestReactionTimestamp) ?? 0).toISOString(),
|
|
51
|
-
},
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
storeAPI.dispatch(
|
|
55
|
-
updateRoom({
|
|
56
|
-
jid: roomJID,
|
|
57
|
-
updates: updates as any,
|
|
58
|
-
})
|
|
59
|
-
);
|
|
52
|
+
return result;
|
|
60
53
|
}
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
if (!rooms[roomJID]) {
|
|
64
|
-
console.warn(`Room ${roomJID} not found in reactions middleware`);
|
|
65
|
-
return result;
|
|
66
|
-
}
|
|
67
54
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
55
|
+
// A reaction was cleared: if the preview was a reaction, fall back to
|
|
56
|
+
// the newest real message (the room may have none loaded yet).
|
|
57
|
+
if (!(room.lastMessage as any)?.emoji) {return result;}
|
|
58
|
+
const messages: IMessage[] = room.messages || [];
|
|
59
|
+
let last: IMessage | undefined;
|
|
60
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
61
|
+
const m = messages[i];
|
|
62
|
+
if (m && m.id !== 'delimiter-new' && !m.isDeleted) {
|
|
63
|
+
last = m;
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
storeAPI.dispatch(
|
|
68
|
+
updateRoom({
|
|
69
|
+
jid: roomJID,
|
|
70
|
+
updates: { lastMessage: (last as any) ?? undefined },
|
|
71
|
+
})
|
|
72
|
+
);
|
|
73
|
+
} catch (e) {
|
|
74
|
+
// A preview update must never break the action that carried it.
|
|
75
|
+
console.warn('reactionsMiddleware: preview update failed', e);
|
|
74
76
|
}
|
|
75
|
-
|
|
76
77
|
return result;
|
|
77
78
|
};
|