@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
package/src/e2ee/send.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { Client } from '@xmpp/client';
|
|
2
|
+
import type { Element } from 'ltx';
|
|
3
|
+
import {
|
|
4
|
+
accountDomain,
|
|
5
|
+
isE2eeEnabled,
|
|
6
|
+
isE2eeRoom,
|
|
7
|
+
omemoReady,
|
|
8
|
+
resolveRecipients,
|
|
9
|
+
} from './index';
|
|
10
|
+
|
|
11
|
+
export function shouldEncrypt(roomJID: string): boolean {
|
|
12
|
+
return isE2eeEnabled() && isE2eeRoom(roomJID);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let queue: Promise<void> = Promise.resolve();
|
|
16
|
+
|
|
17
|
+
export function sendEncrypted(
|
|
18
|
+
client: Client,
|
|
19
|
+
roomJID: string,
|
|
20
|
+
id: string,
|
|
21
|
+
data: Element,
|
|
22
|
+
body: Element,
|
|
23
|
+
plain: Element
|
|
24
|
+
): void {
|
|
25
|
+
queue = queue.then(async () => {
|
|
26
|
+
let stanza = plain;
|
|
27
|
+
try {
|
|
28
|
+
const crypto = await omemoReady();
|
|
29
|
+
if (!crypto) {throw new Error('omemo_not_ready');}
|
|
30
|
+
const recipients = await resolveRecipients(roomJID, accountDomain(client));
|
|
31
|
+
stanza = await crypto.encryptGroupMessage(roomJID, recipients, [body], id, [data]);
|
|
32
|
+
} catch (error) {
|
|
33
|
+
const reason = String((error as Error)?.message || error);
|
|
34
|
+
if (reason.startsWith('omemo_members_unknown')) {
|
|
35
|
+
console.warn(`OMEMO: not sending to ${roomJID} - ${reason}`);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
console.warn(`OMEMO: sending to ${roomJID} in clear - ${reason}`);
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
await client.send(stanza);
|
|
42
|
+
} catch (error) {
|
|
43
|
+
console.error('An error occurred while sending message:', error);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function sendSealedMedia(
|
|
49
|
+
client: Client,
|
|
50
|
+
roomJID: string,
|
|
51
|
+
id: string,
|
|
52
|
+
body: Element,
|
|
53
|
+
cleartext: Element[]
|
|
54
|
+
): void {
|
|
55
|
+
queue = queue.then(async () => {
|
|
56
|
+
try {
|
|
57
|
+
const crypto = await omemoReady();
|
|
58
|
+
if (!crypto) {throw new Error('omemo_not_ready');}
|
|
59
|
+
const recipients = await resolveRecipients(roomJID, accountDomain(client));
|
|
60
|
+
const stanza = await crypto.encryptGroupMessage(roomJID, recipients, [body], id, cleartext);
|
|
61
|
+
await client.send(stanza);
|
|
62
|
+
} catch (error) {
|
|
63
|
+
console.error(
|
|
64
|
+
`OMEMO: refusing to send sealed attachment to ${roomJID} - ${String(
|
|
65
|
+
(error as Error)?.message || error
|
|
66
|
+
)}`
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { Element, parse } from 'ltx';
|
|
2
|
+
import { store } from '../roomStore';
|
|
3
|
+
import { translateKey } from '../i18n/strings';
|
|
4
|
+
import { NS_OMEMO } from './ns';
|
|
5
|
+
import { omemoReady, senderJidFromMuc } from './index';
|
|
6
|
+
|
|
7
|
+
export type DecryptOutcome =
|
|
8
|
+
| 'not-encrypted'
|
|
9
|
+
| 'decrypted'
|
|
10
|
+
| 'undecryptable'
|
|
11
|
+
| 'drop';
|
|
12
|
+
|
|
13
|
+
export type E2eeError =
|
|
14
|
+
| 'unsupported'
|
|
15
|
+
| 'other-device'
|
|
16
|
+
| 'failed';
|
|
17
|
+
|
|
18
|
+
const READY_TIMEOUT_MS = 8000;
|
|
19
|
+
|
|
20
|
+
export function encryptedCarrier(
|
|
21
|
+
stanza: Element,
|
|
22
|
+
depth = 0
|
|
23
|
+
): Element | undefined {
|
|
24
|
+
if (depth > 4 || !stanza?.getChild) {return undefined;}
|
|
25
|
+
if (stanza.name === 'message' && stanza.getChild('encrypted', NS_OMEMO)) {
|
|
26
|
+
return stanza;
|
|
27
|
+
}
|
|
28
|
+
for (const child of stanza.children ?? []) {
|
|
29
|
+
if (typeof child === 'string') {continue;}
|
|
30
|
+
const found = encryptedCarrier(child as Element, depth + 1);
|
|
31
|
+
if (found) {return found;}
|
|
32
|
+
}
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const PLACEHOLDER_KEY: Record<E2eeError, string> = {
|
|
37
|
+
unsupported: 'e2ee.unsupportedMessage',
|
|
38
|
+
'other-device': 'e2ee.otherDevice',
|
|
39
|
+
failed: 'e2ee.undecryptable',
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export function placeholderKey(error?: string): string {
|
|
43
|
+
return PLACEHOLDER_KEY[error as E2eeError] ?? PLACEHOLDER_KEY.failed;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function placeholder(error: E2eeError): Element {
|
|
47
|
+
const settings = store.getState()?.chatSettingStore;
|
|
48
|
+
return new Element('body', {}).t(
|
|
49
|
+
translateKey(
|
|
50
|
+
placeholderKey(error),
|
|
51
|
+
settings?.config?.i18n?.locale || settings?.langSource,
|
|
52
|
+
settings?.config?.i18n?.strings
|
|
53
|
+
)
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function mark(carrier: Element, error?: E2eeError): void {
|
|
58
|
+
let data = carrier.getChild('data');
|
|
59
|
+
if (!data) {
|
|
60
|
+
data = new Element('data', {});
|
|
61
|
+
carrier.append(data);
|
|
62
|
+
}
|
|
63
|
+
data.attrs.omemoEncrypted = 'true';
|
|
64
|
+
if (error) {
|
|
65
|
+
data.attrs.undecryptable = 'true';
|
|
66
|
+
data.attrs.e2eeError = error;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function strip(carrier: Element): void {
|
|
71
|
+
carrier.remove('encrypted', NS_OMEMO);
|
|
72
|
+
carrier.remove('encryption', 'urn:xmpp:eme:0');
|
|
73
|
+
carrier.remove('body');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function close(carrier: Element, error: E2eeError): DecryptOutcome {
|
|
77
|
+
strip(carrier);
|
|
78
|
+
carrier.append(placeholder(error));
|
|
79
|
+
mark(carrier, error);
|
|
80
|
+
return 'undecryptable';
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function rewriteEncryptedStanza(stanza: Element): DecryptOutcome {
|
|
84
|
+
const carrier = encryptedCarrier(stanza);
|
|
85
|
+
if (!carrier) {return 'not-encrypted';}
|
|
86
|
+
const encrypted = carrier.getChild('encrypted', NS_OMEMO);
|
|
87
|
+
if (!encrypted?.getChild('payload')) {return 'drop';}
|
|
88
|
+
return close(carrier, 'unsupported');
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const waitForDevice = () => {
|
|
92
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
93
|
+
const timeout = new Promise<undefined>((resolve) => {
|
|
94
|
+
timer = setTimeout(() => resolve(undefined), READY_TIMEOUT_MS);
|
|
95
|
+
});
|
|
96
|
+
return Promise.race([omemoReady(), timeout]).finally(() => {
|
|
97
|
+
if (timer) {clearTimeout(timer);}
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
export async function decryptStanzaInPlace(
|
|
102
|
+
stanza: Element,
|
|
103
|
+
domain: string
|
|
104
|
+
): Promise<DecryptOutcome> {
|
|
105
|
+
const carrier = encryptedCarrier(stanza);
|
|
106
|
+
if (!carrier) {return 'not-encrypted';}
|
|
107
|
+
|
|
108
|
+
const encrypted = carrier.getChild('encrypted', NS_OMEMO);
|
|
109
|
+
if (!encrypted?.getChild('payload')) {return 'drop';}
|
|
110
|
+
|
|
111
|
+
const from = String(carrier.attrs?.from || '');
|
|
112
|
+
const roomJid = from.split('/')[0]!;
|
|
113
|
+
const sender = senderJidFromMuc(from, domain);
|
|
114
|
+
const crypto = await waitForDevice();
|
|
115
|
+
const decrypted = sender
|
|
116
|
+
? await crypto?.decrypt(carrier, sender, roomJid)
|
|
117
|
+
: undefined;
|
|
118
|
+
|
|
119
|
+
if (!decrypted?.content) {
|
|
120
|
+
return close(
|
|
121
|
+
carrier,
|
|
122
|
+
decrypted?.error === 'omemo_not_encrypted_for_this_device'
|
|
123
|
+
? 'other-device'
|
|
124
|
+
: 'failed'
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
strip(carrier);
|
|
129
|
+
const wrapper = parse(`<omemo-content>${decrypted.content}</omemo-content>`);
|
|
130
|
+
carrier.append(...wrapper.children);
|
|
131
|
+
mark(carrier);
|
|
132
|
+
return 'decrypted';
|
|
133
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { fromBase64, toBase64 } from './crypto';
|
|
2
|
+
|
|
3
|
+
export interface OmemoStore {
|
|
4
|
+
get<T>(key: string): Promise<T | undefined>;
|
|
5
|
+
set(key: string, value: unknown): Promise<void>;
|
|
6
|
+
delete(key: string): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const BYTES_TAG = '$bytes';
|
|
10
|
+
|
|
11
|
+
export function encodeValue(value: unknown): string {
|
|
12
|
+
return JSON.stringify(value, (_key, item) =>
|
|
13
|
+
item instanceof Uint8Array ? { [BYTES_TAG]: toBase64(item) } : item
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function decodeValue<T>(text: string): T {
|
|
18
|
+
return JSON.parse(text, (_key, item) =>
|
|
19
|
+
item && typeof item === 'object' && typeof item[BYTES_TAG] === 'string'
|
|
20
|
+
? fromBase64(item[BYTES_TAG])
|
|
21
|
+
: item
|
|
22
|
+
) as T;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface StringBackend {
|
|
26
|
+
getItem(key: string): Promise<string | null>;
|
|
27
|
+
setItem(key: string, value: string): Promise<void>;
|
|
28
|
+
removeItem(key: string): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function createStore(backend: StringBackend, jid: string): OmemoStore {
|
|
32
|
+
const prefix = `${jid.toLowerCase()}|`;
|
|
33
|
+
return {
|
|
34
|
+
get: async <T>(key: string) => {
|
|
35
|
+
const raw = await backend.getItem(prefix + key);
|
|
36
|
+
return raw === null ? undefined : decodeValue<T>(raw);
|
|
37
|
+
},
|
|
38
|
+
set: (key, value) => backend.setItem(prefix + key, encodeValue(value)),
|
|
39
|
+
delete: (key) => backend.removeItem(prefix + key),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function createMemoryBackend(): StringBackend {
|
|
44
|
+
const data = new Map<string, string>();
|
|
45
|
+
return {
|
|
46
|
+
getItem: async (key) => data.get(key) ?? null,
|
|
47
|
+
setItem: async (key, value) => void data.set(key, value),
|
|
48
|
+
removeItem: async (key) => void data.delete(key),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function createMemoryStore(jid = 'memory'): OmemoStore {
|
|
53
|
+
return createStore(createMemoryBackend(), jid);
|
|
54
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const accountNameOf = (
|
|
2
|
+
user:
|
|
3
|
+
| { xmppUsername?: string; userJID?: string; id?: string; _id?: string }
|
|
4
|
+
| null
|
|
5
|
+
| undefined,
|
|
6
|
+
appId: string
|
|
7
|
+
): string => {
|
|
8
|
+
for (const raw of [user?.xmppUsername, user?.userJID, user?.id, user?._id]) {
|
|
9
|
+
const value = String(raw || '').split('@')[0]!.trim();
|
|
10
|
+
if (!value) {continue;}
|
|
11
|
+
if (value.includes('_')) {return value;}
|
|
12
|
+
if (appId) {return `${appId}_${value}`;}
|
|
13
|
+
}
|
|
14
|
+
return '';
|
|
15
|
+
};
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { IMessage } from '../types/types';
|
|
2
|
+
import { isE2eeRoom } from '../e2ee';
|
|
3
|
+
import { composeName } from './displayName';
|
|
4
|
+
import { parseSealedMediaBody } from '../e2ee/sealedBody';
|
|
2
5
|
|
|
3
6
|
interface IMessageWithNewData extends IMessage {
|
|
4
7
|
[x: string]: any;
|
|
@@ -86,13 +89,25 @@ export const createMessageFromXml = async (
|
|
|
86
89
|
// Synthesize user.name from sender attrs (web reads usersSet from
|
|
87
90
|
// redux in <Message>; we fix it once at the source so Avatar /
|
|
88
91
|
// MessageHeader render the actual sender instead of "??").
|
|
89
|
-
const firstName = (merged.senderFirstName || '')
|
|
90
|
-
|
|
92
|
+
const firstName = (merged.senderFirstName || merged.firstName || '')
|
|
93
|
+
.toString()
|
|
94
|
+
.trim();
|
|
95
|
+
const lastName = (merged.senderLastName || merged.lastName || '')
|
|
96
|
+
.toString()
|
|
97
|
+
.trim();
|
|
91
98
|
const fullName = (merged.fullName || '').toString().trim();
|
|
92
99
|
const senderJID = (merged.senderJID || '').toString();
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
100
|
+
const senderBare = senderJID.split('/')[0] || '';
|
|
101
|
+
const senderResource = senderJID.includes('/') ? senderJID.split('/')[1] || '' : '';
|
|
102
|
+
const senderIsOccupant =
|
|
103
|
+
!!senderResource &&
|
|
104
|
+
(senderBare === String(merged.roomJid || '') ||
|
|
105
|
+
/@conference\./i.test(senderBare));
|
|
106
|
+
const senderLocal = senderIsOccupant
|
|
107
|
+
? senderResource
|
|
108
|
+
: senderBare.includes('@')
|
|
109
|
+
? senderBare.split('@')[0]
|
|
110
|
+
: senderBare;
|
|
96
111
|
|
|
97
112
|
// Bug #41 root cause: the resource of the MUC `from` (room@conference/
|
|
98
113
|
// occupant-id) is the SAME field getDataFromXml uses to derive
|
|
@@ -112,7 +127,7 @@ export const createMessageFromXml = async (
|
|
|
112
127
|
const xmppFrom = (merged.xmppFrom || '').toString();
|
|
113
128
|
const fromResource = xmppFrom.includes('/') ? xmppFrom.split('/')[1] : '';
|
|
114
129
|
|
|
115
|
-
const composed =
|
|
130
|
+
const composed = composeName(firstName, lastName);
|
|
116
131
|
const existingName = String(merged?.user?.name || '').trim();
|
|
117
132
|
const resolvedName =
|
|
118
133
|
existingName ||
|
|
@@ -122,8 +137,18 @@ export const createMessageFromXml = async (
|
|
|
122
137
|
merged?.user?.id ||
|
|
123
138
|
'';
|
|
124
139
|
|
|
140
|
+
const unencrypted =
|
|
141
|
+
merged.omemoEncrypted !== 'true' && isE2eeRoom(String(merged.roomJid || ''));
|
|
142
|
+
|
|
143
|
+
const sealedKeys =
|
|
144
|
+
merged.clientEncrypted === 'true'
|
|
145
|
+
? parseSealedMediaBody(merged.body)
|
|
146
|
+
: undefined;
|
|
147
|
+
|
|
125
148
|
const message: IMessage = {
|
|
126
149
|
...merged,
|
|
150
|
+
...(unencrypted ? { unencrypted: true } : {}),
|
|
151
|
+
...(sealedKeys ? { e2eeKeys: sealedKeys, body: 'media' } : {}),
|
|
127
152
|
user: {
|
|
128
153
|
...(merged.user || {}),
|
|
129
154
|
id: merged?.user?.id || fromResource || senderLocal,
|
|
@@ -1,4 +1,36 @@
|
|
|
1
1
|
import { ApiRoom, IRoom } from '../types/types';
|
|
2
|
+
import type { LastMessage } from '../types/models/message.model';
|
|
3
|
+
|
|
4
|
+
const mapApiLastMessage = (
|
|
5
|
+
apiLastMessage: ApiRoom['lastMessage'],
|
|
6
|
+
roomJid: string
|
|
7
|
+
): LastMessage | undefined => {
|
|
8
|
+
const body = String(apiLastMessage?.body || '').trim();
|
|
9
|
+
if (!apiLastMessage || !body) {return undefined;}
|
|
10
|
+
const senderName = `${apiLastMessage.senderFirstName || ''} ${
|
|
11
|
+
apiLastMessage.senderLastName || ''
|
|
12
|
+
}`.trim();
|
|
13
|
+
return {
|
|
14
|
+
id: apiLastMessage.messageId || apiLastMessage.stanzaId || '',
|
|
15
|
+
xmppId: apiLastMessage.stanzaId,
|
|
16
|
+
roomJid,
|
|
17
|
+
body,
|
|
18
|
+
date: apiLastMessage.createdAt,
|
|
19
|
+
isDeleted: false,
|
|
20
|
+
user: {
|
|
21
|
+
id: apiLastMessage.fromUserId || apiLastMessage.from || '',
|
|
22
|
+
name: senderName,
|
|
23
|
+
},
|
|
24
|
+
} as LastMessage;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const seedTimestamp = (seed: LastMessage | undefined): number | undefined => {
|
|
28
|
+
if (!seed) {return undefined;}
|
|
29
|
+
const id = Number(seed.id);
|
|
30
|
+
if (Number.isFinite(id) && id > 0) {return id;}
|
|
31
|
+
const ms = seed.date ? new Date(seed.date).getTime() : NaN;
|
|
32
|
+
return Number.isFinite(ms) && ms > 0 ? ms * 1000 : undefined;
|
|
33
|
+
};
|
|
2
34
|
|
|
3
35
|
export const createRoomFromApi = (
|
|
4
36
|
room: ApiRoom,
|
|
@@ -6,10 +38,12 @@ export const createRoomFromApi = (
|
|
|
6
38
|
usersArrayLength: number = 0
|
|
7
39
|
): IRoom | null => {
|
|
8
40
|
try {
|
|
41
|
+
const jid = `${room?.name}@${service}` || '';
|
|
42
|
+
const lastMessage = mapApiLastMessage(room?.lastMessage, jid);
|
|
9
43
|
const roomData: IRoom = {
|
|
10
44
|
...room,
|
|
11
45
|
id: (room as any)?._id || '',
|
|
12
|
-
jid
|
|
46
|
+
jid,
|
|
13
47
|
name: room?.title || '',
|
|
14
48
|
title: room?.title || '',
|
|
15
49
|
usersCnt: Number(room?.members?.length || usersArrayLength + 1),
|
|
@@ -19,6 +53,8 @@ export const createRoomFromApi = (
|
|
|
19
53
|
icon: room?.picture !== 'none' ? room?.picture : null,
|
|
20
54
|
unreadMessages: 0,
|
|
21
55
|
lastViewedTimestamp: 0,
|
|
56
|
+
lastMessage,
|
|
57
|
+
lastMessageTimestamp: seedTimestamp(lastMessage),
|
|
22
58
|
};
|
|
23
59
|
return roomData;
|
|
24
60
|
} catch (error) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { IMessage, RoomMember } from '../types/types';
|
|
2
|
+
import { composeName } from './displayName';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Cache-only lookup. Returns the literal "Deleted User" as a MISS sentinel
|
|
@@ -21,7 +22,7 @@ export const createUserNameFromSetUser = (
|
|
|
21
22
|
// fall back to that before giving up and returning the raw id.
|
|
22
23
|
const bareName = user.name?.trim() || '';
|
|
23
24
|
|
|
24
|
-
return
|
|
25
|
+
return composeName(firstName, lastName) || bareName || userId;
|
|
25
26
|
};
|
|
26
27
|
|
|
27
28
|
/**
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const composeName = (
|
|
2
|
+
first?: string | null,
|
|
3
|
+
last?: string | null
|
|
4
|
+
): string => {
|
|
5
|
+
const f = String(first ?? '').trim();
|
|
6
|
+
const l = String(last ?? '').trim();
|
|
7
|
+
if (f && f.includes('@') && f.toLowerCase() === l.toLowerCase()) {return f;}
|
|
8
|
+
return `${f} ${l}`.trim();
|
|
9
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { EMOJI_CATEGORIES, type EmojiEntry } from '../assets/emojiData';
|
|
2
|
+
|
|
3
|
+
let byId: Map<string, EmojiEntry> | null = null;
|
|
4
|
+
const index = (): Map<string, EmojiEntry> => {
|
|
5
|
+
if (!byId) {
|
|
6
|
+
byId = new Map();
|
|
7
|
+
for (const category of EMOJI_CATEGORIES) {
|
|
8
|
+
for (const entry of category.emojis) {byId.set(entry[0], entry);}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return byId;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export const getEmojiNativeById = (id: string): string =>
|
|
15
|
+
index().get(id)?.[1] ?? id;
|
|
16
|
+
|
|
17
|
+
export const getEmojiIdByNative = (native: string): string | undefined => {
|
|
18
|
+
for (const [id, entry] of index()) {
|
|
19
|
+
if (entry[1] === native) {return id;}
|
|
20
|
+
}
|
|
21
|
+
return undefined;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export const DEFAULT_QUICK_REACTIONS = ['+1', 'heart', 'joy', 'open_mouth', 'cry', 'pray'];
|
|
25
|
+
|
|
26
|
+
export const searchEmojis = (query: string, limit = 60): EmojiEntry[] => {
|
|
27
|
+
const q = query.trim().toLowerCase();
|
|
28
|
+
if (!q) {return [];}
|
|
29
|
+
const out: EmojiEntry[] = [];
|
|
30
|
+
for (const category of EMOJI_CATEGORIES) {
|
|
31
|
+
for (const entry of category.emojis) {
|
|
32
|
+
if (entry[0].includes(q) || entry[2].includes(q)) {
|
|
33
|
+
out.push(entry);
|
|
34
|
+
if (out.length >= limit) {return out;}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return out;
|
|
39
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// expo-haptics is an OPTIONAL peer, probed the same way as expo-blur: the JS
|
|
2
|
+
// package alone is not enough, the native module has to be in the binary,
|
|
3
|
+
// otherwise the call throws. Without it the gesture simply has no feedback.
|
|
4
|
+
let Haptics: any = null;
|
|
5
|
+
try {
|
|
6
|
+
const { requireNativeModule } = require('expo-modules-core');
|
|
7
|
+
requireNativeModule('ExpoHaptics');
|
|
8
|
+
Haptics = require('expo-haptics');
|
|
9
|
+
} catch {
|
|
10
|
+
Haptics = null;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** Short tap, the messenger "I got your long-press" feedback. Never throws. */
|
|
14
|
+
export const hapticTap = () => {
|
|
15
|
+
if (!Haptics) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
Haptics.impactAsync?.(Haptics.ImpactFeedbackStyle?.Medium).catch?.(() => {});
|
|
19
|
+
};
|
|
@@ -15,6 +15,7 @@ interface HistoryPreloadSchedulerOptions {
|
|
|
15
15
|
pageSize?: number;
|
|
16
16
|
retryLimit?: number;
|
|
17
17
|
roomLimit?: number;
|
|
18
|
+
firstWave?: number;
|
|
18
19
|
selectedRoomJid?: string | null;
|
|
19
20
|
defaultRoomJids?: string[];
|
|
20
21
|
forceReload?: boolean;
|
|
@@ -29,21 +30,15 @@ interface QueueItem {
|
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
const DEFAULT_CONCURRENCY = 3;
|
|
32
|
-
|
|
33
|
-
// also means more id-overlap with cache, so the merge in
|
|
34
|
-
// `mergeHistoryIntoCache` rarely has to fall back to clear-and-replace.
|
|
35
|
-
const DEFAULT_PAGE_SIZE = 20;
|
|
33
|
+
const DEFAULT_PAGE_SIZE = 10;
|
|
36
34
|
const DEFAULT_RETRY_LIMIT = 2;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
// than `pageSize` — `useUnread()` only ever sees what's been loaded. Page
|
|
40
|
-
// further back, up to this many extra fetches, until we either find the
|
|
41
|
-
// boundary or give up (`unreadCapped` then stays true so callers at least
|
|
42
|
-
// know the count is a floor, not exact). Customer-reported #34.
|
|
43
|
-
const MAX_UNREAD_CATCHUP_PAGES = 8;
|
|
35
|
+
const DEFAULT_FIRST_WAVE = 30;
|
|
36
|
+
const BACKGROUND_BATCH_PAUSE_MS = 400;
|
|
44
37
|
|
|
45
38
|
const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
46
39
|
|
|
40
|
+
declare const __DEV__: boolean | undefined;
|
|
41
|
+
|
|
47
42
|
const messageTimestamp = (m: IMessage): number => {
|
|
48
43
|
if (!m) {return 0;}
|
|
49
44
|
const t = (m as any).timestamp;
|
|
@@ -54,8 +49,12 @@ const messageTimestamp = (m: IMessage): number => {
|
|
|
54
49
|
};
|
|
55
50
|
|
|
56
51
|
const getRoomLastActivityScore = (room: IRoom): number => {
|
|
57
|
-
|
|
58
|
-
|
|
52
|
+
const fromMessages = room?.messages?.length
|
|
53
|
+
? room.messages.reduce((max, m) => Math.max(max, messageTimestamp(m)), 0)
|
|
54
|
+
: 0;
|
|
55
|
+
const fromStamp = Number(room?.lastMessageTimestamp) || 0;
|
|
56
|
+
const fromSeed = Number(room?.lastMessage?.id) || 0;
|
|
57
|
+
return Math.max(fromMessages, fromStamp, fromSeed);
|
|
59
58
|
};
|
|
60
59
|
|
|
61
60
|
const computeUnreadCapped = (
|
|
@@ -73,7 +72,10 @@ const computeUnreadCapped = (
|
|
|
73
72
|
if (countable.length < pageSize) {return false;}
|
|
74
73
|
|
|
75
74
|
const lastViewed = Number(room.lastViewedTimestamp) || 0;
|
|
76
|
-
|
|
75
|
+
// No read marker yet (the private-store markers often land after the
|
|
76
|
+
// first preload page): the count is unknown, not "more than a page".
|
|
77
|
+
// Claiming capped here showed "10+" on rooms with a single unread.
|
|
78
|
+
if (lastViewed <= 0) {return false;}
|
|
77
79
|
|
|
78
80
|
const oldestTs = countable.reduce<number>((minTs, m) => {
|
|
79
81
|
const ts = messageTimestamp(m);
|
|
@@ -116,6 +118,7 @@ export const runHistoryPreloadScheduler = async (
|
|
|
116
118
|
pageSize = DEFAULT_PAGE_SIZE,
|
|
117
119
|
retryLimit = DEFAULT_RETRY_LIMIT,
|
|
118
120
|
roomLimit,
|
|
121
|
+
firstWave = DEFAULT_FIRST_WAVE,
|
|
119
122
|
selectedRoomJid = null,
|
|
120
123
|
defaultRoomJids = [],
|
|
121
124
|
forceReload = false,
|
|
@@ -123,6 +126,12 @@ export const runHistoryPreloadScheduler = async (
|
|
|
123
126
|
|
|
124
127
|
if (signal?.aborted) {return;}
|
|
125
128
|
|
|
129
|
+
const startedAt = Date.now();
|
|
130
|
+
let firstWaveLogged = false;
|
|
131
|
+
const devLog = (msg: string) => {
|
|
132
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {console.log(msg);}
|
|
133
|
+
};
|
|
134
|
+
|
|
126
135
|
store.dispatch(setUnreadSyncing(true));
|
|
127
136
|
try {
|
|
128
137
|
|
|
@@ -153,6 +162,10 @@ export const runHistoryPreloadScheduler = async (
|
|
|
153
162
|
|
|
154
163
|
const inFlightByRoom = new Map<string, Promise<void>>();
|
|
155
164
|
let consecutiveErrorCount = 0;
|
|
165
|
+
let started = 0;
|
|
166
|
+
devLog(
|
|
167
|
+
`[preload] ${queue.length} rooms queued, first wave ${Math.min(firstWave, queue.length)}, page ${pageSize}`
|
|
168
|
+
);
|
|
156
169
|
|
|
157
170
|
while (queue.length > 0) {
|
|
158
171
|
if (signal?.aborted) {return;}
|
|
@@ -176,6 +189,12 @@ export const runHistoryPreloadScheduler = async (
|
|
|
176
189
|
}
|
|
177
190
|
|
|
178
191
|
const batch = readyItems.slice(0, Math.max(1, concurrency));
|
|
192
|
+
const inBackgroundWave = started >= firstWave;
|
|
193
|
+
if (inBackgroundWave && !firstWaveLogged) {
|
|
194
|
+
firstWaveLogged = true;
|
|
195
|
+
devLog(`[preload] first wave done in ${Date.now() - startedAt}ms`);
|
|
196
|
+
}
|
|
197
|
+
started += batch.length;
|
|
179
198
|
|
|
180
199
|
// Snapshot each room's historyPreloadState BEFORE marking the
|
|
181
200
|
// batch as 'loading'. Without this snapshot the per-task
|
|
@@ -229,6 +248,7 @@ export const runHistoryPreloadScheduler = async (
|
|
|
229
248
|
coalesceRoom: true,
|
|
230
249
|
skipIfPreloaded: !forceReload,
|
|
231
250
|
source: 'background',
|
|
251
|
+
selfApplied: true,
|
|
232
252
|
}
|
|
233
253
|
);
|
|
234
254
|
if (signal?.aborted) {return;}
|
|
@@ -237,59 +257,7 @@ export const runHistoryPreloadScheduler = async (
|
|
|
237
257
|
}
|
|
238
258
|
|
|
239
259
|
const nextRoom = store.getState().rooms.rooms[item.jid];
|
|
240
|
-
|
|
241
|
-
const lastViewed = Number(nextRoom?.lastViewedTimestamp) || 0;
|
|
242
|
-
|
|
243
|
-
// The first page was entirely unread — keep paging older until
|
|
244
|
-
// we find a message at/before `lastViewedTimestamp` (the true
|
|
245
|
-
// boundary) or run out of catch-up budget, so the count isn't
|
|
246
|
-
// silently truncated at `pageSize`.
|
|
247
|
-
if (lastViewed > 0 && computeUnreadCapped(nextRoom, combined, pageSize)) {
|
|
248
|
-
let lastPageLen = combined.length;
|
|
249
|
-
let extraPages = 0;
|
|
250
|
-
while (
|
|
251
|
-
extraPages < MAX_UNREAD_CATCHUP_PAGES &&
|
|
252
|
-
lastPageLen >= pageSize &&
|
|
253
|
-
!signal?.aborted
|
|
254
|
-
) {
|
|
255
|
-
const oldestId = combined.reduce<number | null>((min, m) => {
|
|
256
|
-
const idNum = Number((m as any)?.id);
|
|
257
|
-
if (!Number.isFinite(idNum)) {return min;}
|
|
258
|
-
return min === null || idNum < min ? idNum : min;
|
|
259
|
-
}, null);
|
|
260
|
-
if (oldestId === null) {break;}
|
|
261
|
-
|
|
262
|
-
let older: IMessage[] | undefined;
|
|
263
|
-
try {
|
|
264
|
-
older = await client.getHistoryStanza(
|
|
265
|
-
item.jid,
|
|
266
|
-
pageSize,
|
|
267
|
-
oldestId,
|
|
268
|
-
undefined,
|
|
269
|
-
{
|
|
270
|
-
coalesceRoom: true,
|
|
271
|
-
skipIfPreloaded: !forceReload,
|
|
272
|
-
source: 'background',
|
|
273
|
-
}
|
|
274
|
-
);
|
|
275
|
-
} catch {
|
|
276
|
-
break;
|
|
277
|
-
}
|
|
278
|
-
if (!older || !older.length) {break;}
|
|
279
|
-
|
|
280
|
-
combined = [...older, ...combined];
|
|
281
|
-
lastPageLen = older.length;
|
|
282
|
-
extraPages++;
|
|
283
|
-
|
|
284
|
-
const oldestTs = combined.reduce<number>((minTs, m) => {
|
|
285
|
-
const ts = messageTimestamp(m);
|
|
286
|
-
return ts > 0 ? Math.min(minTs, ts) : minTs;
|
|
287
|
-
}, Number.MAX_SAFE_INTEGER);
|
|
288
|
-
if (oldestTs !== Number.MAX_SAFE_INTEGER && oldestTs <= lastViewed) {
|
|
289
|
-
break;
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
260
|
+
const combined: IMessage[] = fetchedMessages || [];
|
|
293
261
|
|
|
294
262
|
// `mergeHistoryIntoCache` (roomsSlice) caps whatever we dispatch
|
|
295
263
|
// here to the newest RUNTIME_MESSAGE_LIMIT messages before it
|
|
@@ -353,10 +321,10 @@ export const runHistoryPreloadScheduler = async (
|
|
|
353
321
|
})
|
|
354
322
|
);
|
|
355
323
|
|
|
356
|
-
|
|
357
|
-
await new Promise((r) => setTimeout(r, 0));
|
|
324
|
+
await sleep(inBackgroundWave ? BACKGROUND_BATCH_PAUSE_MS : 0);
|
|
358
325
|
}
|
|
359
326
|
} finally {
|
|
327
|
+
devLog(`[preload] finished in ${Date.now() - startedAt}ms`);
|
|
360
328
|
store.dispatch(setUnreadSyncing(false));
|
|
361
329
|
}
|
|
362
330
|
};
|