From 6d5ebdeaa1777f31878b6e7d4dfc33fe83abc9fc Mon Sep 17 00:00:00 2001 From: Aman Harwara Date: Tue, 27 Sep 2022 12:24:44 +0530 Subject: [PATCH] fix: export/sharing notes on mobile webview (#1644) --- ...share-npm-7.9.0-b553614939-8eb2f5b4be.zip} | Bin 130976 -> 135977 bytes packages/mobile/package.json | 2 +- packages/mobile/src/AppStack.tsx | 6 +- packages/mobile/src/Lib/Interface.ts | 91 +++++++++++++++++- packages/mobile/src/MobileWebAppContainer.tsx | 1 + .../Domain/Device/MobileDeviceInterface.ts | 5 +- .../ui-services/src/Archive/ArchiveManager.ts | 13 ++- .../Application/ApplicationGroup.ts | 2 +- .../src/javascripts/Components/Icon/Icon.tsx | 1 + .../NotesContextMenu/NotesContextMenu.tsx | 2 +- .../Components/NotesOptions/NotesOptions.tsx | 43 +++++---- .../NotesOptions/NotesOptionsPanel.tsx | 2 +- .../web/src/javascripts/Constants/Strings.ts | 2 +- .../DownloadSelectedItemsOnAndroid.tsx | 67 +++++++++++++ .../NativeMobileWeb/ShareSelectedItems.tsx | 36 +++++++ .../src/javascripts/Utils/NoteExportUtils.ts | 36 +++++++ packages/web/src/javascripts/Utils/Utils.ts | 22 ++++- yarn.lock | 10 +- 18 files changed, 298 insertions(+), 43 deletions(-) rename .yarn/cache/{react-native-share-npm-7.6.4-d44b48b702-2276435473.zip => react-native-share-npm-7.9.0-b553614939-8eb2f5b4be.zip} (52%) create mode 100644 packages/web/src/javascripts/NativeMobileWeb/DownloadSelectedItemsOnAndroid.tsx create mode 100644 packages/web/src/javascripts/NativeMobileWeb/ShareSelectedItems.tsx create mode 100644 packages/web/src/javascripts/Utils/NoteExportUtils.ts diff --git a/.yarn/cache/react-native-share-npm-7.6.4-d44b48b702-2276435473.zip b/.yarn/cache/react-native-share-npm-7.9.0-b553614939-8eb2f5b4be.zip similarity index 52% rename from .yarn/cache/react-native-share-npm-7.6.4-d44b48b702-2276435473.zip rename to .yarn/cache/react-native-share-npm-7.9.0-b553614939-8eb2f5b4be.zip index 1da2a1a47c95ccab985040d1838af71f247a897f..41ee9e47cb0fb9e56df1d6ecca3da6b4dccefdc2 100644 GIT binary patch delta 47324 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 delta 43065 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 MJX5vs{T) = [application], ) - if (!application) { - return null - } - - const shouldOpenWebApp = application.getValue(AlwaysOpenWebAppOnLaunchKey, StorageValueModes.Nonwrapped) as boolean + const shouldOpenWebApp = application?.getValue(AlwaysOpenWebAppOnLaunchKey, StorageValueModes.Nonwrapped) as boolean if (IsMobileWeb || shouldOpenWebApp) { return ( diff --git a/packages/mobile/src/Lib/Interface.ts b/packages/mobile/src/Lib/Interface.ts index aa5b840de..7c1151283 100644 --- a/packages/mobile/src/Lib/Interface.ts +++ b/packages/mobile/src/Lib/Interface.ts @@ -7,16 +7,27 @@ import { LegacyRawKeychainValue, MobileDeviceInterface, NamespacedRootKeyInKeychain, + Platform as SNPlatform, RawKeychainValue, removeFromArray, TransferPayload, } from '@standardnotes/snjs' -import { Alert, Linking, Platform, StatusBar } from 'react-native' +import { Alert, Linking, PermissionsAndroid, Platform, StatusBar } from 'react-native' import FingerprintScanner from 'react-native-fingerprint-scanner' import FlagSecure from 'react-native-flag-secure-android' +import { + CachesDirectoryPath, + DocumentDirectoryPath, + DownloadDirectoryPath, + exists, + unlink, + writeFile, +} from 'react-native-fs' import { hide, show } from 'react-native-privacy-snapshot' +import Share from 'react-native-share' import { AppStateObserverService } from './../AppStateObserverService' import Keychain from './Keychain' +import { SNReactNativeCrypto } from './ReactNativeCrypto' import { IsMobileWeb } from './Utils' export type BiometricsType = 'Fingerprint' | 'Face ID' | 'Biometrics' | 'Touch ID' @@ -64,10 +75,14 @@ const showLoadFailForItemIds = (failedItemIds: string[]) => { export class MobileDevice implements MobileDeviceInterface { environment: Environment.Mobile = Environment.Mobile + platform: SNPlatform.Ios | SNPlatform.Android = Platform.OS === 'ios' ? SNPlatform.Ios : SNPlatform.Android private eventObservers: MobileDeviceEventHandler[] = [] public isDarkMode = false + private crypto: SNReactNativeCrypto - constructor(private stateObserverService?: AppStateObserverService) {} + constructor(private stateObserverService?: AppStateObserverService) { + this.crypto = new SNReactNativeCrypto() + } deinit() { this.stateObserverService?.deinit() @@ -455,4 +470,76 @@ export class MobileDevice implements MobileDeviceInterface { isDeviceDestroyed() { return false } + + async deleteFileAtPathIfExists(path: string) { + if (await exists(path)) { + await unlink(path) + } + } + + async shareBase64AsFile(base64: string, filename: string) { + let downloadedTempFilePath: string | undefined + try { + downloadedTempFilePath = await this.downloadBase64AsFile(base64, filename, true) + if (!downloadedTempFilePath) { + return + } + await Share.open({ + url: `file://${downloadedTempFilePath}`, + failOnCancel: false, + }) + } catch (error) { + this.consoleLog(`${error}`) + } finally { + if (downloadedTempFilePath) { + void this.deleteFileAtPathIfExists(downloadedTempFilePath) + } + } + } + + getFileDestinationPath(filename: string, saveInTempLocation: boolean): string { + let directory = DocumentDirectoryPath + + if (Platform.OS === 'android') { + directory = saveInTempLocation ? CachesDirectoryPath : DownloadDirectoryPath + } + + return `${directory}/${filename}` + } + + async hasStoragePermissionOnAndroid(): Promise { + if (Platform.OS !== 'android') { + return true + } + const grantedStatus = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE) + if (grantedStatus === PermissionsAndroid.RESULTS.GRANTED) { + return true + } + Alert.alert( + 'Storage permissions are required in order to download files. Please accept the permissions prompt and try again.', + ) + return false + } + + async downloadBase64AsFile( + base64: string, + filename: string, + saveInTempLocation = false, + ): Promise { + const isGrantedStoragePermissionOnAndroid = await this.hasStoragePermissionOnAndroid() + + if (!isGrantedStoragePermissionOnAndroid) { + return + } + + try { + const path = this.getFileDestinationPath(filename, saveInTempLocation) + void this.deleteFileAtPathIfExists(path) + const decodedContents = this.crypto.base64Decode(base64.replace(/data.*base64,/, '')) + await writeFile(path, decodedContents) + return path + } catch (error) { + this.consoleLog(`${error}`) + } + } } diff --git a/packages/mobile/src/MobileWebAppContainer.tsx b/packages/mobile/src/MobileWebAppContainer.tsx index 83af26b95..83d4a17a3 100644 --- a/packages/mobile/src/MobileWebAppContainer.tsx +++ b/packages/mobile/src/MobileWebAppContainer.tsx @@ -88,6 +88,7 @@ const MobileWebAppContents = ({ destroyAndReload }: { destroyAndReload: () => vo constructor(messageSender) { this.appVersion = '${pjson.version} (${VersionInfo.buildVersion})' this.environment = 4 + this.platform = ${device.platform} this.databases = [] this.messageSender = messageSender } diff --git a/packages/services/src/Domain/Device/MobileDeviceInterface.ts b/packages/services/src/Domain/Device/MobileDeviceInterface.ts index 61f25205b..9f2d9826f 100644 --- a/packages/services/src/Domain/Device/MobileDeviceInterface.ts +++ b/packages/services/src/Domain/Device/MobileDeviceInterface.ts @@ -1,8 +1,9 @@ import { DeviceInterface } from './DeviceInterface' -import { Environment, RawKeychainValue } from '@standardnotes/models' +import { Environment, Platform, RawKeychainValue } from '@standardnotes/models' export interface MobileDeviceInterface extends DeviceInterface { environment: Environment.Mobile + platform: Platform.Ios | Platform.Android getRawKeychainValue(): Promise getDeviceBiometricsAvailability(): Promise @@ -12,4 +13,6 @@ export interface MobileDeviceInterface extends DeviceInterface { stopHidingMobileInterfaceFromScreenshots(): void consoleLog(...args: any[]): void handleThemeSchemeChange(isDark: boolean): void + shareBase64AsFile(base64: string, filename: string): Promise + downloadBase64AsFile(base64: string, filename: string, saveInTempLocation?: boolean): Promise } diff --git a/packages/ui-services/src/Archive/ArchiveManager.ts b/packages/ui-services/src/Archive/ArchiveManager.ts index 938df80af..329cb64c5 100644 --- a/packages/ui-services/src/Archive/ArchiveManager.ts +++ b/packages/ui-services/src/Archive/ArchiveManager.ts @@ -8,7 +8,7 @@ import { import { ContentType } from '@standardnotes/common' import { ApplicationInterface } from '@standardnotes/services' -function sanitizeFileName(name: string): string { +export function sanitizeFileName(name: string): string { return name.trim().replace(/[.\\/:"?*|<>]/g, '_') } @@ -52,13 +52,16 @@ export class ArchiveManager { }) if (encrypted) { - this.downloadData(blobData, `Standard Notes Encrypted Backup and Import File - ${this.formattedDate()}.txt`) + this.downloadData( + blobData, + `Standard Notes Encrypted Backup and Import File - ${this.formattedDateForExports()}.txt`, + ) } else { this.downloadZippedDecryptedItems(data).catch(console.error) } } - private formattedDate() { + formattedDateForExports() { const string = `${new Date()}` // Match up to the first parenthesis, i.e do not include '(Central Standard Time)' const matches = string.match(/^(.*?) \(/) @@ -108,7 +111,7 @@ export class ArchiveManager { await nextFile() } else { const finalBlob = await zipWriter.close() - this.downloadData(finalBlob, `Standard Notes Backup - ${this.formattedDate()}.zip`) + this.downloadData(finalBlob, `Standard Notes Backup - ${this.formattedDateForExports()}.zip`) } } @@ -143,7 +146,7 @@ export class ArchiveManager { async downloadDataAsZip(data: ZippableData) { const zipFileAsBlob = await this.zipData(data) - this.downloadData(zipFileAsBlob, `Standard Notes Export - ${this.formattedDate()}.zip`) + this.downloadData(zipFileAsBlob, `Standard Notes Export - ${this.formattedDateForExports()}.zip`) } private hrefForData(data: Blob) { diff --git a/packages/web/src/javascripts/Application/ApplicationGroup.ts b/packages/web/src/javascripts/Application/ApplicationGroup.ts index 27ec2daa3..a4d951ebb 100644 --- a/packages/web/src/javascripts/Application/ApplicationGroup.ts +++ b/packages/web/src/javascripts/Application/ApplicationGroup.ts @@ -20,7 +20,7 @@ const createApplication = ( device: WebOrDesktopDevice, webSocketUrl: string, ) => { - const platform = getPlatform() + const platform = getPlatform(device) const application = new WebApplication( deviceInterface, diff --git a/packages/web/src/javascripts/Components/Icon/Icon.tsx b/packages/web/src/javascripts/Components/Icon/Icon.tsx index 048838802..e12f77678 100644 --- a/packages/web/src/javascripts/Components/Icon/Icon.tsx +++ b/packages/web/src/javascripts/Components/Icon/Icon.tsx @@ -86,6 +86,7 @@ export const ICONS = { security: icons.SecurityIcon, server: icons.ServerIcon, settings: icons.SettingsIcon, + share: icons.ShareIcon, signIn: icons.SignInIcon, signOut: icons.SignOutIcon, spreadsheets: icons.SpreadsheetsIcon, diff --git a/packages/web/src/javascripts/Components/NotesContextMenu/NotesContextMenu.tsx b/packages/web/src/javascripts/Components/NotesContextMenu/NotesContextMenu.tsx index e107a4185..0f854e9b6 100644 --- a/packages/web/src/javascripts/Components/NotesContextMenu/NotesContextMenu.tsx +++ b/packages/web/src/javascripts/Components/NotesContextMenu/NotesContextMenu.tsx @@ -41,7 +41,7 @@ const NotesContextMenu = ({ side="right" togglePopover={closeMenu} > -
+
void @@ -95,7 +98,7 @@ const NoteAttributes: FunctionComponent<{ const format = editor?.package_info?.file_type || 'txt' return ( -
+
{typeof words === 'number' && (format === 'txt' || format === 'md') ? ( <>
@@ -220,18 +223,11 @@ const NotesOptions = ({ } }, [application]) - const getNoteFileName = useCallback( - (note: SNNote): string => { - const editor = application.componentManager.editorForNote(note) - const format = editor?.package_info?.file_type || 'txt' - return `${note.title}.${format}` - }, - [application.componentManager], - ) - const downloadSelectedItems = useCallback(async () => { if (notes.length === 1) { - application.getArchiveService().downloadData(new Blob([notes[0].text]), getNoteFileName(notes[0])) + const note = notes[0] + const blob = getNoteBlob(application, note) + application.getArchiveService().downloadData(blob, getNoteFileName(application, note)) return } @@ -243,8 +239,8 @@ const NotesOptions = ({ await application.getArchiveService().downloadDataAsZip( notes.map((note) => { return { - name: getNoteFileName(note), - content: new Blob([note.text]), + name: getNoteFileName(application, note), + content: getNoteBlob(application, note), } }), ) @@ -254,7 +250,7 @@ const NotesOptions = ({ message: `Exported ${notes.length} notes`, }) } - }, [application, getNoteFileName, notes]) + }, [application, notes]) const closeMenuAndToggleNotesList = useCallback(() => { toggleAppPane(AppPaneId.Items) @@ -358,11 +354,22 @@ const NotesOptions = ({ )} + {application.platform === Platform.Android && ( + + )} - + { + if (!application.isNativeMobileWeb() || application.platform !== Platform.Android) { + throw new Error('Function being used on non-android platform') + } + if (notes.length === 1) { + const note = notes[0] + const blob = getNoteBlob(application, note) + const base64 = await getBase64FromBlob(blob) + const { name, ext } = parseFileName(getNoteFileName(application, note)) + const filename = `${sanitizeFileName(name)}.${ext}` + const loadingToastId = addToast({ + type: ToastType.Loading, + message: `Exporting ${filename}..`, + }) + const downloaded = await application.mobileDevice.downloadBase64AsFile(base64, filename) + if (downloaded) { + dismissToast(loadingToastId) + addToast({ + type: ToastType.Success, + message: `Exported ${filename}`, + }) + } else { + addToast({ + type: ToastType.Error, + message: `Could not export ${filename}`, + }) + } + return + } + if (notes.length > 1) { + const zippedDataBlob = await application.getArchiveService().zipData( + notes.map((note) => { + return { + name: getNoteFileName(application, note), + content: getNoteBlob(application, note), + } + }), + ) + const zippedDataAsBase64 = await getBase64FromBlob(zippedDataBlob) + const filename = `Standard Notes Export - ${application.getArchiveService().formattedDateForExports()}.zip` + const loadingToastId = addToast({ + type: ToastType.Loading, + message: `Exporting ${filename}..`, + }) + const downloaded = await application.mobileDevice.downloadBase64AsFile(zippedDataAsBase64, filename) + if (downloaded) { + dismissToast(loadingToastId) + addToast({ + type: ToastType.Success, + message: `Exported ${filename}`, + }) + } else { + addToast({ + type: ToastType.Error, + message: `Could not export ${filename}`, + }) + } + } +} diff --git a/packages/web/src/javascripts/NativeMobileWeb/ShareSelectedItems.tsx b/packages/web/src/javascripts/NativeMobileWeb/ShareSelectedItems.tsx new file mode 100644 index 000000000..a12f64dc2 --- /dev/null +++ b/packages/web/src/javascripts/NativeMobileWeb/ShareSelectedItems.tsx @@ -0,0 +1,36 @@ +import { WebApplication } from '@/Application/Application' +import { getBase64FromBlob } from '@/Utils' +import { getNoteBlob, getNoteFileName } from '@/Utils/NoteExportUtils' +import { parseFileName } from '@standardnotes/filepicker' +import { SNNote } from '@standardnotes/snjs' +import { sanitizeFileName } from '@standardnotes/ui-services' + +export const shareSelectedItems = async (application: WebApplication, notes: SNNote[]) => { + if (!application.isNativeMobileWeb()) { + throw new Error('Share function being used outside mobile webview') + } + if (notes.length === 1) { + const note = notes[0] + const blob = getNoteBlob(application, note) + const base64 = await getBase64FromBlob(blob) + const { name, ext } = parseFileName(getNoteFileName(application, note)) + const filename = `${sanitizeFileName(name)}.${ext}` + application.mobileDevice.shareBase64AsFile(base64, filename) + return + } + if (notes.length > 1) { + const zippedDataBlob = await application.getArchiveService().zipData( + notes.map((note) => { + return { + name: getNoteFileName(application, note), + content: getNoteBlob(application, note), + } + }), + ) + const zippedDataAsBase64 = await getBase64FromBlob(zippedDataBlob) + application.mobileDevice.shareBase64AsFile( + zippedDataAsBase64, + `Standard Notes Export - ${application.getArchiveService().formattedDateForExports()}.zip`, + ) + } +} diff --git a/packages/web/src/javascripts/Utils/NoteExportUtils.ts b/packages/web/src/javascripts/Utils/NoteExportUtils.ts new file mode 100644 index 000000000..6e0cfce70 --- /dev/null +++ b/packages/web/src/javascripts/Utils/NoteExportUtils.ts @@ -0,0 +1,36 @@ +import { WebApplication } from '@/Application/Application' +import { SNNote } from '@standardnotes/snjs' + +export const getNoteFormat = (application: WebApplication, note: SNNote) => { + const editor = application.componentManager.editorForNote(note) + const format = editor?.package_info?.file_type || 'txt' + return format +} + +export const getNoteFileName = (application: WebApplication, note: SNNote): string => { + const format = getNoteFormat(application, note) + return `${note.title}.${format}` +} + +export const getNoteBlob = (application: WebApplication, note: SNNote) => { + const format = getNoteFormat(application, note) + let type: string + switch (format) { + case 'html': + type = 'text/html' + break + case 'json': + type = 'application/json' + break + case 'md': + type = 'text/markdown' + break + default: + type = 'text/plain' + break + } + const blob = new Blob([note.text], { + type, + }) + return blob +} diff --git a/packages/web/src/javascripts/Utils/Utils.ts b/packages/web/src/javascripts/Utils/Utils.ts index a5b3ee5c1..00e1d8d5b 100644 --- a/packages/web/src/javascripts/Utils/Utils.ts +++ b/packages/web/src/javascripts/Utils/Utils.ts @@ -1,4 +1,4 @@ -import { Platform, platformFromString } from '@standardnotes/snjs' +import { DeviceInterface, MobileDeviceInterface, Platform, platformFromString } from '@standardnotes/snjs' import { IsDesktopPlatform, IsWebPlatform } from '@/Constants/Version' import { EMAIL_REGEX } from '../Constants/Constants' import { MediaQueryBreakpoints } from '@/Hooks/useMediaQuery' @@ -31,7 +31,11 @@ export function getPlatformString() { } } -export function getPlatform(): Platform { +export function getPlatform(device: DeviceInterface | MobileDeviceInterface): Platform { + if ('platform' in device) { + return device.platform + } + return platformFromString(getPlatformString()) } @@ -204,3 +208,17 @@ export const disableIosTextFieldZoom = () => { } export const isMobileScreen = () => !window.matchMedia(MediaQueryBreakpoints.md).matches + +export const getBase64FromBlob = (blob: Blob) => { + return new Promise((resolve, reject) => { + const reader = new FileReader() + reader.onloadend = () => { + if (reader.result) { + resolve(reader.result.toString()) + } else { + reject() + } + } + reader.readAsDataURL(blob) + }) +} diff --git a/yarn.lock b/yarn.lock index c1a940acf..3ac8905bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7195,7 +7195,7 @@ __metadata: react-native-screens: 3.13.1 react-native-search-bar: "standardnotes/react-native-search-bar#7d2139daf9b7663b570403f21f520deceba9bb09" react-native-search-box: "standardnotes/react-native-search-box#8c46369912cba78dca718588aca9c16926953ff7" - react-native-share: ^7.3.7 + react-native-share: ^7.9.0 react-native-sodium-jsi: 1.2.0 react-native-static-server: "standardnotes/react-native-static-server#28ef0175dbee3db9aadfab57498497067556a836" react-native-store-review: ^0.2.0 @@ -32971,10 +32971,10 @@ __metadata: languageName: node linkType: hard -"react-native-share@npm:^7.3.7": - version: 7.6.4 - resolution: "react-native-share@npm:7.6.4" - checksum: 22764354738587d9166653b09e014ddecf54562696b7f92353980b12be0f9adef58c5d9f927bd05a5e19f50956e6f14fbe2b7a3105675e5982823512945be315 +"react-native-share@npm:^7.9.0": + version: 7.9.0 + resolution: "react-native-share@npm:7.9.0" + checksum: 8eb2f5b4be8df11224f8f00b2761c2c3b4231590d945f57e8ed91899a455d7b5083bb62aa8a017ed8c15fbdfb95e85f9ee4060ac00c01897ef5c351e756c46af languageName: node linkType: hard