Composer: Fix pasting media from clipboard on iOS (#1698)
This commit is contained in:
parent
6b8ba8c2ce
commit
c2fcd83567
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user