From c2fcd83567c8aeae1a05cfc5d82591f650c53873 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Fri, 4 Feb 2022 15:18:35 +0100 Subject: [PATCH] Composer: Fix pasting media from clipboard on iOS (#1698) --- .../helpers/getFilesFromDataTransferItems.ts | 14 +++++++++++--- .../middle/composer/hooks/useClipboardPaste.ts | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/components/middle/composer/helpers/getFilesFromDataTransferItems.ts b/src/components/middle/composer/helpers/getFilesFromDataTransferItems.ts index f6c16e50d..1d15e685b 100644 --- a/src/components/middle/composer/helpers/getFilesFromDataTransferItems.ts +++ b/src/components/middle/composer/helpers/getFilesFromDataTransferItems.ts @@ -1,22 +1,30 @@ export default async function getFilesFromDataTransferItems(dataTransferItems: DataTransferItemList) { const files: File[] = []; - function traverseFileTreePromise(entry: FileSystemEntry | File) { + function traverseFileTreePromise(entry: FileSystemEntry | File, item: DataTransferItem) { return new Promise(resolve => { if (entry instanceof File) { files.push(entry); resolve(entry); } else if (entry.isFile) { + const itemFile = item.getAsFile(); (entry as FileSystemFileEntry).file((file) => { files.push(file); resolve(file); + }, () => { + // iOS Safari throws an error "NotFoundError: Path does not exist" for files from the clipboard + // https://stackoverflow.com/a/50059309 + if (itemFile) { + files.push(itemFile); + } + resolve(itemFile); }); } else if (entry.isDirectory) { let dirReader = (entry as FileSystemDirectoryEntry).createReader(); dirReader.readEntries((entries) => { let entriesPromises = []; for (let entr of entries) { - entriesPromises.push(traverseFileTreePromise(entr)); + entriesPromises.push(traverseFileTreePromise(entr, item)); } resolve(Promise.all(entriesPromises)); }); @@ -29,7 +37,7 @@ export default async function getFilesFromDataTransferItems(dataTransferItems: D if (item.kind === 'file') { const entry = item.webkitGetAsEntry() || item.getAsFile(); if (entry) { - entriesPromises.push(traverseFileTreePromise(entry)); + entriesPromises.push(traverseFileTreePromise(entry, item)); } } } diff --git a/src/components/middle/composer/hooks/useClipboardPaste.ts b/src/components/middle/composer/hooks/useClipboardPaste.ts index 715cdad08..1d980525c 100644 --- a/src/components/middle/composer/hooks/useClipboardPaste.ts +++ b/src/components/middle/composer/hooks/useClipboardPaste.ts @@ -24,12 +24,12 @@ const useClipboardPaste = ( return; } - e.preventDefault(); const pastedText = e.clipboardData.getData('text').substring(0, MAX_MESSAGE_LENGTH); const { items } = e.clipboardData; let files: File[] = []; + e.preventDefault(); if (items.length > 0) { files = await getFilesFromDataTransferItems(items); }