@ethora/chat-component-rn 26.8.1 → 26.8.3
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 +110 -0
- package/README.md +70 -11
- package/lib/commonjs/assets/EmptyChatIllustration.js +7 -6
- package/lib/commonjs/assets/EmptyChatIllustration.js.map +1 -1
- package/lib/commonjs/assets/icons.js +7 -2
- package/lib/commonjs/assets/icons.js.map +1 -1
- package/lib/commonjs/components/AuthForms/Login.js +27 -12
- package/lib/commonjs/components/AuthForms/Login.js.map +1 -1
- package/lib/commonjs/components/ContextMenu/ContextMenuComponents.js +12 -4
- package/lib/commonjs/components/ContextMenu/ContextMenuComponents.js.map +1 -1
- package/lib/commonjs/components/DropdownMenu/DropdownMenu.js +16 -9
- package/lib/commonjs/components/DropdownMenu/DropdownMenu.js.map +1 -1
- package/lib/commonjs/components/ExampleComponents/CustomMessage.js +25 -7
- package/lib/commonjs/components/ExampleComponents/CustomMessage.js.map +1 -1
- package/lib/commonjs/components/ExampleComponents/CustomTypingIndicatorExamples.js +18 -6
- package/lib/commonjs/components/ExampleComponents/CustomTypingIndicatorExamples.js.map +1 -1
- package/lib/commonjs/components/Header/HeaderRoomList.js +34 -10
- package/lib/commonjs/components/Header/HeaderRoomList.js.map +1 -1
- package/lib/commonjs/components/InputComponents/Search.js +13 -4
- package/lib/commonjs/components/InputComponents/Search.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatHeader.js +18 -6
- package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatRoom.js +154 -15
- package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatWrapper.js +42 -19
- package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
- package/lib/commonjs/components/MainComponents/LanguageSelectorModal.js +37 -10
- package/lib/commonjs/components/MainComponents/LanguageSelectorModal.js.map +1 -1
- package/lib/commonjs/components/MainComponents/LoginWrapper.js +2 -1
- package/lib/commonjs/components/MainComponents/LoginWrapper.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MediaMessage.js +72 -28
- package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MessageContainer.js +5 -1
- package/lib/commonjs/components/MainComponents/MessageContainer.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MessageList.js +22 -8
- package/lib/commonjs/components/MainComponents/MessageList.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ProfileImagePlaceholder.js +14 -13
- package/lib/commonjs/components/MainComponents/ProfileImagePlaceholder.js.map +1 -1
- package/lib/commonjs/components/MainComponents/RNStyled.js +12 -4
- package/lib/commonjs/components/MainComponents/RNStyled.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ReduxWrapper.js +25 -8
- package/lib/commonjs/components/MainComponents/ReduxWrapper.js.map +1 -1
- package/lib/commonjs/components/MainComponents/RoomList.js +214 -38
- package/lib/commonjs/components/MainComponents/RoomList.js.map +1 -1
- package/lib/commonjs/components/MainComponents/Select.js +29 -8
- package/lib/commonjs/components/MainComponents/Select.js.map +1 -1
- package/lib/commonjs/components/Menu/HeaderRoomListMenu.js +329 -99
- package/lib/commonjs/components/Menu/HeaderRoomListMenu.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/BottomReplyContainer.js +24 -8
- package/lib/commonjs/components/MessageBubble/BottomReplyContainer.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/Message.js +46 -24
- package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/MessageInteractions.js +15 -4
- package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/MessageReaction.js +10 -5
- package/lib/commonjs/components/MessageBubble/MessageReaction.js.map +1 -1
- package/lib/commonjs/components/Modals/AddMembersModal/AddMembersModal.js +1 -5
- package/lib/commonjs/components/Modals/AddMembersModal/AddMembersModal.js.map +1 -1
- package/lib/commonjs/components/Modals/AttachSheet/AttachSheet.js +345 -118
- package/lib/commonjs/components/Modals/AttachSheet/AttachSheet.js.map +1 -1
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +599 -203
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/commonjs/components/Modals/ChatProfileModal/DeleteChatModal.js +5 -7
- package/lib/commonjs/components/Modals/ChatProfileModal/DeleteChatModal.js.map +1 -1
- package/lib/commonjs/components/Modals/ChatProfileModal/ReportChatModal.js +230 -0
- package/lib/commonjs/components/Modals/ChatProfileModal/ReportChatModal.js.map +1 -0
- package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js +89 -36
- package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
- package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js +2 -1
- package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
- package/lib/commonjs/components/Modals/Modal/Modal.js +8 -0
- package/lib/commonjs/components/Modals/Modal/Modal.js.map +1 -1
- package/lib/commonjs/components/Modals/ModalHeaderComponent.js +8 -2
- package/lib/commonjs/components/Modals/ModalHeaderComponent.js.map +1 -1
- package/lib/commonjs/components/Modals/ModalWrapper/ModalWrapper.js +8 -8
- package/lib/commonjs/components/Modals/ModalWrapper/ModalWrapper.js.map +1 -1
- package/lib/commonjs/components/Modals/NewChatModal/ModalContent.js +3 -6
- package/lib/commonjs/components/Modals/NewChatModal/ModalContent.js.map +1 -1
- package/lib/commonjs/components/Modals/NewChatModal/NewChatModal.js +205 -106
- package/lib/commonjs/components/Modals/NewChatModal/NewChatModal.js.map +1 -1
- package/lib/commonjs/components/Modals/NewChatModal/UpdNewChatModal.js +8 -0
- package/lib/commonjs/components/Modals/NewChatModal/UpdNewChatModal.js.map +1 -1
- package/lib/commonjs/components/Modals/ProfileHeader/ProfileHeader.js +563 -0
- package/lib/commonjs/components/Modals/ProfileHeader/ProfileHeader.js.map +1 -0
- package/lib/commonjs/components/Modals/ProfileHeader/ProfileMenu.js +215 -0
- package/lib/commonjs/components/Modals/ProfileHeader/ProfileMenu.js.map +1 -0
- package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js +7 -9
- package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js +8 -6
- package/lib/commonjs/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/Referrals/Referrals.js +7 -2
- package/lib/commonjs/components/Modals/SettingsModals/Referrals/Referrals.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/SharedStyledComponents.js +7 -3
- package/lib/commonjs/components/Modals/SettingsModals/SharedStyledComponents.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/Visibility/RadioInput.js +10 -6
- package/lib/commonjs/components/Modals/SettingsModals/Visibility/RadioInput.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/Visibility/VisibilityModal.js +7 -6
- package/lib/commonjs/components/Modals/SettingsModals/Visibility/VisibilityModal.js.map +1 -1
- package/lib/commonjs/components/Modals/UserProfileModal/EditUserModal.js +10 -22
- package/lib/commonjs/components/Modals/UserProfileModal/EditUserModal.js.map +1 -1
- package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js +510 -244
- package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
- package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js +77 -46
- package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
- package/lib/commonjs/components/Modals/styledModalComponents.js +68 -17
- package/lib/commonjs/components/Modals/styledModalComponents.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +30 -10
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastAudioMessage.js +6 -2
- package/lib/commonjs/components/RoomComponents/styled/LastAudioMessage.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js +22 -3
- package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js +17 -3
- package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js +17 -3
- package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/StyledRoomComponents.js +6 -0
- package/lib/commonjs/components/RoomComponents/styled/StyledRoomComponents.js.map +1 -1
- package/lib/commonjs/components/Thread/ThreadWrapper.js +9 -2
- package/lib/commonjs/components/Thread/ThreadWrapper.js.map +1 -1
- package/lib/commonjs/components/Toast/Toast.js +3 -1
- package/lib/commonjs/components/Toast/Toast.js.map +1 -1
- package/lib/commonjs/components/VideoCalls/VideoCallSession.js +6 -3
- package/lib/commonjs/components/VideoCalls/VideoCallSession.js.map +1 -1
- package/lib/commonjs/components/styled/AudioMessage.js +18 -12
- package/lib/commonjs/components/styled/AudioMessage.js.map +1 -1
- package/lib/commonjs/components/styled/Button.js +18 -9
- package/lib/commonjs/components/styled/Button.js.map +1 -1
- package/lib/commonjs/components/styled/DateLabel.js +8 -5
- package/lib/commonjs/components/styled/DateLabel.js.map +1 -1
- package/lib/commonjs/components/styled/MediaModal.js +27 -21
- package/lib/commonjs/components/styled/MediaModal.js.map +1 -1
- package/lib/commonjs/components/styled/MessageImage.js +37 -9
- package/lib/commonjs/components/styled/MessageImage.js.map +1 -1
- package/lib/commonjs/components/styled/RoomListComponents/index.js +60 -38
- package/lib/commonjs/components/styled/RoomListComponents/index.js.map +1 -1
- package/lib/commonjs/components/styled/SendInput.js +93 -19
- package/lib/commonjs/components/styled/SendInput.js.map +1 -1
- package/lib/commonjs/components/styled/StyledComponents.js +75 -25
- package/lib/commonjs/components/styled/StyledComponents.js.map +1 -1
- package/lib/commonjs/components/styled/StyledInput.js +32 -18
- package/lib/commonjs/components/styled/StyledInput.js.map +1 -1
- package/lib/commonjs/components/styled/StyledInputComponents/CustomTypingIndicator.js +13 -8
- package/lib/commonjs/components/styled/StyledInputComponents/CustomTypingIndicator.js.map +1 -1
- package/lib/commonjs/components/styled/StyledInputComponents/MediaComponents.js +20 -9
- package/lib/commonjs/components/styled/StyledInputComponents/MediaComponents.js.map +1 -1
- package/lib/commonjs/components/styled/StyledInputComponents/StyledInputComponents.js +50 -22
- package/lib/commonjs/components/styled/StyledInputComponents/StyledInputComponents.js.map +1 -1
- package/lib/commonjs/components/styled/TreadLabel.js +6 -3
- package/lib/commonjs/components/styled/TreadLabel.js.map +1 -1
- package/lib/commonjs/components/styled/UnsupportedType.js +14 -4
- package/lib/commonjs/components/styled/UnsupportedType.js.map +1 -1
- package/lib/commonjs/components/styled/VideoMessage.js +119 -61
- package/lib/commonjs/components/styled/VideoMessage.js.map +1 -1
- package/lib/commonjs/context/MessageNotificationContext.js +14 -3
- package/lib/commonjs/context/MessageNotificationContext.js.map +1 -1
- package/lib/commonjs/context/xmppProvider.js +184 -59
- package/lib/commonjs/context/xmppProvider.js.map +1 -1
- package/lib/commonjs/helpers/createMessageFromXml.js +19 -1
- 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/getChatBackground.js +26 -0
- package/lib/commonjs/helpers/getChatBackground.js.map +1 -0
- package/lib/commonjs/helpers/getDateLabelColor.js +3 -1
- package/lib/commonjs/helpers/getDateLabelColor.js.map +1 -1
- package/lib/commonjs/helpers/getDisplayFileName.js +79 -0
- package/lib/commonjs/helpers/getDisplayFileName.js.map +1 -0
- package/lib/commonjs/helpers/getIconColor.js +4 -1
- package/lib/commonjs/helpers/getIconColor.js.map +1 -1
- package/lib/commonjs/helpers/getSenderNameColor.js +3 -1
- package/lib/commonjs/helpers/getSenderNameColor.js.map +1 -1
- package/lib/commonjs/helpers/getServerReadTimestamp.js +188 -0
- package/lib/commonjs/helpers/getServerReadTimestamp.js.map +1 -0
- package/lib/commonjs/helpers/historyPreloadScheduler.js +65 -2
- package/lib/commonjs/helpers/historyPreloadScheduler.js.map +1 -1
- package/lib/commonjs/helpers/initXmppRooms.js +14 -8
- package/lib/commonjs/helpers/initXmppRooms.js.map +1 -1
- package/lib/commonjs/helpers/insertMessageWithDelimiter.js +51 -9
- package/lib/commonjs/helpers/insertMessageWithDelimiter.js.map +1 -1
- package/lib/commonjs/helpers/isOwnMessage.js +75 -0
- package/lib/commonjs/helpers/isOwnMessage.js.map +1 -0
- package/lib/commonjs/helpers/keyboardLayout.js +12 -2
- package/lib/commonjs/helpers/keyboardLayout.js.map +1 -1
- package/lib/commonjs/helpers/markdownParser.js +27 -5
- package/lib/commonjs/helpers/markdownParser.js.map +1 -1
- package/lib/commonjs/helpers/mediaLibraryRuntime.js +31 -0
- package/lib/commonjs/helpers/mediaLibraryRuntime.js.map +1 -0
- package/lib/commonjs/helpers/mimeToExtension.js +6 -14
- package/lib/commonjs/helpers/mimeToExtension.js.map +1 -1
- package/lib/commonjs/helpers/msgSortableMs.js +37 -0
- package/lib/commonjs/helpers/msgSortableMs.js.map +1 -0
- package/lib/commonjs/helpers/parseMessageBody.js +82 -24
- package/lib/commonjs/helpers/parseMessageBody.js.map +1 -1
- package/lib/commonjs/helpers/persistCrypto.js +122 -0
- package/lib/commonjs/helpers/persistCrypto.js.map +1 -0
- package/lib/commonjs/helpers/pickImageAsset.js +68 -0
- package/lib/commonjs/helpers/pickImageAsset.js.map +1 -0
- package/lib/commonjs/helpers/pushPayload.js +71 -0
- package/lib/commonjs/helpers/pushPayload.js.map +1 -0
- package/lib/commonjs/helpers/resolveInitBeforeLoadUser.js +130 -17
- package/lib/commonjs/helpers/resolveInitBeforeLoadUser.js.map +1 -1
- package/lib/commonjs/helpers/secureFileUrl.js +101 -0
- package/lib/commonjs/helpers/secureFileUrl.js.map +1 -0
- package/lib/commonjs/helpers/secureKeyValue.js +83 -0
- package/lib/commonjs/helpers/secureKeyValue.js.map +1 -0
- package/lib/commonjs/helpers/secureStoreRuntime.js +59 -0
- package/lib/commonjs/helpers/secureStoreRuntime.js.map +1 -0
- package/lib/commonjs/helpers/secureUserStorage.js +75 -0
- package/lib/commonjs/helpers/secureUserStorage.js.map +1 -0
- package/lib/commonjs/helpers/shallowEqual.js +36 -0
- package/lib/commonjs/helpers/shallowEqual.js.map +1 -0
- package/lib/commonjs/helpers/sheetGestures.js +32 -0
- package/lib/commonjs/helpers/sheetGestures.js.map +1 -0
- package/lib/commonjs/hooks/useChatRoomFocus.js +45 -12
- package/lib/commonjs/hooks/useChatRoomFocus.js.map +1 -1
- package/lib/commonjs/hooks/useChatWrapperInit.js +30 -10
- package/lib/commonjs/hooks/useChatWrapperInit.js.map +1 -1
- package/lib/commonjs/hooks/useComposing.js +27 -0
- package/lib/commonjs/hooks/useComposing.js.map +1 -1
- package/lib/commonjs/hooks/useCustomTypingIndicator.js +7 -3
- package/lib/commonjs/hooks/useCustomTypingIndicator.js.map +1 -1
- package/lib/commonjs/hooks/useFileToken.js +10 -0
- package/lib/commonjs/hooks/useFileToken.js.map +1 -0
- package/lib/commonjs/hooks/useLogout.js +33 -10
- package/lib/commonjs/hooks/useLogout.js.map +1 -1
- package/lib/commonjs/hooks/usePendingNotification.js +8 -11
- package/lib/commonjs/hooks/usePendingNotification.js.map +1 -1
- package/lib/commonjs/hooks/useSendMessage.js +50 -14
- package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
- package/lib/commonjs/hooks/useTheme.js +35 -0
- package/lib/commonjs/hooks/useTheme.js.map +1 -0
- package/lib/commonjs/hooks/useUnreadMessagesCounter.js +6 -1
- package/lib/commonjs/hooks/useUnreadMessagesCounter.js.map +1 -1
- package/lib/commonjs/i18n/strings.js +163 -37
- package/lib/commonjs/i18n/strings.js.map +1 -1
- package/lib/commonjs/main.js +119 -0
- package/lib/commonjs/main.js.map +1 -1
- package/lib/commonjs/networking/api-requests/auth.api.js +134 -60
- package/lib/commonjs/networking/api-requests/auth.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/push.api.js +130 -45
- package/lib/commonjs/networking/api-requests/push.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 +22 -9
- package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/user.api.js +68 -9
- package/lib/commonjs/networking/api-requests/user.api.js.map +1 -1
- package/lib/commonjs/networking/apiClient.js +62 -112
- package/lib/commonjs/networking/apiClient.js.map +1 -1
- package/lib/commonjs/networking/authRefresh.js +332 -0
- package/lib/commonjs/networking/authRefresh.js.map +1 -0
- package/lib/commonjs/networking/stanzaHandlers.js +41 -28
- package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
- package/lib/commonjs/networking/xmpp/flushLastViewedToPrivateStore.js +46 -8
- package/lib/commonjs/networking/xmpp/flushLastViewedToPrivateStore.js.map +1 -1
- package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js +8 -1
- package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/subscribeToRoomMessages.xmpp.js +5 -1
- package/lib/commonjs/networking/xmpp/subscribeToRoomMessages.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmppClient.js +124 -8
- package/lib/commonjs/networking/xmppClient.js.map +1 -1
- package/lib/commonjs/roomStore/chatSettingsSlice.js +26 -7
- package/lib/commonjs/roomStore/chatSettingsSlice.js.map +1 -1
- package/lib/commonjs/roomStore/index.js +35 -2
- package/lib/commonjs/roomStore/index.js.map +1 -1
- package/lib/commonjs/roomStore/persistence.js +226 -23
- package/lib/commonjs/roomStore/persistence.js.map +1 -1
- package/lib/commonjs/roomStore/roomsSlice.js +151 -38
- package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
- package/lib/commonjs/services/pushRegistration.js +250 -0
- package/lib/commonjs/services/pushRegistration.js.map +1 -0
- package/lib/commonjs/services/pushSubscriptionService.js +15 -37
- package/lib/commonjs/services/pushSubscriptionService.js.map +1 -1
- package/lib/commonjs/theme/index.js +38 -0
- package/lib/commonjs/theme/index.js.map +1 -0
- package/lib/commonjs/theme/styled.d.js +4 -0
- package/lib/commonjs/theme/styled.d.js.map +1 -0
- package/lib/commonjs/theme/theme.js +137 -0
- package/lib/commonjs/theme/theme.js.map +1 -0
- package/lib/commonjs/version.js +1 -1
- package/lib/module/assets/EmptyChatIllustration.js +7 -6
- package/lib/module/assets/EmptyChatIllustration.js.map +1 -1
- package/lib/module/assets/icons.js +6 -1
- package/lib/module/assets/icons.js.map +1 -1
- package/lib/module/components/AuthForms/Login.js +27 -12
- package/lib/module/components/AuthForms/Login.js.map +1 -1
- package/lib/module/components/ContextMenu/ContextMenuComponents.js +12 -4
- package/lib/module/components/ContextMenu/ContextMenuComponents.js.map +1 -1
- package/lib/module/components/DropdownMenu/DropdownMenu.js +16 -9
- package/lib/module/components/DropdownMenu/DropdownMenu.js.map +1 -1
- package/lib/module/components/ExampleComponents/CustomMessage.js +25 -7
- package/lib/module/components/ExampleComponents/CustomMessage.js.map +1 -1
- package/lib/module/components/ExampleComponents/CustomTypingIndicatorExamples.js +18 -6
- package/lib/module/components/ExampleComponents/CustomTypingIndicatorExamples.js.map +1 -1
- package/lib/module/components/Header/HeaderRoomList.js +34 -10
- package/lib/module/components/Header/HeaderRoomList.js.map +1 -1
- package/lib/module/components/InputComponents/Search.js +13 -4
- package/lib/module/components/InputComponents/Search.js.map +1 -1
- package/lib/module/components/MainComponents/ChatHeader.js +18 -6
- package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/module/components/MainComponents/ChatRoom.js +156 -17
- package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/module/components/MainComponents/ChatWrapper.js +43 -20
- package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
- package/lib/module/components/MainComponents/LanguageSelectorModal.js +37 -10
- package/lib/module/components/MainComponents/LanguageSelectorModal.js.map +1 -1
- package/lib/module/components/MainComponents/LoginWrapper.js +2 -1
- package/lib/module/components/MainComponents/LoginWrapper.js.map +1 -1
- package/lib/module/components/MainComponents/MediaMessage.js +72 -29
- package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
- package/lib/module/components/MainComponents/MessageContainer.js +5 -1
- package/lib/module/components/MainComponents/MessageContainer.js.map +1 -1
- package/lib/module/components/MainComponents/MessageList.js +22 -8
- package/lib/module/components/MainComponents/MessageList.js.map +1 -1
- package/lib/module/components/MainComponents/ProfileImagePlaceholder.js +14 -13
- package/lib/module/components/MainComponents/ProfileImagePlaceholder.js.map +1 -1
- package/lib/module/components/MainComponents/RNStyled.js +12 -4
- package/lib/module/components/MainComponents/RNStyled.js.map +1 -1
- package/lib/module/components/MainComponents/ReduxWrapper.js +25 -8
- package/lib/module/components/MainComponents/ReduxWrapper.js.map +1 -1
- package/lib/module/components/MainComponents/RoomList.js +213 -38
- package/lib/module/components/MainComponents/RoomList.js.map +1 -1
- package/lib/module/components/MainComponents/Select.js +29 -8
- package/lib/module/components/MainComponents/Select.js.map +1 -1
- package/lib/module/components/Menu/HeaderRoomListMenu.js +331 -102
- package/lib/module/components/Menu/HeaderRoomListMenu.js.map +1 -1
- package/lib/module/components/MessageBubble/BottomReplyContainer.js +24 -8
- package/lib/module/components/MessageBubble/BottomReplyContainer.js.map +1 -1
- package/lib/module/components/MessageBubble/Message.js +47 -25
- package/lib/module/components/MessageBubble/Message.js.map +1 -1
- package/lib/module/components/MessageBubble/MessageInteractions.js +15 -4
- package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
- package/lib/module/components/MessageBubble/MessageReaction.js +10 -5
- package/lib/module/components/MessageBubble/MessageReaction.js.map +1 -1
- package/lib/module/components/Modals/AddMembersModal/AddMembersModal.js +2 -6
- package/lib/module/components/Modals/AddMembersModal/AddMembersModal.js.map +1 -1
- package/lib/module/components/Modals/AttachSheet/AttachSheet.js +336 -121
- package/lib/module/components/Modals/AttachSheet/AttachSheet.js.map +1 -1
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +603 -208
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/module/components/Modals/ChatProfileModal/DeleteChatModal.js +6 -8
- package/lib/module/components/Modals/ChatProfileModal/DeleteChatModal.js.map +1 -1
- package/lib/module/components/Modals/ChatProfileModal/ReportChatModal.js +225 -0
- package/lib/module/components/Modals/ChatProfileModal/ReportChatModal.js.map +1 -0
- package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js +90 -37
- package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
- package/lib/module/components/Modals/FilePreviewModal/PdfView.js +2 -1
- package/lib/module/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
- package/lib/module/components/Modals/Modal/Modal.js +9 -1
- package/lib/module/components/Modals/Modal/Modal.js.map +1 -1
- package/lib/module/components/Modals/ModalHeaderComponent.js +8 -2
- package/lib/module/components/Modals/ModalHeaderComponent.js.map +1 -1
- package/lib/module/components/Modals/ModalWrapper/ModalWrapper.js +10 -10
- package/lib/module/components/Modals/ModalWrapper/ModalWrapper.js.map +1 -1
- package/lib/module/components/Modals/NewChatModal/ModalContent.js +4 -7
- package/lib/module/components/Modals/NewChatModal/ModalContent.js.map +1 -1
- package/lib/module/components/Modals/NewChatModal/NewChatModal.js +208 -108
- package/lib/module/components/Modals/NewChatModal/NewChatModal.js.map +1 -1
- package/lib/module/components/Modals/NewChatModal/UpdNewChatModal.js +8 -0
- package/lib/module/components/Modals/NewChatModal/UpdNewChatModal.js.map +1 -1
- package/lib/module/components/Modals/ProfileHeader/ProfileHeader.js +555 -0
- package/lib/module/components/Modals/ProfileHeader/ProfileHeader.js.map +1 -0
- package/lib/module/components/Modals/ProfileHeader/ProfileMenu.js +210 -0
- package/lib/module/components/Modals/ProfileHeader/ProfileMenu.js.map +1 -0
- package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js +8 -10
- package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js +8 -6
- package/lib/module/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/Referrals/Referrals.js +7 -2
- package/lib/module/components/Modals/SettingsModals/Referrals/Referrals.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/SharedStyledComponents.js +7 -3
- package/lib/module/components/Modals/SettingsModals/SharedStyledComponents.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/Visibility/RadioInput.js +10 -6
- package/lib/module/components/Modals/SettingsModals/Visibility/RadioInput.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/Visibility/VisibilityModal.js +7 -6
- package/lib/module/components/Modals/SettingsModals/Visibility/VisibilityModal.js.map +1 -1
- package/lib/module/components/Modals/UserProfileModal/EditUserModal.js +11 -24
- package/lib/module/components/Modals/UserProfileModal/EditUserModal.js.map +1 -1
- package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js +512 -248
- package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
- package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js +79 -48
- package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
- package/lib/module/components/Modals/styledModalComponents.js +67 -16
- package/lib/module/components/Modals/styledModalComponents.js.map +1 -1
- package/lib/module/components/RoomComponents/ChatRoomItem.js +30 -10
- package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastAudioMessage.js +6 -2
- package/lib/module/components/RoomComponents/styled/LastAudioMessage.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastMessageFile.js +22 -3
- package/lib/module/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js +17 -3
- package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastMessageVideo.js +17 -3
- package/lib/module/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/StyledRoomComponents.js +6 -0
- package/lib/module/components/RoomComponents/styled/StyledRoomComponents.js.map +1 -1
- package/lib/module/components/Thread/ThreadWrapper.js +9 -2
- package/lib/module/components/Thread/ThreadWrapper.js.map +1 -1
- package/lib/module/components/Toast/Toast.js +3 -1
- package/lib/module/components/Toast/Toast.js.map +1 -1
- package/lib/module/components/VideoCalls/VideoCallSession.js +6 -3
- package/lib/module/components/VideoCalls/VideoCallSession.js.map +1 -1
- package/lib/module/components/styled/AudioMessage.js +18 -12
- package/lib/module/components/styled/AudioMessage.js.map +1 -1
- package/lib/module/components/styled/Button.js +17 -9
- package/lib/module/components/styled/Button.js.map +1 -1
- package/lib/module/components/styled/DateLabel.js +8 -5
- package/lib/module/components/styled/DateLabel.js.map +1 -1
- package/lib/module/components/styled/MediaModal.js +29 -23
- package/lib/module/components/styled/MediaModal.js.map +1 -1
- package/lib/module/components/styled/MessageImage.js +37 -9
- package/lib/module/components/styled/MessageImage.js.map +1 -1
- package/lib/module/components/styled/RoomListComponents/index.js +62 -39
- package/lib/module/components/styled/RoomListComponents/index.js.map +1 -1
- package/lib/module/components/styled/SendInput.js +94 -20
- package/lib/module/components/styled/SendInput.js.map +1 -1
- package/lib/module/components/styled/StyledComponents.js +75 -25
- package/lib/module/components/styled/StyledComponents.js.map +1 -1
- package/lib/module/components/styled/StyledInput.js +32 -18
- package/lib/module/components/styled/StyledInput.js.map +1 -1
- package/lib/module/components/styled/StyledInputComponents/CustomTypingIndicator.js +13 -8
- package/lib/module/components/styled/StyledInputComponents/CustomTypingIndicator.js.map +1 -1
- package/lib/module/components/styled/StyledInputComponents/MediaComponents.js +20 -9
- package/lib/module/components/styled/StyledInputComponents/MediaComponents.js.map +1 -1
- package/lib/module/components/styled/StyledInputComponents/StyledInputComponents.js +50 -22
- package/lib/module/components/styled/StyledInputComponents/StyledInputComponents.js.map +1 -1
- package/lib/module/components/styled/TreadLabel.js +6 -3
- package/lib/module/components/styled/TreadLabel.js.map +1 -1
- package/lib/module/components/styled/UnsupportedType.js +14 -4
- package/lib/module/components/styled/UnsupportedType.js.map +1 -1
- package/lib/module/components/styled/VideoMessage.js +120 -62
- package/lib/module/components/styled/VideoMessage.js.map +1 -1
- package/lib/module/context/MessageNotificationContext.js +14 -3
- package/lib/module/context/MessageNotificationContext.js.map +1 -1
- package/lib/module/context/xmppProvider.js +184 -60
- package/lib/module/context/xmppProvider.js.map +1 -1
- package/lib/module/helpers/createMessageFromXml.js +19 -1
- 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/getChatBackground.js +22 -0
- package/lib/module/helpers/getChatBackground.js.map +1 -0
- package/lib/module/helpers/getDateLabelColor.js +4 -1
- package/lib/module/helpers/getDateLabelColor.js.map +1 -1
- package/lib/module/helpers/getDisplayFileName.js +73 -0
- package/lib/module/helpers/getDisplayFileName.js.map +1 -0
- package/lib/module/helpers/getIconColor.js +5 -1
- package/lib/module/helpers/getIconColor.js.map +1 -1
- package/lib/module/helpers/getSenderNameColor.js +4 -1
- package/lib/module/helpers/getSenderNameColor.js.map +1 -1
- package/lib/module/helpers/getServerReadTimestamp.js +181 -0
- package/lib/module/helpers/getServerReadTimestamp.js.map +1 -0
- package/lib/module/helpers/historyPreloadScheduler.js +66 -3
- package/lib/module/helpers/historyPreloadScheduler.js.map +1 -1
- package/lib/module/helpers/initXmppRooms.js +14 -8
- package/lib/module/helpers/initXmppRooms.js.map +1 -1
- package/lib/module/helpers/insertMessageWithDelimiter.js +52 -9
- package/lib/module/helpers/insertMessageWithDelimiter.js.map +1 -1
- package/lib/module/helpers/isOwnMessage.js +70 -0
- package/lib/module/helpers/isOwnMessage.js.map +1 -0
- package/lib/module/helpers/keyboardLayout.js +12 -2
- package/lib/module/helpers/keyboardLayout.js.map +1 -1
- package/lib/module/helpers/markdownParser.js +27 -5
- package/lib/module/helpers/markdownParser.js.map +1 -1
- package/lib/module/helpers/mediaLibraryRuntime.js +25 -0
- package/lib/module/helpers/mediaLibraryRuntime.js.map +1 -0
- package/lib/module/helpers/mimeToExtension.js +6 -13
- package/lib/module/helpers/mimeToExtension.js.map +1 -1
- package/lib/module/helpers/msgSortableMs.js +32 -0
- package/lib/module/helpers/msgSortableMs.js.map +1 -0
- package/lib/module/helpers/parseMessageBody.js +82 -24
- package/lib/module/helpers/parseMessageBody.js.map +1 -1
- package/lib/module/helpers/persistCrypto.js +115 -0
- package/lib/module/helpers/persistCrypto.js.map +1 -0
- package/lib/module/helpers/pickImageAsset.js +63 -0
- package/lib/module/helpers/pickImageAsset.js.map +1 -0
- package/lib/module/helpers/pushPayload.js +63 -0
- package/lib/module/helpers/pushPayload.js.map +1 -0
- package/lib/module/helpers/resolveInitBeforeLoadUser.js +130 -16
- package/lib/module/helpers/resolveInitBeforeLoadUser.js.map +1 -1
- package/lib/module/helpers/secureFileUrl.js +91 -0
- package/lib/module/helpers/secureFileUrl.js.map +1 -0
- package/lib/module/helpers/secureKeyValue.js +75 -0
- package/lib/module/helpers/secureKeyValue.js.map +1 -0
- package/lib/module/helpers/secureStoreRuntime.js +52 -0
- package/lib/module/helpers/secureStoreRuntime.js.map +1 -0
- package/lib/module/helpers/secureUserStorage.js +72 -0
- package/lib/module/helpers/secureUserStorage.js.map +1 -0
- package/lib/module/helpers/shallowEqual.js +31 -0
- package/lib/module/helpers/shallowEqual.js.map +1 -0
- package/lib/module/helpers/sheetGestures.js +26 -0
- package/lib/module/helpers/sheetGestures.js.map +1 -0
- package/lib/module/hooks/useChatRoomFocus.js +46 -13
- package/lib/module/hooks/useChatRoomFocus.js.map +1 -1
- package/lib/module/hooks/useChatWrapperInit.js +30 -10
- package/lib/module/hooks/useChatWrapperInit.js.map +1 -1
- package/lib/module/hooks/useComposing.js +28 -1
- package/lib/module/hooks/useComposing.js.map +1 -1
- package/lib/module/hooks/useCustomTypingIndicator.js +8 -3
- package/lib/module/hooks/useCustomTypingIndicator.js.map +1 -1
- package/lib/module/hooks/useFileToken.js +5 -0
- package/lib/module/hooks/useFileToken.js.map +1 -0
- package/lib/module/hooks/useLogout.js +33 -10
- package/lib/module/hooks/useLogout.js.map +1 -1
- package/lib/module/hooks/usePendingNotification.js +8 -11
- package/lib/module/hooks/usePendingNotification.js.map +1 -1
- package/lib/module/hooks/useSendMessage.js +52 -16
- package/lib/module/hooks/useSendMessage.js.map +1 -1
- package/lib/module/hooks/useTheme.js +30 -0
- package/lib/module/hooks/useTheme.js.map +1 -0
- package/lib/module/hooks/useUnreadMessagesCounter.js +6 -1
- package/lib/module/hooks/useUnreadMessagesCounter.js.map +1 -1
- package/lib/module/i18n/strings.js +163 -37
- package/lib/module/i18n/strings.js.map +1 -1
- package/lib/module/main.js +17 -2
- package/lib/module/main.js.map +1 -1
- package/lib/module/networking/api-requests/auth.api.js +131 -59
- package/lib/module/networking/api-requests/auth.api.js.map +1 -1
- package/lib/module/networking/api-requests/push.api.js +119 -45
- package/lib/module/networking/api-requests/push.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 +21 -9
- package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
- package/lib/module/networking/api-requests/user.api.js +64 -7
- package/lib/module/networking/api-requests/user.api.js.map +1 -1
- package/lib/module/networking/apiClient.js +61 -113
- package/lib/module/networking/apiClient.js.map +1 -1
- package/lib/module/networking/authRefresh.js +321 -0
- package/lib/module/networking/authRefresh.js.map +1 -0
- package/lib/module/networking/stanzaHandlers.js +41 -28
- package/lib/module/networking/stanzaHandlers.js.map +1 -1
- package/lib/module/networking/xmpp/flushLastViewedToPrivateStore.js +46 -8
- package/lib/module/networking/xmpp/flushLastViewedToPrivateStore.js.map +1 -1
- package/lib/module/networking/xmpp/presenceInRoom.xmpp.js +8 -1
- package/lib/module/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/subscribeToRoomMessages.xmpp.js +5 -1
- package/lib/module/networking/xmpp/subscribeToRoomMessages.xmpp.js.map +1 -1
- package/lib/module/networking/xmppClient.js +124 -8
- package/lib/module/networking/xmppClient.js.map +1 -1
- package/lib/module/roomStore/chatSettingsSlice.js +26 -7
- package/lib/module/roomStore/chatSettingsSlice.js.map +1 -1
- package/lib/module/roomStore/index.js +37 -4
- package/lib/module/roomStore/index.js.map +1 -1
- package/lib/module/roomStore/persistence.js +223 -22
- package/lib/module/roomStore/persistence.js.map +1 -1
- package/lib/module/roomStore/roomsSlice.js +139 -34
- package/lib/module/roomStore/roomsSlice.js.map +1 -1
- package/lib/module/services/pushRegistration.js +239 -0
- package/lib/module/services/pushRegistration.js.map +1 -0
- package/lib/module/services/pushSubscriptionService.js +15 -37
- package/lib/module/services/pushSubscriptionService.js.map +1 -1
- package/lib/module/theme/index.js +7 -0
- package/lib/module/theme/index.js.map +1 -0
- package/lib/module/theme/styled.d.js +6 -0
- package/lib/module/theme/styled.d.js.map +1 -0
- package/lib/module/theme/theme.js +131 -0
- package/lib/module/theme/theme.js.map +1 -0
- package/lib/module/version.js +1 -1
- package/lib/typescript/assets/EmptyChatIllustration.d.ts +1 -0
- package/lib/typescript/assets/EmptyChatIllustration.d.ts.map +1 -1
- package/lib/typescript/assets/icons.d.ts +24 -0
- 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/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/lib/typescript/components/ExampleComponents/CustomMessage.d.ts.map +1 -1
- package/lib/typescript/components/Header/HeaderRoomList.d.ts.map +1 -1
- package/lib/typescript/components/InputComponents/Search.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/LanguageSelectorModal.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 +10 -1
- 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 +7 -0
- package/lib/typescript/components/MainComponents/RoomList.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/Select.d.ts.map +1 -1
- package/lib/typescript/components/Menu/HeaderRoomListMenu.d.ts +3 -0
- package/lib/typescript/components/Menu/HeaderRoomListMenu.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/BottomReplyContainer.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/MessageReaction.d.ts.map +1 -1
- package/lib/typescript/components/Modals/AttachSheet/AttachSheet.d.ts +9 -0
- package/lib/typescript/components/Modals/AttachSheet/AttachSheet.d.ts.map +1 -1
- package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts +10 -0
- 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/ChatProfileModal/ReportChatModal.d.ts +9 -0
- package/lib/typescript/components/Modals/ChatProfileModal/ReportChatModal.d.ts.map +1 -0
- 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/ModalHeaderComponent.d.ts.map +1 -1
- package/lib/typescript/components/Modals/ModalWrapper/ModalWrapper.d.ts.map +1 -1
- package/lib/typescript/components/Modals/NewChatModal/ModalContent.d.ts +4 -2
- 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/ProfileHeader/ProfileHeader.d.ts +75 -0
- package/lib/typescript/components/Modals/ProfileHeader/ProfileHeader.d.ts.map +1 -0
- package/lib/typescript/components/Modals/ProfileHeader/ProfileMenu.d.ts +25 -0
- package/lib/typescript/components/Modals/ProfileHeader/ProfileMenu.d.ts.map +1 -0
- package/lib/typescript/components/Modals/SelectUsersModal/SelectUsersModal.d.ts +6 -1
- package/lib/typescript/components/Modals/SelectUsersModal/SelectUsersModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/Referrals/Referrals.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/SharedStyledComponents.d.ts +2 -2
- package/lib/typescript/components/Modals/SettingsModals/SharedStyledComponents.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/Visibility/RadioInput.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/Visibility/VisibilityModal.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 +16 -0
- package/lib/typescript/components/Modals/UserProfileModal/UserProfileModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/UserSettingsModal/UserSettingsModal.d.ts +1 -0
- package/lib/typescript/components/Modals/UserSettingsModal/UserSettingsModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/styledModalComponents.d.ts +2 -0
- 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/LastAudioMessage.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/RoomComponents/styled/StyledRoomComponents.d.ts.map +1 -1
- package/lib/typescript/components/Thread/ThreadWrapper.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/Button.d.ts.map +1 -1
- package/lib/typescript/components/styled/DateLabel.d.ts.map +1 -1
- package/lib/typescript/components/styled/MediaModal.d.ts +2 -2
- package/lib/typescript/components/styled/MediaModal.d.ts.map +1 -1
- package/lib/typescript/components/styled/MessageImage.d.ts +14 -0
- package/lib/typescript/components/styled/MessageImage.d.ts.map +1 -1
- package/lib/typescript/components/styled/RoomListComponents/index.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/StyledInput.d.ts.map +1 -1
- package/lib/typescript/components/styled/StyledInputComponents/MediaComponents.d.ts.map +1 -1
- package/lib/typescript/components/styled/StyledInputComponents/StyledInputComponents.d.ts.map +1 -1
- package/lib/typescript/components/styled/TreadLabel.d.ts.map +1 -1
- package/lib/typescript/components/styled/UnsupportedType.d.ts.map +1 -1
- package/lib/typescript/components/styled/VideoMessage.d.ts +8 -0
- package/lib/typescript/components/styled/VideoMessage.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/helpers/createMessageFromXml.d.ts.map +1 -1
- package/lib/typescript/helpers/getAvatarColor.d.ts +1 -1
- package/lib/typescript/helpers/getChatBackground.d.ts +15 -0
- package/lib/typescript/helpers/getChatBackground.d.ts.map +1 -0
- package/lib/typescript/helpers/getDateLabelColor.d.ts +3 -7
- package/lib/typescript/helpers/getDateLabelColor.d.ts.map +1 -1
- package/lib/typescript/helpers/getDisplayFileName.d.ts +49 -0
- package/lib/typescript/helpers/getDisplayFileName.d.ts.map +1 -0
- package/lib/typescript/helpers/getIconColor.d.ts +4 -7
- package/lib/typescript/helpers/getIconColor.d.ts.map +1 -1
- package/lib/typescript/helpers/getSenderNameColor.d.ts +3 -7
- package/lib/typescript/helpers/getSenderNameColor.d.ts.map +1 -1
- package/lib/typescript/helpers/getServerReadTimestamp.d.ts +108 -0
- package/lib/typescript/helpers/getServerReadTimestamp.d.ts.map +1 -0
- 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 +1 -1
- package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts.map +1 -1
- package/lib/typescript/helpers/isOwnMessage.d.ts +36 -0
- package/lib/typescript/helpers/isOwnMessage.d.ts.map +1 -0
- package/lib/typescript/helpers/keyboardLayout.d.ts +5 -1
- package/lib/typescript/helpers/keyboardLayout.d.ts.map +1 -1
- package/lib/typescript/helpers/markdownParser.d.ts +8 -1
- package/lib/typescript/helpers/markdownParser.d.ts.map +1 -1
- package/lib/typescript/helpers/mediaLibraryRuntime.d.ts +3 -0
- package/lib/typescript/helpers/mediaLibraryRuntime.d.ts.map +1 -0
- package/lib/typescript/helpers/mimeToExtension.d.ts +0 -15
- package/lib/typescript/helpers/mimeToExtension.d.ts.map +1 -1
- package/lib/typescript/helpers/msgSortableMs.d.ts +2 -0
- package/lib/typescript/helpers/msgSortableMs.d.ts.map +1 -0
- package/lib/typescript/helpers/parseMessageBody.d.ts +8 -1
- package/lib/typescript/helpers/parseMessageBody.d.ts.map +1 -1
- package/lib/typescript/helpers/persistCrypto.d.ts +13 -0
- package/lib/typescript/helpers/persistCrypto.d.ts.map +1 -0
- package/lib/typescript/helpers/pickImageAsset.d.ts +27 -0
- package/lib/typescript/helpers/pickImageAsset.d.ts.map +1 -0
- package/lib/typescript/helpers/pushPayload.d.ts +7 -0
- package/lib/typescript/helpers/pushPayload.d.ts.map +1 -0
- package/lib/typescript/helpers/resolveInitBeforeLoadUser.d.ts.map +1 -1
- package/lib/typescript/helpers/secureFileUrl.d.ts +7 -0
- package/lib/typescript/helpers/secureFileUrl.d.ts.map +1 -0
- package/lib/typescript/helpers/secureKeyValue.d.ts +13 -0
- package/lib/typescript/helpers/secureKeyValue.d.ts.map +1 -0
- package/lib/typescript/helpers/secureStoreRuntime.d.ts +29 -0
- package/lib/typescript/helpers/secureStoreRuntime.d.ts.map +1 -0
- package/lib/typescript/helpers/secureUserStorage.d.ts +23 -0
- package/lib/typescript/helpers/secureUserStorage.d.ts.map +1 -0
- package/lib/typescript/helpers/shallowEqual.d.ts +11 -0
- package/lib/typescript/helpers/shallowEqual.d.ts.map +1 -0
- package/lib/typescript/helpers/sheetGestures.d.ts +20 -0
- package/lib/typescript/helpers/sheetGestures.d.ts.map +1 -0
- package/lib/typescript/hooks/useChatRoomFocus.d.ts +4 -1
- 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/useCustomTypingIndicator.d.ts +2 -0
- package/lib/typescript/hooks/useCustomTypingIndicator.d.ts.map +1 -1
- package/lib/typescript/hooks/useFileToken.d.ts +2 -0
- package/lib/typescript/hooks/useFileToken.d.ts.map +1 -0
- 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/useTheme.d.ts +16 -0
- package/lib/typescript/hooks/useTheme.d.ts.map +1 -0
- package/lib/typescript/hooks/useUnreadMessagesCounter.d.ts +1 -0
- package/lib/typescript/hooks/useUnreadMessagesCounter.d.ts.map +1 -1
- package/lib/typescript/i18n/strings.d.ts.map +1 -1
- package/lib/typescript/main.d.ts +16 -2
- package/lib/typescript/main.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/auth.api.d.ts +3 -1
- package/lib/typescript/networking/api-requests/auth.api.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/push.api.d.ts +46 -3
- package/lib/typescript/networking/api-requests/push.api.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/rooms.api.d.ts +1 -0
- package/lib/typescript/networking/api-requests/rooms.api.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/user.api.d.ts +27 -0
- package/lib/typescript/networking/api-requests/user.api.d.ts.map +1 -1
- package/lib/typescript/networking/apiClient.d.ts +12 -6
- package/lib/typescript/networking/apiClient.d.ts.map +1 -1
- package/lib/typescript/networking/authRefresh.d.ts +95 -0
- package/lib/typescript/networking/authRefresh.d.ts.map +1 -0
- package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/flushLastViewedToPrivateStore.d.ts +10 -2
- 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 +14 -0
- package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
- package/lib/typescript/roomStore/chatSettingsSlice.d.ts +16 -0
- 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 +18 -1
- package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
- package/lib/typescript/roomStore/roomsSlice.d.ts +43 -3
- package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
- package/lib/typescript/services/pushRegistration.d.ts +21 -0
- package/lib/typescript/services/pushRegistration.d.ts.map +1 -0
- package/lib/typescript/services/pushSubscriptionService.d.ts +1 -5
- package/lib/typescript/services/pushSubscriptionService.d.ts.map +1 -1
- package/lib/typescript/theme/index.d.ts +5 -0
- package/lib/typescript/theme/index.d.ts.map +1 -0
- package/lib/typescript/theme/theme.d.ts +113 -0
- package/lib/typescript/theme/theme.d.ts.map +1 -0
- package/lib/typescript/types/models/room.model.d.ts +1 -0
- package/lib/typescript/types/models/room.model.d.ts.map +1 -1
- package/lib/typescript/types/types.d.ts +70 -5
- package/lib/typescript/types/types.d.ts.map +1 -1
- package/lib/typescript/version.d.ts +1 -1
- package/package.json +41 -28
- package/src/assets/EmptyChatIllustration.tsx +7 -5
- package/src/assets/icons.tsx +72 -9
- package/src/components/AuthForms/Login.tsx +14 -12
- package/src/components/ContextMenu/ContextMenuComponents.tsx +4 -4
- package/src/components/DropdownMenu/DropdownMenu.tsx +14 -6
- package/src/components/ExampleComponents/CustomMessage.tsx +9 -8
- package/src/components/ExampleComponents/CustomTypingIndicatorExamples.tsx +6 -6
- package/src/components/Header/HeaderRoomList.tsx +35 -8
- package/src/components/InputComponents/Search.tsx +7 -4
- package/src/components/MainComponents/ChatHeader.tsx +18 -6
- package/src/components/MainComponents/ChatRoom.tsx +164 -15
- package/src/components/MainComponents/ChatWrapper.tsx +44 -26
- package/src/components/MainComponents/LanguageSelectorModal.tsx +33 -7
- package/src/components/MainComponents/LoginWrapper.tsx +1 -0
- package/src/components/MainComponents/MediaMessage.tsx +63 -26
- package/src/components/MainComponents/MessageContainer.tsx +5 -1
- package/src/components/MainComponents/MessageList.tsx +36 -7
- package/src/components/MainComponents/ProfileImagePlaceholder.tsx +21 -14
- package/src/components/MainComponents/RNStyled.tsx +4 -4
- package/src/components/MainComponents/ReduxWrapper.tsx +23 -7
- package/src/components/MainComponents/RoomList.tsx +243 -40
- package/src/components/MainComponents/Select.tsx +13 -8
- package/src/components/Menu/HeaderRoomListMenu.tsx +347 -77
- package/src/components/MessageBubble/BottomReplyContainer.tsx +16 -11
- package/src/components/MessageBubble/Message.tsx +48 -25
- package/src/components/MessageBubble/MessageInteractions.tsx +17 -4
- package/src/components/MessageBubble/MessageReaction.tsx +9 -4
- package/src/components/Modals/AddMembersModal/AddMembersModal.tsx +2 -2
- package/src/components/Modals/AttachSheet/AttachSheet.tsx +376 -106
- package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +639 -283
- package/src/components/Modals/ChatProfileModal/DeleteChatModal.tsx +6 -4
- package/src/components/Modals/ChatProfileModal/ReportChatModal.tsx +248 -0
- package/src/components/Modals/FilePreviewModal/FilePreviewModal.tsx +93 -47
- package/src/components/Modals/FilePreviewModal/PdfView.tsx +2 -1
- package/src/components/Modals/Modal/Modal.tsx +7 -0
- package/src/components/Modals/ModalHeaderComponent.tsx +9 -2
- package/src/components/Modals/ModalWrapper/ModalWrapper.tsx +14 -6
- package/src/components/Modals/NewChatModal/ModalContent.tsx +8 -5
- package/src/components/Modals/NewChatModal/NewChatModal.tsx +223 -119
- package/src/components/Modals/NewChatModal/UpdNewChatModal.tsx +12 -1
- package/src/components/Modals/ProfileHeader/ProfileHeader.tsx +624 -0
- package/src/components/Modals/ProfileHeader/ProfileMenu.tsx +224 -0
- package/src/components/Modals/SelectUsersModal/SelectUsersModal.tsx +16 -7
- package/src/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.tsx +8 -6
- package/src/components/Modals/SettingsModals/Referrals/Referrals.tsx +5 -3
- package/src/components/Modals/SettingsModals/SharedStyledComponents.ts +4 -4
- package/src/components/Modals/SettingsModals/Visibility/RadioInput.tsx +9 -5
- package/src/components/Modals/SettingsModals/Visibility/VisibilityModal.tsx +7 -7
- package/src/components/Modals/UserProfileModal/EditUserModal.tsx +12 -26
- package/src/components/Modals/UserProfileModal/UserProfileModal.tsx +621 -307
- package/src/components/Modals/UserSettingsModal/UserSettingsModal.tsx +84 -58
- package/src/components/Modals/styledModalComponents.tsx +31 -16
- package/src/components/RoomComponents/ChatRoomItem.tsx +30 -6
- package/src/components/RoomComponents/styled/LastAudioMessage.tsx +4 -2
- package/src/components/RoomComponents/styled/LastMessageFile.tsx +28 -4
- package/src/components/RoomComponents/styled/LastMessagePhoto.tsx +18 -3
- package/src/components/RoomComponents/styled/LastMessageVideo.tsx +18 -3
- package/src/components/RoomComponents/styled/StyledRoomComponents.ts +2 -0
- package/src/components/Thread/ThreadWrapper.tsx +6 -5
- package/src/components/Toast/Toast.tsx +1 -1
- package/src/components/VideoCalls/VideoCallSession.tsx +8 -3
- package/src/components/styled/AudioMessage.tsx +14 -10
- package/src/components/styled/Button.tsx +15 -8
- package/src/components/styled/DateLabel.tsx +7 -3
- package/src/components/styled/MediaModal.tsx +30 -25
- package/src/components/styled/MessageImage.tsx +53 -7
- package/src/components/styled/RoomListComponents/index.tsx +60 -35
- package/src/components/styled/SendInput.tsx +106 -20
- package/src/components/styled/StyledComponents.ts +38 -25
- package/src/components/styled/StyledInput.tsx +35 -21
- package/src/components/styled/StyledInputComponents/CustomTypingIndicator.tsx +8 -8
- package/src/components/styled/StyledInputComponents/MediaComponents.tsx +20 -7
- package/src/components/styled/StyledInputComponents/StyledInputComponents.tsx +26 -23
- package/src/components/styled/TreadLabel.tsx +9 -3
- package/src/components/styled/UnsupportedType.tsx +14 -4
- package/src/components/styled/VideoMessage.tsx +131 -54
- package/src/context/MessageNotificationContext.tsx +18 -4
- package/src/context/xmppProvider.tsx +216 -57
- package/src/helpers/createMessageFromXml.ts +20 -1
- package/src/helpers/ensureScopedChatCache.ts +2 -2
- package/src/helpers/getChatBackground.ts +20 -0
- package/src/helpers/getDateLabelColor.ts +5 -3
- package/src/helpers/getDisplayFileName.ts +87 -0
- package/src/helpers/getIconColor.ts +6 -3
- package/src/helpers/getSenderNameColor.ts +5 -3
- package/src/helpers/getServerReadTimestamp.ts +197 -0
- package/src/helpers/historyPreloadScheduler.ts +80 -3
- package/src/helpers/initXmppRooms.tsx +14 -10
- package/src/helpers/insertMessageWithDelimiter.ts +55 -19
- package/src/helpers/isOwnMessage.ts +90 -0
- package/src/helpers/keyboardLayout.ts +23 -2
- package/src/helpers/markdownParser.tsx +29 -5
- package/src/helpers/mediaLibraryRuntime.ts +25 -0
- package/src/helpers/mimeToExtension.ts +6 -22
- package/src/helpers/msgSortableMs.ts +25 -0
- package/src/helpers/parseMessageBody.tsx +79 -26
- package/src/helpers/persistCrypto.ts +127 -0
- package/src/helpers/pickImageAsset.ts +68 -0
- package/src/helpers/pushPayload.ts +62 -0
- package/src/helpers/resolveInitBeforeLoadUser.ts +125 -18
- package/src/helpers/secureFileUrl.ts +103 -0
- package/src/helpers/secureKeyValue.ts +80 -0
- package/src/helpers/secureStoreRuntime.ts +62 -0
- package/src/helpers/secureUserStorage.ts +80 -0
- package/src/helpers/shallowEqual.ts +33 -0
- package/src/helpers/sheetGestures.ts +25 -0
- package/src/hooks/useChatRoomFocus.ts +49 -9
- package/src/hooks/useChatWrapperInit.ts +30 -10
- package/src/hooks/useComposing.tsx +37 -1
- package/src/hooks/useCustomTypingIndicator.tsx +7 -3
- package/src/hooks/useFileToken.ts +7 -0
- package/src/hooks/useLogout.tsx +39 -12
- package/src/hooks/usePendingNotification.ts +5 -11
- package/src/hooks/useSendMessage.tsx +60 -15
- package/src/hooks/useTheme.ts +41 -0
- package/src/hooks/useUnreadMessagesCounter.ts +11 -0
- package/src/i18n/strings.ts +163 -37
- package/src/main.ts +57 -2
- package/src/networking/api-requests/auth.api.ts +156 -48
- package/src/networking/api-requests/push.api.ts +185 -62
- package/src/networking/api-requests/roomMembers.api.ts +1 -1
- package/src/networking/api-requests/rooms.api.ts +18 -9
- package/src/networking/api-requests/user.api.ts +79 -7
- package/src/networking/apiClient.ts +68 -123
- package/src/networking/authRefresh.ts +451 -0
- package/src/networking/stanzaHandlers.ts +44 -28
- package/src/networking/xmpp/flushLastViewedToPrivateStore.ts +71 -10
- package/src/networking/xmpp/presenceInRoom.xmpp.ts +6 -1
- package/src/networking/xmpp/subscribeToRoomMessages.xmpp.ts +12 -1
- package/src/networking/xmppClient.ts +141 -9
- package/src/roomStore/chatSettingsSlice.ts +34 -10
- package/src/roomStore/index.ts +40 -4
- package/src/roomStore/persistence.ts +234 -24
- package/src/roomStore/roomsSlice.ts +161 -29
- package/src/services/pushRegistration.ts +356 -0
- package/src/services/pushSubscriptionService.ts +18 -47
- package/src/theme/index.ts +10 -0
- package/src/theme/styled.d.ts +9 -0
- package/src/theme/theme.ts +243 -0
- package/src/types/models/room.model.ts +1 -0
- package/src/types/types.ts +96 -5
- package/src/version.ts +1 -1
- package/lib/commonjs/context/PushNotificationProvider.js +0 -79
- package/lib/commonjs/context/PushNotificationProvider.js.map +0 -1
- package/lib/commonjs/hooks/usePushNotifications.js +0 -110
- package/lib/commonjs/hooks/usePushNotifications.js.map +0 -1
- package/lib/commonjs/services/pushNotifications.js +0 -143
- package/lib/commonjs/services/pushNotifications.js.map +0 -1
- package/lib/module/context/PushNotificationProvider.js +0 -79
- package/lib/module/context/PushNotificationProvider.js.map +0 -1
- package/lib/module/hooks/usePushNotifications.js +0 -106
- package/lib/module/hooks/usePushNotifications.js.map +0 -1
- package/lib/module/services/pushNotifications.js +0 -130
- package/lib/module/services/pushNotifications.js.map +0 -1
- package/lib/typescript/context/PushNotificationProvider.d.ts +0 -2
- package/lib/typescript/context/PushNotificationProvider.d.ts.map +0 -1
- package/lib/typescript/hooks/usePushNotifications.d.ts +0 -5
- package/lib/typescript/hooks/usePushNotifications.d.ts.map +0 -1
- package/lib/typescript/services/pushNotifications.d.ts +0 -10
- package/lib/typescript/services/pushNotifications.d.ts.map +0 -1
- package/src/context/PushNotificationProvider.tsx +0 -78
- package/src/hooks/usePushNotifications.ts +0 -131
- package/src/services/pushNotifications.ts +0 -170
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
2
2
|
import { Middleware } from '@reduxjs/toolkit';
|
|
3
3
|
import { IMessage, IRoom, User } from '../types/types';
|
|
4
|
+
import { encryptForPersist, decryptFromPersist } from '../helpers/persistCrypto';
|
|
5
|
+
import type { FailedMessagePayload } from './roomHeapSlice';
|
|
4
6
|
|
|
5
7
|
// -------------------------------------------------------------------
|
|
6
8
|
// Lightweight RN persistence layer. Mirrors what redux-persist gives
|
|
@@ -11,17 +13,33 @@ import { IMessage, IRoom, User } from '../types/types';
|
|
|
11
13
|
// - cap each room's messages to the most recent MESSAGE_LIMIT (100)
|
|
12
14
|
// - debounced writes (200ms) on relevant action types
|
|
13
15
|
//
|
|
14
|
-
//
|
|
16
|
+
// AES-256-CBC at rest (see `helpers/persistCrypto.ts`): the JSON blob
|
|
17
|
+
// under each key below is encrypted before it reaches AsyncStorage, with
|
|
18
|
+
// the symmetric key held in the platform Keychain/Keystore. `user` here
|
|
19
|
+
// is already secret-free (see `sanitizeUser`) — the encryption is for
|
|
20
|
+
// the message bodies in `rooms`, which aren't.
|
|
15
21
|
// -------------------------------------------------------------------
|
|
16
22
|
|
|
17
23
|
const KEY_CHAT = '@ethora/persist:chatSettingStore';
|
|
18
24
|
const KEY_ROOMS = '@ethora/persist:rooms';
|
|
25
|
+
// bug #39: a failed send needs to survive a relaunch as "failed / tap
|
|
26
|
+
// to retry", not silently render as delivered. `roomHeapStore.failedMessages`
|
|
27
|
+
// is the map the bubble reads (`isFailed = failedMessages[id]`, see
|
|
28
|
+
// Message.tsx / useMessageHeapState): it lives in a separate, previously
|
|
29
|
+
// non-persisted slice from `rooms`, so it gets its own key here.
|
|
30
|
+
const KEY_HEAP = '@ethora/persist:roomHeap';
|
|
19
31
|
|
|
20
32
|
// Per-room message cap on disk. Mirror this value in `roomsSlice`'s
|
|
21
33
|
// in-memory cap (see `enforceMessageCap`) so the runtime and persisted
|
|
22
34
|
// shapes stay aligned.
|
|
23
35
|
export const MESSAGE_LIMIT = 100;
|
|
24
36
|
|
|
37
|
+
// Defensive cap on the number of failed-message payloads written to
|
|
38
|
+
// disk. In practice this map only grows while the user is actively
|
|
39
|
+
// sending offline, but a runaway sender (or a bug that never clears an
|
|
40
|
+
// entry) must not turn this key into an unbounded write.
|
|
41
|
+
export const MAX_PERSISTED_FAILED_MESSAGES = 200;
|
|
42
|
+
|
|
25
43
|
interface PersistedChatState {
|
|
26
44
|
user: User;
|
|
27
45
|
}
|
|
@@ -31,6 +49,14 @@ interface PersistedRoomsState {
|
|
|
31
49
|
// intentionally NOT persisted: activeRoomJID, editAction, isLoading
|
|
32
50
|
}
|
|
33
51
|
|
|
52
|
+
interface PersistedHeapState {
|
|
53
|
+
failedMessages: Record<string, FailedMessagePayload>;
|
|
54
|
+
// intentionally NOT persisted: messageHeap, a process-lifetime
|
|
55
|
+
// "in flight" buffer (see roomHeapSlice.ts); anything still in it when
|
|
56
|
+
// the app dies is handled by the boot-time pending->failed scan below,
|
|
57
|
+
// not by replaying the heap itself.
|
|
58
|
+
}
|
|
59
|
+
|
|
34
60
|
const sanitizeUser = (user?: User): User | null => {
|
|
35
61
|
if (!user) {return null;}
|
|
36
62
|
// Drop secrets we don't want at rest — destructure to omit, then
|
|
@@ -92,6 +118,13 @@ const PERSISTED_MESSAGE_FIELDS: (keyof IMessage)[] = [
|
|
|
92
118
|
// paint already be translated, the way the live path already is.
|
|
93
119
|
'translations',
|
|
94
120
|
'callLog',
|
|
121
|
+
// bug #39: without this, a message that was still in flight (no
|
|
122
|
+
// server echo yet) at kill time comes back from disk indistinguishable
|
|
123
|
+
// from a normal delivered message, so the bubble renders it as sent.
|
|
124
|
+
// Persisting `pending` lets the boot-time scan (see
|
|
125
|
+
// computeBootTimeFailures below) find exactly the messages that never
|
|
126
|
+
// got confirmed and flip them to failed instead.
|
|
127
|
+
'pending',
|
|
95
128
|
];
|
|
96
129
|
|
|
97
130
|
// The sender identity that rides along on every message over the wire
|
|
@@ -191,6 +224,154 @@ const sanitizeRooms = (
|
|
|
191
224
|
return out;
|
|
192
225
|
};
|
|
193
226
|
|
|
227
|
+
// Only the fields retryMessage actually needs to replay the send (see
|
|
228
|
+
// FailedMessagePayload / useSendMessage.retryMessage). In particular, the
|
|
229
|
+
// media `data` blob is trimmed to `uri/type/name/size` (the picker never
|
|
230
|
+
// hands us auth material, but this stays defensive against a future
|
|
231
|
+
// picker change smuggling extra fields, or a huge inline payload, into
|
|
232
|
+
// `data`).
|
|
233
|
+
const sanitizeMediaData = (
|
|
234
|
+
data: any
|
|
235
|
+
): { uri?: string; type?: string; name?: string; size?: number } => {
|
|
236
|
+
if (!data || typeof data !== 'object') {return {};}
|
|
237
|
+
const out: { uri?: string; type?: string; name?: string; size?: number } = {};
|
|
238
|
+
if (typeof data.uri === 'string') {out.uri = data.uri;}
|
|
239
|
+
if (typeof data.type === 'string') {out.type = data.type;}
|
|
240
|
+
if (typeof data.name === 'string') {out.name = data.name;}
|
|
241
|
+
if (typeof data.size === 'number') {out.size = data.size;}
|
|
242
|
+
return out;
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
const sanitizeFailedMessagePayload = (
|
|
246
|
+
payload: FailedMessagePayload
|
|
247
|
+
): FailedMessagePayload | null => {
|
|
248
|
+
if (!payload || typeof payload !== 'object') {return null;}
|
|
249
|
+
if (!payload.id || typeof payload.id !== 'string') {return null;}
|
|
250
|
+
if (!payload.roomJID || typeof payload.roomJID !== 'string') {return null;}
|
|
251
|
+
if (payload.kind === 'media') {
|
|
252
|
+
return {
|
|
253
|
+
kind: 'media',
|
|
254
|
+
id: payload.id,
|
|
255
|
+
roomJID: payload.roomJID,
|
|
256
|
+
data: sanitizeMediaData(payload.data),
|
|
257
|
+
type: typeof payload.type === 'string' ? payload.type : '',
|
|
258
|
+
isReply: payload.isReply,
|
|
259
|
+
isChecked: payload.isChecked,
|
|
260
|
+
mainMessage: payload.mainMessage,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
if (payload.kind === 'text') {
|
|
264
|
+
return {
|
|
265
|
+
kind: 'text',
|
|
266
|
+
id: payload.id,
|
|
267
|
+
roomJID: payload.roomJID,
|
|
268
|
+
body: typeof payload.body === 'string' ? payload.body : '',
|
|
269
|
+
isReply: payload.isReply,
|
|
270
|
+
isChecked: payload.isChecked,
|
|
271
|
+
mainMessage: payload.mainMessage,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
return null;
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
const sanitizeFailedMessages = (
|
|
278
|
+
failedMessages: Record<string, FailedMessagePayload> | undefined
|
|
279
|
+
): Record<string, FailedMessagePayload> => {
|
|
280
|
+
if (!failedMessages || typeof failedMessages !== 'object') {return {};}
|
|
281
|
+
const out: Record<string, FailedMessagePayload> = {};
|
|
282
|
+
let count = 0;
|
|
283
|
+
for (const [id, payload] of Object.entries(failedMessages)) {
|
|
284
|
+
if (count >= MAX_PERSISTED_FAILED_MESSAGES) {break;}
|
|
285
|
+
const clean = sanitizeFailedMessagePayload(payload);
|
|
286
|
+
if (clean) {
|
|
287
|
+
out[id] = clean;
|
|
288
|
+
count++;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return out;
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
// -------------------------------------------------------------------
|
|
295
|
+
// Boot-time pending -> failed conversion (bug #39).
|
|
296
|
+
//
|
|
297
|
+
// `messageHeap` (the "still sending" buffer) is intentionally NOT
|
|
298
|
+
// persisted: it's a process-lifetime thing. That means on a cold start
|
|
299
|
+
// there is no such thing as "still sending": a persisted message that
|
|
300
|
+
// carries `pending: true` never got a server echo NOR got the chance to
|
|
301
|
+
// trip the in-session watchdog (see PENDING_WATCHDOG_MS in
|
|
302
|
+
// useSendMessage.tsx) before the process died. It must render as failed
|
|
303
|
+
// with a working retry, not as delivered and not as stuck "sending...".
|
|
304
|
+
//
|
|
305
|
+
// Reconstructs the same FailedMessagePayload shape the live send path
|
|
306
|
+
// builds in useSendMessage (markMessageFailed calls), from the fields we
|
|
307
|
+
// persist per message.
|
|
308
|
+
// -------------------------------------------------------------------
|
|
309
|
+
|
|
310
|
+
export function reconstructFailedMessagePayload(
|
|
311
|
+
message: IMessage,
|
|
312
|
+
roomJID: string
|
|
313
|
+
): FailedMessagePayload | null {
|
|
314
|
+
if (!message?.id || !roomJID) {return null;}
|
|
315
|
+
const isReply = !!message.isReply;
|
|
316
|
+
const isChecked = message.showInChannel === 'true';
|
|
317
|
+
const mainMessage = message.mainMessage;
|
|
318
|
+
if (message.isMediafile === 'true') {
|
|
319
|
+
return {
|
|
320
|
+
kind: 'media',
|
|
321
|
+
id: message.id,
|
|
322
|
+
roomJID,
|
|
323
|
+
data: sanitizeMediaData({
|
|
324
|
+
uri: message.location,
|
|
325
|
+
name: message.fileName,
|
|
326
|
+
type: message.mimetype,
|
|
327
|
+
size:
|
|
328
|
+
message.size !== undefined && message.size !== null
|
|
329
|
+
? Number(message.size)
|
|
330
|
+
: undefined,
|
|
331
|
+
}),
|
|
332
|
+
type: message.mimetype || '',
|
|
333
|
+
isReply,
|
|
334
|
+
isChecked,
|
|
335
|
+
mainMessage,
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
return {
|
|
339
|
+
kind: 'text',
|
|
340
|
+
id: message.id,
|
|
341
|
+
roomJID,
|
|
342
|
+
body: message.body || '',
|
|
343
|
+
isReply,
|
|
344
|
+
isChecked,
|
|
345
|
+
mainMessage,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Scan every persisted room for messages still `pending: true` that
|
|
351
|
+
* DON'T already have a restored failure entry (those are handled by the
|
|
352
|
+
* caller separately, from the persisted `failedMessages` map), and
|
|
353
|
+
* synthesize a retry-able FailedMessagePayload for each. Pure function:
|
|
354
|
+
* the caller (roomStore/index.ts) is responsible for dispatching
|
|
355
|
+
* `markMessageFailed` for the results.
|
|
356
|
+
*/
|
|
357
|
+
export function computeBootTimeFailures(
|
|
358
|
+
rooms: Record<string, IRoom> | null | undefined,
|
|
359
|
+
alreadyFailed: Record<string, FailedMessagePayload> | null | undefined
|
|
360
|
+
): FailedMessagePayload[] {
|
|
361
|
+
if (!rooms || typeof rooms !== 'object') {return [];}
|
|
362
|
+
const out: FailedMessagePayload[] = [];
|
|
363
|
+
for (const [jid, room] of Object.entries(rooms)) {
|
|
364
|
+
const messages = Array.isArray(room?.messages) ? room.messages : [];
|
|
365
|
+
for (const message of messages) {
|
|
366
|
+
if (!message || !message.pending) {continue;}
|
|
367
|
+
if (alreadyFailed && alreadyFailed[message.id]) {continue;}
|
|
368
|
+
const payload = reconstructFailedMessagePayload(message, jid);
|
|
369
|
+
if (payload) {out.push(payload);}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
return out;
|
|
373
|
+
}
|
|
374
|
+
|
|
194
375
|
let writeTimer: ReturnType<typeof setTimeout> | null = null;
|
|
195
376
|
|
|
196
377
|
/**
|
|
@@ -205,6 +386,7 @@ export const persistenceMiddleware: Middleware = (storeAPI) => (next) => (
|
|
|
205
386
|
const type: string = action?.type || '';
|
|
206
387
|
if (
|
|
207
388
|
!type.startsWith('roomMessages/') &&
|
|
389
|
+
!type.startsWith('roomHeapStore/') &&
|
|
208
390
|
!type.startsWith('chat/setUser') &&
|
|
209
391
|
!type.startsWith('chat/updateUser') &&
|
|
210
392
|
!type.startsWith('chat/refreshTokens') &&
|
|
@@ -215,21 +397,34 @@ export const persistenceMiddleware: Middleware = (storeAPI) => (next) => (
|
|
|
215
397
|
|
|
216
398
|
if (writeTimer) {clearTimeout(writeTimer);}
|
|
217
399
|
writeTimer = setTimeout(() => {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
400
|
+
(async () => {
|
|
401
|
+
try {
|
|
402
|
+
const state = storeAPI.getState();
|
|
403
|
+
const chatPayload: PersistedChatState = {
|
|
404
|
+
user: sanitizeUser(state.chatSettingStore?.user) as User,
|
|
405
|
+
};
|
|
406
|
+
const roomsPayload: PersistedRoomsState = {
|
|
407
|
+
rooms: sanitizeRooms(state.rooms?.rooms || {}),
|
|
408
|
+
};
|
|
409
|
+
const heapPayload: PersistedHeapState = {
|
|
410
|
+
failedMessages: sanitizeFailedMessages(
|
|
411
|
+
state.roomHeapSlice?.failedMessages
|
|
412
|
+
),
|
|
413
|
+
};
|
|
414
|
+
const [chatCipher, roomsCipher, heapCipher] = await Promise.all([
|
|
415
|
+
encryptForPersist(JSON.stringify(chatPayload)),
|
|
416
|
+
encryptForPersist(JSON.stringify(roomsPayload)),
|
|
417
|
+
encryptForPersist(JSON.stringify(heapPayload)),
|
|
418
|
+
]);
|
|
419
|
+
await AsyncStorage.multiSet([
|
|
420
|
+
[KEY_CHAT, chatCipher],
|
|
421
|
+
[KEY_ROOMS, roomsCipher],
|
|
422
|
+
[KEY_HEAP, heapCipher],
|
|
423
|
+
]);
|
|
424
|
+
} catch (e) {
|
|
425
|
+
console.warn('persist write failed', e);
|
|
426
|
+
}
|
|
427
|
+
})();
|
|
233
428
|
}, 200);
|
|
234
429
|
|
|
235
430
|
return result;
|
|
@@ -243,29 +438,44 @@ export const persistenceMiddleware: Middleware = (storeAPI) => (next) => (
|
|
|
243
438
|
export async function readPersistedState(): Promise<{
|
|
244
439
|
chat: PersistedChatState | null;
|
|
245
440
|
rooms: PersistedRoomsState | null;
|
|
441
|
+
heap: PersistedHeapState | null;
|
|
246
442
|
}> {
|
|
247
443
|
try {
|
|
248
|
-
const [chatRaw, roomsRaw] = await AsyncStorage.multiGet([
|
|
444
|
+
const [chatRaw, roomsRaw, heapRaw] = await AsyncStorage.multiGet([
|
|
249
445
|
KEY_CHAT,
|
|
250
446
|
KEY_ROOMS,
|
|
447
|
+
KEY_HEAP,
|
|
251
448
|
]);
|
|
252
|
-
const
|
|
253
|
-
|
|
254
|
-
? (
|
|
449
|
+
const [chatPlain, roomsPlain, heapPlain] = await Promise.all([
|
|
450
|
+
chatRaw[1] ? decryptFromPersist(chatRaw[1]) : Promise.resolve(null),
|
|
451
|
+
roomsRaw[1] ? decryptFromPersist(roomsRaw[1]) : Promise.resolve(null),
|
|
452
|
+
heapRaw[1] ? decryptFromPersist(heapRaw[1]) : Promise.resolve(null),
|
|
453
|
+
]);
|
|
454
|
+
// `decryptFromPersist` returns null both for "nothing stored" and
|
|
455
|
+
// for "stored value isn't a valid envelope for the current key" —
|
|
456
|
+
// notably a plaintext blob left over from a pre-encryption install.
|
|
457
|
+
// Either way there is nothing safe to parse, so the caller treats it
|
|
458
|
+
// as a cold start and re-hydrates from the server.
|
|
459
|
+
const chat = chatPlain ? (JSON.parse(chatPlain) as PersistedChatState) : null;
|
|
460
|
+
const rooms = roomsPlain
|
|
461
|
+
? (JSON.parse(roomsPlain) as PersistedRoomsState)
|
|
462
|
+
: null;
|
|
463
|
+
const heap = heapPlain
|
|
464
|
+
? (JSON.parse(heapPlain) as PersistedHeapState)
|
|
255
465
|
: null;
|
|
256
|
-
return { chat, rooms };
|
|
466
|
+
return { chat, rooms, heap };
|
|
257
467
|
} catch (e) {
|
|
258
468
|
console.warn('persist read failed', e);
|
|
259
|
-
return { chat: null, rooms: null };
|
|
469
|
+
return { chat: null, rooms: null, heap: null };
|
|
260
470
|
}
|
|
261
471
|
}
|
|
262
472
|
|
|
263
473
|
export async function clearPersistedState(): Promise<void> {
|
|
264
474
|
try {
|
|
265
|
-
await AsyncStorage.multiRemove([KEY_CHAT, KEY_ROOMS]);
|
|
475
|
+
await AsyncStorage.multiRemove([KEY_CHAT, KEY_ROOMS, KEY_HEAP]);
|
|
266
476
|
} catch (e) {
|
|
267
477
|
console.warn('persist clear failed', e);
|
|
268
478
|
}
|
|
269
479
|
}
|
|
270
480
|
|
|
271
|
-
export const PERSIST_KEYS = { KEY_CHAT, KEY_ROOMS };
|
|
481
|
+
export const PERSIST_KEYS = { KEY_CHAT, KEY_ROOMS, KEY_HEAP };
|
|
@@ -2,6 +2,7 @@ import { createAsyncThunk, createSlice, PayloadAction, type Slice } from '@redux
|
|
|
2
2
|
import type { WritableDraft } from 'immer';
|
|
3
3
|
import { EditAction, HistoryPreloadState, IMessage, IRoom } from '../types/types';
|
|
4
4
|
import { insertMessageWithDelimiter } from '../helpers/insertMessageWithDelimiter';
|
|
5
|
+
import { msgSortableMs } from '../helpers/msgSortableMs';
|
|
5
6
|
import type XmppClient from '../networking/xmppClient';
|
|
6
7
|
|
|
7
8
|
// Per-room runtime message cap. Mirrors the persistence layer's
|
|
@@ -13,7 +14,7 @@ import type XmppClient from '../networking/xmppClient';
|
|
|
13
14
|
// older history added via unshift/splice is exempt, so the user can
|
|
14
15
|
// page backward arbitrarily far without instantly losing what they
|
|
15
16
|
// just fetched. After cap eviction we drop from the head (oldest).
|
|
16
|
-
const RUNTIME_MESSAGE_LIMIT = 100;
|
|
17
|
+
export const RUNTIME_MESSAGE_LIMIT = 100;
|
|
17
18
|
|
|
18
19
|
// Body strings the server uses for call signaling broadcasts (call-token,
|
|
19
20
|
// call-state ringing/ended, etc). These should never reach the chat
|
|
@@ -142,7 +143,6 @@ function mergeHistoryIntoCache(
|
|
|
142
143
|
const ex = stripCallSignals(existing);
|
|
143
144
|
const fe = stripCallSignals(fetched);
|
|
144
145
|
|
|
145
|
-
const pending = ex.filter((m) => m?.pending);
|
|
146
146
|
const realExisting = ex.filter(
|
|
147
147
|
(m) => m && !m.pending && m.id !== 'delimiter-new'
|
|
148
148
|
);
|
|
@@ -151,6 +151,29 @@ function mergeHistoryIntoCache(
|
|
|
151
151
|
// Nothing usable came back → keep the cache exactly as it was.
|
|
152
152
|
if (realFetched.length === 0) {return ex;}
|
|
153
153
|
|
|
154
|
+
// Optimistic sends are preserved across a history merge - EXCEPT the
|
|
155
|
+
// ones the fetched page proves the server already has. That happens
|
|
156
|
+
// whenever a send reached the server but its echo did not reach us
|
|
157
|
+
// before the process died: the optimistic bubble is restored from disk
|
|
158
|
+
// still `pending: true` (and, since bug #39, flagged failed at boot),
|
|
159
|
+
// while MAM hands back the very same message under its ARCHIVE id.
|
|
160
|
+
// Keying only on `id` never matched those two, so the room ended up
|
|
161
|
+
// showing the message twice - once for real and once as a bubble stuck
|
|
162
|
+
// on "sending…"/"Failed" that nothing could ever clear. The archived
|
|
163
|
+
// copy carries our original stanza id as `xmppId` (getDataFromXml), so
|
|
164
|
+
// match on that too and drop the local ghost.
|
|
165
|
+
const fetchedKeys = new Set<string>();
|
|
166
|
+
for (const m of realFetched) {
|
|
167
|
+
if (m?.id != null) {fetchedKeys.add(String(m.id));}
|
|
168
|
+
if ((m as any)?.xmppId) {fetchedKeys.add(String((m as any).xmppId));}
|
|
169
|
+
}
|
|
170
|
+
const pending = ex.filter(
|
|
171
|
+
(m) =>
|
|
172
|
+
m?.pending &&
|
|
173
|
+
!fetchedKeys.has(String(m.id)) &&
|
|
174
|
+
!(m.xmppId && fetchedKeys.has(String(m.xmppId)))
|
|
175
|
+
);
|
|
176
|
+
|
|
154
177
|
const byMs = (a: IMessage, b: IMessage) =>
|
|
155
178
|
msgSortableMs(a) - msgSortableMs(b);
|
|
156
179
|
const capTail = (arr: IMessage[]) =>
|
|
@@ -214,6 +237,33 @@ export interface RoomMessagesState {
|
|
|
214
237
|
// — see `applyPrivateStoreMarkers`. Re-fetched every init/reconnect,
|
|
215
238
|
// so it is intentionally NOT persisted.
|
|
216
239
|
privateStoreMarkers: Record<string, number>;
|
|
240
|
+
// The single source of truth for "read up to here, but the user
|
|
241
|
+
// hasn't reached the bottom yet" (`{ roomJID: boundaryMs }`).
|
|
242
|
+
// Set by MessageList (via ChatRoom's `onReadBoundaryChange`) the
|
|
243
|
+
// moment the user first scrolls away from the bottom, to the
|
|
244
|
+
// msgSortableMs of the newest message they'd actually seen. Every
|
|
245
|
+
// path that stamps a read marker for a room the user is leaving
|
|
246
|
+
// (ChatRoom unmount, xmppProvider's AppState background handler and
|
|
247
|
+
// `isVisible=false` handler, the live `advance()` effect, and
|
|
248
|
+
// `useChatRoomFocus`'s `leaveRoom`) must consult this instead of
|
|
249
|
+
// unconditionally stamping "the newest acked message" - otherwise
|
|
250
|
+
// leaving a room while scrolled up marks messages the user never
|
|
251
|
+
// reached as read (customer #42, a regression of #33 reintroduced by
|
|
252
|
+
// #38's server-timestamp marker). See `getReadMarkerTimestamp` in
|
|
253
|
+
// helpers/getServerReadTimestamp.ts.
|
|
254
|
+
//
|
|
255
|
+
// Cleared when the boundary no longer applies: the user scrolls back
|
|
256
|
+
// to the bottom, the visible room changes, or the room is truly left
|
|
257
|
+
// (ChatRoom unmounts, or a tab-navigator focus hook releases the
|
|
258
|
+
// room). NOT cleared merely because the app backgrounds or a host's
|
|
259
|
+
// `isVisible` flips false - MessageList typically stays mounted
|
|
260
|
+
// through those, so its own scroll-tracking ref (the only thing that
|
|
261
|
+
// could re-derive this value) is still intact and the boundary must
|
|
262
|
+
// stay in sync with it. Deliberately NOT persisted (this key isn't
|
|
263
|
+
// read by `persistence.ts`, which only ever picks `rooms` back out of
|
|
264
|
+
// this slice) - it's meaningless across a process restart, where
|
|
265
|
+
// MessageList always mounts fresh at the bottom.
|
|
266
|
+
readBoundaries: Record<string, number>;
|
|
217
267
|
}
|
|
218
268
|
|
|
219
269
|
const initialState: RoomMessagesState = {
|
|
@@ -230,6 +280,7 @@ const initialState: RoomMessagesState = {
|
|
|
230
280
|
},
|
|
231
281
|
pendingNotificationJid: null,
|
|
232
282
|
privateStoreMarkers: {},
|
|
283
|
+
readBoundaries: {},
|
|
233
284
|
};
|
|
234
285
|
|
|
235
286
|
const isValidRoomJid = (jid: unknown): jid is string => {
|
|
@@ -317,6 +368,8 @@ const reducers = {
|
|
|
317
368
|
: [];
|
|
318
369
|
state.rooms[roomData.jid] = {
|
|
319
370
|
...roomData,
|
|
371
|
+
icon: roomData.icon !== undefined ? roomData.icon : existing?.icon,
|
|
372
|
+
roomBg: roomData.roomBg !== undefined ? roomData.roomBg : existing?.roomBg,
|
|
320
373
|
messages:
|
|
321
374
|
existingMessages.length > 0 ? existingMessages : incomingMessages,
|
|
322
375
|
lastViewedTimestamp: lastViewed,
|
|
@@ -494,7 +547,7 @@ const reducers = {
|
|
|
494
547
|
state.visibleRoomJID === roomJID
|
|
495
548
|
? null
|
|
496
549
|
: lastViewedValue
|
|
497
|
-
?
|
|
550
|
+
? lastViewedValue
|
|
498
551
|
: null;
|
|
499
552
|
|
|
500
553
|
insertMessageWithDelimiter(roomMessages, message, lastViewedTimestamp);
|
|
@@ -512,6 +565,7 @@ const reducers = {
|
|
|
512
565
|
state.rooms = {};
|
|
513
566
|
state.visibleRoomJID = null;
|
|
514
567
|
state.privateStoreMarkers = {};
|
|
568
|
+
state.readBoundaries = {};
|
|
515
569
|
state.isUnreadSyncing = false;
|
|
516
570
|
},
|
|
517
571
|
setComposing(
|
|
@@ -578,7 +632,19 @@ const reducers = {
|
|
|
578
632
|
*
|
|
579
633
|
* Monotonic: a marker only ever moves a baseline FORWARD, so a stale
|
|
580
634
|
* server value can't resurrect already-read messages and a more-recent
|
|
581
|
-
* local read (tab blur stamping
|
|
635
|
+
* local read (tab blur stamping the server read timestamp) always wins.
|
|
636
|
+
*
|
|
637
|
+
* Bug #38 self-heal: forward-only is correct for a SANE existing
|
|
638
|
+
* value, but a device whose clock was ahead may have already stamped
|
|
639
|
+
* a marker in the future (either persisted locally from a previous
|
|
640
|
+
* session, or fetched from the server before this fix existed). To
|
|
641
|
+
* "only ever move forward" from a corrupt future value is to never
|
|
642
|
+
* move at all - the room would stay stuck at `unreadMessages: 0`
|
|
643
|
+
* forever. When the room is loaded, detect a marker that sits well
|
|
644
|
+
* past the newest message we actually know it has and waive the
|
|
645
|
+
* forward-only check for that one comparison, so the incoming
|
|
646
|
+
* (already-clamped, see xmppClient.getChatsPrivateStoreRequestStanza)
|
|
647
|
+
* value can correct it even though it's numerically smaller.
|
|
582
648
|
*/
|
|
583
649
|
applyPrivateStoreMarkers: (
|
|
584
650
|
state: WritableDraft<RoomMessagesState>,
|
|
@@ -590,20 +656,72 @@ const reducers = {
|
|
|
590
656
|
for (const jid of Object.keys(markers)) {
|
|
591
657
|
const ts = Number(markers[jid]);
|
|
592
658
|
if (!jid || !Number.isFinite(ts) || ts <= 0) {continue;}
|
|
659
|
+
|
|
660
|
+
const room = state.rooms[jid];
|
|
661
|
+
const newestKnownMs = room ? newestAckedMessageMs(room.messages) : 0;
|
|
662
|
+
// Mirrors isCorruptFutureReadMarker in helpers/getServerReadTimestamp.ts
|
|
663
|
+
// (duplicated to avoid a roomStore <-> helpers import cycle):
|
|
664
|
+
// BOTH signals are required. "Further ahead than the newest
|
|
665
|
+
// message this room has locally" happens all the time on a room
|
|
666
|
+
// whose history hasn't synced yet, and healing on that alone
|
|
667
|
+
// would drop a legitimate marker another device wrote after
|
|
668
|
+
// reading newer messages. A real read marker can never be ahead
|
|
669
|
+
// of real time, so that second signal is what distinguishes a
|
|
670
|
+
// stale cache from a wrong clock.
|
|
671
|
+
const nowMs = Date.now();
|
|
672
|
+
const looksCorrupt = (existing: number) =>
|
|
673
|
+
newestKnownMs > 0 &&
|
|
674
|
+
existing > newestKnownMs + FUTURE_MARKER_TOLERANCE_MS &&
|
|
675
|
+
existing > nowMs + FUTURE_MARKER_TOLERANCE_MS;
|
|
676
|
+
|
|
593
677
|
// Remember the marker so rooms that load LATER (via addRoom)
|
|
594
678
|
// inherit it even though they don't exist in the store yet.
|
|
595
|
-
|
|
679
|
+
const cachedMarker = state.privateStoreMarkers[jid] || 0;
|
|
680
|
+
if (ts > cachedMarker || looksCorrupt(cachedMarker)) {
|
|
596
681
|
state.privateStoreMarkers[jid] = ts;
|
|
597
682
|
}
|
|
598
683
|
// Upgrade an already-loaded room's baseline + recompute its badge.
|
|
599
|
-
//
|
|
600
|
-
|
|
601
|
-
if (room && ts > (room.lastViewedTimestamp || 0)) {
|
|
684
|
+
// Forward-only, unless the room's CURRENT baseline is itself the
|
|
685
|
+
// corrupt value being corrected.
|
|
686
|
+
if (room && (ts > (room.lastViewedTimestamp || 0) || looksCorrupt(room.lastViewedTimestamp || 0))) {
|
|
602
687
|
room.lastViewedTimestamp = ts;
|
|
603
688
|
room.unreadMessages = countNewerMessages(room.messages, ts);
|
|
604
689
|
}
|
|
605
690
|
}
|
|
606
691
|
},
|
|
692
|
+
/**
|
|
693
|
+
* Set (or clear) the "read up to here, but not further" boundary for
|
|
694
|
+
* a room - see `readBoundaries` on `RoomMessagesState` for the full
|
|
695
|
+
* contract. `ts` is the msgSortableMs of the newest message the user
|
|
696
|
+
* actually reached before scrolling away from the bottom; `null`/`0`
|
|
697
|
+
* clears it (the user is at the bottom, or nothing was reached yet).
|
|
698
|
+
*/
|
|
699
|
+
setReadBoundary: (
|
|
700
|
+
state: WritableDraft<RoomMessagesState>,
|
|
701
|
+
action: PayloadAction<{ jid: string; ts: number | null }>
|
|
702
|
+
) => {
|
|
703
|
+
const { jid, ts } = action.payload;
|
|
704
|
+
if (!jid) {return;}
|
|
705
|
+
if (!state.readBoundaries) {state.readBoundaries = {};}
|
|
706
|
+
if (typeof ts === 'number' && Number.isFinite(ts) && ts > 0) {
|
|
707
|
+
state.readBoundaries[jid] = ts;
|
|
708
|
+
} else {
|
|
709
|
+
delete state.readBoundaries[jid];
|
|
710
|
+
}
|
|
711
|
+
},
|
|
712
|
+
/**
|
|
713
|
+
* Release a room's read boundary once it has been consumed by a
|
|
714
|
+
* genuine "leave" (ChatRoom unmount, or a tab-navigator focus hook
|
|
715
|
+
* switching to a different room) - see `readBoundaries` for why the
|
|
716
|
+
* background/`isVisible=false` paths deliberately do NOT call this.
|
|
717
|
+
*/
|
|
718
|
+
clearReadBoundary: (
|
|
719
|
+
state: WritableDraft<RoomMessagesState>,
|
|
720
|
+
action: PayloadAction<{ jid: string }>
|
|
721
|
+
) => {
|
|
722
|
+
const { jid } = action.payload;
|
|
723
|
+
if (jid && state.readBoundaries) {delete state.readBoundaries[jid];}
|
|
724
|
+
},
|
|
607
725
|
setRoomRole: (
|
|
608
726
|
state: WritableDraft<RoomMessagesState>,
|
|
609
727
|
action: PayloadAction<{ chatJID: string; role: string }>
|
|
@@ -697,6 +815,7 @@ const reducers = {
|
|
|
697
815
|
state.isLoading = false;
|
|
698
816
|
state.isUnreadSyncing = false;
|
|
699
817
|
state.privateStoreMarkers = {};
|
|
818
|
+
state.readBoundaries = {};
|
|
700
819
|
},
|
|
701
820
|
setActiveMessage: (
|
|
702
821
|
state: WritableDraft<RoomMessagesState>,
|
|
@@ -818,27 +937,13 @@ export const roomsStore: Slice<RoomMessagesState, typeof reducers, 'roomMessages
|
|
|
818
937
|
reducers,
|
|
819
938
|
});
|
|
820
939
|
|
|
821
|
-
//
|
|
822
|
-
//
|
|
823
|
-
//
|
|
824
|
-
//
|
|
825
|
-
//
|
|
826
|
-
//
|
|
827
|
-
|
|
828
|
-
// user's own messages (parity with unreadMiddleware's isOwnMessage
|
|
829
|
-
// filter — without this, the reducer and the middleware disagree about
|
|
830
|
-
// the count and we get a flicker as the badge gets written twice with
|
|
831
|
-
// different values on every message).
|
|
832
|
-
export const msgSortableMs = (msg: any): number => {
|
|
833
|
-
const id = String(msg?.id || '');
|
|
834
|
-
const m = /^(\d{13})/.exec(id);
|
|
835
|
-
if (m) {return Number(m[1]);}
|
|
836
|
-
if (msg?.date) {
|
|
837
|
-
const t = new Date(msg.date as any).getTime();
|
|
838
|
-
if (Number.isFinite(t)) {return t;}
|
|
839
|
-
}
|
|
840
|
-
return 0;
|
|
841
|
-
};
|
|
940
|
+
// Re-exported for backward compatibility - every existing call site
|
|
941
|
+
// imports `msgSortableMs` from here. The implementation now lives in
|
|
942
|
+
// helpers/msgSortableMs.ts (imported above), so insertMessageWithDelimiter.ts
|
|
943
|
+
// (which this file itself imports) can use the SAME ordering source
|
|
944
|
+
// without a roomStore <-> helpers import cycle. See that file for the
|
|
945
|
+
// full rationale (server id vs. client `date`).
|
|
946
|
+
export { msgSortableMs };
|
|
842
947
|
|
|
843
948
|
const norm = (s: any): string => {
|
|
844
949
|
if (s == null) {return '';}
|
|
@@ -870,6 +975,31 @@ const isOwn = (
|
|
|
870
975
|
return false;
|
|
871
976
|
};
|
|
872
977
|
|
|
978
|
+
// Bug #38 tolerance: a stored read marker more than this far past the
|
|
979
|
+
// newest message a room actually has is not "the user is a little
|
|
980
|
+
// ahead" - it's a leftover from a device whose clock was wrong when it
|
|
981
|
+
// stamped the marker. Kept in sync with (but duplicated from, to avoid
|
|
982
|
+
// a roomStore ↔ helpers import cycle) FUTURE_READ_MARKER_TOLERANCE_MS
|
|
983
|
+
// in helpers/getServerReadTimestamp.ts.
|
|
984
|
+
const FUTURE_MARKER_TOLERANCE_MS = 5 * 60 * 1000;
|
|
985
|
+
|
|
986
|
+
// Newest message in `messages` this room actually has proof the server
|
|
987
|
+
// accepted - used only to sanity-check an already-stored read marker
|
|
988
|
+
// against reality (see applyPrivateStoreMarkers's self-heal). Excludes
|
|
989
|
+
// pending/optimistic sends via the `pending` flag alone: unlike
|
|
990
|
+
// getServerReadTimestamp, this runs inside a reducer and can't reach
|
|
991
|
+
// across to the roomHeapSlice slice, but `pending` already identifies
|
|
992
|
+
// every optimistic send that matters for this comparison.
|
|
993
|
+
const newestAckedMessageMs = (messages: IMessage[] | undefined): number => {
|
|
994
|
+
let newest = 0;
|
|
995
|
+
for (const m of messages || []) {
|
|
996
|
+
if (!m || m.id === 'delimiter-new' || m.pending) {continue;}
|
|
997
|
+
const ms = msgSortableMs(m);
|
|
998
|
+
if (ms > newest) {newest = ms;}
|
|
999
|
+
}
|
|
1000
|
+
return newest;
|
|
1001
|
+
};
|
|
1002
|
+
|
|
873
1003
|
const countNewerMessages = (
|
|
874
1004
|
messages: IMessage[],
|
|
875
1005
|
timestamp: number,
|
|
@@ -900,6 +1030,8 @@ export const {
|
|
|
900
1030
|
setUnreadSyncing,
|
|
901
1031
|
setLastViewedTimestamp,
|
|
902
1032
|
applyPrivateStoreMarkers,
|
|
1033
|
+
setReadBoundary,
|
|
1034
|
+
clearReadBoundary,
|
|
903
1035
|
setRoomNoMessages,
|
|
904
1036
|
setCurrentRoom,
|
|
905
1037
|
setVisibleRoom,
|