@ethora/chat-component-rn 26.8.1 → 26.8.2
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 +96 -0
- package/README.md +43 -10
- package/lib/commonjs/assets/icons.js +7 -2
- package/lib/commonjs/assets/icons.js.map +1 -1
- package/lib/commonjs/components/AuthForms/Login.js +4 -4
- package/lib/commonjs/components/AuthForms/Login.js.map +1 -1
- package/lib/commonjs/components/Header/HeaderRoomList.js +29 -8
- package/lib/commonjs/components/Header/HeaderRoomList.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatHeader.js +9 -3
- package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatRoom.js +150 -14
- package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatWrapper.js +34 -13
- package/lib/commonjs/components/MainComponents/ChatWrapper.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 +29 -9
- 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 +13 -5
- 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/RoomList.js +208 -35
- package/lib/commonjs/components/MainComponents/RoomList.js.map +1 -1
- package/lib/commonjs/components/Menu/HeaderRoomListMenu.js +317 -98
- package/lib/commonjs/components/Menu/HeaderRoomListMenu.js.map +1 -1
- package/lib/commonjs/components/Modals/AttachSheet/AttachSheet.js +322 -110
- package/lib/commonjs/components/Modals/AttachSheet/AttachSheet.js.map +1 -1
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +546 -203
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/commonjs/components/Modals/ChatProfileModal/ReportChatModal.js +226 -0
- package/lib/commonjs/components/Modals/ChatProfileModal/ReportChatModal.js.map +1 -0
- package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js +69 -27
- 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/NewChatModal/ModalContent.js +2 -1
- package/lib/commonjs/components/Modals/NewChatModal/ModalContent.js.map +1 -1
- package/lib/commonjs/components/Modals/NewChatModal/NewChatModal.js +202 -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 +210 -0
- package/lib/commonjs/components/Modals/ProfileHeader/ProfileMenu.js.map +1 -0
- package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js +4 -2
- package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
- package/lib/commonjs/components/Modals/UserProfileModal/EditUserModal.js +7 -21
- package/lib/commonjs/components/Modals/UserProfileModal/EditUserModal.js.map +1 -1
- package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js +507 -244
- package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
- package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js +74 -46
- package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
- package/lib/commonjs/components/Modals/styledModalComponents.js +9 -2
- package/lib/commonjs/components/Modals/styledModalComponents.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +21 -7
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.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/VideoCalls/VideoCallSession.js +6 -3
- package/lib/commonjs/components/VideoCalls/VideoCallSession.js.map +1 -1
- package/lib/commonjs/components/styled/AudioMessage.js +2 -1
- package/lib/commonjs/components/styled/AudioMessage.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/SendInput.js +80 -11
- package/lib/commonjs/components/styled/SendInput.js.map +1 -1
- package/lib/commonjs/components/styled/StyledComponents.js +9 -3
- package/lib/commonjs/components/styled/StyledComponents.js.map +1 -1
- package/lib/commonjs/components/styled/StyledInputComponents/StyledInputComponents.js +11 -4
- package/lib/commonjs/components/styled/StyledInputComponents/StyledInputComponents.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/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 +23 -0
- package/lib/commonjs/helpers/getChatBackground.js.map +1 -0
- package/lib/commonjs/helpers/getDisplayFileName.js +79 -0
- package/lib/commonjs/helpers/getDisplayFileName.js.map +1 -0
- 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/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/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/useFileToken.js +10 -0
- package/lib/commonjs/hooks/useFileToken.js.map +1 -0
- package/lib/commonjs/hooks/useLogout.js +23 -7
- 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/useUnreadMessagesCounter.js +6 -1
- package/lib/commonjs/hooks/useUnreadMessagesCounter.js.map +1 -1
- package/lib/commonjs/i18n/strings.js +145 -37
- package/lib/commonjs/i18n/strings.js.map +1 -1
- package/lib/commonjs/main.js +44 -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/roomMembers.api.js +1 -1
- package/lib/commonjs/networking/api-requests/roomMembers.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/rooms.api.js +9 -9
- package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/user.api.js +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/pushSubscriptionService.js +15 -13
- package/lib/commonjs/services/pushSubscriptionService.js.map +1 -1
- package/lib/commonjs/version.js +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 +4 -4
- package/lib/module/components/AuthForms/Login.js.map +1 -1
- package/lib/module/components/Header/HeaderRoomList.js +29 -8
- package/lib/module/components/Header/HeaderRoomList.js.map +1 -1
- package/lib/module/components/MainComponents/ChatHeader.js +9 -3
- package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/module/components/MainComponents/ChatRoom.js +152 -16
- package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/module/components/MainComponents/ChatWrapper.js +35 -14
- package/lib/module/components/MainComponents/ChatWrapper.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 +30 -10
- 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 +13 -5
- 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/RoomList.js +207 -35
- package/lib/module/components/MainComponents/RoomList.js.map +1 -1
- package/lib/module/components/Menu/HeaderRoomListMenu.js +319 -101
- package/lib/module/components/Menu/HeaderRoomListMenu.js.map +1 -1
- package/lib/module/components/Modals/AttachSheet/AttachSheet.js +313 -113
- package/lib/module/components/Modals/AttachSheet/AttachSheet.js.map +1 -1
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +549 -207
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/module/components/Modals/ChatProfileModal/ReportChatModal.js +223 -0
- package/lib/module/components/Modals/ChatProfileModal/ReportChatModal.js.map +1 -0
- package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js +70 -28
- 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/NewChatModal/ModalContent.js +2 -1
- package/lib/module/components/Modals/NewChatModal/ModalContent.js.map +1 -1
- package/lib/module/components/Modals/NewChatModal/NewChatModal.js +205 -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 +205 -0
- package/lib/module/components/Modals/ProfileHeader/ProfileMenu.js.map +1 -0
- package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js +4 -2
- package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
- package/lib/module/components/Modals/UserProfileModal/EditUserModal.js +9 -23
- package/lib/module/components/Modals/UserProfileModal/EditUserModal.js.map +1 -1
- package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js +509 -248
- package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
- package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js +76 -48
- package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
- package/lib/module/components/Modals/styledModalComponents.js +9 -2
- package/lib/module/components/Modals/styledModalComponents.js.map +1 -1
- package/lib/module/components/RoomComponents/ChatRoomItem.js +21 -7
- package/lib/module/components/RoomComponents/ChatRoomItem.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/VideoCalls/VideoCallSession.js +6 -3
- package/lib/module/components/VideoCalls/VideoCallSession.js.map +1 -1
- package/lib/module/components/styled/AudioMessage.js +2 -1
- package/lib/module/components/styled/AudioMessage.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/SendInput.js +81 -12
- package/lib/module/components/styled/SendInput.js.map +1 -1
- package/lib/module/components/styled/StyledComponents.js +9 -3
- package/lib/module/components/styled/StyledComponents.js.map +1 -1
- package/lib/module/components/styled/StyledInputComponents/StyledInputComponents.js +11 -4
- package/lib/module/components/styled/StyledInputComponents/StyledInputComponents.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/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 +18 -0
- package/lib/module/helpers/getChatBackground.js.map +1 -0
- package/lib/module/helpers/getDisplayFileName.js +73 -0
- package/lib/module/helpers/getDisplayFileName.js.map +1 -0
- 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/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/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/useFileToken.js +5 -0
- package/lib/module/hooks/useFileToken.js.map +1 -0
- package/lib/module/hooks/useLogout.js +23 -7
- 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/useUnreadMessagesCounter.js +6 -1
- package/lib/module/hooks/useUnreadMessagesCounter.js.map +1 -1
- package/lib/module/i18n/strings.js +145 -37
- package/lib/module/i18n/strings.js.map +1 -1
- package/lib/module/main.js +14 -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/roomMembers.api.js +1 -1
- package/lib/module/networking/api-requests/roomMembers.api.js.map +1 -1
- package/lib/module/networking/api-requests/rooms.api.js +9 -9
- package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
- package/lib/module/networking/api-requests/user.api.js +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/pushSubscriptionService.js +15 -13
- package/lib/module/services/pushSubscriptionService.js.map +1 -1
- package/lib/module/version.js +1 -1
- package/lib/typescript/assets/icons.d.ts +16 -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/Header/HeaderRoomList.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/LoginWrapper.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MessageContainer.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MessageList.d.ts +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/RoomList.d.ts +7 -0
- package/lib/typescript/components/MainComponents/RoomList.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/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/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/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/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.map +1 -1
- package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessageFile.d.ts +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessageFile.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessagePhoto.d.ts +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessagePhoto.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessageVideo.d.ts +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessageVideo.d.ts.map +1 -1
- package/lib/typescript/components/VideoCalls/VideoCallSession.d.ts.map +1 -1
- package/lib/typescript/components/styled/AudioMessage.d.ts.map +1 -1
- package/lib/typescript/components/styled/MessageImage.d.ts +14 -0
- package/lib/typescript/components/styled/MessageImage.d.ts.map +1 -1
- package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
- package/lib/typescript/components/styled/StyledComponents.d.ts.map +1 -1
- package/lib/typescript/components/styled/StyledInputComponents/StyledInputComponents.d.ts.map +1 -1
- package/lib/typescript/components/styled/UnsupportedType.d.ts.map +1 -1
- package/lib/typescript/components/styled/VideoMessage.d.ts +8 -0
- package/lib/typescript/components/styled/VideoMessage.d.ts.map +1 -1
- package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
- package/lib/typescript/helpers/createMessageFromXml.d.ts.map +1 -1
- package/lib/typescript/helpers/getChatBackground.d.ts +15 -0
- package/lib/typescript/helpers/getChatBackground.d.ts.map +1 -0
- package/lib/typescript/helpers/getDisplayFileName.d.ts +49 -0
- package/lib/typescript/helpers/getDisplayFileName.d.ts.map +1 -0
- 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/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/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/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/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 +9 -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/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/pushSubscriptionService.d.ts +1 -1
- package/lib/typescript/services/pushSubscriptionService.d.ts.map +1 -1
- package/lib/typescript/types/types.d.ts +50 -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/icons.tsx +48 -9
- package/src/components/AuthForms/Login.tsx +3 -3
- package/src/components/Header/HeaderRoomList.tsx +29 -7
- package/src/components/MainComponents/ChatHeader.tsx +9 -3
- package/src/components/MainComponents/ChatRoom.tsx +161 -15
- package/src/components/MainComponents/ChatWrapper.tsx +36 -20
- package/src/components/MainComponents/LoginWrapper.tsx +1 -0
- package/src/components/MainComponents/MediaMessage.tsx +26 -8
- package/src/components/MainComponents/MessageContainer.tsx +5 -1
- package/src/components/MainComponents/MessageList.tsx +23 -4
- package/src/components/MainComponents/ProfileImagePlaceholder.tsx +21 -14
- package/src/components/MainComponents/RoomList.tsx +236 -39
- package/src/components/Menu/HeaderRoomListMenu.tsx +328 -75
- package/src/components/Modals/AttachSheet/AttachSheet.tsx +333 -97
- package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +600 -282
- package/src/components/Modals/ChatProfileModal/ReportChatModal.tsx +244 -0
- package/src/components/Modals/FilePreviewModal/FilePreviewModal.tsx +79 -38
- package/src/components/Modals/FilePreviewModal/PdfView.tsx +2 -1
- package/src/components/Modals/Modal/Modal.tsx +7 -0
- package/src/components/Modals/NewChatModal/ModalContent.tsx +6 -3
- package/src/components/Modals/NewChatModal/NewChatModal.tsx +219 -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 +217 -0
- package/src/components/Modals/SelectUsersModal/SelectUsersModal.tsx +14 -4
- package/src/components/Modals/UserProfileModal/EditUserModal.tsx +9 -25
- package/src/components/Modals/UserProfileModal/UserProfileModal.tsx +617 -307
- package/src/components/Modals/UserSettingsModal/UserSettingsModal.tsx +75 -58
- package/src/components/Modals/styledModalComponents.tsx +9 -2
- package/src/components/RoomComponents/ChatRoomItem.tsx +18 -3
- 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/VideoCalls/VideoCallSession.tsx +8 -3
- package/src/components/styled/AudioMessage.tsx +2 -1
- package/src/components/styled/MessageImage.tsx +53 -7
- package/src/components/styled/SendInput.tsx +83 -12
- package/src/components/styled/StyledComponents.ts +9 -3
- package/src/components/styled/StyledInputComponents/StyledInputComponents.tsx +11 -4
- package/src/components/styled/UnsupportedType.tsx +14 -4
- package/src/components/styled/VideoMessage.tsx +131 -54
- 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 +18 -0
- package/src/helpers/getDisplayFileName.ts +87 -0
- 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/mediaLibraryRuntime.ts +25 -0
- package/src/helpers/mimeToExtension.ts +6 -22
- package/src/helpers/msgSortableMs.ts +25 -0
- 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/useFileToken.ts +7 -0
- package/src/hooks/useLogout.tsx +29 -9
- package/src/hooks/usePendingNotification.ts +5 -11
- package/src/hooks/useSendMessage.tsx +60 -15
- package/src/hooks/useUnreadMessagesCounter.ts +11 -0
- package/src/i18n/strings.ts +145 -37
- package/src/main.ts +26 -2
- package/src/networking/api-requests/auth.api.ts +156 -48
- package/src/networking/api-requests/roomMembers.api.ts +1 -1
- package/src/networking/api-requests/rooms.api.ts +9 -9
- package/src/networking/api-requests/user.api.ts +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/pushSubscriptionService.ts +18 -13
- package/src/types/types.ts +72 -5
- package/src/version.ts +1 -1
package/src/roomStore/index.ts
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import { configureStore, combineReducers } from '@reduxjs/toolkit';
|
|
2
2
|
import chatSettingsReducer, { setUser } from './chatSettingsSlice';
|
|
3
3
|
import roomsSlice, { addRoom } from './roomsSlice';
|
|
4
|
-
import { roomHeapSlice } from './roomHeapSlice';
|
|
4
|
+
import { roomHeapSlice, markMessageFailed } from './roomHeapSlice';
|
|
5
5
|
import callReducer from './callSlice';
|
|
6
6
|
import { IRoom } from '../types/types';
|
|
7
7
|
import { unreadMiddleware } from './Middleware/unreadMidlleware';
|
|
8
8
|
import { logoutMiddleware } from './Middleware/logoutMiddleware';
|
|
9
9
|
import { newMessageMidlleware } from './Middleware/newMessageMidlleware';
|
|
10
10
|
import { reactionsMiddleware } from './Middleware/reactionsMiddleware';
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
persistenceMiddleware,
|
|
13
|
+
readPersistedState,
|
|
14
|
+
computeBootTimeFailures,
|
|
15
|
+
} from './persistence';
|
|
12
16
|
|
|
13
17
|
const rootReducer = combineReducers({
|
|
14
18
|
chatSettingStore: chatSettingsReducer,
|
|
@@ -68,11 +72,12 @@ export const getActiveRoom = (state: RootState): IRoom | null => {
|
|
|
68
72
|
: null;
|
|
69
73
|
};
|
|
70
74
|
|
|
71
|
-
// Async rehydrate
|
|
75
|
+
// Async rehydrate: read persisted slices and replay them as standard
|
|
76
|
+
// actions.
|
|
72
77
|
export const persistorReady =
|
|
73
78
|
globalScope.__CHAT_PERSISTOR_READY__ ||
|
|
74
79
|
(globalScope.__CHAT_PERSISTOR_READY__ = (async () => {
|
|
75
|
-
const { chat, rooms } = await readPersistedState();
|
|
80
|
+
const { chat, rooms, heap } = await readPersistedState();
|
|
76
81
|
if (chat?.user && chat.user.walletAddress) {
|
|
77
82
|
store.dispatch(setUser(chat.user));
|
|
78
83
|
}
|
|
@@ -82,4 +87,35 @@ export const persistorReady =
|
|
|
82
87
|
store.dispatch(addRoom({ roomData: room as IRoom }));
|
|
83
88
|
}
|
|
84
89
|
}
|
|
90
|
+
|
|
91
|
+
// bug #39: restore failures that were already flagged (watchdog or
|
|
92
|
+
// an explicit send error) before the app was killed, so the bubble
|
|
93
|
+
// still shows "Failed / tap to retry" instead of quietly reverting
|
|
94
|
+
// to a normal sent bubble.
|
|
95
|
+
// Skip entries whose bubble no longer exists in the restored cache.
|
|
96
|
+
// A failure flag is only ever READ as `failedMessages[message.id]`,
|
|
97
|
+
// so one with no matching message is dead weight that would be
|
|
98
|
+
// replayed and re-persisted on every launch forever. This happens
|
|
99
|
+
// for real: a send that reached the server but whose echo was lost
|
|
100
|
+
// gets flagged failed at boot, then the history merge replaces the
|
|
101
|
+
// optimistic bubble with the archived copy under its server id (see
|
|
102
|
+
// mergeHistoryIntoCache), leaving the flag behind.
|
|
103
|
+
const restoredFailed = heap?.failedMessages || {};
|
|
104
|
+
for (const payload of Object.values(restoredFailed)) {
|
|
105
|
+
const stillRendered = (
|
|
106
|
+
rooms?.rooms?.[payload.roomJID]?.messages || []
|
|
107
|
+
).some((m) => m?.id === payload.id);
|
|
108
|
+
if (!stillRendered) {continue;}
|
|
109
|
+
store.dispatch(markMessageFailed(payload));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// bug #39: a message that was still `pending: true` at kill time
|
|
113
|
+
// never got a server echo AND never got the chance to trip the
|
|
114
|
+
// in-session send watchdog (messageHeap is process-lifetime only,
|
|
115
|
+
// never persisted). Treat every such message as failed so it gets
|
|
116
|
+
// a working retry instead of silently rendering as delivered.
|
|
117
|
+
const bootFailures = computeBootTimeFailures(rooms?.rooms, restoredFailed);
|
|
118
|
+
for (const payload of bootFailures) {
|
|
119
|
+
store.dispatch(markMessageFailed(payload));
|
|
120
|
+
}
|
|
85
121
|
})());
|
|
@@ -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 };
|