Files
print-calculator/frontend/src/app/shared/directives/copy-on-click.directive.ts
Joe Küng 2ace632022
Some checks failed
PR Checks / prettier-autofix (pull_request) Successful in 11s
PR Checks / test-frontend (pull_request) Failing after 57s
PR Checks / security-sast (pull_request) Successful in 30s
PR Checks / test-backend (pull_request) Successful in 27s
feat(front-end): ssr implementation
2026-03-11 16:37:08 +01:00

60 lines
1.3 KiB
TypeScript

import { isPlatformBrowser } from '@angular/common';
import {
Directive,
HostBinding,
HostListener,
Input,
PLATFORM_ID,
inject,
} from '@angular/core';
@Directive({
selector: '[appCopyOnClick]',
standalone: true,
})
export class CopyOnClickDirective {
private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
@Input('appCopyOnClick') value: string | null | undefined;
@HostBinding('style.cursor') readonly cursor = 'pointer';
@HostListener('click', ['$event'])
onClick(event: MouseEvent): void {
const text = (this.value ?? '').trim();
if (!text) {
return;
}
event.stopPropagation();
void this.copy(text);
}
private async copy(text: string): Promise<void> {
if (!this.isBrowser) {
return;
}
if (navigator.clipboard?.writeText) {
try {
await navigator.clipboard.writeText(text);
return;
} catch {
// Fallback below for browsers/environments that block clipboard API.
}
}
const textarea = document.createElement('textarea');
textarea.value = text;
textarea.style.position = 'fixed';
textarea.style.opacity = '0';
document.body.appendChild(textarea);
textarea.select();
try {
document.execCommand('copy');
} finally {
document.body.removeChild(textarea);
}
}
}