@uppy/dashboard
Version:
Universal UI plugin for Uppy.
57 lines (51 loc) • 1.49 kB
text/typescript
/**
* Copies text to clipboard by creating an almost invisible textarea,
* adding text there, then running execCommand('copy').
* Falls back to prompt() when the easy way fails (hello, Safari!)
* From http://stackoverflow.com/a/30810322
*
* @param {string} textToCopy
* @param {string} fallbackString
* @returns {Promise}
*/
type $TSFixMe = any
export default function copyToClipboard(
textToCopy: $TSFixMe,
fallbackString = 'Copy the URL below',
): $TSFixMe {
return new Promise<void>((resolve) => {
const textArea = document.createElement('textarea')
textArea.setAttribute('style', {
position: 'fixed',
top: 0,
left: 0,
width: '2em',
height: '2em',
padding: 0,
border: 'none',
outline: 'none',
boxShadow: 'none',
background: 'transparent',
} as $TSFixMe as string)
textArea.value = textToCopy
document.body.appendChild(textArea)
textArea.select()
const magicCopyFailed = (cause?: unknown) => {
document.body.removeChild(textArea)
// eslint-disable-next-line no-alert
window.prompt(fallbackString, textToCopy)
resolve()
}
try {
const successful = document.execCommand('copy')
if (!successful) {
return magicCopyFailed('copy command unavailable')
}
document.body.removeChild(textArea)
return resolve()
} catch (err) {
document.body.removeChild(textArea)
return magicCopyFailed(err)
}
})
}