function getString(item) { return new Promise(resolve => { item.getAsString(resolve); }); } export default function(state, emitter) { window.addEventListener('paste', async event => { if (state.route !== '/' || state.uploading) return; if (['password', 'text', 'email'].includes(event.target.type)) return; 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] }); }); } }); }