resources/js/services/clipboard.ts
export class Clipboard {
protected data: DataTransfer;
constructor(clipboardData: DataTransfer) {
this.data = clipboardData;
}
/**
* Check if the clipboard has any items.
*/
hasItems(): boolean {
return Boolean(this.data) && Boolean(this.data.types) && this.data.types.length > 0;
}
/**
* Check if the given event has tabular-looking data in the clipboard.
*/
containsTabularData(): boolean {
const rtfData = this.data.getData('text/rtf');
return !!rtfData && rtfData.includes('\\trowd');
}
/**
* Get the images that are in the clipboard data.
*/
getImages(): File[] {
return this.getFiles().filter(f => f.type.includes('image'));
}
/**
* Get the files included in the clipboard data.
*/
getFiles(): File[] {
const {files} = this.data;
return [...files];
}
}
export async function copyTextToClipboard(text: string) {
if (window.isSecureContext && navigator.clipboard) {
await navigator.clipboard.writeText(text);
return;
}
// Backup option where we can't use the navigator.clipboard API
const tempInput = document.createElement('textarea');
tempInput.setAttribute('style', 'position: absolute; left: -1000px; top: -1000px;');
tempInput.value = text;
document.body.appendChild(tempInput);
tempInput.select();
document.execCommand('copy');
document.body.removeChild(tempInput);
}