m-oauth/components/ui/copybutton.tsx
2023-06-06 02:47:14 +08:00

40 lines
1.1 KiB
TypeScript

"use client";
import { useEffect, useState } from "react";
import { cn } from "@/lib/utils";
import { Check, Copy } from "lucide-react";
interface CopyButtonProps extends React.HTMLAttributes<HTMLButtonElement> {
value: string;
}
const copyToClipboardWithMeta = (value: string, event?: Event) => {
navigator.clipboard.writeText(value);
};
export function CopyButton({ value, className, ...props }: CopyButtonProps) {
const [hasCopied, setHasCopied] = useState(false);
useEffect(() => {
setTimeout(() => {
setHasCopied(false);
}, 2000);
}, [hasCopied]);
return (
<button
className={cn(
"z-20 inline-flex h-8 w-8 items-center justify-center rounded-md border bg-background text-sm font-medium transition-all hover:bg-muted focus:outline-none ",
className
)}
onClick={() => {
copyToClipboardWithMeta(value);
setHasCopied(true);
}}
{...props}
>
<span className="sr-only">Copy</span>
{hasCopied ? <Check className="h-3 w-3" /> : <Copy className="h-3 w-3" />}
</button>
);
}