365adc24a6
* Pass up asChild * Include padding when asChild specified * Adds copy buttons to useful data in Details tab * Improve view batch tooltip message
62 lines
1.8 KiB
TypeScript
62 lines
1.8 KiB
TypeScript
import { ClipboardCheckIcon, ClipboardIcon } from "lucide-react";
|
|
import { useState } from "react";
|
|
import { SimpleTooltip } from "~/components/primitives/Tooltip";
|
|
import { useCopy } from "~/hooks/useCopy";
|
|
import { cn } from "~/utils/cn";
|
|
|
|
export function CopyableText({
|
|
value,
|
|
copyValue,
|
|
className,
|
|
asChild,
|
|
}: {
|
|
value: string;
|
|
copyValue?: string;
|
|
className?: string;
|
|
asChild?: boolean;
|
|
}) {
|
|
const [isHovered, setIsHovered] = useState(false);
|
|
const { copy, copied } = useCopy(copyValue ?? value);
|
|
|
|
return (
|
|
<span
|
|
className={cn("group relative inline-flex h-6 items-center", className)}
|
|
onMouseLeave={() => setIsHovered(false)}
|
|
>
|
|
<span onMouseEnter={() => setIsHovered(true)}>{value}</span>
|
|
<span
|
|
onClick={copy}
|
|
onMouseDown={(e) => e.stopPropagation()}
|
|
className={cn(
|
|
"absolute -right-6 top-0 z-10 size-6 font-sans",
|
|
isHovered ? "flex" : "hidden"
|
|
)}
|
|
>
|
|
<SimpleTooltip
|
|
button={
|
|
<span
|
|
className={cn(
|
|
"ml-1 flex size-6 items-center justify-center rounded border border-charcoal-650 bg-charcoal-750",
|
|
asChild && "p-1",
|
|
copied
|
|
? "text-green-500"
|
|
: "text-text-dimmed hover:border-charcoal-600 hover:bg-charcoal-700 hover:text-text-bright"
|
|
)}
|
|
>
|
|
{copied ? (
|
|
<ClipboardCheckIcon className="size-3.5" />
|
|
) : (
|
|
<ClipboardIcon className="size-3.5" />
|
|
)}
|
|
</span>
|
|
}
|
|
content={copied ? "Copied!" : "Copy"}
|
|
className="font-sans"
|
|
disableHoverableContent
|
|
asChild={asChild}
|
|
/>
|
|
</span>
|
|
</span>
|
|
);
|
|
}
|