2022-08-09 15:37:34 +03:00
import { showTemporaryTooltip } from '../modules/tippy.js' ;
2022-01-29 00:00:11 +03:00
2021-11-16 11:16:05 +03:00
const { copy _success , copy _error } = window . config . i18n ;
2020-02-08 02:03:42 +03:00
2022-11-21 12:59:42 +03:00
export async function copyToClipboard ( content ) {
if ( content instanceof Blob ) {
2022-11-22 03:58:55 +03:00
const item = new ClipboardItem ( { [ content . type ] : content } ) ;
2022-11-21 12:59:42 +03:00
await navigator . clipboard . write ( [ item ] ) ;
} else { // text
try {
await navigator . clipboard . writeText ( content ) ;
} catch {
return fallbackCopyToClipboard ( content ) ;
}
2022-08-09 15:37:34 +03:00
}
return true ;
2021-05-30 22:15:57 +03:00
}
2021-11-16 11:16:05 +03:00
// Fallback to use if navigator.clipboard doesn't exist. Achieved via creating
// a temporary textarea element, selecting the text, and using document.execCommand
2021-10-19 13:22:16 +03:00
function fallbackCopyToClipboard ( text ) {
if ( ! document . execCommand ) return false ;
const tempTextArea = document . createElement ( 'textarea' ) ;
tempTextArea . value = text ;
// avoid scrolling
tempTextArea . style . top = 0 ;
tempTextArea . style . left = 0 ;
tempTextArea . style . position = 'fixed' ;
document . body . appendChild ( tempTextArea ) ;
tempTextArea . select ( ) ;
2021-11-16 11:16:05 +03:00
// if unsecure (not https), there is no navigator.clipboard, but we can still
// use document.execCommand to copy to clipboard
2021-10-19 13:22:16 +03:00
const success = document . execCommand ( 'copy' ) ;
document . body . removeChild ( tempTextArea ) ;
return success ;
}
2021-11-16 11:16:05 +03:00
// For all DOM elements with [data-clipboard-target] or [data-clipboard-text],
// this copy-to-clipboard will work for them
2022-12-23 19:03:11 +03:00
export function initGlobalCopyToClipboardListener ( ) {
2021-11-12 15:37:45 +03:00
document . addEventListener ( 'click' , ( e ) => {
2021-10-16 20:28:04 +03:00
let target = e . target ;
2021-11-16 11:16:05 +03:00
// in case <button data-clipboard-text><svg></button>, so we just search
// up to 3 levels for performance
2021-10-16 20:28:04 +03:00
for ( let i = 0 ; i < 3 && target ; i ++ ) {
2021-11-22 11:19:01 +03:00
const text = target . getAttribute ( 'data-clipboard-text' ) || document . querySelector ( target . getAttribute ( 'data-clipboard-target' ) ) ? . value ;
2021-10-16 20:28:04 +03:00
if ( text ) {
e . preventDefault ( ) ;
2021-11-12 15:37:45 +03:00
( async ( ) => {
2022-08-09 15:37:34 +03:00
const success = await copyToClipboard ( text ) ;
showTemporaryTooltip ( target , success ? copy _success : copy _error ) ;
2021-11-12 15:37:45 +03:00
} ) ( ) ;
2021-10-16 20:28:04 +03:00
break ;
2021-05-30 22:15:57 +03:00
}
2021-10-16 20:28:04 +03:00
target = target . parentElement ;
}
} ) ;
2020-02-08 02:03:42 +03:00
}