1
1
import { type ReactNode } from "react" ;
2
2
import { AnimatedNumber } from "../primitives/AnimatedNumber" ;
3
3
import { Spinner } from "../primitives/Spinner" ;
4
+ import { SimpleTooltip } from "../primitives/Tooltip" ;
4
5
import { cn } from "~/utils/cn" ;
6
+ import { formatNumber , formatNumberCompact } from "~/utils/numberFormatter" ;
7
+ import { Header3 } from "../primitives/Headers" ;
5
8
6
9
interface BigNumberProps {
7
10
title : ReactNode ;
@@ -13,6 +16,7 @@ interface BigNumberProps {
13
16
accessory ?: ReactNode ;
14
17
suffix ?: string ;
15
18
suffixClassName ?: string ;
19
+ compactThreshold ?: number ;
16
20
}
17
21
18
22
export function BigNumber ( {
@@ -25,25 +29,42 @@ export function BigNumber({
25
29
accessory,
26
30
animate = false ,
27
31
loading = false ,
32
+ compactThreshold = 100000 ,
28
33
} : BigNumberProps ) {
29
34
const v = value ?? defaultValue ;
35
+
36
+ const formatValue = ( num : number ) => {
37
+ return num >= compactThreshold ? formatNumberCompact ( num ) : formatNumber ( num ) ;
38
+ } ;
39
+
40
+ const shouldCompact = v !== undefined && v >= compactThreshold ;
41
+
30
42
return (
31
- < div className = "grid grid-rows-[1.5rem_auto] gap-4 rounded-sm border border-grid-dimmed bg-background-bright p-4" >
32
- < div className = "flex items-center justify-between" >
33
- < div className = "text-2sm text-text-dimmed " > { title } </ div >
43
+ < div className = "flex flex-col justify-between gap-4 rounded-sm border border-grid-dimmed bg-background-bright p-4" >
44
+ < div className = "flex flex-wrap items-center justify-between gap-2 " >
45
+ < Header3 className = "leading-6 " > { title } </ Header3 >
34
46
{ accessory && < div className = "flex-shrink-0" > { accessory } </ div > }
35
47
</ div >
36
48
< div
37
49
className = { cn (
38
- "h-[3.75rem] text-[3.75rem] font-normal tabular-nums leading-none text-text-bright" ,
50
+ "text-[3.75rem] font-normal tabular-nums leading-none text-text-bright" ,
39
51
valueClassName
40
52
) }
41
53
>
42
54
{ loading ? (
43
55
< Spinner className = "size-6" />
44
56
) : v !== undefined ? (
45
- < div className = "flex items-baseline gap-1" >
46
- { animate ? < AnimatedNumber value = { v } /> : v }
57
+ < div className = "flex flex-wrap items-baseline gap-2" >
58
+ { shouldCompact ? (
59
+ < SimpleTooltip
60
+ button = { animate ? < AnimatedNumber value = { v } /> : formatValue ( v ) }
61
+ content = { formatNumber ( v ) }
62
+ />
63
+ ) : animate ? (
64
+ < AnimatedNumber value = { v } />
65
+ ) : (
66
+ formatValue ( v )
67
+ ) }
47
68
{ suffix && < div className = { cn ( "text-xs" , suffixClassName ) } > { suffix } </ div > }
48
69
</ div >
49
70
) : (
0 commit comments