diff --git a/src/components/ui/copy-button.tsx b/src/components/ui/copy-button.tsx new file mode 100644 index 0000000..ca98320 --- /dev/null +++ b/src/components/ui/copy-button.tsx @@ -0,0 +1,112 @@ +"use client"; +import type { DropdownMenuTriggerProps } from "@radix-ui/react-dropdown-menu"; +import { CheckIcon, ClipboardIcon } from "lucide-react"; + +import { Button, type ButtonProps } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { cn } from "@/lib/utils"; +import { useCallback, useEffect, useState } from "react"; + +interface CopyButtonProps extends ButtonProps { + value: string; + src?: string; + event?: Event["NONE"]; +} + +interface Value { + data: string; + title: string; +} + +export async function copyToClipboardWithMeta(value: string) { + await window?.navigator.clipboard.writeText(value); +} + +export function CopyButton({ + value, + className, + src, + variant = "ghost", + event, + ...props +}: CopyButtonProps) { + const [hasCopied, setHasCopied] = useState(false); + + // biome-ignore lint/correctness/useExhaustiveDependencies: + useEffect(() => { + setTimeout(() => { + setHasCopied(false); + }, 2000); + }, [hasCopied]); + + return ( + + ); +} + +interface CopyMultipleChoiceButtonProps extends DropdownMenuTriggerProps { + values: Value[]; +} + +export function CopyMultipleChoiceButton({ + values, + className, + ...props +}: CopyMultipleChoiceButtonProps) { + const [hasCopied, setHasCopied] = useState(false); + + // biome-ignore lint/correctness/useExhaustiveDependencies: + useEffect(() => { + setTimeout(() => { + setHasCopied(false); + }, 2000); + }, [hasCopied]); + + const copyCommand = useCallback((value: string) => { + copyToClipboardWithMeta(value).then(() => setHasCopied(true)); + }, []); + + return ( + + + + + + copyCommand("npm")}>npm + + + ); +}