Spaces:
Running
Running
<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 () => { | |
// writeText() can be unavailable or fail in some cases (iframe, etc) so we try/catch | |
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> | |