@ethora/chat-component-rn 26.7.9 → 26.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +0 -93
- package/README.md +10 -33
- package/lib/commonjs/assets/icons.js +2 -7
- package/lib/commonjs/assets/icons.js.map +1 -1
- package/lib/commonjs/components/AuthForms/Login.js +4 -4
- package/lib/commonjs/components/AuthForms/Login.js.map +1 -1
- package/lib/commonjs/components/Header/HeaderRoomList.js +7 -26
- package/lib/commonjs/components/Header/HeaderRoomList.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatHeader.js +3 -9
- package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatRoom.js +13 -101
- package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatWrapper.js +38 -34
- package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
- package/lib/commonjs/components/MainComponents/LoginWrapper.js +1 -2
- package/lib/commonjs/components/MainComponents/LoginWrapper.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MediaMessage.js +9 -29
- package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MessageContainer.js +1 -5
- package/lib/commonjs/components/MainComponents/MessageContainer.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MessageList.js +5 -13
- package/lib/commonjs/components/MainComponents/MessageList.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ProfileImagePlaceholder.js +13 -14
- package/lib/commonjs/components/MainComponents/ProfileImagePlaceholder.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ReduxWrapper.js +24 -3
- package/lib/commonjs/components/MainComponents/ReduxWrapper.js.map +1 -1
- package/lib/commonjs/components/MainComponents/RoomList.js +35 -208
- package/lib/commonjs/components/MainComponents/RoomList.js.map +1 -1
- package/lib/commonjs/components/Menu/HeaderRoomListMenu.js +98 -317
- package/lib/commonjs/components/Menu/HeaderRoomListMenu.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/MessageTranslate.js +16 -7
- package/lib/commonjs/components/MessageBubble/MessageTranslate.js.map +1 -1
- package/lib/commonjs/components/Modals/AttachSheet/AttachSheet.js +112 -320
- package/lib/commonjs/components/Modals/AttachSheet/AttachSheet.js.map +1 -1
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +215 -556
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/commonjs/components/Modals/ChatProfileModal/DeleteChatModal.js +9 -7
- package/lib/commonjs/components/Modals/ChatProfileModal/DeleteChatModal.js.map +1 -1
- package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js +27 -69
- package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
- package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js +1 -2
- package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
- package/lib/commonjs/components/Modals/Modal/Modal.js +0 -8
- package/lib/commonjs/components/Modals/Modal/Modal.js.map +1 -1
- package/lib/commonjs/components/Modals/NewChatModal/ModalContent.js +1 -2
- package/lib/commonjs/components/Modals/NewChatModal/ModalContent.js.map +1 -1
- package/lib/commonjs/components/Modals/NewChatModal/NewChatModal.js +109 -205
- package/lib/commonjs/components/Modals/NewChatModal/NewChatModal.js.map +1 -1
- package/lib/commonjs/components/Modals/NewChatModal/UpdNewChatModal.js +0 -8
- package/lib/commonjs/components/Modals/NewChatModal/UpdNewChatModal.js.map +1 -1
- package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js +2 -4
- package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
- package/lib/commonjs/components/Modals/UserProfileModal/EditUserModal.js +21 -7
- package/lib/commonjs/components/Modals/UserProfileModal/EditUserModal.js.map +1 -1
- package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js +244 -507
- package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
- package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js +46 -74
- package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
- package/lib/commonjs/components/Modals/styledModalComponents.js +2 -9
- package/lib/commonjs/components/Modals/styledModalComponents.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +39 -23
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js +3 -22
- package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js +3 -17
- package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js +3 -17
- package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
- package/lib/commonjs/components/VideoCalls/VideoCallSession.js +3 -6
- package/lib/commonjs/components/VideoCalls/VideoCallSession.js.map +1 -1
- package/lib/commonjs/components/styled/AudioMessage.js +1 -2
- package/lib/commonjs/components/styled/AudioMessage.js.map +1 -1
- package/lib/commonjs/components/styled/DateLabel.js +10 -3
- package/lib/commonjs/components/styled/DateLabel.js.map +1 -1
- package/lib/commonjs/components/styled/MessageImage.js +9 -37
- package/lib/commonjs/components/styled/MessageImage.js.map +1 -1
- package/lib/commonjs/components/styled/NewMessageLabel.js +3 -1
- package/lib/commonjs/components/styled/NewMessageLabel.js.map +1 -1
- package/lib/commonjs/components/styled/SendInput.js +17 -86
- package/lib/commonjs/components/styled/SendInput.js.map +1 -1
- package/lib/commonjs/components/styled/StyledComponents.js +3 -9
- package/lib/commonjs/components/styled/StyledComponents.js.map +1 -1
- package/lib/commonjs/components/styled/StyledInputComponents/StyledInputComponents.js +4 -11
- package/lib/commonjs/components/styled/StyledInputComponents/StyledInputComponents.js.map +1 -1
- package/lib/commonjs/components/styled/UnsupportedType.js +4 -14
- package/lib/commonjs/components/styled/UnsupportedType.js.map +1 -1
- package/lib/commonjs/components/styled/VideoMessage.js +61 -119
- package/lib/commonjs/components/styled/VideoMessage.js.map +1 -1
- package/lib/commonjs/context/xmppProvider.js +54 -128
- package/lib/commonjs/context/xmppProvider.js.map +1 -1
- package/lib/commonjs/helpers/createMessageFromXml.js +1 -19
- package/lib/commonjs/helpers/createMessageFromXml.js.map +1 -1
- package/lib/commonjs/helpers/ensureScopedChatCache.js +2 -2
- package/lib/commonjs/helpers/ensureScopedChatCache.js.map +1 -1
- package/lib/commonjs/helpers/getDataFromXml.js +24 -1
- package/lib/commonjs/helpers/getDataFromXml.js.map +1 -1
- package/lib/commonjs/helpers/historyPreloadScheduler.js +2 -65
- package/lib/commonjs/helpers/historyPreloadScheduler.js.map +1 -1
- package/lib/commonjs/helpers/initXmppRooms.js +8 -14
- package/lib/commonjs/helpers/initXmppRooms.js.map +1 -1
- package/lib/commonjs/helpers/insertMessageWithDelimiter.js +13 -0
- package/lib/commonjs/helpers/insertMessageWithDelimiter.js.map +1 -1
- package/lib/commonjs/helpers/isUnresolvedSenderId.js +6 -1
- package/lib/commonjs/helpers/isUnresolvedSenderId.js.map +1 -1
- package/lib/commonjs/helpers/mimeToExtension.js +14 -6
- package/lib/commonjs/helpers/mimeToExtension.js.map +1 -1
- package/lib/commonjs/helpers/resolveInitBeforeLoadUser.js +17 -130
- package/lib/commonjs/helpers/resolveInitBeforeLoadUser.js.map +1 -1
- package/lib/commonjs/helpers/resolveLangSource.js +38 -0
- package/lib/commonjs/helpers/resolveLangSource.js.map +1 -0
- package/lib/commonjs/helpers/xmppUsername.js +39 -0
- package/lib/commonjs/helpers/xmppUsername.js.map +1 -0
- package/lib/commonjs/hooks/useChatRoomFocus.js +8 -17
- package/lib/commonjs/hooks/useChatRoomFocus.js.map +1 -1
- package/lib/commonjs/hooks/useChatWrapperInit.js +14 -32
- package/lib/commonjs/hooks/useChatWrapperInit.js.map +1 -1
- package/lib/commonjs/hooks/useComposing.js +0 -27
- package/lib/commonjs/hooks/useComposing.js.map +1 -1
- package/lib/commonjs/hooks/useLogout.js +7 -15
- package/lib/commonjs/hooks/useLogout.js.map +1 -1
- package/lib/commonjs/hooks/usePendingNotification.js +11 -8
- package/lib/commonjs/hooks/usePendingNotification.js.map +1 -1
- package/lib/commonjs/hooks/useSendMessage.js +14 -50
- package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
- package/lib/commonjs/hooks/useUnreadMessagesCounter.js +1 -6
- package/lib/commonjs/hooks/useUnreadMessagesCounter.js.map +1 -1
- package/lib/commonjs/i18n/strings.js +133 -121
- package/lib/commonjs/i18n/strings.js.map +1 -1
- package/lib/commonjs/i18n/useT.js +1 -1
- package/lib/commonjs/main.js +0 -44
- package/lib/commonjs/main.js.map +1 -1
- package/lib/commonjs/networking/api-requests/auth.api.js +60 -134
- package/lib/commonjs/networking/api-requests/auth.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/roomMembers.api.js +1 -1
- package/lib/commonjs/networking/api-requests/roomMembers.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/rooms.api.js +9 -9
- package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/user.api.js +9 -68
- package/lib/commonjs/networking/api-requests/user.api.js.map +1 -1
- package/lib/commonjs/networking/apiClient.js +112 -62
- package/lib/commonjs/networking/apiClient.js.map +1 -1
- package/lib/commonjs/networking/stanzaHandlers.js +51 -93
- package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
- package/lib/commonjs/networking/xmpp/flushLastViewedToPrivateStore.js +8 -46
- package/lib/commonjs/networking/xmpp/flushLastViewedToPrivateStore.js.map +1 -1
- package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js +1 -8
- package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/subscribeToRoomMessages.xmpp.js +1 -5
- package/lib/commonjs/networking/xmpp/subscribeToRoomMessages.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmppClient.js +8 -124
- package/lib/commonjs/networking/xmppClient.js.map +1 -1
- package/lib/commonjs/roomStore/chatSettingsSlice.js +7 -26
- package/lib/commonjs/roomStore/chatSettingsSlice.js.map +1 -1
- package/lib/commonjs/roomStore/index.js +2 -35
- package/lib/commonjs/roomStore/index.js.map +1 -1
- package/lib/commonjs/roomStore/persistence.js +39 -226
- package/lib/commonjs/roomStore/persistence.js.map +1 -1
- package/lib/commonjs/roomStore/roomsSlice.js +8 -87
- package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
- package/lib/commonjs/services/pushSubscriptionService.js +13 -15
- package/lib/commonjs/services/pushSubscriptionService.js.map +1 -1
- package/lib/commonjs/version.js +3 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/assets/icons.js +1 -6
- package/lib/module/assets/icons.js.map +1 -1
- package/lib/module/components/AuthForms/Login.js +4 -4
- package/lib/module/components/AuthForms/Login.js.map +1 -1
- package/lib/module/components/Header/HeaderRoomList.js +7 -26
- package/lib/module/components/Header/HeaderRoomList.js.map +1 -1
- package/lib/module/components/MainComponents/ChatHeader.js +3 -9
- package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/module/components/MainComponents/ChatRoom.js +14 -102
- package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/module/components/MainComponents/ChatWrapper.js +40 -36
- package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
- package/lib/module/components/MainComponents/LoginWrapper.js +1 -2
- package/lib/module/components/MainComponents/LoginWrapper.js.map +1 -1
- package/lib/module/components/MainComponents/MediaMessage.js +10 -30
- package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
- package/lib/module/components/MainComponents/MessageContainer.js +1 -5
- package/lib/module/components/MainComponents/MessageContainer.js.map +1 -1
- package/lib/module/components/MainComponents/MessageList.js +5 -13
- package/lib/module/components/MainComponents/MessageList.js.map +1 -1
- package/lib/module/components/MainComponents/ProfileImagePlaceholder.js +13 -14
- package/lib/module/components/MainComponents/ProfileImagePlaceholder.js.map +1 -1
- package/lib/module/components/MainComponents/ReduxWrapper.js +26 -5
- package/lib/module/components/MainComponents/ReduxWrapper.js.map +1 -1
- package/lib/module/components/MainComponents/RoomList.js +35 -207
- package/lib/module/components/MainComponents/RoomList.js.map +1 -1
- package/lib/module/components/Menu/HeaderRoomListMenu.js +101 -319
- package/lib/module/components/Menu/HeaderRoomListMenu.js.map +1 -1
- package/lib/module/components/MessageBubble/MessageTranslate.js +16 -7
- package/lib/module/components/MessageBubble/MessageTranslate.js.map +1 -1
- package/lib/module/components/Modals/AttachSheet/AttachSheet.js +115 -311
- package/lib/module/components/Modals/AttachSheet/AttachSheet.js.map +1 -1
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +219 -559
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/module/components/Modals/ChatProfileModal/DeleteChatModal.js +9 -7
- package/lib/module/components/Modals/ChatProfileModal/DeleteChatModal.js.map +1 -1
- package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js +28 -70
- package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
- package/lib/module/components/Modals/FilePreviewModal/PdfView.js +1 -2
- package/lib/module/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
- package/lib/module/components/Modals/Modal/Modal.js +1 -9
- package/lib/module/components/Modals/Modal/Modal.js.map +1 -1
- package/lib/module/components/Modals/NewChatModal/ModalContent.js +1 -2
- package/lib/module/components/Modals/NewChatModal/ModalContent.js.map +1 -1
- package/lib/module/components/Modals/NewChatModal/NewChatModal.js +111 -208
- package/lib/module/components/Modals/NewChatModal/NewChatModal.js.map +1 -1
- package/lib/module/components/Modals/NewChatModal/UpdNewChatModal.js +0 -8
- package/lib/module/components/Modals/NewChatModal/UpdNewChatModal.js.map +1 -1
- package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js +2 -4
- package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
- package/lib/module/components/Modals/UserProfileModal/EditUserModal.js +23 -9
- package/lib/module/components/Modals/UserProfileModal/EditUserModal.js.map +1 -1
- package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js +248 -509
- package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
- package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js +48 -76
- package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
- package/lib/module/components/Modals/styledModalComponents.js +2 -9
- package/lib/module/components/Modals/styledModalComponents.js.map +1 -1
- package/lib/module/components/RoomComponents/ChatRoomItem.js +40 -24
- package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastMessageFile.js +3 -22
- package/lib/module/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js +3 -17
- package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastMessageVideo.js +3 -17
- package/lib/module/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
- package/lib/module/components/VideoCalls/VideoCallSession.js +3 -6
- package/lib/module/components/VideoCalls/VideoCallSession.js.map +1 -1
- package/lib/module/components/styled/AudioMessage.js +1 -2
- package/lib/module/components/styled/AudioMessage.js.map +1 -1
- package/lib/module/components/styled/DateLabel.js +10 -3
- package/lib/module/components/styled/DateLabel.js.map +1 -1
- package/lib/module/components/styled/MessageImage.js +9 -37
- package/lib/module/components/styled/MessageImage.js.map +1 -1
- package/lib/module/components/styled/NewMessageLabel.js +3 -1
- package/lib/module/components/styled/NewMessageLabel.js.map +1 -1
- package/lib/module/components/styled/SendInput.js +18 -87
- package/lib/module/components/styled/SendInput.js.map +1 -1
- package/lib/module/components/styled/StyledComponents.js +3 -9
- package/lib/module/components/styled/StyledComponents.js.map +1 -1
- package/lib/module/components/styled/StyledInputComponents/StyledInputComponents.js +4 -11
- package/lib/module/components/styled/StyledInputComponents/StyledInputComponents.js.map +1 -1
- package/lib/module/components/styled/UnsupportedType.js +4 -14
- package/lib/module/components/styled/UnsupportedType.js.map +1 -1
- package/lib/module/components/styled/VideoMessage.js +62 -120
- package/lib/module/components/styled/VideoMessage.js.map +1 -1
- package/lib/module/context/xmppProvider.js +55 -128
- package/lib/module/context/xmppProvider.js.map +1 -1
- package/lib/module/helpers/createMessageFromXml.js +1 -19
- package/lib/module/helpers/createMessageFromXml.js.map +1 -1
- package/lib/module/helpers/ensureScopedChatCache.js +2 -2
- package/lib/module/helpers/ensureScopedChatCache.js.map +1 -1
- package/lib/module/helpers/getDataFromXml.js +23 -1
- package/lib/module/helpers/getDataFromXml.js.map +1 -1
- package/lib/module/helpers/historyPreloadScheduler.js +3 -66
- package/lib/module/helpers/historyPreloadScheduler.js.map +1 -1
- package/lib/module/helpers/initXmppRooms.js +8 -14
- package/lib/module/helpers/initXmppRooms.js.map +1 -1
- package/lib/module/helpers/insertMessageWithDelimiter.js +13 -0
- package/lib/module/helpers/insertMessageWithDelimiter.js.map +1 -1
- package/lib/module/helpers/isUnresolvedSenderId.js +6 -1
- package/lib/module/helpers/isUnresolvedSenderId.js.map +1 -1
- package/lib/module/helpers/mimeToExtension.js +13 -6
- package/lib/module/helpers/mimeToExtension.js.map +1 -1
- package/lib/module/helpers/resolveInitBeforeLoadUser.js +16 -130
- package/lib/module/helpers/resolveInitBeforeLoadUser.js.map +1 -1
- package/lib/module/helpers/resolveLangSource.js +32 -0
- package/lib/module/helpers/resolveLangSource.js.map +1 -0
- package/lib/module/helpers/xmppUsername.js +35 -0
- package/lib/module/helpers/xmppUsername.js.map +1 -0
- package/lib/module/hooks/useChatRoomFocus.js +8 -17
- package/lib/module/hooks/useChatRoomFocus.js.map +1 -1
- package/lib/module/hooks/useChatWrapperInit.js +14 -32
- package/lib/module/hooks/useChatWrapperInit.js.map +1 -1
- package/lib/module/hooks/useComposing.js +1 -28
- package/lib/module/hooks/useComposing.js.map +1 -1
- package/lib/module/hooks/useLogout.js +7 -15
- package/lib/module/hooks/useLogout.js.map +1 -1
- package/lib/module/hooks/usePendingNotification.js +11 -8
- package/lib/module/hooks/usePendingNotification.js.map +1 -1
- package/lib/module/hooks/useSendMessage.js +16 -52
- package/lib/module/hooks/useSendMessage.js.map +1 -1
- package/lib/module/hooks/useUnreadMessagesCounter.js +1 -6
- package/lib/module/hooks/useUnreadMessagesCounter.js.map +1 -1
- package/lib/module/i18n/strings.js +133 -121
- package/lib/module/i18n/strings.js.map +1 -1
- package/lib/module/i18n/useT.js +1 -1
- package/lib/module/main.js +2 -14
- package/lib/module/main.js.map +1 -1
- package/lib/module/networking/api-requests/auth.api.js +59 -131
- package/lib/module/networking/api-requests/auth.api.js.map +1 -1
- package/lib/module/networking/api-requests/roomMembers.api.js +1 -1
- package/lib/module/networking/api-requests/roomMembers.api.js.map +1 -1
- package/lib/module/networking/api-requests/rooms.api.js +9 -9
- package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
- package/lib/module/networking/api-requests/user.api.js +7 -64
- package/lib/module/networking/api-requests/user.api.js.map +1 -1
- package/lib/module/networking/apiClient.js +113 -61
- package/lib/module/networking/apiClient.js.map +1 -1
- package/lib/module/networking/stanzaHandlers.js +52 -94
- package/lib/module/networking/stanzaHandlers.js.map +1 -1
- package/lib/module/networking/xmpp/flushLastViewedToPrivateStore.js +8 -46
- package/lib/module/networking/xmpp/flushLastViewedToPrivateStore.js.map +1 -1
- package/lib/module/networking/xmpp/presenceInRoom.xmpp.js +1 -8
- package/lib/module/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/subscribeToRoomMessages.xmpp.js +1 -5
- package/lib/module/networking/xmpp/subscribeToRoomMessages.xmpp.js.map +1 -1
- package/lib/module/networking/xmppClient.js +8 -124
- package/lib/module/networking/xmppClient.js.map +1 -1
- package/lib/module/roomStore/chatSettingsSlice.js +7 -26
- package/lib/module/roomStore/chatSettingsSlice.js.map +1 -1
- package/lib/module/roomStore/index.js +4 -37
- package/lib/module/roomStore/index.js.map +1 -1
- package/lib/module/roomStore/persistence.js +38 -223
- package/lib/module/roomStore/persistence.js.map +1 -1
- package/lib/module/roomStore/roomsSlice.js +7 -86
- package/lib/module/roomStore/roomsSlice.js.map +1 -1
- package/lib/module/services/pushSubscriptionService.js +13 -15
- package/lib/module/services/pushSubscriptionService.js.map +1 -1
- package/lib/module/version.js +3 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/assets/icons.d.ts +0 -16
- package/lib/typescript/assets/icons.d.ts.map +1 -1
- package/lib/typescript/components/AuthForms/Login.d.ts.map +1 -1
- package/lib/typescript/components/Header/HeaderRoomList.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/LoginWrapper.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MessageContainer.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MessageList.d.ts +1 -10
- package/lib/typescript/components/MainComponents/MessageList.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ProfileImagePlaceholder.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ReduxWrapper.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/RoomList.d.ts +0 -7
- package/lib/typescript/components/MainComponents/RoomList.d.ts.map +1 -1
- package/lib/typescript/components/Menu/HeaderRoomListMenu.d.ts +0 -3
- package/lib/typescript/components/Menu/HeaderRoomListMenu.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/MessageTranslate.d.ts.map +1 -1
- package/lib/typescript/components/Modals/AttachSheet/AttachSheet.d.ts +0 -9
- package/lib/typescript/components/Modals/AttachSheet/AttachSheet.d.ts.map +1 -1
- package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts +0 -10
- package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/ChatProfileModal/DeleteChatModal.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/Modal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/NewChatModal/ModalContent.d.ts +2 -4
- package/lib/typescript/components/Modals/NewChatModal/ModalContent.d.ts.map +1 -1
- package/lib/typescript/components/Modals/NewChatModal/NewChatModal.d.ts +1 -1
- package/lib/typescript/components/Modals/NewChatModal/NewChatModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/NewChatModal/UpdNewChatModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SelectUsersModal/SelectUsersModal.d.ts +1 -6
- package/lib/typescript/components/Modals/SelectUsersModal/SelectUsersModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/UserProfileModal/EditUserModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/UserProfileModal/UserProfileModal.d.ts +0 -16
- package/lib/typescript/components/Modals/UserProfileModal/UserProfileModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/UserSettingsModal/UserSettingsModal.d.ts +0 -1
- package/lib/typescript/components/Modals/UserSettingsModal/UserSettingsModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/styledModalComponents.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessageFile.d.ts +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessageFile.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessagePhoto.d.ts +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessagePhoto.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessageVideo.d.ts +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessageVideo.d.ts.map +1 -1
- package/lib/typescript/components/VideoCalls/VideoCallSession.d.ts.map +1 -1
- package/lib/typescript/components/styled/AudioMessage.d.ts.map +1 -1
- package/lib/typescript/components/styled/DateLabel.d.ts.map +1 -1
- package/lib/typescript/components/styled/MessageImage.d.ts +0 -14
- package/lib/typescript/components/styled/MessageImage.d.ts.map +1 -1
- package/lib/typescript/components/styled/NewMessageLabel.d.ts.map +1 -1
- package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
- package/lib/typescript/components/styled/StyledComponents.d.ts.map +1 -1
- package/lib/typescript/components/styled/StyledInputComponents/StyledInputComponents.d.ts.map +1 -1
- package/lib/typescript/components/styled/UnsupportedType.d.ts.map +1 -1
- package/lib/typescript/components/styled/VideoMessage.d.ts +0 -8
- package/lib/typescript/components/styled/VideoMessage.d.ts.map +1 -1
- package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
- package/lib/typescript/helpers/createMessageFromXml.d.ts.map +1 -1
- package/lib/typescript/helpers/getDataFromXml.d.ts.map +1 -1
- package/lib/typescript/helpers/historyPreloadScheduler.d.ts.map +1 -1
- package/lib/typescript/helpers/initXmppRooms.d.ts.map +1 -1
- package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts.map +1 -1
- package/lib/typescript/helpers/isUnresolvedSenderId.d.ts.map +1 -1
- package/lib/typescript/helpers/mimeToExtension.d.ts +15 -0
- package/lib/typescript/helpers/mimeToExtension.d.ts.map +1 -1
- package/lib/typescript/helpers/resolveInitBeforeLoadUser.d.ts.map +1 -1
- package/lib/typescript/helpers/resolveLangSource.d.ts +30 -0
- package/lib/typescript/helpers/resolveLangSource.d.ts.map +1 -0
- package/lib/typescript/helpers/xmppUsername.d.ts +13 -0
- package/lib/typescript/helpers/xmppUsername.d.ts.map +1 -0
- package/lib/typescript/hooks/useChatRoomFocus.d.ts +1 -4
- package/lib/typescript/hooks/useChatRoomFocus.d.ts.map +1 -1
- package/lib/typescript/hooks/useChatWrapperInit.d.ts.map +1 -1
- package/lib/typescript/hooks/useComposing.d.ts.map +1 -1
- package/lib/typescript/hooks/useLogout.d.ts.map +1 -1
- package/lib/typescript/hooks/usePendingNotification.d.ts.map +1 -1
- package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
- package/lib/typescript/hooks/useUnreadMessagesCounter.d.ts +0 -1
- package/lib/typescript/hooks/useUnreadMessagesCounter.d.ts.map +1 -1
- package/lib/typescript/i18n/strings.d.ts.map +1 -1
- package/lib/typescript/i18n/useT.d.ts +1 -1
- package/lib/typescript/main.d.ts +2 -9
- package/lib/typescript/main.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/auth.api.d.ts +1 -3
- package/lib/typescript/networking/api-requests/auth.api.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/user.api.d.ts +0 -27
- package/lib/typescript/networking/api-requests/user.api.d.ts.map +1 -1
- package/lib/typescript/networking/apiClient.d.ts +6 -12
- package/lib/typescript/networking/apiClient.d.ts.map +1 -1
- package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/flushLastViewedToPrivateStore.d.ts +2 -10
- package/lib/typescript/networking/xmpp/flushLastViewedToPrivateStore.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/subscribeToRoomMessages.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmppClient.d.ts +0 -14
- package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
- package/lib/typescript/roomStore/chatSettingsSlice.d.ts +0 -16
- package/lib/typescript/roomStore/chatSettingsSlice.d.ts.map +1 -1
- package/lib/typescript/roomStore/index.d.ts.map +1 -1
- package/lib/typescript/roomStore/persistence.d.ts +1 -18
- package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
- package/lib/typescript/roomStore/roomsSlice.d.ts +1 -14
- package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
- package/lib/typescript/services/pushSubscriptionService.d.ts +1 -1
- package/lib/typescript/services/pushSubscriptionService.d.ts.map +1 -1
- package/lib/typescript/types/types.d.ts +5 -49
- package/lib/typescript/types/types.d.ts.map +1 -1
- package/lib/typescript/version.d.ts +1 -1
- package/lib/typescript/version.d.ts.map +1 -1
- package/package.json +29 -41
- package/src/assets/icons.tsx +9 -48
- package/src/components/AuthForms/Login.tsx +3 -3
- package/src/components/Header/HeaderRoomList.tsx +6 -24
- package/src/components/MainComponents/ChatHeader.tsx +3 -9
- package/src/components/MainComponents/ChatRoom.tsx +16 -111
- package/src/components/MainComponents/ChatWrapper.tsx +53 -36
- package/src/components/MainComponents/LoginWrapper.tsx +0 -1
- package/src/components/MainComponents/MediaMessage.tsx +8 -26
- package/src/components/MainComponents/MessageContainer.tsx +1 -5
- package/src/components/MainComponents/MessageList.tsx +4 -23
- package/src/components/MainComponents/ProfileImagePlaceholder.tsx +14 -21
- package/src/components/MainComponents/ReduxWrapper.tsx +18 -1
- package/src/components/MainComponents/RoomList.tsx +39 -236
- package/src/components/Menu/HeaderRoomListMenu.tsx +75 -328
- package/src/components/MessageBubble/MessageTranslate.tsx +17 -12
- package/src/components/Modals/AttachSheet/AttachSheet.tsx +99 -331
- package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +293 -611
- package/src/components/Modals/ChatProfileModal/DeleteChatModal.tsx +9 -7
- package/src/components/Modals/FilePreviewModal/FilePreviewModal.tsx +38 -79
- package/src/components/Modals/FilePreviewModal/PdfView.tsx +1 -2
- package/src/components/Modals/Modal/Modal.tsx +0 -7
- package/src/components/Modals/NewChatModal/ModalContent.tsx +3 -6
- package/src/components/Modals/NewChatModal/NewChatModal.tsx +126 -223
- package/src/components/Modals/NewChatModal/UpdNewChatModal.tsx +1 -12
- package/src/components/Modals/SelectUsersModal/SelectUsersModal.tsx +4 -14
- package/src/components/Modals/UserProfileModal/EditUserModal.tsx +25 -9
- package/src/components/Modals/UserProfileModal/UserProfileModal.tsx +307 -617
- package/src/components/Modals/UserSettingsModal/UserSettingsModal.tsx +58 -75
- package/src/components/Modals/styledModalComponents.tsx +2 -9
- package/src/components/RoomComponents/ChatRoomItem.tsx +50 -21
- package/src/components/RoomComponents/styled/LastMessageFile.tsx +4 -28
- package/src/components/RoomComponents/styled/LastMessagePhoto.tsx +3 -18
- package/src/components/RoomComponents/styled/LastMessageVideo.tsx +3 -18
- package/src/components/VideoCalls/VideoCallSession.tsx +3 -8
- package/src/components/styled/AudioMessage.tsx +1 -2
- package/src/components/styled/DateLabel.tsx +10 -3
- package/src/components/styled/MessageImage.tsx +7 -53
- package/src/components/styled/NewMessageLabel.tsx +3 -1
- package/src/components/styled/SendInput.tsx +18 -91
- package/src/components/styled/StyledComponents.ts +3 -9
- package/src/components/styled/StyledInputComponents/StyledInputComponents.tsx +4 -11
- package/src/components/styled/UnsupportedType.tsx +4 -14
- package/src/components/styled/VideoMessage.tsx +54 -131
- package/src/context/xmppProvider.tsx +51 -134
- package/src/helpers/createMessageFromXml.ts +1 -20
- package/src/helpers/ensureScopedChatCache.ts +2 -2
- package/src/helpers/getDataFromXml.ts +25 -1
- package/src/helpers/historyPreloadScheduler.ts +3 -80
- package/src/helpers/initXmppRooms.tsx +10 -14
- package/src/helpers/insertMessageWithDelimiter.ts +13 -0
- package/src/helpers/isUnresolvedSenderId.ts +9 -1
- package/src/helpers/mimeToExtension.ts +22 -6
- package/src/helpers/resolveInitBeforeLoadUser.ts +18 -125
- package/src/helpers/resolveLangSource.ts +40 -0
- package/src/helpers/xmppUsername.ts +38 -0
- package/src/hooks/useChatRoomFocus.ts +5 -14
- package/src/hooks/useChatWrapperInit.ts +16 -32
- package/src/hooks/useComposing.tsx +1 -37
- package/src/hooks/useLogout.tsx +9 -15
- package/src/hooks/usePendingNotification.ts +11 -5
- package/src/hooks/useSendMessage.tsx +15 -60
- package/src/hooks/useUnreadMessagesCounter.ts +0 -11
- package/src/i18n/strings.ts +133 -121
- package/src/i18n/useT.ts +1 -1
- package/src/main.ts +2 -26
- package/src/networking/api-requests/auth.api.ts +48 -156
- package/src/networking/api-requests/roomMembers.api.ts +1 -1
- package/src/networking/api-requests/rooms.api.ts +9 -9
- package/src/networking/api-requests/user.api.ts +7 -79
- package/src/networking/apiClient.ts +123 -68
- package/src/networking/stanzaHandlers.ts +51 -92
- package/src/networking/xmpp/flushLastViewedToPrivateStore.ts +10 -71
- package/src/networking/xmpp/presenceInRoom.xmpp.ts +1 -6
- package/src/networking/xmpp/subscribeToRoomMessages.xmpp.ts +1 -12
- package/src/networking/xmppClient.ts +9 -141
- package/src/roomStore/chatSettingsSlice.ts +10 -34
- package/src/roomStore/index.ts +4 -40
- package/src/roomStore/persistence.ts +40 -234
- package/src/roomStore/roomsSlice.ts +7 -87
- package/src/services/pushSubscriptionService.ts +13 -18
- package/src/types/types.ts +5 -58
- package/src/version.ts +3 -1
- package/lib/commonjs/components/Modals/ChatProfileModal/ReportChatModal.js +0 -226
- package/lib/commonjs/components/Modals/ChatProfileModal/ReportChatModal.js.map +0 -1
- package/lib/commonjs/components/Modals/ProfileHeader/ProfileHeader.js +0 -556
- package/lib/commonjs/components/Modals/ProfileHeader/ProfileHeader.js.map +0 -1
- package/lib/commonjs/components/Modals/ProfileHeader/ProfileMenu.js +0 -210
- package/lib/commonjs/components/Modals/ProfileHeader/ProfileMenu.js.map +0 -1
- package/lib/commonjs/helpers/getChatBackground.js +0 -23
- package/lib/commonjs/helpers/getChatBackground.js.map +0 -1
- package/lib/commonjs/helpers/getDisplayFileName.js +0 -79
- package/lib/commonjs/helpers/getDisplayFileName.js.map +0 -1
- package/lib/commonjs/helpers/getServerReadTimestamp.js +0 -125
- package/lib/commonjs/helpers/getServerReadTimestamp.js.map +0 -1
- package/lib/commonjs/helpers/isOwnMessage.js +0 -75
- package/lib/commonjs/helpers/isOwnMessage.js.map +0 -1
- package/lib/commonjs/helpers/mediaLibraryRuntime.js +0 -31
- package/lib/commonjs/helpers/mediaLibraryRuntime.js.map +0 -1
- package/lib/commonjs/helpers/persistCrypto.js +0 -122
- package/lib/commonjs/helpers/persistCrypto.js.map +0 -1
- package/lib/commonjs/helpers/pickImageAsset.js +0 -68
- package/lib/commonjs/helpers/pickImageAsset.js.map +0 -1
- package/lib/commonjs/helpers/pushPayload.js +0 -71
- package/lib/commonjs/helpers/pushPayload.js.map +0 -1
- package/lib/commonjs/helpers/secureFileUrl.js +0 -101
- package/lib/commonjs/helpers/secureFileUrl.js.map +0 -1
- package/lib/commonjs/helpers/secureKeyValue.js +0 -83
- package/lib/commonjs/helpers/secureKeyValue.js.map +0 -1
- package/lib/commonjs/helpers/secureStoreRuntime.js +0 -59
- package/lib/commonjs/helpers/secureStoreRuntime.js.map +0 -1
- package/lib/commonjs/helpers/secureUserStorage.js +0 -75
- package/lib/commonjs/helpers/secureUserStorage.js.map +0 -1
- package/lib/commonjs/helpers/shallowEqual.js +0 -36
- package/lib/commonjs/helpers/shallowEqual.js.map +0 -1
- package/lib/commonjs/helpers/sheetGestures.js +0 -32
- package/lib/commonjs/helpers/sheetGestures.js.map +0 -1
- package/lib/commonjs/hooks/useFileToken.js +0 -10
- package/lib/commonjs/hooks/useFileToken.js.map +0 -1
- package/lib/commonjs/networking/authRefresh.js +0 -332
- package/lib/commonjs/networking/authRefresh.js.map +0 -1
- package/lib/module/components/Modals/ChatProfileModal/ReportChatModal.js +0 -223
- package/lib/module/components/Modals/ChatProfileModal/ReportChatModal.js.map +0 -1
- package/lib/module/components/Modals/ProfileHeader/ProfileHeader.js +0 -548
- package/lib/module/components/Modals/ProfileHeader/ProfileHeader.js.map +0 -1
- package/lib/module/components/Modals/ProfileHeader/ProfileMenu.js +0 -205
- package/lib/module/components/Modals/ProfileHeader/ProfileMenu.js.map +0 -1
- package/lib/module/helpers/getChatBackground.js +0 -18
- package/lib/module/helpers/getChatBackground.js.map +0 -1
- package/lib/module/helpers/getDisplayFileName.js +0 -73
- package/lib/module/helpers/getDisplayFileName.js.map +0 -1
- package/lib/module/helpers/getServerReadTimestamp.js +0 -120
- package/lib/module/helpers/getServerReadTimestamp.js.map +0 -1
- package/lib/module/helpers/isOwnMessage.js +0 -70
- package/lib/module/helpers/isOwnMessage.js.map +0 -1
- package/lib/module/helpers/mediaLibraryRuntime.js +0 -25
- package/lib/module/helpers/mediaLibraryRuntime.js.map +0 -1
- package/lib/module/helpers/persistCrypto.js +0 -115
- package/lib/module/helpers/persistCrypto.js.map +0 -1
- package/lib/module/helpers/pickImageAsset.js +0 -63
- package/lib/module/helpers/pickImageAsset.js.map +0 -1
- package/lib/module/helpers/pushPayload.js +0 -63
- package/lib/module/helpers/pushPayload.js.map +0 -1
- package/lib/module/helpers/secureFileUrl.js +0 -91
- package/lib/module/helpers/secureFileUrl.js.map +0 -1
- package/lib/module/helpers/secureKeyValue.js +0 -75
- package/lib/module/helpers/secureKeyValue.js.map +0 -1
- package/lib/module/helpers/secureStoreRuntime.js +0 -52
- package/lib/module/helpers/secureStoreRuntime.js.map +0 -1
- package/lib/module/helpers/secureUserStorage.js +0 -72
- package/lib/module/helpers/secureUserStorage.js.map +0 -1
- package/lib/module/helpers/shallowEqual.js +0 -31
- package/lib/module/helpers/shallowEqual.js.map +0 -1
- package/lib/module/helpers/sheetGestures.js +0 -26
- package/lib/module/helpers/sheetGestures.js.map +0 -1
- package/lib/module/hooks/useFileToken.js +0 -5
- package/lib/module/hooks/useFileToken.js.map +0 -1
- package/lib/module/networking/authRefresh.js +0 -321
- package/lib/module/networking/authRefresh.js.map +0 -1
- package/lib/typescript/components/Modals/ChatProfileModal/ReportChatModal.d.ts +0 -9
- package/lib/typescript/components/Modals/ChatProfileModal/ReportChatModal.d.ts.map +0 -1
- package/lib/typescript/components/Modals/ProfileHeader/ProfileHeader.d.ts +0 -75
- package/lib/typescript/components/Modals/ProfileHeader/ProfileHeader.d.ts.map +0 -1
- package/lib/typescript/components/Modals/ProfileHeader/ProfileMenu.d.ts +0 -25
- package/lib/typescript/components/Modals/ProfileHeader/ProfileMenu.d.ts.map +0 -1
- package/lib/typescript/helpers/getChatBackground.d.ts +0 -15
- package/lib/typescript/helpers/getChatBackground.d.ts.map +0 -1
- package/lib/typescript/helpers/getDisplayFileName.d.ts +0 -49
- package/lib/typescript/helpers/getDisplayFileName.d.ts.map +0 -1
- package/lib/typescript/helpers/getServerReadTimestamp.d.ts +0 -69
- package/lib/typescript/helpers/getServerReadTimestamp.d.ts.map +0 -1
- package/lib/typescript/helpers/isOwnMessage.d.ts +0 -36
- package/lib/typescript/helpers/isOwnMessage.d.ts.map +0 -1
- package/lib/typescript/helpers/mediaLibraryRuntime.d.ts +0 -3
- package/lib/typescript/helpers/mediaLibraryRuntime.d.ts.map +0 -1
- package/lib/typescript/helpers/persistCrypto.d.ts +0 -13
- package/lib/typescript/helpers/persistCrypto.d.ts.map +0 -1
- package/lib/typescript/helpers/pickImageAsset.d.ts +0 -27
- package/lib/typescript/helpers/pickImageAsset.d.ts.map +0 -1
- package/lib/typescript/helpers/pushPayload.d.ts +0 -7
- package/lib/typescript/helpers/pushPayload.d.ts.map +0 -1
- package/lib/typescript/helpers/secureFileUrl.d.ts +0 -7
- package/lib/typescript/helpers/secureFileUrl.d.ts.map +0 -1
- package/lib/typescript/helpers/secureKeyValue.d.ts +0 -13
- package/lib/typescript/helpers/secureKeyValue.d.ts.map +0 -1
- package/lib/typescript/helpers/secureStoreRuntime.d.ts +0 -29
- package/lib/typescript/helpers/secureStoreRuntime.d.ts.map +0 -1
- package/lib/typescript/helpers/secureUserStorage.d.ts +0 -23
- package/lib/typescript/helpers/secureUserStorage.d.ts.map +0 -1
- package/lib/typescript/helpers/shallowEqual.d.ts +0 -11
- package/lib/typescript/helpers/shallowEqual.d.ts.map +0 -1
- package/lib/typescript/helpers/sheetGestures.d.ts +0 -20
- package/lib/typescript/helpers/sheetGestures.d.ts.map +0 -1
- package/lib/typescript/hooks/useFileToken.d.ts +0 -2
- package/lib/typescript/hooks/useFileToken.d.ts.map +0 -1
- package/lib/typescript/networking/authRefresh.d.ts +0 -95
- package/lib/typescript/networking/authRefresh.d.ts.map +0 -1
- package/src/components/Modals/ChatProfileModal/ReportChatModal.tsx +0 -244
- package/src/components/Modals/ProfileHeader/ProfileHeader.tsx +0 -615
- package/src/components/Modals/ProfileHeader/ProfileMenu.tsx +0 -217
- package/src/helpers/getChatBackground.ts +0 -18
- package/src/helpers/getDisplayFileName.ts +0 -87
- package/src/helpers/getServerReadTimestamp.ts +0 -120
- package/src/helpers/isOwnMessage.ts +0 -90
- package/src/helpers/mediaLibraryRuntime.ts +0 -25
- package/src/helpers/persistCrypto.ts +0 -127
- package/src/helpers/pickImageAsset.ts +0 -68
- package/src/helpers/pushPayload.ts +0 -62
- package/src/helpers/secureFileUrl.ts +0 -103
- package/src/helpers/secureKeyValue.ts +0 -80
- package/src/helpers/secureStoreRuntime.ts +0 -62
- package/src/helpers/secureUserStorage.ts +0 -80
- package/src/helpers/shallowEqual.ts +0 -33
- package/src/helpers/sheetGestures.ts +0 -25
- package/src/hooks/useFileToken.ts +0 -7
- package/src/networking/authRefresh.ts +0 -451
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
/** @format */
|
|
2
|
-
|
|
3
|
-
import React, { useRef, useState } from 'react';
|
|
4
|
-
import {
|
|
5
|
-
Animated,
|
|
6
|
-
Dimensions,
|
|
7
|
-
Easing,
|
|
8
|
-
Modal,
|
|
9
|
-
Pressable,
|
|
10
|
-
StyleSheet,
|
|
11
|
-
Text,
|
|
12
|
-
TouchableOpacity,
|
|
13
|
-
View,
|
|
14
|
-
} from 'react-native';
|
|
15
|
-
import { MoreIcon } from '../../../assets/icons';
|
|
16
|
-
|
|
17
|
-
export interface ProfileMenuItem {
|
|
18
|
-
key: string;
|
|
19
|
-
label: string;
|
|
20
|
-
icon: React.ReactNode;
|
|
21
|
-
destructive?: boolean;
|
|
22
|
-
onPress: () => void;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/** Fallbacks used for the very first frame, before the card is measured. */
|
|
26
|
-
const ESTIMATED_WIDTH = 220;
|
|
27
|
-
const ESTIMATED_HEIGHT = 160;
|
|
28
|
-
const GAP = 8;
|
|
29
|
-
/** Roughly a notch inset + the header band, used until measured. */
|
|
30
|
-
const DEFAULT_TOP = 104;
|
|
31
|
-
const EDGE = 12;
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* The "…" overflow menu shared by the chat and user profile screens.
|
|
35
|
-
*
|
|
36
|
-
* The shared `DropdownMenu` pins its card at a hard-coded `top: 95`, which
|
|
37
|
-
* on this screen landed it over the host's own tab bar, unanchored to the
|
|
38
|
-
* button. This one measures the button and grows the card out of it: the
|
|
39
|
-
* card scales up from its top-right corner (translate → scale → translate
|
|
40
|
-
* back, which is how you fake a transform-origin in React Native) so the
|
|
41
|
-
* menu visibly unfolds from the three dots.
|
|
42
|
-
*/
|
|
43
|
-
const ProfileMenu: React.FC<{
|
|
44
|
-
items: ProfileMenuItem[];
|
|
45
|
-
testIDPrefix?: string;
|
|
46
|
-
}> = ({ items, testIDPrefix = 'chat-profile' }) => {
|
|
47
|
-
const buttonRef = useRef<View>(null);
|
|
48
|
-
const [open, setOpen] = useState(false);
|
|
49
|
-
const [anchor, setAnchor] = useState({ top: DEFAULT_TOP, right: EDGE });
|
|
50
|
-
const [size, setSize] = useState({
|
|
51
|
-
width: ESTIMATED_WIDTH,
|
|
52
|
-
height: ESTIMATED_HEIGHT,
|
|
53
|
-
});
|
|
54
|
-
const progress = useRef(new Animated.Value(0)).current;
|
|
55
|
-
|
|
56
|
-
const animate = (to: number, done?: () => void) =>
|
|
57
|
-
Animated.timing(progress, {
|
|
58
|
-
toValue: to,
|
|
59
|
-
duration: to ? 180 : 140,
|
|
60
|
-
easing: to ? Easing.out(Easing.back(1.3)) : Easing.in(Easing.quad),
|
|
61
|
-
useNativeDriver: true,
|
|
62
|
-
}).start(({ finished }) => finished && done?.());
|
|
63
|
-
|
|
64
|
-
// Anchor to the button's window frame — that is the same coordinate
|
|
65
|
-
// space the <Modal> lays out in, so no insets to subtract. Measured on
|
|
66
|
-
// layout (and again on open) rather than *before* opening: on some hosts
|
|
67
|
-
// the measure callback never fires, and gating the open on it would mean
|
|
68
|
-
// a menu that simply doesn't appear.
|
|
69
|
-
const measure = () =>
|
|
70
|
-
buttonRef.current?.measureInWindow?.((x, y, width, height) => {
|
|
71
|
-
if (typeof y !== 'number' || typeof x !== 'number') {return;}
|
|
72
|
-
const screenWidth = Dimensions.get('window').width;
|
|
73
|
-
setAnchor({
|
|
74
|
-
top: y + height + GAP,
|
|
75
|
-
right: Math.max(screenWidth - (x + width), EDGE),
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
const openMenu = () => {
|
|
80
|
-
measure();
|
|
81
|
-
progress.setValue(0);
|
|
82
|
-
setOpen(true);
|
|
83
|
-
animate(1);
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
const closeMenu = (then?: () => void) =>
|
|
87
|
-
animate(0, () => {
|
|
88
|
-
setOpen(false);
|
|
89
|
-
then?.();
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
const scale = progress.interpolate({
|
|
93
|
-
inputRange: [0, 1],
|
|
94
|
-
outputRange: [0.2, 1],
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
if (items.length === 0) {
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return (
|
|
102
|
-
<>
|
|
103
|
-
<View ref={buttonRef} collapsable={false} onLayout={measure}>
|
|
104
|
-
<TouchableOpacity
|
|
105
|
-
testID={`${testIDPrefix}-menu`}
|
|
106
|
-
activeOpacity={0.7}
|
|
107
|
-
onPress={openMenu}
|
|
108
|
-
style={styles.button}
|
|
109
|
-
>
|
|
110
|
-
<MoreIcon color="#FFFFFF" />
|
|
111
|
-
</TouchableOpacity>
|
|
112
|
-
</View>
|
|
113
|
-
|
|
114
|
-
<Modal
|
|
115
|
-
transparent
|
|
116
|
-
visible={open}
|
|
117
|
-
animationType="none"
|
|
118
|
-
onRequestClose={() => closeMenu()}
|
|
119
|
-
>
|
|
120
|
-
<Pressable
|
|
121
|
-
testID={`${testIDPrefix}-menu-backdrop`}
|
|
122
|
-
style={StyleSheet.absoluteFill}
|
|
123
|
-
onPress={() => closeMenu()}
|
|
124
|
-
/>
|
|
125
|
-
<Animated.View
|
|
126
|
-
testID={`${testIDPrefix}-menu-card`}
|
|
127
|
-
onLayout={(e) => {
|
|
128
|
-
const { width, height } = e.nativeEvent.layout;
|
|
129
|
-
if (width && height) {setSize({ width, height });}
|
|
130
|
-
}}
|
|
131
|
-
style={[
|
|
132
|
-
styles.card,
|
|
133
|
-
{
|
|
134
|
-
top: anchor.top,
|
|
135
|
-
right: anchor.right,
|
|
136
|
-
opacity: progress,
|
|
137
|
-
transform: [
|
|
138
|
-
// Move the origin to the card's top-right corner, scale
|
|
139
|
-
// there, then move back — RN has no transform-origin.
|
|
140
|
-
{ translateX: size.width / 2 },
|
|
141
|
-
{ translateY: -size.height / 2 },
|
|
142
|
-
{ scale },
|
|
143
|
-
{ translateX: -size.width / 2 },
|
|
144
|
-
{ translateY: size.height / 2 },
|
|
145
|
-
],
|
|
146
|
-
},
|
|
147
|
-
]}
|
|
148
|
-
>
|
|
149
|
-
{items.map((item, index) => (
|
|
150
|
-
<TouchableOpacity
|
|
151
|
-
key={item.key}
|
|
152
|
-
testID={`${testIDPrefix}-menu-${item.key}`}
|
|
153
|
-
activeOpacity={0.6}
|
|
154
|
-
style={[styles.row, index > 0 && styles.rowDivider]}
|
|
155
|
-
onPress={() => closeMenu(item.onPress)}
|
|
156
|
-
>
|
|
157
|
-
<Text
|
|
158
|
-
style={[styles.label, item.destructive && styles.destructive]}
|
|
159
|
-
>
|
|
160
|
-
{item.label}
|
|
161
|
-
</Text>
|
|
162
|
-
<View style={styles.icon}>{item.icon}</View>
|
|
163
|
-
</TouchableOpacity>
|
|
164
|
-
))}
|
|
165
|
-
</Animated.View>
|
|
166
|
-
</Modal>
|
|
167
|
-
</>
|
|
168
|
-
);
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
const styles = StyleSheet.create({
|
|
172
|
-
button: {
|
|
173
|
-
width: 40,
|
|
174
|
-
height: 40,
|
|
175
|
-
borderRadius: 20,
|
|
176
|
-
backgroundColor: 'rgba(0,0,0,0.28)',
|
|
177
|
-
alignItems: 'center',
|
|
178
|
-
justifyContent: 'center',
|
|
179
|
-
},
|
|
180
|
-
card: {
|
|
181
|
-
position: 'absolute',
|
|
182
|
-
minWidth: 200,
|
|
183
|
-
backgroundColor: '#FFFFFF',
|
|
184
|
-
borderRadius: 14,
|
|
185
|
-
paddingVertical: 4,
|
|
186
|
-
shadowColor: '#121219',
|
|
187
|
-
shadowOffset: { width: 0, height: 6 },
|
|
188
|
-
shadowOpacity: 0.18,
|
|
189
|
-
shadowRadius: 16,
|
|
190
|
-
elevation: 12,
|
|
191
|
-
},
|
|
192
|
-
row: {
|
|
193
|
-
flexDirection: 'row',
|
|
194
|
-
alignItems: 'center',
|
|
195
|
-
justifyContent: 'space-between',
|
|
196
|
-
gap: 24,
|
|
197
|
-
paddingHorizontal: 16,
|
|
198
|
-
paddingVertical: 13,
|
|
199
|
-
},
|
|
200
|
-
rowDivider: {
|
|
201
|
-
borderTopWidth: StyleSheet.hairlineWidth,
|
|
202
|
-
borderTopColor: '#EFEFF2',
|
|
203
|
-
},
|
|
204
|
-
label: {
|
|
205
|
-
fontSize: 16,
|
|
206
|
-
color: '#141414',
|
|
207
|
-
},
|
|
208
|
-
destructive: {
|
|
209
|
-
color: '#E53935',
|
|
210
|
-
},
|
|
211
|
-
icon: {
|
|
212
|
-
width: 22,
|
|
213
|
-
alignItems: 'center',
|
|
214
|
-
},
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
export default ProfileMenu;
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/** @format */
|
|
2
|
-
|
|
3
|
-
import type { IConfig } from '../types/types';
|
|
4
|
-
|
|
5
|
-
/** Ground behind the conversation, and behind the rounded corners of the
|
|
6
|
-
* header and the composer that sit over it. */
|
|
7
|
-
export const DEFAULT_CHAT_BACKGROUND = '#F3F6FC';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* One place for the conversation's background colour.
|
|
11
|
-
*
|
|
12
|
-
* The message list has always painted it; the chat container behind it was
|
|
13
|
-
* plain white, which is what made the header's rounded bottom corners and
|
|
14
|
-
* the composer's rounded top corners invisible — the corners revealed the
|
|
15
|
-
* white parent, not the conversation.
|
|
16
|
-
*/
|
|
17
|
-
export const getChatBackgroundColor = (config?: IConfig): string =>
|
|
18
|
-
config?.backgroundChat?.color || DEFAULT_CHAT_BACKGROUND;
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { ensureFilenameHasExtension, filenameFromUrl } from './mimeToExtension';
|
|
2
|
-
|
|
3
|
-
export interface DisplayFileNameOptions {
|
|
4
|
-
originalName?: string | null;
|
|
5
|
-
fileName?: string | null;
|
|
6
|
-
location?: string | null;
|
|
7
|
-
mimetype?: string | null;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Picks the best human-readable filename for a chat attachment - the
|
|
12
|
-
* single source of truth for every place a file name is rendered in the
|
|
13
|
-
* UI, saved to disk, shared, or downloaded.
|
|
14
|
-
*
|
|
15
|
-
* Priority: `originalName` (the sender's own file name, e.g. "test1.pdf")
|
|
16
|
-
* beats `fileName` (the server's stored/hashed name, e.g.
|
|
17
|
-
* "3f9a1c...c2.pdf") beats the last path segment of `location`. The
|
|
18
|
-
* stored hash name is only a fallback of last resort.
|
|
19
|
-
*
|
|
20
|
-
* Bug #40: display and save/share/download logic used to prefer the
|
|
21
|
-
* stored hash name over the original one, so an attachment sent as
|
|
22
|
-
* "test1.pdf" showed up (and got saved to the phone) as something like
|
|
23
|
-
* "3f9a1c...c2.pdf" - both directions (web -> RN and RN -> RN).
|
|
24
|
-
*
|
|
25
|
-
* Always returns a non-empty string with a valid extension: if the
|
|
26
|
-
* chosen candidate has no extension (a hash name can be `<hex>` with no
|
|
27
|
-
* extension at all, or `<hex>.<ext>`), one is appended from `mimetype`
|
|
28
|
-
* (or `.bin` as a last resort when the mime is unknown/missing too).
|
|
29
|
-
*/
|
|
30
|
-
export function getDisplayFileName(options: DisplayFileNameOptions): string {
|
|
31
|
-
const candidate =
|
|
32
|
-
(options.originalName && options.originalName.trim()) ||
|
|
33
|
-
(options.fileName && options.fileName.trim()) ||
|
|
34
|
-
filenameFromUrl(options.location) ||
|
|
35
|
-
'';
|
|
36
|
-
return ensureFilenameHasExtension(candidate, options.mimetype);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Makes a display name safe to use as an actual path segment when
|
|
41
|
-
* saving/sharing a file to the device: strips path separators (so an
|
|
42
|
-
* odd/hostile server-provided name can't escape the target directory)
|
|
43
|
-
* and control characters. Keeps the rest of the name - including the
|
|
44
|
-
* extension - intact.
|
|
45
|
-
*/
|
|
46
|
-
export function sanitizeFileNameForPath(name: string): string {
|
|
47
|
-
const cleaned = (name || '')
|
|
48
|
-
.replace(/[\/\\]/g, '_')
|
|
49
|
-
// eslint-disable-next-line no-control-regex
|
|
50
|
-
.replace(/[\x00-\x1f\x7f]/g, '')
|
|
51
|
-
.trim();
|
|
52
|
-
return cleaned || 'file';
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Resolves a filename that is safe to write into a target directory:
|
|
57
|
-
* sanitizes it, then - if `exists` reports a collision - inserts
|
|
58
|
-
* " (1)", " (2)", ... before the extension until a free name is found,
|
|
59
|
-
* so saving two different attachments that share a display name never
|
|
60
|
-
* silently overwrites the first one.
|
|
61
|
-
*
|
|
62
|
-
* `exists` is injected so callers can back it with whatever existence
|
|
63
|
-
* check makes sense for their storage API (expo-file-system,
|
|
64
|
-
* StorageAccessFramework directory listing, ...) - this function stays
|
|
65
|
-
* pure and easy to unit test.
|
|
66
|
-
*/
|
|
67
|
-
export async function getUniqueFileName(
|
|
68
|
-
name: string,
|
|
69
|
-
exists: (candidateName: string) => Promise<boolean>
|
|
70
|
-
): Promise<string> {
|
|
71
|
-
const safeName = sanitizeFileNameForPath(name);
|
|
72
|
-
if (!(await exists(safeName))) {
|
|
73
|
-
return safeName;
|
|
74
|
-
}
|
|
75
|
-
const dotIndex = safeName.lastIndexOf('.');
|
|
76
|
-
const base = dotIndex > 0 ? safeName.slice(0, dotIndex) : safeName;
|
|
77
|
-
const ext = dotIndex > 0 ? safeName.slice(dotIndex) : '';
|
|
78
|
-
// 999 collisions is already a pathological case; fall back to a
|
|
79
|
-
// timestamp suffix rather than looping forever.
|
|
80
|
-
for (let i = 1; i < 1000; i += 1) {
|
|
81
|
-
const candidate = `${base} (${i})${ext}`;
|
|
82
|
-
if (!(await exists(candidate))) {
|
|
83
|
-
return candidate;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return `${base} (${Date.now()})${ext}`;
|
|
87
|
-
}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import type { IMessage, IRoom } from '../types/types';
|
|
2
|
-
import { msgSortableMs } from '../roomStore/roomsSlice';
|
|
3
|
-
|
|
4
|
-
// A stored/stamped read marker more than this far past the newest
|
|
5
|
-
// message we actually know about for a room is not "the user is a
|
|
6
|
-
// little ahead" - it's a leftover from a device whose clock was wrong
|
|
7
|
-
// when it stamped the marker (bug #38). Generous on purpose: this value
|
|
8
|
-
// only controls when we're willing to treat an existing marker as
|
|
9
|
-
// corrupt and self-heal it, never how far off a legitimate new write can
|
|
10
|
-
// be, so a false positive here just means a bad value survives one extra
|
|
11
|
-
// cycle, not that a good value gets rejected.
|
|
12
|
-
export const FUTURE_READ_MARKER_TOLERANCE_MS = 5 * 60 * 1000;
|
|
13
|
-
|
|
14
|
-
export interface ReadTimestampHeapState {
|
|
15
|
-
messageHeap?: IMessage[] | null;
|
|
16
|
-
failedMessages?: Record<string, unknown> | null;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
type RoomForReadTimestamp = Pick<IRoom, 'jid' | 'messages' | 'lastViewedTimestamp'>;
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Resolve the "read up to here" marker for `room` using SERVER time,
|
|
23
|
-
* never the device clock.
|
|
24
|
-
*
|
|
25
|
-
* Bug #38: if the device clock is ahead when the user leaves a room, a
|
|
26
|
-
* `Date.now()` read marker lands in the future. The private-store merge
|
|
27
|
-
* (flushLastViewedToPrivateStore.ts) is forward-only ("if (prevNum >=
|
|
28
|
-
* ts) continue"), so once a future marker is written, no later
|
|
29
|
-
* *correct* write can ever replace it - the room's unread count is
|
|
30
|
-
* stuck wrong forever, on every device, from that point on. Anchoring
|
|
31
|
-
* to the newest SERVER-acknowledged message's own timestamp instead
|
|
32
|
-
* means the marker we write can never be ahead of what the server
|
|
33
|
-
* itself has recorded for the room.
|
|
34
|
-
*
|
|
35
|
-
* "Server-acknowledged" excludes:
|
|
36
|
-
* - a message still marked `pending` (the optimistic bubble shown
|
|
37
|
-
* while a send is in flight - it carries the DEVICE send time via
|
|
38
|
-
* `date`, not a server timestamp, until the server echoes it back
|
|
39
|
-
* and insertMessageWithDelimiter flips `pending` off);
|
|
40
|
-
* - a message id present in `heapState.messageHeap` (queued retry -
|
|
41
|
-
* used for offline media sends, see roomHeapSlice.ts) or
|
|
42
|
-
* `heapState.failedMessages` (a send that never reached the server
|
|
43
|
-
* at all).
|
|
44
|
-
*
|
|
45
|
-
* `msgSortableMs` (roomsSlice.ts) reads the server-assigned microsecond
|
|
46
|
-
* timestamp encoded in the first 13 digits of the message id - the same
|
|
47
|
-
* source already used for message ordering and unread counting - so
|
|
48
|
-
* this stays consistent with the rest of the read/unread pipeline.
|
|
49
|
-
*
|
|
50
|
-
* Falls back to the room's existing `lastViewedTimestamp` (so leaving
|
|
51
|
-
* an empty or never-scrolled room doesn't regress the marker), then to
|
|
52
|
-
* `0` when there's truly nothing to anchor to yet (a brand new room
|
|
53
|
-
* with no history and no prior marker). Callers should treat `0` as
|
|
54
|
-
* "skip the write" rather than substituting a device-clock guess.
|
|
55
|
-
*/
|
|
56
|
-
export function getServerReadTimestamp(
|
|
57
|
-
room: RoomForReadTimestamp | null | undefined,
|
|
58
|
-
heapState?: ReadTimestampHeapState | null
|
|
59
|
-
): number {
|
|
60
|
-
if (!room) {return 0;}
|
|
61
|
-
|
|
62
|
-
const heapIds = new Set(
|
|
63
|
-
(heapState?.messageHeap || [])
|
|
64
|
-
.filter((m) => m && m.id != null)
|
|
65
|
-
.map((m) => String(m.id))
|
|
66
|
-
);
|
|
67
|
-
const failedIds = new Set(Object.keys(heapState?.failedMessages || {}));
|
|
68
|
-
|
|
69
|
-
let newest = 0;
|
|
70
|
-
const messages = room.messages || [];
|
|
71
|
-
for (const m of messages) {
|
|
72
|
-
if (!m || !m.id) {continue;}
|
|
73
|
-
const id = String(m.id);
|
|
74
|
-
if (id === 'delimiter-new' || id === 'delimiter-new-local') {continue;}
|
|
75
|
-
if ((m as any).pending) {continue;}
|
|
76
|
-
if (heapIds.has(id) || failedIds.has(id)) {continue;}
|
|
77
|
-
|
|
78
|
-
const ts = msgSortableMs(m);
|
|
79
|
-
if (ts > newest) {newest = ts;}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
if (newest > 0) {return newest;}
|
|
83
|
-
if (room.lastViewedTimestamp && room.lastViewedTimestamp > 0) {
|
|
84
|
-
return room.lastViewedTimestamp;
|
|
85
|
-
}
|
|
86
|
-
return 0;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Is `marker` a leftover from a device whose clock was wrong when it
|
|
91
|
-
* stamped a read marker (bug #38)?
|
|
92
|
-
*
|
|
93
|
-
* TWO independent signals must agree before we're willing to throw a
|
|
94
|
-
* stored marker away, because "waive the forward-only guard" is a
|
|
95
|
-
* destructive operation:
|
|
96
|
-
*
|
|
97
|
-
* 1. it sits well past the newest message we know the room has, AND
|
|
98
|
-
* 2. it sits well past real time.
|
|
99
|
-
*
|
|
100
|
-
* Signal 1 alone is NOT enough, and that is the whole point of this
|
|
101
|
-
* function: a device whose local cache for a room is simply stale (very
|
|
102
|
-
* common - any room whose history hasn't been synced yet this session)
|
|
103
|
-
* sees a perfectly legitimate marker written by another device that HAS
|
|
104
|
-
* seen newer messages, and would happily "heal" it backwards, resurrecting
|
|
105
|
-
* already-read messages as unread on every device. A real timestamp can
|
|
106
|
-
* never be ahead of real time, so requiring signal 2 as well means a
|
|
107
|
-
* stale cache on its own can no longer trigger the self-heal.
|
|
108
|
-
*
|
|
109
|
-
* Signal 2 alone is not used either: it would let a device whose own
|
|
110
|
-
* clock is running SLOW mistake every correct marker for a corrupt one.
|
|
111
|
-
*/
|
|
112
|
-
export function isCorruptFutureReadMarker(
|
|
113
|
-
marker: number,
|
|
114
|
-
newestAckedMs: number
|
|
115
|
-
): boolean {
|
|
116
|
-
if (!Number.isFinite(marker) || marker <= 0) {return false;}
|
|
117
|
-
if (!(newestAckedMs > 0)) {return false;}
|
|
118
|
-
if (marker <= newestAckedMs + FUTURE_READ_MARKER_TOLERANCE_MS) {return false;}
|
|
119
|
-
return marker > Date.now() + FUTURE_READ_MARKER_TOLERANCE_MS;
|
|
120
|
-
}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { IMessage } from '../types/types';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Bug #41: during reconnect catch-up (app was backgrounded/offline, then
|
|
5
|
-
* comes back online), messages replayed from MAM could transiently render
|
|
6
|
-
* on the RIGHT (as if sent by the current user) before flipping to the
|
|
7
|
-
* LEFT a moment later. Root cause: `message.user.id === walletAddress`
|
|
8
|
-
* treats `undefined === undefined` (or `'' === ''`) as a match, and the
|
|
9
|
-
* two sides could independently be empty for one frame -- the message's
|
|
10
|
-
* sender id before the MAM-derived value settled, and/or the current
|
|
11
|
-
* user's id before it rehydrated. Two blank ids must never compare equal.
|
|
12
|
-
*
|
|
13
|
-
* A second, related issue: the same logical sender id can show up in
|
|
14
|
-
* different shapes depending on which code path produced it -- a bare
|
|
15
|
-
* id ("wallet123") or a bare JID with an incidental session resource
|
|
16
|
-
* ("wallet123@host/sessionResource", as `senderJID` attrs carry on the
|
|
17
|
-
* wire -- see src/assets/test.xml). In every shape used in this
|
|
18
|
-
* codebase the identifying segment is the part BEFORE the first '@' (or
|
|
19
|
-
* before '/' when there's no '@'); anything after that -- domain,
|
|
20
|
-
* resource -- is noise. Comparing raw strings with `===` fails whenever
|
|
21
|
-
* one side still carries that noise and the other doesn't. Normalizing
|
|
22
|
-
* both sides (strip resource, strip domain, lowercase) before comparing
|
|
23
|
-
* makes the check tolerant of that drift.
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
export interface OwnMessageUserLike {
|
|
27
|
-
id?: string | null;
|
|
28
|
-
xmppUsername?: string | null;
|
|
29
|
-
walletAddress?: string | null;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export type OwnMessageCurrentUser =
|
|
33
|
-
| OwnMessageUserLike
|
|
34
|
-
| string
|
|
35
|
-
| null
|
|
36
|
-
| undefined;
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Strip a MUC resource (`room@host/resource` -> `room@host`) and then a
|
|
40
|
-
* JID domain (`local@host` -> `local`), lowercasing the result. Applies
|
|
41
|
-
* to both plain ids and full/partial JIDs so either shape normalizes to
|
|
42
|
-
* the same comparable value.
|
|
43
|
-
*/
|
|
44
|
-
const normalizeId = (raw: unknown): string => {
|
|
45
|
-
const value = String(raw ?? '').trim();
|
|
46
|
-
if (!value) {
|
|
47
|
-
return '';
|
|
48
|
-
}
|
|
49
|
-
const withoutResource = value.split('/')[0];
|
|
50
|
-
const withoutDomain = withoutResource.includes('@')
|
|
51
|
-
? withoutResource.split('@')[0]
|
|
52
|
-
: withoutResource;
|
|
53
|
-
return withoutDomain.toLowerCase();
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
// Same precedence the rest of the app uses when it needs "who am I" as a
|
|
57
|
-
// single id: xmppUsername first, walletAddress as the fallback.
|
|
58
|
-
const resolveCurrentUserId = (currentUser: OwnMessageCurrentUser): string => {
|
|
59
|
-
if (typeof currentUser === 'string') {
|
|
60
|
-
return currentUser;
|
|
61
|
-
}
|
|
62
|
-
if (!currentUser) {
|
|
63
|
-
return '';
|
|
64
|
-
}
|
|
65
|
-
return (
|
|
66
|
-
currentUser.xmppUsername || currentUser.walletAddress || currentUser.id || ''
|
|
67
|
-
);
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Robustly determine whether `message` was sent by `currentUser`. Never
|
|
72
|
-
* returns true from two blank/undefined ids, and tolerates bare-id vs.
|
|
73
|
-
* full-JID mismatches between the sender id and the current user id.
|
|
74
|
-
*/
|
|
75
|
-
export const isOwnMessage = (
|
|
76
|
-
message: Pick<IMessage, 'user'> | null | undefined,
|
|
77
|
-
currentUser: OwnMessageCurrentUser
|
|
78
|
-
): boolean => {
|
|
79
|
-
const messageUserId = normalizeId(message?.user?.id);
|
|
80
|
-
if (!messageUserId) {
|
|
81
|
-
return false;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const currentUserId = normalizeId(resolveCurrentUserId(currentUser));
|
|
85
|
-
if (!currentUserId) {
|
|
86
|
-
return false;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return messageUserId === currentUserId;
|
|
90
|
-
};
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
let cached: any | undefined;
|
|
2
|
-
|
|
3
|
-
export const getMediaLibrary = (): any | null => {
|
|
4
|
-
if (cached !== undefined) {return cached;}
|
|
5
|
-
try {
|
|
6
|
-
const legacy = require('expo-media-library/legacy');
|
|
7
|
-
|
|
8
|
-
if (legacy?.getAssetsAsync) {
|
|
9
|
-
cached = legacy;
|
|
10
|
-
return cached;
|
|
11
|
-
}
|
|
12
|
-
} catch {
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
try {
|
|
16
|
-
cached = require('expo-media-library') ?? null;
|
|
17
|
-
} catch {
|
|
18
|
-
cached = null;
|
|
19
|
-
}
|
|
20
|
-
return cached;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export const __resetMediaLibraryCache = () => {
|
|
24
|
-
cached = undefined;
|
|
25
|
-
};
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import CryptoJS from 'crypto-js';
|
|
2
|
-
import { secureGet, secureSet } from './secureKeyValue';
|
|
3
|
-
|
|
4
|
-
// AES-256-CBC at rest for the bulk persisted state (message history +
|
|
5
|
-
// room list) that `roomStore/persistence.ts` writes to AsyncStorage.
|
|
6
|
-
// This is envelope encryption, not a SecureStore write of the payload
|
|
7
|
-
// itself: expo-secure-store has historically capped a single value's
|
|
8
|
-
// size on Android (chunking exists in newer releases, but the payload
|
|
9
|
-
// here is unbounded — up to MESSAGE_LIMIT messages per room, times
|
|
10
|
-
// every room), so only the small symmetric KEY goes through the
|
|
11
|
-
// platform Keychain/Keystore (`secureKeyValue.ts`); the ciphertext
|
|
12
|
-
// itself stays in plain AsyncStorage, unreadable without that key.
|
|
13
|
-
const CIPHER_KEY_STORE_KEY = 'ethora_history_cipher_key';
|
|
14
|
-
const ENVELOPE_VERSION = 1;
|
|
15
|
-
const KEY_BYTES = 32; // AES-256
|
|
16
|
-
const IV_BYTES = 16; // one AES block
|
|
17
|
-
|
|
18
|
-
interface Envelope {
|
|
19
|
-
v: number;
|
|
20
|
-
iv: string; // base64
|
|
21
|
-
ct: string; // base64 ciphertext
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* `crypto-js`'s own `WordArray.random()` falls back to `Math.random()`
|
|
26
|
-
* when it can't detect a browser `window.crypto` — not safe for key/IV
|
|
27
|
-
* material. `react-native-get-random-values` (a REQUIRED peer
|
|
28
|
-
* dependency, imported at the top of `main.ts`/`index.js` before
|
|
29
|
-
* anything else in the SDK runs) polyfills the real thing onto
|
|
30
|
-
* `global.crypto.getRandomValues` instead; source bytes from that and
|
|
31
|
-
* hand them to crypto-js as a WordArray rather than trust its default.
|
|
32
|
-
*/
|
|
33
|
-
const randomWordArray = (byteLength: number): CryptoJS.lib.WordArray => {
|
|
34
|
-
const bytes = new Uint8Array(byteLength);
|
|
35
|
-
(global as any).crypto.getRandomValues(bytes);
|
|
36
|
-
const words: number[] = [];
|
|
37
|
-
for (let i = 0; i < bytes.length; i += 4) {
|
|
38
|
-
words.push(
|
|
39
|
-
((bytes[i] || 0) << 24) |
|
|
40
|
-
((bytes[i + 1] || 0) << 16) |
|
|
41
|
-
((bytes[i + 2] || 0) << 8) |
|
|
42
|
-
(bytes[i + 3] || 0)
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
return CryptoJS.lib.WordArray.create(words, byteLength);
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
let cachedKeyPromise: Promise<CryptoJS.lib.WordArray> | null = null;
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* One AES-256 key per install, generated on first use and persisted
|
|
52
|
-
* through the SecureStore/Keychain bridge. Reused across logins on
|
|
53
|
-
* purpose: the ciphertext it protects is deleted wholesale on logout
|
|
54
|
-
* (`clearPersistedState`), so there is no cross-account data for a
|
|
55
|
-
* stable key to expose — only the encrypted blob of whoever is
|
|
56
|
-
* currently logged in ever exists on disk at a given time.
|
|
57
|
-
*/
|
|
58
|
-
const loadOrCreateKey = (): Promise<CryptoJS.lib.WordArray> => {
|
|
59
|
-
if (cachedKeyPromise) {return cachedKeyPromise;}
|
|
60
|
-
cachedKeyPromise = (async () => {
|
|
61
|
-
const existing = await secureGet(CIPHER_KEY_STORE_KEY);
|
|
62
|
-
if (existing) {
|
|
63
|
-
return CryptoJS.enc.Base64.parse(existing);
|
|
64
|
-
}
|
|
65
|
-
const key = randomWordArray(KEY_BYTES);
|
|
66
|
-
await secureSet(CIPHER_KEY_STORE_KEY, CryptoJS.enc.Base64.stringify(key));
|
|
67
|
-
return key;
|
|
68
|
-
})();
|
|
69
|
-
return cachedKeyPromise;
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
/** Encrypt a JSON-serialisable payload for storage. Returns the string to persist. */
|
|
73
|
-
export async function encryptForPersist(plaintext: string): Promise<string> {
|
|
74
|
-
const key = await loadOrCreateKey();
|
|
75
|
-
const iv = randomWordArray(IV_BYTES);
|
|
76
|
-
const encrypted = CryptoJS.AES.encrypt(plaintext, key, {
|
|
77
|
-
iv,
|
|
78
|
-
mode: CryptoJS.mode.CBC,
|
|
79
|
-
padding: CryptoJS.pad.Pkcs7,
|
|
80
|
-
});
|
|
81
|
-
const envelope: Envelope = {
|
|
82
|
-
v: ENVELOPE_VERSION,
|
|
83
|
-
iv: CryptoJS.enc.Base64.stringify(iv),
|
|
84
|
-
ct: encrypted.ciphertext.toString(CryptoJS.enc.Base64),
|
|
85
|
-
};
|
|
86
|
-
return JSON.stringify(envelope);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Decrypt a value previously written by `encryptForPersist`. Returns
|
|
91
|
-
* null (never throws) for anything that isn't a valid envelope for the
|
|
92
|
-
* current key — including a plaintext blob from a pre-encryption
|
|
93
|
-
* install: the app just re-hydrates that room/history from the server,
|
|
94
|
-
* same as any other empty-cache cold start.
|
|
95
|
-
*/
|
|
96
|
-
export async function decryptFromPersist(
|
|
97
|
-
stored: string
|
|
98
|
-
): Promise<string | null> {
|
|
99
|
-
try {
|
|
100
|
-
const envelope = JSON.parse(stored) as Partial<Envelope>;
|
|
101
|
-
if (
|
|
102
|
-
!envelope ||
|
|
103
|
-
envelope.v !== ENVELOPE_VERSION ||
|
|
104
|
-
!envelope.iv ||
|
|
105
|
-
!envelope.ct
|
|
106
|
-
) {
|
|
107
|
-
return null;
|
|
108
|
-
}
|
|
109
|
-
const key = await loadOrCreateKey();
|
|
110
|
-
const iv = CryptoJS.enc.Base64.parse(envelope.iv);
|
|
111
|
-
const ciphertext = CryptoJS.enc.Base64.parse(envelope.ct);
|
|
112
|
-
const decrypted = CryptoJS.AES.decrypt(
|
|
113
|
-
{ ciphertext } as CryptoJS.lib.CipherParams,
|
|
114
|
-
key,
|
|
115
|
-
{ iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }
|
|
116
|
-
);
|
|
117
|
-
const plaintext = decrypted.toString(CryptoJS.enc.Utf8);
|
|
118
|
-
return plaintext || null;
|
|
119
|
-
} catch {
|
|
120
|
-
return null;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/** Test seam only. */
|
|
125
|
-
export const __resetPersistCryptoKeyForTests = (): void => {
|
|
126
|
-
cachedKeyPromise = null;
|
|
127
|
-
};
|