Composer: Fix pasting media from clipboard on iOS (#1698)

This commit is contained in:
Alexander Zinchuk 2022-02-04 15:18:35 +01:00
parent 6b8ba8c2ce
commit c2fcd83567
2 changed files with 12 additions and 4 deletions

View File

@ -1,22 +1,30 @@
export default async function getFilesFromDataTransferItems(dataTransferItems: DataTransferItemList) { export default async function getFilesFromDataTransferItems(dataTransferItems: DataTransferItemList) {
const files: File[] = []; const files: File[] = [];
function traverseFileTreePromise(entry: FileSystemEntry | File) { function traverseFileTreePromise(entry: FileSystemEntry | File, item: DataTransferItem) {
return new Promise(resolve => { return new Promise(resolve => {
if (entry instanceof File) { if (entry instanceof File) {
files.push(entry); files.push(entry);
resolve(entry); resolve(entry);
} else if (entry.isFile) { } else if (entry.isFile) {
const itemFile = item.getAsFile();
(entry as FileSystemFileEntry).file((file) => { (entry as FileSystemFileEntry).file((file) => {
files.push(file); files.push(file);
resolve(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) { } else if (entry.isDirectory) {
let dirReader = (entry as FileSystemDirectoryEntry).createReader(); let dirReader = (entry as FileSystemDirectoryEntry).createReader();
dirReader.readEntries((entries) => { dirReader.readEntries((entries) => {
let entriesPromises = []; let entriesPromises = [];
for (let entr of entries) { for (let entr of entries) {
entriesPromises.push(traverseFileTreePromise(entr)); entriesPromises.push(traverseFileTreePromise(entr, item));
} }
resolve(Promise.all(entriesPromises)); resolve(Promise.all(entriesPromises));
}); });
@ -29,7 +37,7 @@ export default async function getFilesFromDataTransferItems(dataTransferItems: D
if (item.kind === 'file') { if (item.kind === 'file') {
const entry = item.webkitGetAsEntry() || item.getAsFile(); const entry = item.webkitGetAsEntry() || item.getAsFile();
if (entry) { if (entry) {
entriesPromises.push(traverseFileTreePromise(entry)); entriesPromises.push(traverseFileTreePromise(entry, item));
} }
} }
} }

View File

@ -24,12 +24,12 @@ const useClipboardPaste = (
return; return;
} }
e.preventDefault();
const pastedText = e.clipboardData.getData('text').substring(0, MAX_MESSAGE_LENGTH); const pastedText = e.clipboardData.getData('text').substring(0, MAX_MESSAGE_LENGTH);
const { items } = e.clipboardData; const { items } = e.clipboardData;
let files: File[] = []; let files: File[] = [];
e.preventDefault();
if (items.length > 0) { if (items.length > 0) {
files = await getFilesFromDataTransferItems(items); files = await getFilesFromDataTransferItems(items);
} }