| <script lang="ts"> | |
| import { onDestroy } from "svelte"; | |
| import { Copy, Check } from "@gradio/icons"; | |
| import { IconButton } from "@gradio/atoms"; | |
| let copied = false; | |
| export let value: string; | |
| let timer: NodeJS.Timeout; | |
| function copy_feedback(): void { | |
| copied = true; | |
| if (timer) clearTimeout(timer); | |
| timer = setTimeout(() => { | |
| copied = false; | |
| }, 2000); | |
| } | |
| async function handle_copy(): Promise<void> { | |
| if ("clipboard" in navigator) { | |
| await navigator.clipboard.writeText(value); | |
| copy_feedback(); | |
| } else { | |
| const textArea = document.createElement("textarea"); | |
| textArea.value = value; | |
| textArea.style.position = "absolute"; | |
| textArea.style.left = "-999999px"; | |
| document.body.prepend(textArea); | |
| textArea.select(); | |
| try { | |
| document.execCommand("copy"); | |
| copy_feedback(); | |
| } catch (error) { | |
| console.error(error); | |
| } finally { | |
| textArea.remove(); | |
| } | |
| } | |
| } | |
| onDestroy(() => { | |
| if (timer) clearTimeout(timer); | |
| }); | |
| </script> | |
| <IconButton | |
| on:click={handle_copy} | |
| label={copied ? "Copied message" : "Copy message"} | |
| Icon={copied ? Check : Copy} | |
| /> | |