"use client" import * as React from "react" import { DropdownMenuTriggerProps } from "@radix-ui/react-dropdown-menu" import { NpmCommands } from "types/unist" import { cn } from "@/lib/utils" import { Icons } from "@/components/icons" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" interface CopyButtonProps extends React.HTMLAttributes { value: string src?: string } async function copyToClipboardWithMeta( value: string, meta?: Record ) { navigator.clipboard.writeText(value) } export function CopyButton({ value, className, src, ...props }: CopyButtonProps) { const [hasCopied, setHasCopied] = React.useState(false) React.useEffect(() => { setTimeout(() => { setHasCopied(false) }, 2000) }, [hasCopied]) return ( ) } interface CopyWithClassNamesProps extends DropdownMenuTriggerProps { value: string classNames: string className: string } export function CopyWithClassNames({ value, classNames, className, ...props }: CopyWithClassNamesProps) { const [hasCopied, setHasCopied] = React.useState(false) React.useEffect(() => { setTimeout(() => { setHasCopied(false) }, 2000) }, [hasCopied]) const copyToClipboard = React.useCallback((value: string) => { copyToClipboardWithMeta(value) setHasCopied(true) }, []) return ( {hasCopied ? ( ) : ( )} Copy copyToClipboard(value)}> Component copyToClipboard(classNames)}> Classname ) } interface CopyNpmCommandButtonProps extends DropdownMenuTriggerProps { commands: Required } export function CopyNpmCommandButton({ commands, className, ...props }: CopyNpmCommandButtonProps) { const [hasCopied, setHasCopied] = React.useState(false) React.useEffect(() => { setTimeout(() => { setHasCopied(false) }, 2000) }, [hasCopied]) const copyCommand = React.useCallback((value: string) => { copyToClipboardWithMeta(value) setHasCopied(true) }, []) return ( {hasCopied ? ( ) : ( )} Copy copyCommand(commands.__npmCommand__)}> npm copyCommand(commands.__yarnCommand__)}> yarn copyCommand(commands.__pnpmCommand__)}> pnpm ) }