@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
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { IMessage } from '../types/types';
|
|
2
|
-
import { isDateAfter, isDateBefore } from './dateComparison';
|
|
3
2
|
import { msgSortableMs } from './msgSortableMs';
|
|
4
3
|
|
|
5
4
|
// Robustly resolve a caller-supplied read marker to epoch milliseconds.
|
|
@@ -90,17 +89,29 @@ export function insertMessageWithDelimiter(
|
|
|
90
89
|
return;
|
|
91
90
|
}
|
|
92
91
|
|
|
93
|
-
const newMessageDate = message.date;
|
|
94
92
|
const lastMessage = roomMessages[roomMessages.length - 1];
|
|
95
|
-
|
|
93
|
+
// Ordered by the id-encoded server timestamp (msgSortableMs), the same
|
|
94
|
+
// key the list and the unread logic use. The old `date` string compare
|
|
95
|
+
// had a hole: a message neither strictly after the last one nor
|
|
96
|
+
// strictly before the first (same second, or an unparseable date) fell
|
|
97
|
+
// through every branch and was silently DROPPED.
|
|
98
|
+
const newMs = msgSortableMs(message);
|
|
99
|
+
const lastMs = lastMessage ? msgSortableMs(lastMessage) : 0;
|
|
96
100
|
|
|
97
|
-
if (
|
|
101
|
+
if (!lastMessage || !newMs || newMs >= lastMs) {
|
|
98
102
|
const index = roomMessages.findIndex(
|
|
99
103
|
(msg) => msg.id === message.xmppId || msg.id === message.id
|
|
100
104
|
);
|
|
101
105
|
|
|
102
106
|
if (index !== -1) {
|
|
103
|
-
|
|
107
|
+
// Keep an open thread open when its parent is replaced by the echo.
|
|
108
|
+
const keepThread = (roomMessages[index] as any)?.activeMessage;
|
|
109
|
+
roomMessages[index] = {
|
|
110
|
+
...message,
|
|
111
|
+
id: message.id,
|
|
112
|
+
pending: false,
|
|
113
|
+
...(keepThread ? { activeMessage: true } : {}),
|
|
114
|
+
};
|
|
104
115
|
} else {
|
|
105
116
|
roomMessages.push(message);
|
|
106
117
|
}
|
|
@@ -153,18 +164,14 @@ export function insertMessageWithDelimiter(
|
|
|
153
164
|
});
|
|
154
165
|
}
|
|
155
166
|
}
|
|
156
|
-
} else if (
|
|
157
|
-
isDateBefore(newMessageDate.toString(), firstMessage?.date?.toString() ?? '')
|
|
158
|
-
) {
|
|
159
|
-
roomMessages.unshift(message);
|
|
160
167
|
} else {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
+
// Before the first message strictly newer than it; equal keys keep
|
|
169
|
+
// arrival order.
|
|
170
|
+
const at = roomMessages.findIndex((msg) => msgSortableMs(msg) > newMs);
|
|
171
|
+
if (at === -1) {
|
|
172
|
+
roomMessages.push(message);
|
|
173
|
+
} else {
|
|
174
|
+
roomMessages.splice(at, 0, message);
|
|
168
175
|
}
|
|
169
176
|
}
|
|
170
177
|
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { IMessage } from '../types/models/message.model';
|
|
2
|
+
import { applyReactionToMessage, compareStanzaIds } from '../roomStore/roomsSlice';
|
|
3
|
+
|
|
4
|
+
export interface ExtractedReaction {
|
|
5
|
+
messageId: string;
|
|
6
|
+
from: string;
|
|
7
|
+
emoji: string[];
|
|
8
|
+
data: Record<string, string>;
|
|
9
|
+
roomJID: string;
|
|
10
|
+
/** Server stanza id (microsecond timestamp) — orders reactions. */
|
|
11
|
+
ts?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const extractReaction = (
|
|
15
|
+
msg: any,
|
|
16
|
+
fallbackRoomJID?: string,
|
|
17
|
+
archiveId?: string
|
|
18
|
+
): ExtractedReaction | null => {
|
|
19
|
+
const reactionsEl = msg?.getChild?.('reactions');
|
|
20
|
+
if (!reactionsEl) {return null;}
|
|
21
|
+
const messageId = reactionsEl.attrs?.id;
|
|
22
|
+
const from = String(reactionsEl.attrs?.from || '');
|
|
23
|
+
if (!messageId || !from.split('@')[0]) {return null;}
|
|
24
|
+
const emoji: string[] = (reactionsEl.getChildren?.('reaction') || [])
|
|
25
|
+
.map((reaction: any) => (reaction.text ? reaction.text() : ''))
|
|
26
|
+
.filter(Boolean);
|
|
27
|
+
const data = (msg.getChild?.('data')?.attrs || {}) as Record<string, string>;
|
|
28
|
+
const stanzaId = msg.getChild?.('stanza-id');
|
|
29
|
+
const roomJID = String(
|
|
30
|
+
stanzaId?.attrs?.by || fallbackRoomJID || msg.attrs?.from || ''
|
|
31
|
+
).split('/')[0];
|
|
32
|
+
const rawTs = String(archiveId || stanzaId?.attrs?.id || '');
|
|
33
|
+
const ts = /^\d+$/.test(rawTs) ? rawTs : undefined;
|
|
34
|
+
return { messageId, from, emoji, data, roomJID, ...(ts ? { ts } : {}) };
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export const applyMamReactions = (
|
|
38
|
+
messages: IMessage[],
|
|
39
|
+
reactions: ExtractedReaction[]
|
|
40
|
+
): ExtractedReaction[] => {
|
|
41
|
+
const byId = new Map<string, IMessage>();
|
|
42
|
+
for (const message of messages) {
|
|
43
|
+
if (message?.id) {byId.set(String(message.id), message);}
|
|
44
|
+
}
|
|
45
|
+
const deferred: ExtractedReaction[] = [];
|
|
46
|
+
// Oldest first, so the newest state of each reactor wins.
|
|
47
|
+
const ordered = reactions
|
|
48
|
+
.slice()
|
|
49
|
+
.sort((a, b) => (a.ts && b.ts ? compareStanzaIds(a.ts, b.ts) : 0));
|
|
50
|
+
for (const reaction of ordered) {
|
|
51
|
+
const target = byId.get(String(reaction.messageId));
|
|
52
|
+
if (target) {
|
|
53
|
+
applyReactionToMessage(target, reaction.from, reaction.emoji, reaction.data, reaction.ts);
|
|
54
|
+
} else {
|
|
55
|
+
deferred.push(reaction);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return deferred;
|
|
59
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** The parent a reply points at, read from its `mainMessage` JSON. */
|
|
2
|
+
export interface MessageReference {
|
|
3
|
+
id: string;
|
|
4
|
+
text: string;
|
|
5
|
+
roomJid: string;
|
|
6
|
+
userName?: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const cache = new WeakMap<object, MessageReference | null>();
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Safe read of `message.mainMessage` (a JSON string on the wire). Null for
|
|
13
|
+
* a missing or malformed value — a bad payload must not crash a bubble.
|
|
14
|
+
* Cached per message object.
|
|
15
|
+
*/
|
|
16
|
+
export const parseMessageReference = (message: {
|
|
17
|
+
mainMessage?: string;
|
|
18
|
+
} | null | undefined): MessageReference | null => {
|
|
19
|
+
if (!message?.mainMessage) {return null;}
|
|
20
|
+
const cached = cache.get(message);
|
|
21
|
+
if (cached !== undefined) {return cached;}
|
|
22
|
+
let ref: MessageReference | null = null;
|
|
23
|
+
try {
|
|
24
|
+
const parsed = JSON.parse(message.mainMessage);
|
|
25
|
+
if (parsed && parsed.id != null) {
|
|
26
|
+
ref = {
|
|
27
|
+
id: String(parsed.id),
|
|
28
|
+
text: typeof parsed.text === 'string' ? parsed.text : '',
|
|
29
|
+
roomJid: typeof parsed.roomJid === 'string' ? parsed.roomJid : '',
|
|
30
|
+
userName: typeof parsed.userName === 'string' ? parsed.userName : undefined,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
} catch {
|
|
34
|
+
ref = null;
|
|
35
|
+
}
|
|
36
|
+
cache.set(message, ref);
|
|
37
|
+
return ref;
|
|
38
|
+
};
|
|
@@ -69,6 +69,11 @@ const loadOrCreateKey = (): Promise<CryptoJS.lib.WordArray> => {
|
|
|
69
69
|
return cachedKeyPromise;
|
|
70
70
|
};
|
|
71
71
|
|
|
72
|
+
export async function isPersistKeyKept(): Promise<boolean> {
|
|
73
|
+
const key = await loadOrCreateKey();
|
|
74
|
+
return (await secureGet(CIPHER_KEY_STORE_KEY)) === CryptoJS.enc.Base64.stringify(key);
|
|
75
|
+
}
|
|
76
|
+
|
|
72
77
|
/** Encrypt a JSON-serialisable payload for storage. Returns the string to persist. */
|
|
73
78
|
export async function encryptForPersist(plaintext: string): Promise<string> {
|
|
74
79
|
const key = await loadOrCreateKey();
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { IConfig } from '../types/types';
|
|
2
|
+
import { DEFAULT_QUICK_REACTIONS } from './emoji';
|
|
3
|
+
|
|
4
|
+
export const reactionsEnabled = (config?: IConfig | null): boolean =>
|
|
5
|
+
!config?.disableReactions && config?.reactions?.enabled !== false;
|
|
6
|
+
|
|
7
|
+
export const quickReactionIds = (config?: IConfig | null): string[] => {
|
|
8
|
+
const ids = config?.reactions?.quickReactions;
|
|
9
|
+
return Array.isArray(ids) && ids.length ? ids.slice(0, 8) : DEFAULT_QUICK_REACTIONS;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export const reactionPickerEnabled = (config?: IConfig | null): boolean =>
|
|
13
|
+
reactionsEnabled(config) && config?.reactions?.picker !== false;
|
|
@@ -74,6 +74,21 @@ export async function secureRemove(key: string): Promise<void> {
|
|
|
74
74
|
await AsyncStorage.removeItem(FALLBACK_PREFIX + key).catch(() => undefined);
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
+
export async function secureGetOrCreate(
|
|
78
|
+
key: string,
|
|
79
|
+
create: () => string
|
|
80
|
+
): Promise<{ value: string; created: boolean } | null> {
|
|
81
|
+
const existing = await secureGet(key);
|
|
82
|
+
if (existing) {return { value: existing, created: false };}
|
|
83
|
+
const value = create();
|
|
84
|
+
await secureSet(key, value);
|
|
85
|
+
if ((await secureGet(key)) !== value) {
|
|
86
|
+
pushLog('warn', `secureStore: ${key} was not kept`);
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
return { value, created: true };
|
|
90
|
+
}
|
|
91
|
+
|
|
77
92
|
/** Test seam only. */
|
|
78
93
|
export const __resetSecureKeyValueWarningForTests = (): void => {
|
|
79
94
|
warnedFallback = false;
|
|
@@ -31,10 +31,20 @@ export const updateMessagesTillLast = async (
|
|
|
31
31
|
processedIndex + batchSize
|
|
32
32
|
);
|
|
33
33
|
|
|
34
|
+
|
|
34
35
|
const lastTimestampsByJid = currentBatch.reduce(
|
|
35
36
|
(acc: Record<string, number>, current: string) => {
|
|
36
37
|
const room = (store.getState() as any).rooms?.rooms?.[current];
|
|
37
|
-
|
|
38
|
+
const cached: IMessage[] = Array.isArray(room?.messages)
|
|
39
|
+
? room.messages
|
|
40
|
+
: [];
|
|
41
|
+
let newest = 0;
|
|
42
|
+
for (const m of cached) {
|
|
43
|
+
if (!m || m.pending || m.id === 'delimiter-new') {continue;}
|
|
44
|
+
const id = Number(m.id);
|
|
45
|
+
if (Number.isFinite(id) && id > newest) {newest = id;}
|
|
46
|
+
}
|
|
47
|
+
acc[current] = newest;
|
|
38
48
|
return acc;
|
|
39
49
|
},
|
|
40
50
|
{} as Record<string, number>
|
|
@@ -59,7 +69,9 @@ export const updateMessagesTillLast = async (
|
|
|
59
69
|
const fetchedMessages = await client.getHistoryStanza(
|
|
60
70
|
jid,
|
|
61
71
|
messagesPerFetch,
|
|
62
|
-
Number(lastMessageId)
|
|
72
|
+
Number(lastMessageId),
|
|
73
|
+
undefined,
|
|
74
|
+
{ coalesceRoom: true, source: 'background', selfApplied: true }
|
|
63
75
|
);
|
|
64
76
|
|
|
65
77
|
if (!fetchedMessages.length) {break;}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import * as FileSystem from 'expo-file-system/legacy';
|
|
2
|
+
import { filenameFromUrl, getExtensionForMime } from './mimeToExtension';
|
|
3
|
+
|
|
4
|
+
// Containers the native players open from a local file by extension.
|
|
5
|
+
const VIDEO_EXT_RE = /\.(mp4|mov|m4v|webm|3gp|mkv|mpeg)$/i;
|
|
6
|
+
|
|
7
|
+
const hashString = (value: string) => {
|
|
8
|
+
let hash = 5381;
|
|
9
|
+
for (let i = 0; i < value.length; i++) {
|
|
10
|
+
hash = (hash * 33) ^ value.charCodeAt(i);
|
|
11
|
+
}
|
|
12
|
+
return (hash >>> 0).toString(36);
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export const isRemoteUrl = (url?: string | null): boolean =>
|
|
16
|
+
/^https?:\/\//i.test(url || '');
|
|
17
|
+
|
|
18
|
+
const hostOf = (url: string): string =>
|
|
19
|
+
(/^https?:\/\/(?:[^@/]+@)?([^:/?#]+)/i.exec(url)?.[1] || '').toLowerCase();
|
|
20
|
+
|
|
21
|
+
// The query carries the short-lived file token; the file is the same.
|
|
22
|
+
const withoutQuery = (url: string): string => url.split('#')[0]!.split('?')[0]!;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Where a remote video is kept once downloaded. The extension matters:
|
|
26
|
+
* AVFoundation picks the demuxer of a local file by it.
|
|
27
|
+
*/
|
|
28
|
+
export const getVideoCacheUri = (
|
|
29
|
+
url: string,
|
|
30
|
+
mimetype: string | undefined | null,
|
|
31
|
+
cacheDirectory: string
|
|
32
|
+
): string => {
|
|
33
|
+
const fromUrl = VIDEO_EXT_RE.exec(filenameFromUrl(url))?.[0];
|
|
34
|
+
const fromMime = getExtensionForMime(mimetype);
|
|
35
|
+
const ext = (
|
|
36
|
+
fromUrl || (VIDEO_EXT_RE.test(fromMime) ? fromMime : '.mp4')
|
|
37
|
+
).toLowerCase();
|
|
38
|
+
return `${cacheDirectory}ethora-video-${hashString(withoutQuery(url))}${ext}`;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Hosts that answered a streaming attempt with an error. AVPlayer refuses a
|
|
43
|
+
* server that replies 200 to a byte-range request ("server is not correctly
|
|
44
|
+
* configured"), so for those the next video skips the doomed stream and
|
|
45
|
+
* downloads straight away.
|
|
46
|
+
*/
|
|
47
|
+
const hostsWithoutStreaming = new Set<string>();
|
|
48
|
+
|
|
49
|
+
export const markStreamingUnsupported = (url: string): void => {
|
|
50
|
+
const host = hostOf(url);
|
|
51
|
+
if (host) {hostsWithoutStreaming.add(host);}
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export const isStreamingUnsupported = (url: string): boolean =>
|
|
55
|
+
hostsWithoutStreaming.has(hostOf(url));
|
|
56
|
+
|
|
57
|
+
export const findCachedVideo = async (
|
|
58
|
+
url: string,
|
|
59
|
+
mimetype?: string | null
|
|
60
|
+
): Promise<string | null> => {
|
|
61
|
+
const cacheDirectory = FileSystem.cacheDirectory;
|
|
62
|
+
if (!cacheDirectory || !isRemoteUrl(url)) {return null;}
|
|
63
|
+
try {
|
|
64
|
+
const uri = getVideoCacheUri(url, mimetype, cacheDirectory);
|
|
65
|
+
const info = await FileSystem.getInfoAsync(uri);
|
|
66
|
+
return info.exists ? uri : null;
|
|
67
|
+
} catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
type ProgressListener = (fraction: number) => void;
|
|
73
|
+
|
|
74
|
+
const inFlight = new Map<
|
|
75
|
+
string,
|
|
76
|
+
{ promise: Promise<string>; listeners: Set<ProgressListener> }
|
|
77
|
+
>();
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Downloads the video next to the app's other caches and resolves with the
|
|
81
|
+
* local uri. One download per file however many callers ask; `onProgress`
|
|
82
|
+
* gets 0..1 when the server reports a length.
|
|
83
|
+
*/
|
|
84
|
+
export const downloadVideoToCache = (
|
|
85
|
+
url: string,
|
|
86
|
+
mimetype?: string | null,
|
|
87
|
+
onProgress?: ProgressListener
|
|
88
|
+
): Promise<string> => {
|
|
89
|
+
const cacheDirectory = FileSystem.cacheDirectory;
|
|
90
|
+
if (!cacheDirectory) {
|
|
91
|
+
return Promise.reject(new Error('video_cache_unavailable'));
|
|
92
|
+
}
|
|
93
|
+
const finalUri = getVideoCacheUri(url, mimetype, cacheDirectory);
|
|
94
|
+
|
|
95
|
+
const running = inFlight.get(finalUri);
|
|
96
|
+
if (running) {
|
|
97
|
+
if (onProgress) {running.listeners.add(onProgress);}
|
|
98
|
+
return running.promise;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const listeners = new Set<ProgressListener>();
|
|
102
|
+
if (onProgress) {listeners.add(onProgress);}
|
|
103
|
+
|
|
104
|
+
const run = async (): Promise<string> => {
|
|
105
|
+
// Download under another name: an interrupted download must not be
|
|
106
|
+
// mistaken for the cached file next time.
|
|
107
|
+
const part = `${finalUri}.part`;
|
|
108
|
+
await FileSystem.deleteAsync(part, { idempotent: true }).catch(() => {});
|
|
109
|
+
const task = FileSystem.createDownloadResumable(url, part, {}, (p) => {
|
|
110
|
+
if (p.totalBytesExpectedToWrite > 0) {
|
|
111
|
+
const fraction = Math.min(
|
|
112
|
+
1,
|
|
113
|
+
p.totalBytesWritten / p.totalBytesExpectedToWrite
|
|
114
|
+
);
|
|
115
|
+
listeners.forEach((listener) => listener(fraction));
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
const result = await task.downloadAsync();
|
|
119
|
+
if (!result || result.status < 200 || result.status >= 300) {
|
|
120
|
+
await FileSystem.deleteAsync(part, { idempotent: true }).catch(() => {});
|
|
121
|
+
throw new Error(`video_download_status_${result?.status ?? 'cancelled'}`);
|
|
122
|
+
}
|
|
123
|
+
await FileSystem.deleteAsync(finalUri, { idempotent: true }).catch(() => {});
|
|
124
|
+
await FileSystem.moveAsync({ from: part, to: finalUri });
|
|
125
|
+
return finalUri;
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const promise = run().finally(() => {
|
|
129
|
+
inFlight.delete(finalUri);
|
|
130
|
+
});
|
|
131
|
+
inFlight.set(finalUri, { promise, listeners });
|
|
132
|
+
return promise;
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
export const __resetVideoCacheForTests = (): void => {
|
|
136
|
+
hostsWithoutStreaming.clear();
|
|
137
|
+
inFlight.clear();
|
|
138
|
+
};
|
|
@@ -50,8 +50,9 @@ export const useHeapSender = (client: XmppClient | null) => {
|
|
|
50
50
|
msg.user.walletAddress || '',
|
|
51
51
|
msg.body,
|
|
52
52
|
'',
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
// Wire values are strings: '"false"' is truthy.
|
|
54
|
+
String(msg.isReply) === 'true',
|
|
55
|
+
String(msg.showInChannel) === 'true',
|
|
55
56
|
msg.mainMessage,
|
|
56
57
|
msg.id
|
|
57
58
|
);
|
package/src/hooks/useLogout.tsx
CHANGED
|
@@ -12,6 +12,7 @@ import { clearRoomsRestCache } from '../networking/api-requests/rooms.api';
|
|
|
12
12
|
import { clearPersistedState } from '../roomStore/persistence';
|
|
13
13
|
import { secureUserStorage } from '../helpers/secureUserStorage';
|
|
14
14
|
import { getFlushBoundaryTs } from '../helpers/getServerReadTimestamp';
|
|
15
|
+
import { stopOmemo } from '../e2ee';
|
|
15
16
|
|
|
16
17
|
// AsyncStorage keys the library writes but that aren't cleared by any
|
|
17
18
|
// slice reducer. Listed here so a single logout call wipes the full
|
|
@@ -109,6 +110,14 @@ const logoutService = {
|
|
|
109
110
|
console.warn('logoutService: push reset failed', e);
|
|
110
111
|
}
|
|
111
112
|
|
|
113
|
+
stopOmemo();
|
|
114
|
+
try {
|
|
115
|
+
const { clearOpenedFiles } =
|
|
116
|
+
require('../e2ee/sealedFiles') as typeof import('../e2ee/sealedFiles');
|
|
117
|
+
clearOpenedFiles();
|
|
118
|
+
} catch {
|
|
119
|
+
}
|
|
120
|
+
|
|
112
121
|
// 3. REST: nuke the in-memory `/chats/my` cache so the next login
|
|
113
122
|
// doesn't read user A's rooms while user B is bootstrapping.
|
|
114
123
|
try {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
1
2
|
import { useSelector } from 'react-redux';
|
|
2
3
|
import { RootState } from '../roomStore';
|
|
3
4
|
|
|
@@ -8,8 +9,11 @@ export const useMessageHeapState = () => {
|
|
|
8
9
|
const failedMessages = useSelector(
|
|
9
10
|
(state: RootState) => state.roomHeapSlice?.failedMessages
|
|
10
11
|
);
|
|
11
|
-
const idSet = new Set(queue?.map((m) => m.id) ?? []);
|
|
12
|
-
const failedIdSet =
|
|
12
|
+
const idSet = useMemo(() => new Set(queue?.map((m) => m.id) ?? []), [queue]);
|
|
13
|
+
const failedIdSet = useMemo(
|
|
14
|
+
() => new Set(Object.keys(failedMessages || {})),
|
|
15
|
+
[failedMessages]
|
|
16
|
+
);
|
|
13
17
|
|
|
14
18
|
return { queue, idSet, failedMessages, failedIdSet };
|
|
15
19
|
};
|
|
@@ -2,8 +2,9 @@ import { useEffect } from 'react';
|
|
|
2
2
|
import { setIsLoading } from '../roomStore/roomsSlice';
|
|
3
3
|
import { useXmppClient } from '../context/xmppProvider';
|
|
4
4
|
import { IConfig, IMessage, IRoom } from '../types/types';
|
|
5
|
-
import { useDispatch } from 'react-redux';
|
|
5
|
+
import { useDispatch, useSelector, useStore } from 'react-redux';
|
|
6
6
|
import useGetNewArchRoom from './useGetNewArchRoom';
|
|
7
|
+
import type { RootState } from '../roomStore';
|
|
7
8
|
|
|
8
9
|
const countUndefinedText = (arr: IMessage[]) =>
|
|
9
10
|
(Array.isArray(arr) ? arr : []).filter(
|
|
@@ -21,14 +22,32 @@ const hasLoadedRoomHistory = (room?: IRoom): boolean => {
|
|
|
21
22
|
);
|
|
22
23
|
};
|
|
23
24
|
|
|
25
|
+
const defaultRoomJids = (config: IConfig): string[] =>
|
|
26
|
+
(config?.defaultRooms || []).map((room: any) =>
|
|
27
|
+
typeof room === 'string' ? room : room?.jid
|
|
28
|
+
);
|
|
29
|
+
|
|
24
30
|
export const useRoomInitialization = (
|
|
25
31
|
activeRoomJID: string,
|
|
26
|
-
|
|
27
|
-
config: IConfig,
|
|
28
|
-
messageLength: number
|
|
32
|
+
config: IConfig
|
|
29
33
|
) => {
|
|
30
34
|
const { client } = useXmppClient();
|
|
31
35
|
const dispatch = useDispatch();
|
|
36
|
+
const reduxStore = useStore<RootState>();
|
|
37
|
+
|
|
38
|
+
const hasRooms = useSelector(
|
|
39
|
+
(state: RootState) => Object.keys(state.rooms.rooms || {}).length > 0
|
|
40
|
+
);
|
|
41
|
+
const activeRoomExists = useSelector(
|
|
42
|
+
(state: RootState) => !!activeRoomJID && !!state.rooms.rooms?.[activeRoomJID]
|
|
43
|
+
);
|
|
44
|
+
const activeHistoryLoaded = useSelector((state: RootState) =>
|
|
45
|
+
hasLoadedRoomHistory(state.rooms.rooms?.[activeRoomJID])
|
|
46
|
+
);
|
|
47
|
+
const defaultRoomsMissing = useSelector((state: RootState) => {
|
|
48
|
+
const jids = defaultRoomJids(config);
|
|
49
|
+
return jids.length > 0 && jids.some((jid) => !state.rooms.rooms?.[jid]);
|
|
50
|
+
});
|
|
32
51
|
|
|
33
52
|
const syncRooms = useGetNewArchRoom();
|
|
34
53
|
|
|
@@ -59,9 +78,8 @@ export const useRoomInitialization = (
|
|
|
59
78
|
}, [client, activeRoomJID]);
|
|
60
79
|
|
|
61
80
|
useEffect(() => {
|
|
62
|
-
const
|
|
63
|
-
const shouldLoadActiveHistory =
|
|
64
|
-
!!activeRoomJID && !hasLoadedRoomHistory(activeRoom);
|
|
81
|
+
const roomsList = reduxStore.getState().rooms.rooms || {};
|
|
82
|
+
const shouldLoadActiveHistory = !!activeRoomJID && !activeHistoryLoaded;
|
|
65
83
|
|
|
66
84
|
const getDefaultHistory = async () => {
|
|
67
85
|
if (!client || !activeRoomJID) {return;}
|
|
@@ -129,7 +147,7 @@ export const useRoomInitialization = (
|
|
|
129
147
|
// real, non-pending message in the room counts as "loaded").
|
|
130
148
|
dispatch(setIsLoading({ loading: true, chatJID: activeRoomJID }));
|
|
131
149
|
getDefaultHistory();
|
|
132
|
-
} else {
|
|
150
|
+
} else if (roomsList?.[activeRoomJID]?.isLoading) {
|
|
133
151
|
dispatch(setIsLoading({ loading: false, chatJID: activeRoomJID }));
|
|
134
152
|
}
|
|
135
153
|
} else if (!roomsList?.[activeRoomJID]) {
|
|
@@ -137,10 +155,7 @@ export const useRoomInitialization = (
|
|
|
137
155
|
}
|
|
138
156
|
|
|
139
157
|
if (client && config?.defaultRooms) {
|
|
140
|
-
|
|
141
|
-
(room) => roomsList[typeof room === 'string' ? room : room.jid] !== undefined
|
|
142
|
-
);
|
|
143
|
-
if (roomsList && !allExist) {
|
|
158
|
+
if (defaultRoomsMissing) {
|
|
144
159
|
config?.defaultRooms.map(async (room) => {
|
|
145
160
|
client.presenceInRoomStanza(typeof room === 'string' ? room : room.jid);
|
|
146
161
|
});
|
|
@@ -151,10 +166,12 @@ export const useRoomInitialization = (
|
|
|
151
166
|
}
|
|
152
167
|
}
|
|
153
168
|
}
|
|
169
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
154
170
|
}, [
|
|
155
171
|
activeRoomJID,
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
172
|
+
hasRooms,
|
|
173
|
+
activeRoomExists,
|
|
174
|
+
activeHistoryLoaded,
|
|
175
|
+
defaultRoomsMissing,
|
|
159
176
|
]);
|
|
160
177
|
};
|