@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
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
ActivityIndicator,
|
|
4
|
+
Alert,
|
|
5
|
+
Platform,
|
|
6
|
+
Pressable,
|
|
7
|
+
StyleProp,
|
|
8
|
+
StyleSheet,
|
|
9
|
+
Text,
|
|
10
|
+
View,
|
|
11
|
+
ViewStyle,
|
|
12
|
+
} from 'react-native';
|
|
13
|
+
import { LockIcon } from '../../assets/icons';
|
|
14
|
+
import { useTheme } from '../../hooks/useTheme';
|
|
15
|
+
import { useT } from '../../i18n/useT';
|
|
16
|
+
import { useToast } from '../../context/ToastContext';
|
|
17
|
+
import { omemoReady, type DeviceInfo, type Trust } from '../../e2ee';
|
|
18
|
+
|
|
19
|
+
interface EncryptionCardProps {
|
|
20
|
+
account?: string;
|
|
21
|
+
style?: StyleProp<ViewStyle>;
|
|
22
|
+
testID?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
type Loaded =
|
|
26
|
+
| { state: 'loading' }
|
|
27
|
+
| { state: 'unavailable' }
|
|
28
|
+
| { state: 'ready'; jid: string; own: boolean; devices: DeviceInfo[] };
|
|
29
|
+
|
|
30
|
+
const MONO = Platform.select({ ios: 'Menlo', default: 'monospace' });
|
|
31
|
+
|
|
32
|
+
const twoLines = (fingerprint: string): string => {
|
|
33
|
+
const groups = fingerprint.split(' ');
|
|
34
|
+
const half = Math.ceil(groups.length / 2);
|
|
35
|
+
return `${groups.slice(0, half).join(' ')}\n${groups.slice(half).join(' ')}`;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const EncryptionCard: React.FC<EncryptionCardProps> = ({ account, style, testID }) => {
|
|
39
|
+
const theme = useTheme();
|
|
40
|
+
const t = useT();
|
|
41
|
+
const { showToast } = useToast();
|
|
42
|
+
const [loaded, setLoaded] = useState<Loaded>({ state: 'loading' });
|
|
43
|
+
const mounted = useRef(true);
|
|
44
|
+
useEffect(
|
|
45
|
+
() => () => {
|
|
46
|
+
mounted.current = false;
|
|
47
|
+
},
|
|
48
|
+
[]
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
const load = useCallback(async () => {
|
|
52
|
+
try {
|
|
53
|
+
const device = await omemoReady();
|
|
54
|
+
if (!device) {
|
|
55
|
+
if (mounted.current) {setLoaded({ state: 'unavailable' });}
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const domain = device.jid.split('@')[1] || '';
|
|
59
|
+
const local = String(account || '').split('@')[0]!.toLowerCase();
|
|
60
|
+
const jid = local ? `${local}@${domain}` : device.jid;
|
|
61
|
+
const devices = await device.devices(jid);
|
|
62
|
+
if (mounted.current) {
|
|
63
|
+
setLoaded({ state: 'ready', jid, own: jid === device.jid, devices });
|
|
64
|
+
}
|
|
65
|
+
} catch (error) {
|
|
66
|
+
console.warn('[e2ee] could not list devices', error);
|
|
67
|
+
if (mounted.current) {setLoaded({ state: 'unavailable' });}
|
|
68
|
+
}
|
|
69
|
+
}, [account]);
|
|
70
|
+
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
void load();
|
|
73
|
+
}, [load]);
|
|
74
|
+
|
|
75
|
+
const copy = useCallback(
|
|
76
|
+
async (fingerprint: string) => {
|
|
77
|
+
try {
|
|
78
|
+
const Clipboard = require('expo-clipboard');
|
|
79
|
+
await Clipboard.setStringAsync(fingerprint);
|
|
80
|
+
showToast({
|
|
81
|
+
id: Date.now().toString(),
|
|
82
|
+
title: t('e2ee.devices.title'),
|
|
83
|
+
message: t('e2ee.devices.copied'),
|
|
84
|
+
type: 'success',
|
|
85
|
+
});
|
|
86
|
+
} catch (error) {
|
|
87
|
+
console.warn('[e2ee] could not copy the fingerprint', error);
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
[showToast, t]
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
const setTrust = useCallback(
|
|
94
|
+
async (jid: string, id: number, trust: Trust) => {
|
|
95
|
+
try {
|
|
96
|
+
const device = await omemoReady();
|
|
97
|
+
await device?.setTrust(jid, id, trust);
|
|
98
|
+
} catch (error) {
|
|
99
|
+
console.warn('[e2ee] could not change trust', error);
|
|
100
|
+
}
|
|
101
|
+
void load();
|
|
102
|
+
},
|
|
103
|
+
[load]
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
const askTrust = useCallback(
|
|
107
|
+
(jid: string, device: DeviceInfo) => {
|
|
108
|
+
const choices: Array<{ trust: Trust; label: string }> = [
|
|
109
|
+
{ trust: 'verified', label: t('e2ee.trust.verify') },
|
|
110
|
+
{ trust: 'untrusted', label: t('e2ee.trust.distrust') },
|
|
111
|
+
{ trust: 'blind', label: t('e2ee.trust.reset') },
|
|
112
|
+
];
|
|
113
|
+
Alert.alert(
|
|
114
|
+
t('e2ee.trust.prompt', { id: device.id }),
|
|
115
|
+
`${device.fingerprint}\n\n${t('e2ee.devices.hint')}`,
|
|
116
|
+
[
|
|
117
|
+
...choices
|
|
118
|
+
.filter((choice) => choice.trust !== device.trust)
|
|
119
|
+
.map((choice) => ({
|
|
120
|
+
text: choice.label,
|
|
121
|
+
style: choice.trust === 'untrusted' ? ('destructive' as const) : ('default' as const),
|
|
122
|
+
onPress: () => void setTrust(jid, device.id, choice.trust),
|
|
123
|
+
})),
|
|
124
|
+
{ text: t('action.cancel'), style: 'cancel' as const },
|
|
125
|
+
]
|
|
126
|
+
);
|
|
127
|
+
},
|
|
128
|
+
[setTrust, t]
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
const trustLabel: Record<Trust, string> = {
|
|
132
|
+
verified: t('e2ee.trust.verified'),
|
|
133
|
+
blind: t('e2ee.trust.blind'),
|
|
134
|
+
untrusted: t('e2ee.trust.untrusted'),
|
|
135
|
+
};
|
|
136
|
+
const trustColor: Record<Trust, string> = {
|
|
137
|
+
verified: theme.primary,
|
|
138
|
+
blind: theme.textSecondary,
|
|
139
|
+
untrusted: theme.danger,
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
const row = (jid: string, device: DeviceInfo, own: boolean) => {
|
|
143
|
+
const mine = device.trust === 'own';
|
|
144
|
+
return (
|
|
145
|
+
<Pressable
|
|
146
|
+
key={device.id}
|
|
147
|
+
testID={`e2ee-device-${device.id}`}
|
|
148
|
+
accessibilityRole="button"
|
|
149
|
+
onPress={() => (own ? void copy(device.fingerprint) : askTrust(jid, device))}
|
|
150
|
+
onLongPress={() => void copy(device.fingerprint)}
|
|
151
|
+
style={[styles.row, { borderTopColor: theme.border }]}
|
|
152
|
+
>
|
|
153
|
+
<View style={styles.rowHead}>
|
|
154
|
+
<Text style={[styles.device, { color: theme.text }]} numberOfLines={1}>
|
|
155
|
+
{mine
|
|
156
|
+
? t('e2ee.devices.thisDevice')
|
|
157
|
+
: t('e2ee.trust.prompt', { id: device.id })}
|
|
158
|
+
{device.label ? ` · ${device.label}` : ''}
|
|
159
|
+
</Text>
|
|
160
|
+
{!mine && !own && (
|
|
161
|
+
<Text
|
|
162
|
+
testID={`e2ee-trust-${device.id}`}
|
|
163
|
+
style={[styles.trust, { color: trustColor[device.trust as Trust] }]}
|
|
164
|
+
>
|
|
165
|
+
{trustLabel[device.trust as Trust]}
|
|
166
|
+
</Text>
|
|
167
|
+
)}
|
|
168
|
+
</View>
|
|
169
|
+
<Text style={[styles.fingerprint, { color: theme.textSecondary }]}>
|
|
170
|
+
{twoLines(device.fingerprint)}
|
|
171
|
+
</Text>
|
|
172
|
+
</Pressable>
|
|
173
|
+
);
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
let body: React.ReactNode;
|
|
177
|
+
if (loaded.state === 'loading') {
|
|
178
|
+
body = (
|
|
179
|
+
<View style={styles.status}>
|
|
180
|
+
<ActivityIndicator size="small" color={theme.textSecondary} />
|
|
181
|
+
<Text style={[styles.note, { color: theme.textSecondary }]}>
|
|
182
|
+
{t('e2ee.devices.loading')}
|
|
183
|
+
</Text>
|
|
184
|
+
</View>
|
|
185
|
+
);
|
|
186
|
+
} else if (loaded.state === 'unavailable') {
|
|
187
|
+
body = (
|
|
188
|
+
<Text style={[styles.note, { color: theme.textSecondary }]}>
|
|
189
|
+
{t('e2ee.devices.unavailable')}
|
|
190
|
+
</Text>
|
|
191
|
+
);
|
|
192
|
+
} else {
|
|
193
|
+
const { jid, own, devices } = loaded;
|
|
194
|
+
const ordered = [
|
|
195
|
+
...devices.filter((d) => d.trust === 'own'),
|
|
196
|
+
...devices.filter((d) => d.trust !== 'own'),
|
|
197
|
+
];
|
|
198
|
+
const others = ordered.filter((d) => d.trust !== 'own');
|
|
199
|
+
body = (
|
|
200
|
+
<>
|
|
201
|
+
{ordered.map((device) => row(jid, device, own))}
|
|
202
|
+
{(own ? others.length === 0 : ordered.length === 0) && (
|
|
203
|
+
<Text style={[styles.note, { color: theme.textSecondary }]}>
|
|
204
|
+
{t(own ? 'e2ee.devices.noneOwn' : 'e2ee.devices.none')}
|
|
205
|
+
</Text>
|
|
206
|
+
)}
|
|
207
|
+
{!own && ordered.length > 0 && (
|
|
208
|
+
<Text style={[styles.hint, { color: theme.textMuted }]}>
|
|
209
|
+
{t('e2ee.devices.hint')}
|
|
210
|
+
</Text>
|
|
211
|
+
)}
|
|
212
|
+
</>
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return (
|
|
217
|
+
<View style={[style, styles.card]} testID={testID || 'e2ee-devices'}>
|
|
218
|
+
<View style={styles.head}>
|
|
219
|
+
<LockIcon width={18} height={18} color={theme.textSecondary} />
|
|
220
|
+
<Text style={[styles.title, { color: theme.text }]}>
|
|
221
|
+
{t('e2ee.devices.title')}
|
|
222
|
+
</Text>
|
|
223
|
+
</View>
|
|
224
|
+
{body}
|
|
225
|
+
</View>
|
|
226
|
+
);
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
export default EncryptionCard;
|
|
230
|
+
|
|
231
|
+
const styles = StyleSheet.create({
|
|
232
|
+
card: {
|
|
233
|
+
flexDirection: 'column',
|
|
234
|
+
alignItems: 'stretch',
|
|
235
|
+
},
|
|
236
|
+
head: {
|
|
237
|
+
flexDirection: 'row',
|
|
238
|
+
alignItems: 'center',
|
|
239
|
+
gap: 8,
|
|
240
|
+
marginBottom: 6,
|
|
241
|
+
},
|
|
242
|
+
title: {
|
|
243
|
+
fontSize: 16,
|
|
244
|
+
fontWeight: '600',
|
|
245
|
+
},
|
|
246
|
+
status: {
|
|
247
|
+
flexDirection: 'row',
|
|
248
|
+
alignItems: 'center',
|
|
249
|
+
gap: 8,
|
|
250
|
+
paddingVertical: 6,
|
|
251
|
+
},
|
|
252
|
+
note: {
|
|
253
|
+
fontSize: 14,
|
|
254
|
+
lineHeight: 19,
|
|
255
|
+
paddingVertical: 4,
|
|
256
|
+
},
|
|
257
|
+
row: {
|
|
258
|
+
paddingVertical: 10,
|
|
259
|
+
borderTopWidth: StyleSheet.hairlineWidth,
|
|
260
|
+
gap: 4,
|
|
261
|
+
},
|
|
262
|
+
rowHead: {
|
|
263
|
+
flexDirection: 'row',
|
|
264
|
+
alignItems: 'center',
|
|
265
|
+
justifyContent: 'space-between',
|
|
266
|
+
gap: 8,
|
|
267
|
+
},
|
|
268
|
+
device: {
|
|
269
|
+
flexShrink: 1,
|
|
270
|
+
fontSize: 15,
|
|
271
|
+
fontWeight: '500',
|
|
272
|
+
},
|
|
273
|
+
trust: {
|
|
274
|
+
fontSize: 13,
|
|
275
|
+
fontWeight: '600',
|
|
276
|
+
},
|
|
277
|
+
fingerprint: {
|
|
278
|
+
fontFamily: MONO,
|
|
279
|
+
fontSize: 12,
|
|
280
|
+
lineHeight: 17,
|
|
281
|
+
},
|
|
282
|
+
hint: {
|
|
283
|
+
marginTop: 6,
|
|
284
|
+
fontSize: 12,
|
|
285
|
+
lineHeight: 16,
|
|
286
|
+
},
|
|
287
|
+
});
|
|
@@ -18,6 +18,7 @@ import { defaultMediaDims } from '../../helpers/mediaDimensions';
|
|
|
18
18
|
import { useFileToken } from '../../hooks/useFileToken';
|
|
19
19
|
import { appendFileToken } from '../../helpers/secureFileUrl';
|
|
20
20
|
import { useTheme } from '../../hooks/useTheme';
|
|
21
|
+
import SealedAttachment from './SealedAttachment';
|
|
21
22
|
|
|
22
23
|
interface MediaMessageProps {
|
|
23
24
|
mimeType?: string;
|
|
@@ -167,6 +168,10 @@ const MediaMessage: React.FC<MediaMessageProps> = ({
|
|
|
167
168
|
const location = appendFileToken(rawLocation, fileToken);
|
|
168
169
|
const messageText = appendFileToken(rawMessageText, fileToken);
|
|
169
170
|
|
|
171
|
+
if (message?.clientEncrypted === 'true') {
|
|
172
|
+
return <SealedAttachment message={message} isUser={isUser} />;
|
|
173
|
+
}
|
|
174
|
+
|
|
170
175
|
if (mimeType) {
|
|
171
176
|
const displayName = getDisplayFileName({
|
|
172
177
|
originalName: (message as any)?.originalName,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { FC, Fragment, useMemo } from 'react';
|
|
1
|
+
import React, { FC, Fragment, memo, useMemo } from 'react';
|
|
2
2
|
import { IConfig, IMessage } from '../../types/types';
|
|
3
3
|
import { isOwnMessage } from '../../helpers/isOwnMessage';
|
|
4
4
|
import DateLabel from '../styled/DateLabel';
|
|
@@ -6,9 +6,6 @@ import SystemMessage from './SystemMessage';
|
|
|
6
6
|
import NewMessageLabel from '../styled/NewMessageLabel';
|
|
7
7
|
import {
|
|
8
8
|
Message,
|
|
9
|
-
MessageText,
|
|
10
|
-
MessageTimestamp,
|
|
11
|
-
UserName,
|
|
12
9
|
} from '../styled/StyledComponents';
|
|
13
10
|
import { View } from 'react-native';
|
|
14
11
|
|
|
@@ -35,7 +32,7 @@ interface MessageContainerProps {
|
|
|
35
32
|
className?: string;
|
|
36
33
|
}
|
|
37
34
|
|
|
38
|
-
|
|
35
|
+
const MessageContainerImpl: FC<MessageContainerProps> = ({
|
|
39
36
|
CustomMessage,
|
|
40
37
|
CustomDaySeparator,
|
|
41
38
|
CustomNewMessageLabel,
|
|
@@ -101,28 +98,23 @@ export const MessageContainer: FC<MessageContainerProps> = ({
|
|
|
101
98
|
<DateLabel date={messageDate} colors={config?.colors} />
|
|
102
99
|
)
|
|
103
100
|
) : null}
|
|
101
|
+
|
|
104
102
|
<MessageComponent
|
|
105
103
|
message={message}
|
|
106
104
|
isUser={isUser}
|
|
107
105
|
isReply={isReply}
|
|
108
106
|
className={className}
|
|
109
107
|
>
|
|
110
|
-
{
|
|
111
|
-
<>
|
|
112
|
-
<MessageTimestamp>
|
|
113
|
-
{messageDate.toLocaleTimeString()}
|
|
114
|
-
</MessageTimestamp>
|
|
115
|
-
<UserName>{message.user.name}: </UserName>
|
|
116
|
-
<MessageText>{message.body}</MessageText>
|
|
117
|
-
</>
|
|
118
|
-
) : (
|
|
108
|
+
{CustomMessage ? (
|
|
119
109
|
<MessageComponent
|
|
120
110
|
message={message}
|
|
121
111
|
isUser={isUser}
|
|
122
112
|
isReply={isReply}
|
|
123
113
|
/>
|
|
124
|
-
)}
|
|
114
|
+
) : null}
|
|
125
115
|
</MessageComponent>
|
|
126
116
|
</View>
|
|
127
117
|
);
|
|
128
118
|
};
|
|
119
|
+
|
|
120
|
+
export const MessageContainer = memo(MessageContainerImpl);
|
|
@@ -23,7 +23,8 @@ import { msgSortableMs } from '../../roomStore/roomsSlice';
|
|
|
23
23
|
import Composing from '../styled/StyledInputComponents/Composing';
|
|
24
24
|
import TreadLabel from '../styled/TreadLabel';
|
|
25
25
|
import { MessageContainer } from './MessageContainer';
|
|
26
|
-
import {
|
|
26
|
+
import { useSelector } from 'react-redux';
|
|
27
|
+
import type { RootState } from '../../roomStore';
|
|
27
28
|
import Loader from '../styled/Loader';
|
|
28
29
|
import { ArowDownIcon } from '../../assets/icons';
|
|
29
30
|
import CustomTypingIndicator from '../styled/StyledInputComponents/CustomTypingIndicator';
|
|
@@ -67,6 +68,43 @@ interface MessageListProps<TMessage extends IMessage> {
|
|
|
67
68
|
onReadBoundaryChange?: (boundaryTs: number | null) => void;
|
|
68
69
|
}
|
|
69
70
|
|
|
71
|
+
const mainIdCache = new WeakMap<object, string | null>();
|
|
72
|
+
const mainMessageIdOf = (m: IMessage): string | null => {
|
|
73
|
+
if (!m?.mainMessage) {return null;}
|
|
74
|
+
const cached = mainIdCache.get(m);
|
|
75
|
+
if (cached !== undefined) {return cached;}
|
|
76
|
+
let id: string | null = null;
|
|
77
|
+
try {
|
|
78
|
+
const parsed = JSON.parse(m.mainMessage);
|
|
79
|
+
id = parsed?.id != null ? String(parsed.id) : null;
|
|
80
|
+
} catch {
|
|
81
|
+
id = null;
|
|
82
|
+
}
|
|
83
|
+
mainIdCache.set(m, id);
|
|
84
|
+
return id;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const sortKeyCache = new WeakMap<object, number>();
|
|
88
|
+
const sortKeyOf = (m: IMessage): number => {
|
|
89
|
+
const cached = sortKeyCache.get(m);
|
|
90
|
+
if (cached !== undefined) {return cached;}
|
|
91
|
+
const key = new Date(m?.date as any).getTime() || 0;
|
|
92
|
+
sortKeyCache.set(m, key);
|
|
93
|
+
return key;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
const dayKeyCache = new WeakMap<object, string>();
|
|
97
|
+
const dayKeyOf = (m: IMessage): string => {
|
|
98
|
+
const cached = dayKeyCache.get(m);
|
|
99
|
+
if (cached !== undefined) {return cached;}
|
|
100
|
+
const key = new Date(m.date).toDateString();
|
|
101
|
+
dayKeyCache.set(m, key);
|
|
102
|
+
return key;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const keyExtractor = (item: IMessage) => String(item.id);
|
|
106
|
+
const EMPTY_LIST: IMessage[] = [];
|
|
107
|
+
|
|
70
108
|
const MessageList = <TMessage extends IMessage>({
|
|
71
109
|
CustomMessage,
|
|
72
110
|
CustomDaySeparator,
|
|
@@ -80,8 +118,12 @@ const MessageList = <TMessage extends IMessage>({
|
|
|
80
118
|
activeMessage,
|
|
81
119
|
onReadBoundaryChange,
|
|
82
120
|
}: MessageListProps<TMessage>) => {
|
|
83
|
-
const
|
|
84
|
-
|
|
121
|
+
const room = useSelector(
|
|
122
|
+
(state: RootState) => state.rooms.rooms?.[roomJID]
|
|
123
|
+
) as IRoom | undefined;
|
|
124
|
+
const composing = room?.composing;
|
|
125
|
+
const composingList = room?.composingList;
|
|
126
|
+
const messages = room?.messages || EMPTY_LIST;
|
|
85
127
|
const theme = useTheme();
|
|
86
128
|
const [isUserAtBottom, setIsUserAtBottom] = useState(true);
|
|
87
129
|
const [showNewMessageIndicator, setShowNewMessageIndicator] = useState(false);
|
|
@@ -107,17 +149,22 @@ const MessageList = <TMessage extends IMessage>({
|
|
|
107
149
|
const flatListRef = useRef<FlatList<IMessage>>(null);
|
|
108
150
|
|
|
109
151
|
const addReplyMessages = useMemo(() => {
|
|
152
|
+
const repliesByParent = new Map<string, IMessage[]>();
|
|
153
|
+
for (const mess of messages) {
|
|
154
|
+
if (!mess?.mainMessage || mess.isDeleted) {continue;}
|
|
155
|
+
const parentId = mainMessageIdOf(mess);
|
|
156
|
+
if (!parentId) {continue;}
|
|
157
|
+
const list = repliesByParent.get(parentId);
|
|
158
|
+
if (list) {
|
|
159
|
+
list.push(mess);
|
|
160
|
+
} else {
|
|
161
|
+
repliesByParent.set(parentId, [mess]);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (repliesByParent.size === 0) {return messages;}
|
|
110
165
|
return messages.map((message: IMessage) => {
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
reply: messages.filter(
|
|
114
|
-
(mess: IMessage) =>
|
|
115
|
-
!!mess.mainMessage &&
|
|
116
|
-
JSON.parse(mess.mainMessage).id === message.id &&
|
|
117
|
-
!mess.isDeleted
|
|
118
|
-
),
|
|
119
|
-
};
|
|
120
|
-
return newMessage;
|
|
166
|
+
const reply = repliesByParent.get(String(message.id));
|
|
167
|
+
return reply ? { ...message, reply } : message;
|
|
121
168
|
});
|
|
122
169
|
}, [messages]);
|
|
123
170
|
|
|
@@ -134,7 +181,7 @@ const MessageList = <TMessage extends IMessage>({
|
|
|
134
181
|
item.isReply &&
|
|
135
182
|
item.isReply === 'true' &&
|
|
136
183
|
item.mainMessage &&
|
|
137
|
-
|
|
184
|
+
mainMessageIdOf(item) === String(activeMessage?.id)
|
|
138
185
|
);
|
|
139
186
|
} else {
|
|
140
187
|
filtered = nonDeletedMessages.filter(
|
|
@@ -154,14 +201,21 @@ const MessageList = <TMessage extends IMessage>({
|
|
|
154
201
|
// settles. Sorting here makes each render a stable, ordered view —
|
|
155
202
|
// even mid-stream — so the user sees them appear from oldest to
|
|
156
203
|
// newest with no swap animation.
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
);
|
|
204
|
+
let sorted = filtered;
|
|
205
|
+
for (let i = 1; i < filtered.length; i++) {
|
|
206
|
+
if (sortKeyOf(filtered[i - 1]) > sortKeyOf(filtered[i])) {
|
|
207
|
+
sorted = filtered.slice().sort((a, b) => sortKeyOf(a) - sortKeyOf(b));
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const seen = new Set<string>();
|
|
212
|
+
const deduped: IMessage[] = [];
|
|
213
|
+
for (const m of sorted) {
|
|
214
|
+
const key = String(m.id);
|
|
215
|
+
if (seen.has(key)) {continue;}
|
|
216
|
+
seen.add(key);
|
|
217
|
+
deduped.push(m);
|
|
218
|
+
}
|
|
165
219
|
return deduped;
|
|
166
220
|
}, [addReplyMessages, isReply, roomJID, activeMessage]);
|
|
167
221
|
|
|
@@ -244,8 +298,21 @@ const MessageList = <TMessage extends IMessage>({
|
|
|
244
298
|
return withDivider;
|
|
245
299
|
}, [memoizedMessages, isUserAtBottom, roomJID, unreadWhileScrolledUp]);
|
|
246
300
|
|
|
301
|
+
const dateLabelIds = useMemo(() => {
|
|
302
|
+
const ids = new Set<string>();
|
|
303
|
+
let nextDay: string | null = null;
|
|
304
|
+
for (let i = dataMessages.length - 1; i >= 0; i--) {
|
|
305
|
+
const item = dataMessages[i];
|
|
306
|
+
if (String(item.id).startsWith('delimiter-new')) {continue;}
|
|
307
|
+
const day = dayKeyOf(item);
|
|
308
|
+
if (nextDay === null || day !== nextDay) {ids.add(String(item.id));}
|
|
309
|
+
nextDay = day;
|
|
310
|
+
}
|
|
311
|
+
return ids;
|
|
312
|
+
}, [dataMessages]);
|
|
313
|
+
|
|
247
314
|
const renderMessage = useCallback(
|
|
248
|
-
({ item
|
|
315
|
+
({ item }: { item: IMessage }) => {
|
|
249
316
|
if (String(item.id).startsWith('delimiter-new')) {
|
|
250
317
|
return (
|
|
251
318
|
<MessageContainer
|
|
@@ -262,24 +329,7 @@ const MessageList = <TMessage extends IMessage>({
|
|
|
262
329
|
);
|
|
263
330
|
}
|
|
264
331
|
|
|
265
|
-
const
|
|
266
|
-
let showDateLabel = false;
|
|
267
|
-
|
|
268
|
-
let nextMessage = null;
|
|
269
|
-
for (let i = index + 1; i < dataMessages.length; i++) {
|
|
270
|
-
const candidate = dataMessages[i];
|
|
271
|
-
if (!String(candidate.id).startsWith('delimiter-new')) {
|
|
272
|
-
nextMessage = candidate;
|
|
273
|
-
break;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
const nextMessageDate = nextMessage
|
|
277
|
-
? new Date(nextMessage.date).toDateString()
|
|
278
|
-
: null;
|
|
279
|
-
|
|
280
|
-
if (!nextMessage || messageDate !== nextMessageDate) {
|
|
281
|
-
showDateLabel = true;
|
|
282
|
-
}
|
|
332
|
+
const showDateLabel = dateLabelIds.has(String(item.id));
|
|
283
333
|
|
|
284
334
|
return (
|
|
285
335
|
<MessageContainer
|
|
@@ -301,7 +351,7 @@ const MessageList = <TMessage extends IMessage>({
|
|
|
301
351
|
CustomDaySeparator,
|
|
302
352
|
CustomMessage,
|
|
303
353
|
CustomNewMessageLabel,
|
|
304
|
-
|
|
354
|
+
dateLabelIds,
|
|
305
355
|
isReply,
|
|
306
356
|
user.xmppUsername,
|
|
307
357
|
user.walletAddress,
|
|
@@ -452,7 +502,10 @@ const MessageList = <TMessage extends IMessage>({
|
|
|
452
502
|
ref={flatListRef}
|
|
453
503
|
data={dataMessages}
|
|
454
504
|
renderItem={renderMessage}
|
|
455
|
-
keyExtractor={
|
|
505
|
+
keyExtractor={keyExtractor}
|
|
506
|
+
initialNumToRender={15}
|
|
507
|
+
maxToRenderPerBatch={10}
|
|
508
|
+
windowSize={7}
|
|
456
509
|
onEndReached={handleLoadMore}
|
|
457
510
|
onScroll={handleScroll}
|
|
458
511
|
onContentSizeChange={handleContentSizeChange}
|
|
@@ -22,6 +22,7 @@ import '../../helpers/storeConsole';
|
|
|
22
22
|
import {installPromiseRejectionTracker} from '../../utils/installPromiseRejectionTracker';
|
|
23
23
|
import {useChatFonts} from '../../hooks/useChatFonts';
|
|
24
24
|
import {installPushTokenHook} from '../../services/pushRegistration';
|
|
25
|
+
import {setE2eeEnabled} from '../../e2ee';
|
|
25
26
|
|
|
26
27
|
// Mount-time, dev-only — wire a global unhandled-promise-rejection
|
|
27
28
|
// tracker so any future leak surfaces with a real stack trace in Metro
|
|
@@ -57,6 +58,10 @@ const ConfigEnabler: React.FC<{config?: IConfig}> = ({config}) => {
|
|
|
57
58
|
if (!config) {return;}
|
|
58
59
|
dispatch(setConfig(config));
|
|
59
60
|
}, [config, dispatch]);
|
|
61
|
+
const e2eeEnabled = config?.e2ee?.enabled === true;
|
|
62
|
+
React.useEffect(() => {
|
|
63
|
+
setE2eeEnabled(e2eeEnabled);
|
|
64
|
+
}, [e2eeEnabled]);
|
|
60
65
|
return null;
|
|
61
66
|
};
|
|
62
67
|
|
|
@@ -121,10 +121,16 @@ const RoomList: React.FC<RoomListProps> = ({
|
|
|
121
121
|
setSearchTerm(text);
|
|
122
122
|
}, []);
|
|
123
123
|
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
124
|
+
const activityOf = useCallback((chat: IRoom): number => {
|
|
125
|
+
const last = chat?.messages?.[chat?.messages.length - 1];
|
|
126
|
+
const fromLive = Number(last?.id);
|
|
127
|
+
if (Number.isFinite(fromLive) && fromLive > 0) {return fromLive;}
|
|
128
|
+
const fromStamp = Number(chat?.lastMessageTimestamp);
|
|
129
|
+
if (Number.isFinite(fromStamp) && fromStamp > 0) {return fromStamp;}
|
|
130
|
+
const fromSeed = Number(chat?.lastMessage?.id);
|
|
131
|
+
if (Number.isFinite(fromSeed) && fromSeed > 0) {return fromSeed;}
|
|
132
|
+
return 0;
|
|
133
|
+
}, []);
|
|
128
134
|
|
|
129
135
|
const filteredChats = useMemo(() => {
|
|
130
136
|
const lowerCaseSearchTerm = searchTerm.toLowerCase();
|
|
@@ -136,22 +142,13 @@ const RoomList: React.FC<RoomListProps> = ({
|
|
|
136
142
|
const hay = `${chat?.title || ''} ${chat?.name || ''}`.toLowerCase();
|
|
137
143
|
return hay.includes(lowerCaseSearchTerm);
|
|
138
144
|
})
|
|
139
|
-
.sort((a, b) =>
|
|
140
|
-
if (getLastMessage(a)?.id && getLastMessage(b)?.id) {
|
|
141
|
-
return Number(getLastMessage(b).id) - Number(getLastMessage(a).id);
|
|
142
|
-
} else if (getLastMessage(a)?.id) {
|
|
143
|
-
return -1;
|
|
144
|
-
} else if (getLastMessage(b)?.id) {
|
|
145
|
-
return 1;
|
|
146
|
-
}
|
|
147
|
-
return -1;
|
|
148
|
-
});
|
|
145
|
+
.sort((a, b) => activityOf(b) - activityOf(a));
|
|
149
146
|
|
|
150
147
|
chatsMap.set(lowerCaseSearchTerm, result);
|
|
151
148
|
}
|
|
152
149
|
|
|
153
150
|
return chatsMap.get(lowerCaseSearchTerm) || [];
|
|
154
|
-
}, [chats, searchTerm]);
|
|
151
|
+
}, [chats, searchTerm, activityOf]);
|
|
155
152
|
|
|
156
153
|
useEffect(() => {
|
|
157
154
|
if (burgerMenu) {
|
|
@@ -278,6 +275,21 @@ const RoomList: React.FC<RoomListProps> = ({
|
|
|
278
275
|
}
|
|
279
276
|
}, [isSearchFocused]);
|
|
280
277
|
|
|
278
|
+
const renderRoom = useCallback(
|
|
279
|
+
({ item }: { item: IRoom }) => (
|
|
280
|
+
<Pressable
|
|
281
|
+
testID={`room-${(item.jid || '').split('@')[0]}`}
|
|
282
|
+
accessibilityLabel={`room-${item.title || item.name}`}
|
|
283
|
+
onPress={() => performClick(item)}
|
|
284
|
+
onPressIn={handlePressIn}
|
|
285
|
+
onPressOut={handlePressOut}
|
|
286
|
+
>
|
|
287
|
+
<ChatRoomItem chat={item} config={config} />
|
|
288
|
+
</Pressable>
|
|
289
|
+
),
|
|
290
|
+
[performClick, handlePressIn, handlePressOut, config]
|
|
291
|
+
);
|
|
292
|
+
|
|
281
293
|
const toggleDrawer = () => {
|
|
282
294
|
if (isDrawerOpen) {
|
|
283
295
|
closeDrawer();
|
|
@@ -392,20 +404,7 @@ const RoomList: React.FC<RoomListProps> = ({
|
|
|
392
404
|
onMomentumScrollBegin={handleMomentumBegin}
|
|
393
405
|
onMomentumScrollEnd={handleMomentumEnd}
|
|
394
406
|
keyboardShouldPersistTaps="handled"
|
|
395
|
-
renderItem={
|
|
396
|
-
<Pressable
|
|
397
|
-
// Stable testID so e2e drivers can target a room
|
|
398
|
-
// row by its jid local-part (e.g. Main chat under
|
|
399
|
-
// app id `..._...759` → testID `room-...759`).
|
|
400
|
-
testID={`room-${(item.jid || '').split('@')[0]}`}
|
|
401
|
-
accessibilityLabel={`room-${item.title || item.name}`}
|
|
402
|
-
onPress={() => performClick(item)}
|
|
403
|
-
onPressIn={handlePressIn}
|
|
404
|
-
onPressOut={handlePressOut}
|
|
405
|
-
>
|
|
406
|
-
<ChatRoomItem chat={item} config={config} />
|
|
407
|
-
</Pressable>
|
|
408
|
-
)}
|
|
407
|
+
renderItem={renderRoom}
|
|
409
408
|
style={[
|
|
410
409
|
styles.chatList,
|
|
411
410
|
{ backgroundColor: theme.listBackground },
|