| <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: any; |
|
|
| 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 text-sm rounded-lg border py-2 px-2 shadow-sm border-gray-200 active:shadow-inner dark:border-gray-600 hover:border-gray-300 dark:hover:border-gray-400 transition-all {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> |
|
|