| | <script lang="ts"> |
| | import { onDestroy } from "svelte"; |
| |
|
| | import IconCopy from "./icons/IconCopy.svelte"; |
| | import Tooltip from "./Tooltip.svelte"; |
| |
|
| | export let classNames = ""; |
| | export let value: string; |
| |
|
| | let isSuccess = false; |
| | let timeout: ReturnType<typeof setTimeout>; |
| |
|
| | const handleClick = async () => { |
| | |
| | try { |
| | await navigator.clipboard.writeText(value); |
| |
|
| | isSuccess = true; |
| | if (timeout) { |
| | clearTimeout(timeout); |
| | } |
| | timeout = setTimeout(() => { |
| | isSuccess = false; |
| | }, 1000); |
| | } catch (err) { |
| | console.error(err); |
| | } |
| | }; |
| |
|
| | onDestroy(() => { |
| | if (timeout) { |
| | clearTimeout(timeout); |
| | } |
| | }); |
| | </script> |
| |
|
| | <button |
| | class="btn rounded-lg border border-gray-200 px-2 py-2 text-sm shadow-sm transition-all hover:border-gray-300 active:shadow-inner dark:border-gray-600 dark:hover:border-gray-400 {classNames} |
| | {!isSuccess && 'text-gray-200 dark:text-gray-200'} |
| | {isSuccess && 'text-green-500'} |
| | " |
| | title={"Copy to clipboard"} |
| | type="button" |
| | on:click={handleClick} |
| | > |
| | <span class="relative"> |
| | <IconCopy /> |
| | <Tooltip classNames={isSuccess ? "opacity-100" : "opacity-0"} /> |
| | </span> |
| | </button> |
| |
|