Refactor clipboard to use native clipboard API
This commit is contained in:
@@ -1,6 +1,4 @@
|
||||
import { Component, ViewChild, ElementRef, AfterViewInit, Input, ChangeDetectionStrategy } from '@angular/core';
|
||||
import * as ClipboardJS from 'clipboard';
|
||||
import * as tlite from 'tlite';
|
||||
import { Component, Input, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'app-clipboard',
|
||||
@@ -8,15 +6,14 @@ import * as tlite from 'tlite';
|
||||
styleUrls: ['./clipboard.component.scss'],
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class ClipboardComponent implements AfterViewInit {
|
||||
@ViewChild('btn') btn: ElementRef;
|
||||
@ViewChild('buttonWrapper') buttonWrapper: ElementRef;
|
||||
export class ClipboardComponent {
|
||||
@Input() button = false;
|
||||
@Input() class = 'btn btn-secondary ml-1';
|
||||
@Input() size: 'small' | 'normal' | 'large' = 'normal';
|
||||
@Input() text: string;
|
||||
@Input() leftPadding = true;
|
||||
copiedMessage: string = $localize`:@@clipboard.copied-message:Copied!`;
|
||||
showMessage = false;
|
||||
|
||||
widths = {
|
||||
small: '10',
|
||||
@@ -24,22 +21,40 @@ export class ClipboardComponent implements AfterViewInit {
|
||||
large: '18',
|
||||
};
|
||||
|
||||
clipboard: any;
|
||||
constructor(
|
||||
private cd: ChangeDetectorRef,
|
||||
) { }
|
||||
|
||||
constructor() { }
|
||||
|
||||
ngAfterViewInit() {
|
||||
this.clipboard = new ClipboardJS(this.btn.nativeElement);
|
||||
this.clipboard.on('success', () => {
|
||||
tlite.show(this.buttonWrapper.nativeElement);
|
||||
setTimeout(() => {
|
||||
tlite.hide(this.buttonWrapper.nativeElement);
|
||||
}, 1000);
|
||||
});
|
||||
async copyText() {
|
||||
if (this.text && !this.showMessage) {
|
||||
try {
|
||||
await this.copyToClipboard(this.text);
|
||||
this.showMessage = true;
|
||||
this.cd.markForCheck();
|
||||
setTimeout(() => {
|
||||
this.showMessage = false;
|
||||
this.cd.markForCheck();
|
||||
}, 1000);
|
||||
} catch (error) {
|
||||
console.error('Clipboard copy failed:', error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onDestroy() {
|
||||
this.clipboard.destroy();
|
||||
async copyToClipboard(text: string) {
|
||||
if (navigator.clipboard) {
|
||||
await navigator.clipboard.writeText(text);
|
||||
} else {
|
||||
// Use the 'out of viewport hidden text area' trick on non-secure contexts
|
||||
const textarea = document.createElement('textarea');
|
||||
textarea.value = this.text;
|
||||
textarea.style.opacity = '0';
|
||||
textarea.setAttribute('readonly', 'true'); // Don't trigger keyboard on mobile
|
||||
document.body.appendChild(textarea);
|
||||
textarea.select();
|
||||
document.execCommand('copy');
|
||||
textarea.remove();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user