-
Notifications
You must be signed in to change notification settings - Fork 3
/
Balance.tsx
72 lines (65 loc) · 1.87 KB
/
Balance.tsx
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
70
71
72
import { Text, TextProps, Skeleton } from '@pancakeswap/uikit'
import { useMemo } from 'react'
import CountUp from 'react-countup'
import isUndefinedOrNull from 'utils/isUndefinedOrNull'
import _toNumber from 'lodash/toNumber'
import _isNaN from 'lodash/isNaN'
import _replace from 'lodash/replace'
import _toString from 'lodash/toString'
interface BalanceProps extends TextProps {
value: number
decimals?: number
unit?: string
isDisabled?: boolean
prefix?: string
onClick?: (event: React.MouseEvent<HTMLElement>) => void
}
const Balance: React.FC<BalanceProps> = ({
value,
color = 'text',
decimals = 3,
isDisabled = false,
unit,
prefix,
onClick,
...props
}) => {
const prefixProp = useMemo(() => (prefix ? { prefix } : {}), [prefix])
const suffixProp = useMemo(() => (unit ? { suffix: unit } : {}), [unit])
return (
<CountUp
start={0}
preserveValue
delay={0}
end={value}
{...prefixProp}
{...suffixProp}
decimals={decimals}
duration={1}
separator=","
>
{({ countUpRef }) => (
<Text color={isDisabled ? 'textDisabled' : color} onClick={onClick} {...props}>
<span ref={countUpRef} />
</Text>
)}
</CountUp>
)
}
export const BalanceWithLoading: React.FC<Omit<BalanceProps, 'value'> & { value: string | number }> = ({
value,
fontSize,
...props
}) => {
const isValueUndefinedOrNull = useMemo(() => isUndefinedOrNull(value), [value])
const finalValue = useMemo(() => {
if (isValueUndefinedOrNull) return null
const trimmedValue = _replace(_toString(value), /,/g, '')
return _isNaN(trimmedValue) || _isNaN(_toNumber(trimmedValue)) ? 0 : _toNumber(trimmedValue)
}, [value, isValueUndefinedOrNull])
if (isValueUndefinedOrNull) {
return <Skeleton />
}
return <Balance {...props} value={finalValue} fontSize={fontSize} />
}
export default Balance