55 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
| 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);
 | |
| }
 |