2023-04-02 12:25:36 +03:00
import { clippie } from 'clippie' ;
2022-11-21 12:59:42 +03:00
import { showTemporaryTooltip } from '../modules/tippy.js' ;
import { convertImage } from '../utils.js' ;
2022-12-23 19:03:11 +03:00
2022-11-21 12:59:42 +03:00
const { i18n } = window . config ;
async function doCopy ( content , btn ) {
2023-04-02 12:25:36 +03:00
const success = await clippie ( content ) ;
2022-11-21 12:59:42 +03:00
showTemporaryTooltip ( btn , success ? i18n . copy _success : i18n . copy _error ) ;
}
export function initCopyContent ( ) {
const btn = document . getElementById ( 'copy-content' ) ;
if ( ! btn || btn . classList . contains ( 'disabled' ) ) return ;
btn . addEventListener ( 'click' , async ( ) => {
if ( btn . classList . contains ( 'is-loading' ) ) return ;
let content , isImage ;
const link = btn . getAttribute ( 'data-link' ) ;
// when data-link is present, we perform a fetch. this is either because
// the text to copy is not in the DOM or it is an image which should be
// fetched to copy in full resolution
if ( link ) {
btn . classList . add ( 'is-loading' ) ;
try {
const res = await fetch ( link , { credentials : 'include' , redirect : 'follow' } ) ;
const contentType = res . headers . get ( 'content-type' ) ;
if ( contentType . startsWith ( 'image/' ) && ! contentType . startsWith ( 'image/svg' ) ) {
isImage = true ;
content = await res . blob ( ) ;
} else {
content = await res . text ( ) ;
}
} catch {
return showTemporaryTooltip ( btn , i18n . copy _error ) ;
} finally {
btn . classList . remove ( 'is-loading' ) ;
}
} else { // text, read from DOM
const lineEls = document . querySelectorAll ( '.file-view .lines-code' ) ;
content = Array . from ( lineEls ) . map ( ( el ) => el . textContent ) . join ( '' ) ;
}
try {
await doCopy ( content , btn ) ;
} catch {
if ( isImage ) { // convert image to png as last-resort as some browser only support png copy
try {
await doCopy ( await convertImage ( content , 'image/png' ) , btn ) ;
} catch {
showTemporaryTooltip ( btn , i18n . copy _error ) ;
}
} else {
showTemporaryTooltip ( btn , i18n . copy _error ) ;
}
}
} ) ;
}