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 ;
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 ;
2023-05-16 07:45:36 +03:00
let content ;
let isRasterImage = false ;
2022-11-21 12:59:42 +03:00
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 ) {
2023-08-24 17:21:41 +03:00
btn . classList . add ( 'is-loading' , 'small-loading-icon' ) ;
2022-11-21 12:59:42 +03:00
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' ) ) {
2023-05-16 07:45:36 +03:00
isRasterImage = true ;
2022-11-21 12:59:42 +03:00
content = await res . blob ( ) ;
} else {
content = await res . text ( ) ;
}
} catch {
return showTemporaryTooltip ( btn , i18n . copy _error ) ;
} finally {
2023-08-24 17:21:41 +03:00
btn . classList . remove ( 'is-loading' , 'small-loading-icon' ) ;
2022-11-21 12:59:42 +03:00
}
} else { // text, read from DOM
const lineEls = document . querySelectorAll ( '.file-view .lines-code' ) ;
2023-05-18 04:14:31 +03:00
content = Array . from ( lineEls , ( el ) => el . textContent ) . join ( '' ) ;
2022-11-21 12:59:42 +03:00
}
2023-05-16 07:45:36 +03:00
// try copy original first, if that fails and it's an image, convert it to png
const success = await clippie ( content ) ;
if ( success ) {
showTemporaryTooltip ( btn , i18n . copy _success ) ;
} else {
if ( isRasterImage ) {
const success = await clippie ( await convertImage ( content , 'image/png' ) ) ;
showTemporaryTooltip ( btn , success ? i18n . copy _success : i18n . copy _error ) ;
2022-11-21 12:59:42 +03:00
} else {
showTemporaryTooltip ( btn , i18n . copy _error ) ;
}
}
} ) ;
}