type Options = { /** The time before the copied status is reset. */ delay: number; }; /** Use this hook to copy text to the clipboard and show a copied state. * * ## Usage * ```svelte * * * * ``` * */ export class UseClipboard { #copiedStatus = $state<"success" | "failure">(); private delay: number; private timeout: ReturnType | undefined = undefined; constructor({ delay = 800 }: Partial = {}) { this.delay = delay; } /** Copies the given text to the users clipboard. * * ## Usage * ```ts * clipboard.copy('Hello, World!'); * ``` * * @param text * @returns */ async copy(text: string) { if (this.timeout) { this.#copiedStatus = undefined; clearTimeout(this.timeout); } try { await navigator.clipboard.writeText(text); this.#copiedStatus = "success"; this.timeout = setTimeout(() => { this.#copiedStatus = undefined; }, this.delay); } catch { // an error can occur when not in the browser or if the user hasn't given clipboard access this.#copiedStatus = "failure"; this.timeout = setTimeout(() => { this.#copiedStatus = undefined; }, this.delay); } return this.#copiedStatus; } /** true when the user has just copied to the clipboard. */ get copied() { return this.#copiedStatus === "success"; } /** Indicates whether a copy has occurred * and gives a status of either `success` or `failure`. */ get status() { return this.#copiedStatus; } }