// Based on code provided by Amir Fo // https://stackoverflow.com/a/74528564 export function copy(text: string) { return new Promise((resolve, reject) => { if ( typeof navigator !== "undefined" && typeof navigator.clipboard !== "undefined" && // @ts-ignore navigator.permissions !== "undefined" ) { navigator.permissions // @ts-ignore .query({ name: "clipboard-write" }) .then((permission) => { if (permission.state === "granted" || permission.state === "prompt") { const type = "text/plain"; const blob = new Blob([text], { type }); const data = [new ClipboardItem({ [type]: blob })]; navigator.clipboard.write(data).then(resolve).catch(reject); } else { reject(new Error("Permission not granted!")); } }) .catch((e) => { // Firefox doesnt support clipboard-write permission if (navigator.userAgent.indexOf("Firefox") != -1) { navigator.clipboard.writeText(text).then(resolve).catch(reject); } else { reject(e); } }); } else if ( document.queryCommandSupported && document.queryCommandSupported("copy") ) { const textarea = document.createElement("textarea"); textarea.textContent = text; textarea.setAttribute("readonly", ""); textarea.style.fontSize = "12pt"; textarea.style.position = "fixed"; textarea.style.width = "2em"; textarea.style.height = "2em"; textarea.style.padding = "0"; textarea.style.margin = "0"; textarea.style.border = "none"; textarea.style.outline = "none"; textarea.style.boxShadow = "none"; textarea.style.background = "transparent"; document.body.appendChild(textarea); textarea.focus(); textarea.select(); try { document.execCommand("copy"); document.body.removeChild(textarea); resolve(); } catch (e) { document.body.removeChild(textarea); reject(e); } } else { reject( new Error("None of copying methods are supported by this browser!") ); } }); }