import Clipboard from 'clipboard'; export interface ClipboardCreateContext { readonly el: string | Element; readonly text: string; readonly successCallback?: (e: ClipboardEvent) => void; readonly errorCallback?: (e: ClipboardEvent) => void; } export interface ClipboardEvent { readonly text: string; readonly action: string; } export class ClipboardTextHolder { private text: string; public constructor(text: string) { this.text = text; } public getText(): string { return this.text; } public setText(text: string): void { this.text = text; } } export class ClipboardHolder { private readonly textHolder: ClipboardTextHolder; private readonly clipboard: Clipboard; private constructor(textHolder: ClipboardTextHolder, clipboard: Clipboard) { this.textHolder = textHolder; this.clipboard = clipboard; } public setClipboardText(text: string): void { this.textHolder.setText(text); } public destroy(): void { this.clipboard.destroy(); } public static create({ el, text, successCallback, errorCallback }: ClipboardCreateContext): ClipboardHolder { const textHolder = new ClipboardTextHolder(text); const clipboard = new Clipboard(el, { text: function () { return textHolder.getText(); } }); clipboard.on('success', (e) => { if (successCallback) { successCallback({ text: e.text, action: e.action }); } }); clipboard.on('error', (e) => { if (errorCallback) { errorCallback({ text: e.text, action: e.action }); } }); return new ClipboardHolder(textHolder, clipboard); } }