Openstatus
www.openstatus.dev
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}