2023-04-02 11:25:36 +02:00
import { clippie } from 'clippie' ;
2024-07-07 17:32:30 +02:00
import { showTemporaryTooltip } from '../modules/tippy.ts' ;
import { convertImage } from '../utils.ts' ;
import { GET } from '../modules/fetch.ts' ;
2022-12-23 17:03:11 +01:00
2022-11-21 10:59:42 +01:00
const { i18n } = window . config ;
export function initCopyContent() {
2024-06-10 22:49:33 +02:00
const btn = document . querySelector ( '#copy-content' ) ;
2022-11-21 10:59:42 +01:00
if ( ! btn || btn . classList . contains ( 'disabled' ) ) return ;
btn . addEventListener ( 'click' , async ( ) = > {
if ( btn . classList . contains ( 'is-loading' ) ) return ;
2023-05-16 06:45:36 +02:00
let content ;
let isRasterImage = false ;
2022-11-21 10:59:42 +01: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 ) {
2024-03-31 18:06:06 +02:00
btn . classList . add ( 'is-loading' , 'loading-icon-2px' ) ;
2022-11-21 10:59:42 +01:00
try {
2023-09-19 02:50:30 +02:00
const res = await GET ( link , { credentials : 'include' , redirect : 'follow' } ) ;
2022-11-21 10:59:42 +01:00
const contentType = res . headers . get ( 'content-type' ) ;
if ( contentType . startsWith ( 'image/' ) && ! contentType . startsWith ( 'image/svg' ) ) {
2023-05-16 06:45:36 +02:00
isRasterImage = true ;
2022-11-21 10:59:42 +01:00
content = await res . blob ( ) ;
} else {
content = await res . text ( ) ;
}
} catch {
return showTemporaryTooltip ( btn , i18n . copy_error ) ;
} finally {
2024-03-31 18:06:06 +02:00
btn . classList . remove ( 'is-loading' , 'loading-icon-2px' ) ;
2022-11-21 10:59:42 +01:00
}
} else { // text, read from DOM
const lineEls = document . querySelectorAll ( '.file-view .lines-code' ) ;
2023-05-18 03:14:31 +02:00
content = Array . from ( lineEls , ( el ) = > el . textContent ) . join ( '' ) ;
2022-11-21 10:59:42 +01:00
}
2023-05-16 06:45:36 +02: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 10:59:42 +01:00
} else {
showTemporaryTooltip ( btn , i18n . copy_error ) ;
}
}
} ) ;
}