Openstatus www.openstatus.dev
at main 58 lines 1.5 kB view raw
1import { cn } from "@/lib/utils"; 2import { useEffect, useRef, useState } from "react"; 3import { Badge } from "../ui/badge"; 4import { 5 Tooltip, 6 TooltipContent, 7 TooltipProvider, 8 TooltipTrigger, 9} from "../ui/tooltip"; 10 11export function TableCellBadge({ 12 value, 13 className, 14 ...props 15}: React.ComponentProps<typeof Badge> & { value: unknown }) { 16 const ref = useRef<HTMLSpanElement>(null); 17 const [isTruncated, setIsTruncated] = useState(false); 18 const [open, setOpen] = useState(false); 19 20 // biome-ignore lint/correctness/useExhaustiveDependencies: <explanation> 21 useEffect(() => { 22 if (ref.current) { 23 setIsTruncated(ref.current.scrollWidth > ref.current.clientWidth); 24 } 25 }, [ref]); 26 27 return ( 28 <Badge 29 variant="outline" 30 className={cn( 31 "max-w-16 truncate font-mono", 32 value ? "text-foreground" : "text-foreground/70", 33 className, 34 )} 35 {...props} 36 > 37 <TooltipProvider> 38 {isTruncated ? ( 39 <Tooltip open={open} onOpenChange={setOpen}> 40 <TooltipTrigger 41 onPointerDown={(event) => event.preventDefault()} 42 asChild 43 > 44 <span ref={ref} className="block truncate"> 45 {String(value)} 46 </span> 47 </TooltipTrigger> 48 <TooltipContent>{String(value)}</TooltipContent> 49 </Tooltip> 50 ) : ( 51 <span ref={ref} className="truncate"> 52 {String(value)} 53 </span> 54 )} 55 </TooltipProvider> 56 </Badge> 57 ); 58}