-
Notifications
You must be signed in to change notification settings - Fork 650
Expand file tree
/
Copy pathBigNumberWidget.jsx
More file actions
69 lines (63 loc) · 2.04 KB
/
BigNumberWidget.jsx
File metadata and controls
69 lines (63 loc) · 2.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import { ArrowDown, ArrowUp, AlertTriangle } from 'lucide-react';
import React from 'react';
import {
Tooltip,
TooltipTrigger,
TooltipContent,
} from '@/components/ui/tooltip';
import { cn } from '@/lib/utils';
const formatNumber = (num) => {
if (Math.abs(num) >= 1e9) return (num / 1e9).toFixed(1) + 'B';
if (Math.abs(num) >= 1e6) return (num / 1e6).toFixed(1) + 'M';
if (Math.abs(num) >= 1e3) return (num / 1e3).toFixed(1) + 'K';
return num;
};
const BigNumberCard = ({ id, label, value, delta, unit, error, className }) => {
const deltaNumber = parseFloat(delta);
const isPositive = deltaNumber >= 0;
const displayDelta =
typeof delta === 'string' ? delta : `${isPositive ? '+' : ''}${delta}${unit ?? ''}`;
return (
<div
id={id}
className={cn(
'bg-white rounded-xl shadow p-4 w-full max-w-xs relative',
error && 'border-destructive border-2 bg-red-50',
className
)}
>
{error && (
<Tooltip>
<TooltipTrigger asChild>
<div className="absolute top-2 right-2 text-destructive">
<AlertTriangle className="w-5 h-5" />
</div>
</TooltipTrigger>
<TooltipContent>
<span>{error.toString()}</span>
</TooltipContent>
</Tooltip>
)}
<div className="text-sm text-gray-500">{label}</div>
<div className="text-3xl font-bold text-gray-800 break-words leading-tight max-w-full">
{error
? <span className="text-gray-400 italic">unavailable</span>
: Number.isFinite(value)
? `${formatNumber(value)}${unit ?? ''}`
: String(value)}
</div>
{delta !== undefined && (
<div
className={cn(
'flex items-center mt-1 text-sm',
isPositive ? 'text-green-600' : 'text-red-600'
)}
>
{isPositive ? <ArrowUp size={16} /> : <ArrowDown size={16} />}
<span className="ml-1">{displayDelta}</span>
</div>
)}
</div>
);
};
export default BigNumberCard;