@ethora/chat-component-rn 26.10.5 → 26.10.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/README.md +18 -0
- package/app.plugin.js +2 -0
- package/lib/commonjs/assets/icons.js +2 -2
- package/lib/commonjs/assets/icons.js.map +1 -1
- package/lib/commonjs/components/MainComponents/AlbumGrid.js +152 -0
- package/lib/commonjs/components/MainComponents/AlbumGrid.js.map +1 -0
- package/lib/commonjs/components/MainComponents/ChatRoom.js +2 -2
- package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MediaMessage.js +199 -123
- package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MediaUploadOverlay.js +109 -0
- package/lib/commonjs/components/MainComponents/MediaUploadOverlay.js.map +1 -0
- package/lib/commonjs/components/MessageBubble/MediaCaption.js +51 -0
- package/lib/commonjs/components/MessageBubble/MediaCaption.js.map +1 -0
- package/lib/commonjs/components/MessageBubble/Message.js +40 -1
- package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/MessageInteractions.js +2 -1
- package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
- package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js +75 -0
- package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/LastMessageItem.js +20 -4
- package/lib/commonjs/components/RoomComponents/LastMessageItem.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastAudioMessage.js +3 -2
- package/lib/commonjs/components/RoomComponents/styled/LastAudioMessage.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js +3 -2
- package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js +3 -2
- package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js +3 -2
- package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
- package/lib/commonjs/components/Thread/ThreadWrapper.js +3 -2
- package/lib/commonjs/components/Thread/ThreadWrapper.js.map +1 -1
- package/lib/commonjs/components/styled/MediaFilePreview.js +60 -47
- package/lib/commonjs/components/styled/MediaFilePreview.js.map +1 -1
- package/lib/commonjs/components/styled/MessageImage.js +16 -6
- package/lib/commonjs/components/styled/MessageImage.js.map +1 -1
- package/lib/commonjs/components/styled/SendInput.js +99 -68
- package/lib/commonjs/components/styled/SendInput.js.map +1 -1
- package/lib/commonjs/components/styled/VideoMessage.js +24 -10
- package/lib/commonjs/components/styled/VideoMessage.js.map +1 -1
- package/lib/commonjs/context/xmppProvider.js +46 -0
- package/lib/commonjs/context/xmppProvider.js.map +1 -1
- package/lib/commonjs/e2ee/fileEnvelope.js +6 -0
- package/lib/commonjs/e2ee/fileEnvelope.js.map +1 -1
- package/lib/commonjs/e2ee/sealedBody.js +32 -2
- package/lib/commonjs/e2ee/sealedBody.js.map +1 -1
- package/lib/commonjs/helpers/albumLayout.js +150 -0
- package/lib/commonjs/helpers/albumLayout.js.map +1 -0
- package/lib/commonjs/helpers/attachments.js +255 -0
- package/lib/commonjs/helpers/attachments.js.map +1 -0
- package/lib/commonjs/helpers/caption.js +214 -0
- package/lib/commonjs/helpers/caption.js.map +1 -0
- package/lib/commonjs/helpers/createMainMessageForThread.js +5 -1
- package/lib/commonjs/helpers/createMainMessageForThread.js.map +1 -1
- package/lib/commonjs/helpers/createMessageFromXml.js +19 -5
- package/lib/commonjs/helpers/createMessageFromXml.js.map +1 -1
- package/lib/commonjs/helpers/fileKind.js +40 -0
- package/lib/commonjs/helpers/fileKind.js.map +1 -0
- package/lib/commonjs/helpers/getDataFromXml.js +6 -1
- package/lib/commonjs/helpers/getDataFromXml.js.map +1 -1
- package/lib/commonjs/helpers/mapWithConcurrency.js +41 -0
- package/lib/commonjs/helpers/mapWithConcurrency.js.map +1 -0
- package/lib/commonjs/helpers/mediaLimits.js +33 -0
- package/lib/commonjs/helpers/mediaLimits.js.map +1 -0
- package/lib/commonjs/helpers/mediaSendRetry.js +64 -0
- package/lib/commonjs/helpers/mediaSendRetry.js.map +1 -0
- package/lib/commonjs/helpers/mediaWireData.js +62 -0
- package/lib/commonjs/helpers/mediaWireData.js.map +1 -0
- package/lib/commonjs/helpers/mentionSpans.js +19 -0
- package/lib/commonjs/helpers/mentionSpans.js.map +1 -0
- package/lib/commonjs/helpers/mimeToExtension.js +45 -0
- package/lib/commonjs/helpers/mimeToExtension.js.map +1 -1
- package/lib/commonjs/helpers/readReceipts.js +173 -0
- package/lib/commonjs/helpers/readReceipts.js.map +1 -0
- package/lib/commonjs/helpers/repairFilenameEncoding.js +79 -0
- package/lib/commonjs/helpers/repairFilenameEncoding.js.map +1 -0
- package/lib/commonjs/helpers/safeJson.js +18 -0
- package/lib/commonjs/helpers/safeJson.js.map +1 -0
- package/lib/commonjs/helpers/secureStoreRuntime.js +10 -1
- package/lib/commonjs/helpers/secureStoreRuntime.js.map +1 -1
- package/lib/commonjs/hooks/useSendMessage.js +384 -193
- package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
- package/lib/commonjs/i18n/strings.js +96 -0
- package/lib/commonjs/i18n/strings.js.map +1 -1
- package/lib/commonjs/main.js +81 -0
- package/lib/commonjs/main.js.map +1 -1
- package/lib/commonjs/networking/api-requests/auth.api.js +62 -3
- package/lib/commonjs/networking/api-requests/auth.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/push.api.js +22 -7
- package/lib/commonjs/networking/api-requests/push.api.js.map +1 -1
- package/lib/commonjs/networking/stanzaHandlers.js +100 -3
- package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
- package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js +4 -2
- package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/sendDisplayedMarker.xmpp.js +28 -0
- package/lib/commonjs/networking/xmpp/sendDisplayedMarker.xmpp.js.map +1 -0
- package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js +53 -2
- package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/sendReceivedReceipt.xmpp.js +28 -0
- package/lib/commonjs/networking/xmpp/sendReceivedReceipt.xmpp.js.map +1 -0
- package/lib/commonjs/networking/xmppClient.js +64 -0
- package/lib/commonjs/networking/xmppClient.js.map +1 -1
- package/lib/commonjs/push/pushKeyStore.js +169 -0
- package/lib/commonjs/push/pushKeyStore.js.map +1 -0
- package/lib/commonjs/push/sealedBox.js +106 -0
- package/lib/commonjs/push/sealedBox.js.map +1 -0
- package/lib/commonjs/push/sealedPush.js +124 -0
- package/lib/commonjs/push/sealedPush.js.map +1 -0
- package/lib/commonjs/push/sealedPushTask.js +195 -0
- package/lib/commonjs/push/sealedPushTask.js.map +1 -0
- package/lib/commonjs/roomStore/persistence.js +78 -5
- package/lib/commonjs/roomStore/persistence.js.map +1 -1
- package/lib/commonjs/roomStore/roomHeapSlice.js +4 -0
- package/lib/commonjs/roomStore/roomHeapSlice.js.map +1 -1
- package/lib/commonjs/roomStore/roomsSlice.js +114 -1
- package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
- package/lib/commonjs/services/pushRegistration.js +12 -7
- package/lib/commonjs/services/pushRegistration.js.map +1 -1
- package/lib/commonjs/types/models/attachment.model.js +2 -0
- package/lib/commonjs/types/models/attachment.model.js.map +1 -0
- package/lib/commonjs/version.js +1 -1
- package/lib/module/assets/icons.js +1 -1
- package/lib/module/assets/icons.js.map +1 -1
- package/lib/module/components/MainComponents/AlbumGrid.js +146 -0
- package/lib/module/components/MainComponents/AlbumGrid.js.map +1 -0
- package/lib/module/components/MainComponents/ChatRoom.js +2 -2
- package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/module/components/MainComponents/MediaMessage.js +200 -124
- package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
- package/lib/module/components/MainComponents/MediaUploadOverlay.js +104 -0
- package/lib/module/components/MainComponents/MediaUploadOverlay.js.map +1 -0
- package/lib/module/components/MessageBubble/MediaCaption.js +46 -0
- package/lib/module/components/MessageBubble/MediaCaption.js.map +1 -0
- package/lib/module/components/MessageBubble/Message.js +44 -5
- package/lib/module/components/MessageBubble/Message.js.map +1 -1
- package/lib/module/components/MessageBubble/MessageInteractions.js +2 -1
- package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
- package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js +75 -0
- package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
- package/lib/module/components/RoomComponents/LastMessageItem.js +20 -4
- package/lib/module/components/RoomComponents/LastMessageItem.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastAudioMessage.js +3 -2
- package/lib/module/components/RoomComponents/styled/LastAudioMessage.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastMessageFile.js +3 -2
- package/lib/module/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js +3 -2
- package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastMessageVideo.js +3 -2
- package/lib/module/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
- package/lib/module/components/Thread/ThreadWrapper.js +3 -2
- package/lib/module/components/Thread/ThreadWrapper.js.map +1 -1
- package/lib/module/components/styled/MediaFilePreview.js +61 -48
- package/lib/module/components/styled/MediaFilePreview.js.map +1 -1
- package/lib/module/components/styled/MessageImage.js +16 -6
- package/lib/module/components/styled/MessageImage.js.map +1 -1
- package/lib/module/components/styled/SendInput.js +99 -68
- package/lib/module/components/styled/SendInput.js.map +1 -1
- package/lib/module/components/styled/VideoMessage.js +24 -10
- package/lib/module/components/styled/VideoMessage.js.map +1 -1
- package/lib/module/context/xmppProvider.js +46 -0
- package/lib/module/context/xmppProvider.js.map +1 -1
- package/lib/module/e2ee/fileEnvelope.js +1 -1
- package/lib/module/e2ee/fileEnvelope.js.map +1 -1
- package/lib/module/e2ee/sealedBody.js +32 -2
- package/lib/module/e2ee/sealedBody.js.map +1 -1
- package/lib/module/helpers/albumLayout.js +143 -0
- package/lib/module/helpers/albumLayout.js.map +1 -0
- package/lib/module/helpers/attachments.js +245 -0
- package/lib/module/helpers/attachments.js.map +1 -0
- package/lib/module/helpers/caption.js +207 -0
- package/lib/module/helpers/caption.js.map +1 -0
- package/lib/module/helpers/createMainMessageForThread.js +5 -1
- package/lib/module/helpers/createMainMessageForThread.js.map +1 -1
- package/lib/module/helpers/createMessageFromXml.js +20 -6
- package/lib/module/helpers/createMessageFromXml.js.map +1 -1
- package/lib/module/helpers/fileKind.js +34 -0
- package/lib/module/helpers/fileKind.js.map +1 -0
- package/lib/module/helpers/getDataFromXml.js +6 -1
- package/lib/module/helpers/getDataFromXml.js.map +1 -1
- package/lib/module/helpers/mapWithConcurrency.js +37 -0
- package/lib/module/helpers/mapWithConcurrency.js.map +1 -0
- package/lib/module/helpers/mediaLimits.js +27 -0
- package/lib/module/helpers/mediaLimits.js.map +1 -0
- package/lib/module/helpers/mediaSendRetry.js +55 -0
- package/lib/module/helpers/mediaSendRetry.js.map +1 -0
- package/lib/module/helpers/mediaWireData.js +58 -0
- package/lib/module/helpers/mediaWireData.js.map +1 -0
- package/lib/module/helpers/mentionSpans.js +14 -0
- package/lib/module/helpers/mentionSpans.js.map +1 -0
- package/lib/module/helpers/mimeToExtension.js +43 -0
- package/lib/module/helpers/mimeToExtension.js.map +1 -1
- package/lib/module/helpers/readReceipts.js +160 -0
- package/lib/module/helpers/readReceipts.js.map +1 -0
- package/lib/module/helpers/repairFilenameEncoding.js +74 -0
- package/lib/module/helpers/repairFilenameEncoding.js.map +1 -0
- package/lib/module/helpers/safeJson.js +13 -0
- package/lib/module/helpers/safeJson.js.map +1 -0
- package/lib/module/helpers/secureStoreRuntime.js +10 -1
- package/lib/module/helpers/secureStoreRuntime.js.map +1 -1
- package/lib/module/hooks/useSendMessage.js +387 -195
- package/lib/module/hooks/useSendMessage.js.map +1 -1
- package/lib/module/i18n/strings.js +96 -0
- package/lib/module/i18n/strings.js.map +1 -1
- package/lib/module/main.js +6 -0
- package/lib/module/main.js.map +1 -1
- package/lib/module/networking/api-requests/auth.api.js +62 -3
- package/lib/module/networking/api-requests/auth.api.js.map +1 -1
- package/lib/module/networking/api-requests/push.api.js +21 -6
- package/lib/module/networking/api-requests/push.api.js.map +1 -1
- package/lib/module/networking/stanzaHandlers.js +97 -4
- package/lib/module/networking/stanzaHandlers.js.map +1 -1
- package/lib/module/networking/xmpp/handleStanzas.xmpp.js +5 -3
- package/lib/module/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/sendDisplayedMarker.xmpp.js +25 -0
- package/lib/module/networking/xmpp/sendDisplayedMarker.xmpp.js.map +1 -0
- package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js +53 -2
- package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/sendReceivedReceipt.xmpp.js +25 -0
- package/lib/module/networking/xmpp/sendReceivedReceipt.xmpp.js.map +1 -0
- package/lib/module/networking/xmppClient.js +64 -0
- package/lib/module/networking/xmppClient.js.map +1 -1
- package/lib/module/push/pushKeyStore.js +159 -0
- package/lib/module/push/pushKeyStore.js.map +1 -0
- package/lib/module/push/sealedBox.js +97 -0
- package/lib/module/push/sealedBox.js.map +1 -0
- package/lib/module/push/sealedPush.js +117 -0
- package/lib/module/push/sealedPush.js.map +1 -0
- package/lib/module/push/sealedPushTask.js +187 -0
- package/lib/module/push/sealedPushTask.js.map +1 -0
- package/lib/module/roomStore/persistence.js +78 -5
- package/lib/module/roomStore/persistence.js.map +1 -1
- package/lib/module/roomStore/roomHeapSlice.js +4 -0
- package/lib/module/roomStore/roomHeapSlice.js.map +1 -1
- package/lib/module/roomStore/roomsSlice.js +109 -0
- package/lib/module/roomStore/roomsSlice.js.map +1 -1
- package/lib/module/services/pushRegistration.js +12 -7
- package/lib/module/services/pushRegistration.js.map +1 -1
- package/lib/module/types/models/attachment.model.js +2 -0
- package/lib/module/types/models/attachment.model.js.map +1 -0
- package/lib/module/version.js +1 -1
- package/lib/typescript/assets/icons.d.ts +6 -1
- package/lib/typescript/assets/icons.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/AlbumGrid.d.ts +21 -0
- package/lib/typescript/components/MainComponents/AlbumGrid.d.ts.map +1 -0
- package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MediaUploadOverlay.d.ts +17 -0
- package/lib/typescript/components/MainComponents/MediaUploadOverlay.d.ts.map +1 -0
- package/lib/typescript/components/MessageBubble/MediaCaption.d.ts +12 -0
- package/lib/typescript/components/MessageBubble/MediaCaption.d.ts.map +1 -0
- 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/Modals/FilePreviewModal/FilePreviewModal.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/LastMessageItem.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastAudioMessage.d.ts +2 -0
- package/lib/typescript/components/RoomComponents/styled/LastAudioMessage.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessageFile.d.ts +2 -0
- package/lib/typescript/components/RoomComponents/styled/LastMessageFile.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessagePhoto.d.ts +2 -0
- package/lib/typescript/components/RoomComponents/styled/LastMessagePhoto.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessageVideo.d.ts +2 -0
- package/lib/typescript/components/RoomComponents/styled/LastMessageVideo.d.ts.map +1 -1
- package/lib/typescript/components/Thread/ThreadWrapper.d.ts.map +1 -1
- package/lib/typescript/components/styled/MediaFilePreview.d.ts.map +1 -1
- package/lib/typescript/components/styled/MessageImage.d.ts +10 -0
- package/lib/typescript/components/styled/MessageImage.d.ts.map +1 -1
- package/lib/typescript/components/styled/SendInput.d.ts +7 -1
- package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
- package/lib/typescript/components/styled/VideoMessage.d.ts +7 -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/e2ee/fileEnvelope.d.ts +1 -1
- package/lib/typescript/e2ee/fileEnvelope.d.ts.map +1 -1
- package/lib/typescript/e2ee/sealedBody.d.ts +16 -0
- package/lib/typescript/e2ee/sealedBody.d.ts.map +1 -1
- package/lib/typescript/helpers/albumLayout.d.ts +66 -0
- package/lib/typescript/helpers/albumLayout.d.ts.map +1 -0
- package/lib/typescript/helpers/attachments.d.ts +55 -0
- package/lib/typescript/helpers/attachments.d.ts.map +1 -0
- package/lib/typescript/helpers/caption.d.ts +64 -0
- package/lib/typescript/helpers/caption.d.ts.map +1 -0
- package/lib/typescript/helpers/createMainMessageForThread.d.ts.map +1 -1
- package/lib/typescript/helpers/createMessageFromXml.d.ts.map +1 -1
- package/lib/typescript/helpers/fileKind.d.ts +20 -0
- package/lib/typescript/helpers/fileKind.d.ts.map +1 -0
- package/lib/typescript/helpers/getDataFromXml.d.ts.map +1 -1
- package/lib/typescript/helpers/mapWithConcurrency.d.ts +9 -0
- package/lib/typescript/helpers/mapWithConcurrency.d.ts.map +1 -0
- package/lib/typescript/helpers/mediaLimits.d.ts +13 -0
- package/lib/typescript/helpers/mediaLimits.d.ts.map +1 -0
- package/lib/typescript/helpers/mediaSendRetry.d.ts +26 -0
- package/lib/typescript/helpers/mediaSendRetry.d.ts.map +1 -0
- package/lib/typescript/helpers/mediaWireData.d.ts +16 -0
- package/lib/typescript/helpers/mediaWireData.d.ts.map +1 -0
- package/lib/typescript/helpers/mentionSpans.d.ts +8 -0
- package/lib/typescript/helpers/mentionSpans.d.ts.map +1 -0
- package/lib/typescript/helpers/mimeToExtension.d.ts +7 -0
- package/lib/typescript/helpers/mimeToExtension.d.ts.map +1 -1
- package/lib/typescript/helpers/readReceipts.d.ts +82 -0
- package/lib/typescript/helpers/readReceipts.d.ts.map +1 -0
- package/lib/typescript/helpers/repairFilenameEncoding.d.ts +12 -0
- package/lib/typescript/helpers/repairFilenameEncoding.d.ts.map +1 -0
- package/lib/typescript/helpers/safeJson.d.ts +2 -0
- package/lib/typescript/helpers/safeJson.d.ts.map +1 -0
- package/lib/typescript/helpers/secureStoreRuntime.d.ts +17 -3
- package/lib/typescript/helpers/secureStoreRuntime.d.ts.map +1 -1
- package/lib/typescript/hooks/useSendMessage.d.ts +2 -1
- package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
- package/lib/typescript/i18n/strings.d.ts.map +1 -1
- package/lib/typescript/main.d.ts +6 -0
- package/lib/typescript/main.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/auth.api.d.ts +2 -0
- package/lib/typescript/networking/api-requests/auth.api.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/push.api.d.ts +14 -2
- package/lib/typescript/networking/api-requests/push.api.d.ts.map +1 -1
- package/lib/typescript/networking/stanzaHandlers.d.ts +7 -3
- package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/sendDisplayedMarker.xmpp.d.ts +3 -0
- package/lib/typescript/networking/xmpp/sendDisplayedMarker.xmpp.d.ts.map +1 -0
- package/lib/typescript/networking/xmpp/sendMediaMessage.xmpp.d.ts +12 -0
- package/lib/typescript/networking/xmpp/sendMediaMessage.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/sendReceivedReceipt.xmpp.d.ts +3 -0
- package/lib/typescript/networking/xmpp/sendReceivedReceipt.xmpp.d.ts.map +1 -0
- package/lib/typescript/networking/xmppClient.d.ts +15 -0
- package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
- package/lib/typescript/push/pushKeyStore.d.ts +35 -0
- package/lib/typescript/push/pushKeyStore.d.ts.map +1 -0
- package/lib/typescript/push/sealedBox.d.ts +24 -0
- package/lib/typescript/push/sealedBox.d.ts.map +1 -0
- package/lib/typescript/push/sealedPush.d.ts +61 -0
- package/lib/typescript/push/sealedPush.d.ts.map +1 -0
- package/lib/typescript/push/sealedPushTask.d.ts +33 -0
- package/lib/typescript/push/sealedPushTask.d.ts.map +1 -0
- package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
- package/lib/typescript/roomStore/roomHeapSlice.d.ts +22 -1
- package/lib/typescript/roomStore/roomHeapSlice.d.ts.map +1 -1
- package/lib/typescript/roomStore/roomsSlice.d.ts +67 -3
- package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
- package/lib/typescript/services/pushRegistration.d.ts +8 -0
- package/lib/typescript/services/pushRegistration.d.ts.map +1 -1
- package/lib/typescript/types/models/attachment.model.d.ts +52 -0
- package/lib/typescript/types/models/attachment.model.d.ts.map +1 -0
- package/lib/typescript/types/models/message.model.d.ts +26 -0
- package/lib/typescript/types/models/message.model.d.ts.map +1 -1
- package/lib/typescript/types/models/modal.model.d.ts +7 -0
- package/lib/typescript/types/models/modal.model.d.ts.map +1 -1
- package/lib/typescript/types/models/room.model.d.ts +2 -0
- package/lib/typescript/types/models/room.model.d.ts.map +1 -1
- package/lib/typescript/types/types.d.ts +35 -1
- package/lib/typescript/types/types.d.ts.map +1 -1
- package/lib/typescript/version.d.ts +1 -1
- package/package.json +14 -1
- package/plugins/notification-service/Info.plist +31 -0
- package/plugins/notification-service/NotificationService.swift +195 -0
- package/plugins/notification-service/SealedBox.swift +355 -0
- package/plugins/notification-service/check/gen-vectors.mjs +24 -0
- package/plugins/notification-service/check/main.swift +37 -0
- package/plugins/notification-service/check/run.sh +12 -0
- package/plugins/notification-service/check/vectors.json +1 -0
- package/plugins/withNotificationServiceExtension.js +189 -0
- package/src/assets/icons.tsx +20 -2
- package/src/components/MainComponents/AlbumGrid.tsx +183 -0
- package/src/components/MainComponents/ChatRoom.tsx +4 -2
- package/src/components/MainComponents/MediaMessage.tsx +246 -130
- package/src/components/MainComponents/MediaUploadOverlay.tsx +102 -0
- package/src/components/MessageBubble/MediaCaption.tsx +45 -0
- package/src/components/MessageBubble/Message.tsx +71 -3
- package/src/components/MessageBubble/MessageInteractions.tsx +2 -1
- package/src/components/Modals/FilePreviewModal/FilePreviewModal.tsx +64 -0
- package/src/components/RoomComponents/LastMessageItem.tsx +15 -4
- package/src/components/RoomComponents/styled/LastAudioMessage.tsx +6 -3
- package/src/components/RoomComponents/styled/LastMessageFile.tsx +6 -2
- package/src/components/RoomComponents/styled/LastMessagePhoto.tsx +6 -2
- package/src/components/RoomComponents/styled/LastMessageVideo.tsx +6 -2
- package/src/components/Thread/ThreadWrapper.tsx +5 -9
- package/src/components/styled/MediaFilePreview.tsx +49 -34
- package/src/components/styled/MessageImage.tsx +21 -5
- package/src/components/styled/SendInput.tsx +101 -87
- package/src/components/styled/VideoMessage.tsx +34 -9
- package/src/context/xmppProvider.tsx +32 -0
- package/src/e2ee/fileEnvelope.ts +1 -1
- package/src/e2ee/sealedBody.ts +44 -5
- package/src/helpers/albumLayout.ts +207 -0
- package/src/helpers/attachments.ts +316 -0
- package/src/helpers/caption.ts +283 -0
- package/src/helpers/createMainMessageForThread.ts +6 -1
- package/src/helpers/createMessageFromXml.ts +21 -5
- package/src/helpers/fileKind.ts +38 -0
- package/src/helpers/getDataFromXml.ts +5 -1
- package/src/helpers/mapWithConcurrency.ts +32 -0
- package/src/helpers/mediaLimits.ts +27 -0
- package/src/helpers/mediaSendRetry.ts +59 -0
- package/src/helpers/mediaWireData.ts +57 -0
- package/src/helpers/mentionSpans.ts +17 -0
- package/src/helpers/mimeToExtension.ts +51 -0
- package/src/helpers/readReceipts.ts +219 -0
- package/src/helpers/repairFilenameEncoding.ts +82 -0
- package/src/helpers/safeJson.ts +11 -0
- package/src/helpers/secureStoreRuntime.ts +21 -3
- package/src/hooks/useSendMessage.tsx +448 -249
- package/src/i18n/strings.ts +96 -0
- package/src/main.ts +30 -0
- package/src/networking/api-requests/auth.api.ts +60 -3
- package/src/networking/api-requests/push.api.ts +29 -4
- package/src/networking/stanzaHandlers.ts +91 -2
- package/src/networking/xmpp/handleStanzas.xmpp.ts +6 -2
- package/src/networking/xmpp/sendDisplayedMarker.xmpp.ts +31 -0
- package/src/networking/xmpp/sendMediaMessage.xmpp.ts +60 -3
- package/src/networking/xmpp/sendReceivedReceipt.xmpp.ts +31 -0
- package/src/networking/xmppClient.ts +48 -0
- package/src/push/pushKeyStore.ts +163 -0
- package/src/push/sealedBox.ts +104 -0
- package/src/push/sealedPush.ts +127 -0
- package/src/push/sealedPushTask.ts +175 -0
- package/src/roomStore/persistence.ts +94 -3
- package/src/roomStore/roomHeapSlice.ts +23 -1
- package/src/roomStore/roomsSlice.ts +112 -1
- package/src/services/pushRegistration.ts +25 -5
- package/src/types/models/attachment.model.ts +51 -0
- package/src/types/models/message.model.ts +29 -0
- package/src/types/models/modal.model.ts +7 -0
- package/src/types/models/room.model.ts +2 -0
- package/src/types/types.ts +41 -1
- package/src/version.ts +1 -1
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import type { IMessage, IRoom } from '../types/types';
|
|
2
|
+
import { msgSortableMs } from './msgSortableMs';
|
|
3
|
+
import { isOwnMessage } from './isOwnMessage';
|
|
4
|
+
import { createUserNameFromSetUser } from './createUserNameFromSetUser';
|
|
5
|
+
|
|
6
|
+
// Delivery (XEP-0184) and read (XEP-0333) state for the reader's own messages.
|
|
7
|
+
// Pure helpers: the reducers, the stanza handlers, the flush that sends the
|
|
8
|
+
// read watermark and the bubble all read the same rules from here.
|
|
9
|
+
//
|
|
10
|
+
// Receipts are session-only. receivedBy / lastDisplayedByUser are never
|
|
11
|
+
// written to disk (see persistence.ts), so after a reload every own message
|
|
12
|
+
// falls back to "sent" until the peers acknowledge again.
|
|
13
|
+
|
|
14
|
+
export type ReceiptStatus = 'sent' | 'delivered' | 'seen';
|
|
15
|
+
|
|
16
|
+
/** Names listed in a "Read by" / "Delivered to" sheet before the rest become "+N". */
|
|
17
|
+
export const RECEIPT_NAME_LIMIT = 5;
|
|
18
|
+
|
|
19
|
+
const NO_VIEWERS: string[] = [];
|
|
20
|
+
|
|
21
|
+
/** Stanza ids of the receipt and marker frames (never chat messages). */
|
|
22
|
+
export const isReceiptMarkerId = (id: unknown): boolean => {
|
|
23
|
+
const value = String(id ?? '');
|
|
24
|
+
return value.startsWith('message-received') || value.startsWith('message-displayed');
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// A message the reader can be shown as displayed: not an optimistic send,
|
|
28
|
+
// not the "New messages" divider, not a client-only call-log row.
|
|
29
|
+
const isDisplayableForReceipts = (message: IMessage | undefined | null): boolean => {
|
|
30
|
+
if (!message) return false;
|
|
31
|
+
if (message.pending) return false;
|
|
32
|
+
if (message.id === 'delimiter-new') return false;
|
|
33
|
+
if (String(message.id || '').startsWith('calllog-')) return false;
|
|
34
|
+
return true;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* The message id that becomes this reader's read watermark, or null when
|
|
39
|
+
* nothing should be sent: no displayable message, the newest message is the
|
|
40
|
+
* reader's own (nothing to report), or a read boundary (the reader scrolled
|
|
41
|
+
* up) sits before every message. With a boundary the watermark is the newest
|
|
42
|
+
* message at or before it, so a scrolled-up reader never claims messages they
|
|
43
|
+
* did not reach.
|
|
44
|
+
*/
|
|
45
|
+
export const getReadWatermarkMessageId = (
|
|
46
|
+
room: Pick<IRoom, 'messages'> | null | undefined,
|
|
47
|
+
selfXmppUsername: string,
|
|
48
|
+
boundaryTs?: number | null
|
|
49
|
+
): string | null => {
|
|
50
|
+
if (!selfXmppUsername) return null;
|
|
51
|
+
const messages = (room?.messages || []).filter(isDisplayableForReceipts);
|
|
52
|
+
if (messages.length === 0) return null;
|
|
53
|
+
const newest = messages[messages.length - 1];
|
|
54
|
+
if (isOwnMessage(newest, selfXmppUsername)) return null;
|
|
55
|
+
if (typeof boundaryTs === 'number' && boundaryTs > 0) {
|
|
56
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
57
|
+
if (msgSortableMs(messages[i]) <= boundaryTs) return String(messages[i].id);
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
return String(newest.id);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/** The slice of the redux state the receipt rules read. */
|
|
65
|
+
export interface ReceiptStoreState {
|
|
66
|
+
chatSettingStore?: {
|
|
67
|
+
config?: { disableLastRead?: boolean; disableReadReceipts?: boolean } | null;
|
|
68
|
+
user?: { xmppUsername?: string | null; walletAddress?: string | null } | null;
|
|
69
|
+
} | null;
|
|
70
|
+
rooms: {
|
|
71
|
+
rooms: Record<string, IRoom>;
|
|
72
|
+
visibleRoomJID: string | null;
|
|
73
|
+
jumpWindow: { roomJID: string } | null;
|
|
74
|
+
readBoundaries: Record<string, number>;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// The reader's identity as the message list resolves it (xmppUsername, then
|
|
79
|
+
// walletAddress), so the watermark and the bubble agree on "own".
|
|
80
|
+
export const selfIdentity = (state: ReceiptStoreState): string =>
|
|
81
|
+
state.chatSettingStore?.user?.xmppUsername || state.chatSettingStore?.user?.walletAddress || '';
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Watermark to send for `roomJid` right now, or null. Sends only while the
|
|
85
|
+
* room is the one on screen, never while an old-history jump window is open,
|
|
86
|
+
* and never when read markers are switched off (`disableLastRead` or
|
|
87
|
+
* `disableReadReceipts`).
|
|
88
|
+
*/
|
|
89
|
+
export const computeReadWatermark = (
|
|
90
|
+
state: ReceiptStoreState,
|
|
91
|
+
roomJid: string
|
|
92
|
+
): string | null => {
|
|
93
|
+
if (!roomJid) return null;
|
|
94
|
+
const config = state.chatSettingStore?.config;
|
|
95
|
+
if (config?.disableLastRead || config?.disableReadReceipts) return null;
|
|
96
|
+
const rooms = state.rooms;
|
|
97
|
+
if (rooms.visibleRoomJID !== roomJid) return null;
|
|
98
|
+
if (rooms.jumpWindow?.roomJID === roomJid) return null;
|
|
99
|
+
return getReadWatermarkMessageId(
|
|
100
|
+
rooms.rooms?.[roomJid],
|
|
101
|
+
selfIdentity(state),
|
|
102
|
+
rooms.readBoundaries?.[roomJid] ?? null
|
|
103
|
+
);
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Other occupants whose read watermark sits at or after `messageId` in the
|
|
108
|
+
* room's list. Returns the shared empty array when there are none, so the
|
|
109
|
+
* selector result stays shallow-equal between store updates.
|
|
110
|
+
*/
|
|
111
|
+
export const viewersAtOrAfter = (
|
|
112
|
+
room: Pick<IRoom, 'messages' | 'lastDisplayedByUser'> | null | undefined,
|
|
113
|
+
messageId: string,
|
|
114
|
+
selfXmppUsername: string
|
|
115
|
+
): string[] => {
|
|
116
|
+
const watermark = room?.lastDisplayedByUser;
|
|
117
|
+
const messages = room?.messages;
|
|
118
|
+
if (!watermark || !messages || messages.length === 0 || !messageId) return NO_VIEWERS;
|
|
119
|
+
const viewers = Object.keys(watermark).filter(
|
|
120
|
+
(xmppUsername) => xmppUsername !== selfXmppUsername
|
|
121
|
+
);
|
|
122
|
+
if (viewers.length === 0) return NO_VIEWERS;
|
|
123
|
+
const indexOf = (id: string): number => {
|
|
124
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
125
|
+
if (messages[i].id === id) return i;
|
|
126
|
+
}
|
|
127
|
+
return -1;
|
|
128
|
+
};
|
|
129
|
+
const thisIndex = indexOf(messageId);
|
|
130
|
+
if (thisIndex === -1) return NO_VIEWERS;
|
|
131
|
+
const seen = viewers.filter((xmppUsername) => {
|
|
132
|
+
const displayedIndex = indexOf(watermark[xmppUsername]);
|
|
133
|
+
return displayedIndex !== -1 && displayedIndex >= thisIndex;
|
|
134
|
+
});
|
|
135
|
+
return seen.length > 0 ? seen : NO_VIEWERS;
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
/** Selector form of viewersAtOrAfter, keyed by room and message. */
|
|
139
|
+
export const selectSeenBy = (
|
|
140
|
+
state: { rooms: { rooms: Record<string, IRoom> } },
|
|
141
|
+
roomJid: string,
|
|
142
|
+
messageId: string,
|
|
143
|
+
selfXmppUsername: string
|
|
144
|
+
): string[] =>
|
|
145
|
+
viewersAtOrAfter(state.rooms.rooms?.[roomJid], messageId, selfXmppUsername);
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* sent / delivered / seen for one of the reader's own messages. "seen" wins
|
|
149
|
+
* over "delivered", which wins over "sent". Only other occupants count.
|
|
150
|
+
*/
|
|
151
|
+
export const deliveredToOthers = (
|
|
152
|
+
message: Pick<IMessage, 'receivedBy'>,
|
|
153
|
+
selfXmppUsername: string
|
|
154
|
+
): string[] =>
|
|
155
|
+
Object.keys(message.receivedBy || {}).filter(
|
|
156
|
+
(xmppUsername) => xmppUsername !== selfXmppUsername
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
export const statusOf = (seenBy: string[], deliveredTo: string[]): ReceiptStatus =>
|
|
160
|
+
seenBy.length > 0 ? 'seen' : deliveredTo.length > 0 ? 'delivered' : 'sent';
|
|
161
|
+
|
|
162
|
+
export const getReceiptStatus = (
|
|
163
|
+
message: Pick<IMessage, 'id' | 'receivedBy'>,
|
|
164
|
+
room: Pick<IRoom, 'messages' | 'lastDisplayedByUser'> | null | undefined,
|
|
165
|
+
selfXmppUsername: string
|
|
166
|
+
): { status: ReceiptStatus; seenBy: string[]; deliveredTo: string[] } => {
|
|
167
|
+
const deliveredTo = deliveredToOthers(message, selfXmppUsername);
|
|
168
|
+
const seenBy = viewersAtOrAfter(room, String(message.id), selfXmppUsername);
|
|
169
|
+
return { status: statusOf(seenBy, deliveredTo), seenBy, deliveredTo };
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
/** Display name for a receipt entry: usersSet first, the raw username as the last resort. */
|
|
173
|
+
export const receiptNameFor = (
|
|
174
|
+
usersSet: Record<string, any> | undefined,
|
|
175
|
+
xmppUsername: string
|
|
176
|
+
): string => {
|
|
177
|
+
const name = createUserNameFromSetUser(usersSet || {}, xmppUsername);
|
|
178
|
+
return name && name !== 'Deleted User' ? name : xmppUsername;
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
const formatNames = (names: string[]): string => {
|
|
182
|
+
const shown = names.slice(0, RECEIPT_NAME_LIMIT);
|
|
183
|
+
const extra = names.length - shown.length;
|
|
184
|
+
return extra > 0 ? `${shown.join(', ')} +${extra}` : shown.join(', ');
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Text for the tick's details sheet. Groups name the readers or recipients
|
|
189
|
+
* (capped, then "+N"); a 1:1 room only says Read / Delivered.
|
|
190
|
+
*/
|
|
191
|
+
export const describeReceipt = ({
|
|
192
|
+
status,
|
|
193
|
+
isGroup,
|
|
194
|
+
seenBy,
|
|
195
|
+
deliveredTo,
|
|
196
|
+
nameOf,
|
|
197
|
+
t,
|
|
198
|
+
}: {
|
|
199
|
+
status: ReceiptStatus;
|
|
200
|
+
isGroup: boolean;
|
|
201
|
+
seenBy: string[];
|
|
202
|
+
deliveredTo: string[];
|
|
203
|
+
nameOf: (xmppUsername: string) => string;
|
|
204
|
+
t: (key: string, vars?: Record<string, string | number>) => string;
|
|
205
|
+
}): string => {
|
|
206
|
+
if (status === 'seen') {
|
|
207
|
+
return isGroup
|
|
208
|
+
? t('message.receipt.readBy', { names: formatNames(seenBy.map(nameOf)) })
|
|
209
|
+
: t('message.receipt.read');
|
|
210
|
+
}
|
|
211
|
+
if (status === 'delivered') {
|
|
212
|
+
return isGroup
|
|
213
|
+
? t('message.receipt.deliveredTo', {
|
|
214
|
+
names: formatNames(deliveredTo.map(nameOf)),
|
|
215
|
+
})
|
|
216
|
+
: t('message.receipt.delivered');
|
|
217
|
+
}
|
|
218
|
+
return t('message.receipt.sent');
|
|
219
|
+
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repairs file names the backend returns as UTF-8 bytes read as Latin-1
|
|
3
|
+
* (the classic multer/busboy `originalname` problem): "Список.pdf" arrives
|
|
4
|
+
* as "СпиÑок.pdf".
|
|
5
|
+
*
|
|
6
|
+
* Pure and conservative: a name is only replaced when every character fits
|
|
7
|
+
* in one byte, the bytes decode as strict UTF-8, the result differs, holds
|
|
8
|
+
* no replacement or control characters and contains at least one letter
|
|
9
|
+
* outside basic Latin. A correct name is returned untouched.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const hasMultiByteSignature = (value: string): boolean =>
|
|
13
|
+
// UTF-8 lead bytes C2-F4 followed by a continuation byte 80-BF.
|
|
14
|
+
/[Â-ô][\u0080-¿]/.test(value);
|
|
15
|
+
|
|
16
|
+
const looksLikePercentEncoded = (value: string): boolean =>
|
|
17
|
+
/%[0-9A-Fa-f]{2}/.test(value);
|
|
18
|
+
|
|
19
|
+
// C0 controls, DEL and the C1 range, checked per UTF-16 code unit.
|
|
20
|
+
const hasControlChars = (value: string): boolean => {
|
|
21
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
22
|
+
const code = value.charCodeAt(i);
|
|
23
|
+
if (code < 0x20 || (code >= 0x7f && code <= 0x9f)) return true;
|
|
24
|
+
}
|
|
25
|
+
return false;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// Any code unit above ASCII (same as the former [^\u0000-\u007F] test).
|
|
29
|
+
const hasNonAscii = (value: string): boolean => /[\u0080-\uFFFF]/.test(value);
|
|
30
|
+
|
|
31
|
+
const decodeLatin1AsUtf8 = (value: string): string | null => {
|
|
32
|
+
if (typeof TextDecoder === 'undefined') return null;
|
|
33
|
+
const bytes = new Uint8Array(value.length);
|
|
34
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
35
|
+
const code = value.charCodeAt(i);
|
|
36
|
+
if (code > 0xff) return null;
|
|
37
|
+
bytes[i] = code;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
return new TextDecoder('utf-8', { fatal: true }).decode(bytes);
|
|
41
|
+
} catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const isPlausibleRepair = (original: string, repaired: string): boolean =>
|
|
47
|
+
repaired !== original &&
|
|
48
|
+
!repaired.includes('�') &&
|
|
49
|
+
!hasControlChars(repaired) &&
|
|
50
|
+
// Must contain a letter from a non-Latin-1 script or a real accented
|
|
51
|
+
// letter, otherwise the "fix" is just noise.
|
|
52
|
+
hasNonAscii(repaired) &&
|
|
53
|
+
/\p{L}/u.test(repaired);
|
|
54
|
+
|
|
55
|
+
const tryPercentDecode = (value: string): string => {
|
|
56
|
+
if (!looksLikePercentEncoded(value)) return value;
|
|
57
|
+
try {
|
|
58
|
+
const decoded = decodeURIComponent(value);
|
|
59
|
+
return hasControlChars(decoded) || decoded.includes('�') ? value : decoded;
|
|
60
|
+
} catch {
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export const repairFilenameEncoding = (name: string): string => {
|
|
66
|
+
if (typeof name !== 'string' || name === '') return name;
|
|
67
|
+
|
|
68
|
+
let current = name;
|
|
69
|
+
|
|
70
|
+
// Percent-encoded names ("%D0%A1...") first; they may also be mojibake
|
|
71
|
+
// after decoding, so run the byte repair on the result.
|
|
72
|
+
const unescaped = tryPercentDecode(current);
|
|
73
|
+
if (unescaped !== current && hasNonAscii(unescaped)) {
|
|
74
|
+
current = unescaped;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (!hasMultiByteSignature(current)) return current;
|
|
78
|
+
|
|
79
|
+
const repaired = decodeLatin1AsUtf8(current);
|
|
80
|
+
if (repaired !== null && isPlausibleRepair(current, repaired)) return repaired;
|
|
81
|
+
return current;
|
|
82
|
+
};
|
|
@@ -12,10 +12,25 @@
|
|
|
12
12
|
* AsyncStorage rather than crash (see `secureKeyValue.ts`).
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
+
/**
|
|
16
|
+
* The subset of expo-secure-store's options the SDK uses. `keychainService`
|
|
17
|
+
* must be repeated on every read of an item written with it; the
|
|
18
|
+
* accessibility constants come from `SecureStoreRuntime.accessible`.
|
|
19
|
+
*/
|
|
20
|
+
export interface SecureStoreOptions {
|
|
21
|
+
keychainService?: string;
|
|
22
|
+
/** iOS only: one of `accessible`; ignored on Android. */
|
|
23
|
+
keychainAccessible?: unknown;
|
|
24
|
+
}
|
|
25
|
+
|
|
15
26
|
export interface SecureStoreRuntime {
|
|
16
|
-
getItemAsync: (key: string) => Promise<string | null>;
|
|
17
|
-
setItemAsync: (key: string, value: string) => Promise<void>;
|
|
18
|
-
deleteItemAsync: (key: string) => Promise<void>;
|
|
27
|
+
getItemAsync: (key: string, options?: SecureStoreOptions) => Promise<string | null>;
|
|
28
|
+
setItemAsync: (key: string, value: string, options?: SecureStoreOptions) => Promise<void>;
|
|
29
|
+
deleteItemAsync: (key: string, options?: SecureStoreOptions) => Promise<void>;
|
|
30
|
+
/** expo-secure-store's iOS keychain accessibility constants (undefined on older versions). */
|
|
31
|
+
accessible: {
|
|
32
|
+
afterFirstUnlockThisDeviceOnly?: unknown;
|
|
33
|
+
};
|
|
19
34
|
}
|
|
20
35
|
|
|
21
36
|
let cached: SecureStoreRuntime | null | undefined;
|
|
@@ -45,6 +60,9 @@ export const loadSecureStore = (): SecureStoreRuntime | null => {
|
|
|
45
60
|
getItemAsync: mod.getItemAsync,
|
|
46
61
|
setItemAsync: mod.setItemAsync,
|
|
47
62
|
deleteItemAsync: mod.deleteItemAsync,
|
|
63
|
+
accessible: {
|
|
64
|
+
afterFirstUnlockThisDeviceOnly: mod.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY,
|
|
65
|
+
},
|
|
48
66
|
};
|
|
49
67
|
}
|
|
50
68
|
} catch {
|