improved paste to handle text and pasted file's names
This commit is contained in:
parent
f7f8944e00
commit
7166f4e3d6
1 changed files with 29 additions and 9 deletions
|
@ -1,15 +1,35 @@
|
|||
function getString(item) {
|
||||
return new Promise(resolve => {
|
||||
item.getAsString(resolve);
|
||||
});
|
||||
}
|
||||
|
||||
export default function(state, emitter) {
|
||||
window.addEventListener('paste', event => {
|
||||
window.addEventListener('paste', async event => {
|
||||
if (state.route !== '/' || state.uploading) return;
|
||||
|
||||
for (const item of event.clipboardData.items) {
|
||||
if (!item.type.includes('image')) continue;
|
||||
|
||||
const file = item.getAsFile();
|
||||
|
||||
if (!file) continue; // Sometimes null
|
||||
|
||||
emitter.emit('addFiles', { files: [file] });
|
||||
const items = Array.from(event.clipboardData.items);
|
||||
const transferFiles = items.filter(item => item.kind === 'file');
|
||||
const strings = items.filter(item => item.kind === 'string');
|
||||
if (transferFiles.length) {
|
||||
const promises = transferFiles.map(async (f, i) => {
|
||||
const blob = f.getAsFile();
|
||||
if (!blob) {
|
||||
return null;
|
||||
}
|
||||
const name = await getString(strings[i]);
|
||||
const file = new File([blob], name, { type: blob.type });
|
||||
return file;
|
||||
});
|
||||
const files = (await Promise.all(promises)).filter(f => !!f);
|
||||
if (files.length) {
|
||||
emitter.emit('addFiles', { files });
|
||||
}
|
||||
} else if (strings.length) {
|
||||
strings[0].getAsString(s => {
|
||||
const file = new File([s], 'pasted.txt', { type: 'text/plain' });
|
||||
emitter.emit('addFiles', { files: [file] });
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue