36 lines
1.2 KiB
JavaScript
36 lines
1.2 KiB
JavaScript
|
|
/**
|
||
|
|
* A helper class to manage requesting clipboard permissions and provide common functionality for working with the
|
||
|
|
* clipboard.
|
||
|
|
*/
|
||
|
|
class ClipboardHelper {
|
||
|
|
constructor() {
|
||
|
|
if ( game.clipboard instanceof this.constructor ) {
|
||
|
|
throw new Error("You may not re-initialize the singleton ClipboardHelper. Use game.clipboard instead.");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Copies plain text to the clipboard in a cross-browser compatible way.
|
||
|
|
* @param {string} text The text to copy.
|
||
|
|
* @returns {Promise<void>}
|
||
|
|
*/
|
||
|
|
async copyPlainText(text) {
|
||
|
|
// The clipboard-write permission name is not supported in Firefox.
|
||
|
|
try {
|
||
|
|
const result = await navigator.permissions.query({name: "clipboard-write"});
|
||
|
|
if ( ["granted", "prompt"].includes(result.state) ) {
|
||
|
|
return navigator.clipboard.writeText(text);
|
||
|
|
}
|
||
|
|
} catch(err) {}
|
||
|
|
|
||
|
|
// Fallback to deprecated execCommand here if writeText is not supported in this browser or security context.
|
||
|
|
document.addEventListener("copy", event => {
|
||
|
|
event.clipboardData.setData("text/plain", text);
|
||
|
|
event.preventDefault();
|
||
|
|
}, {once: true});
|
||
|
|
document.execCommand("copy");
|
||
|
|
}
|
||
|
|
}
|