"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 ); }