1
- import { FC , useEffect , useRef , useState , CSSProperties } from "react"
2
- import { ProviderInterface , uint256 } from "starknet"
1
+ import BigDecimalNumber from "bignumber.js"
2
+ import { CSSProperties , FC , useEffect , useRef , useState } from "react"
3
+ import { ProviderInterface , constants , uint256 } from "starknet"
3
4
import { truncateAddress } from "../../helpers/address"
4
5
import { formatUnits } from "../../helpers/formatUnits"
5
6
import { prettifyTokenNumber } from "../../helpers/prettifyNumber"
7
+ import { useStarknetId } from "../../hooks/useStarknetId"
6
8
import { ChevronDown } from "../../icons/ChevronDown"
7
9
import { ProfileIcon } from "../../icons/ProfileIcon"
8
10
import { hexSchema } from "../../schemas/hexSchema"
9
11
import { DropdownElement } from "../../types/DropdownElement"
12
+ import { SkeletonLoading } from "../Loading/SkeletonLoading"
10
13
import { ConnectedMenu } from "./ConnectedMenu"
14
+ import { AccountInfo } from "./types"
11
15
12
16
const { uint256ToBN } = uint256
13
17
14
18
interface ConnectedButtonProps {
15
19
address : string
16
- accountInfo ?: {
17
- showBalance ?: boolean
18
- starknetId ?: string
19
- starknetIdAvatar ?: string
20
- }
20
+ chainId : constants . StarknetChainId
21
+ accountInfo ?: AccountInfo
21
22
dropdownElements ?: DropdownElement [ ]
22
23
provider : ProviderInterface
23
24
symbol ?: string
@@ -30,17 +31,28 @@ const FEE_TOKEN_ADDRESS = // ETH on starknet
30
31
31
32
const ConnectedButton : FC < ConnectedButtonProps > = ( {
32
33
address,
34
+ chainId,
33
35
accountInfo,
34
36
dropdownElements,
35
37
provider,
36
- symbol,
38
+ symbol = "ETH" ,
37
39
webWalletUrl,
38
40
style,
39
41
} ) => {
40
42
const [ isOpen , setIsOpen ] = useState ( false )
41
43
const [ balance , setBalance ] = useState ( "" )
44
+ const [ isFetchingBalance , setIsFetchingBalance ] = useState ( false )
45
+
46
+ const { showBalance, displayStarknetId, displayStarknetIdAvatar } =
47
+ accountInfo ?? { }
42
48
43
- const { showBalance, starknetId, starknetIdAvatar } = accountInfo ?? { }
49
+ const { data, isLoading } = useStarknetId ( {
50
+ address,
51
+ chainId,
52
+ displayStarknetId,
53
+ displayStarknetIdAvatar,
54
+ provider,
55
+ } )
44
56
45
57
const toggleMenu = ( ) => {
46
58
setIsOpen ( ( prev ) => ! prev )
@@ -56,6 +68,7 @@ const ConnectedButton: FC<ConnectedButtonProps> = ({
56
68
}
57
69
58
70
const balanceOf = async ( address : string ) => {
71
+ setIsFetchingBalance ( true )
59
72
try {
60
73
const values = await provider . callContract ( {
61
74
contractAddress : FEE_TOKEN_ADDRESS ,
@@ -77,10 +90,17 @@ const ConnectedButton: FC<ConnectedButtonProps> = ({
77
90
decimals : 18 ,
78
91
} )
79
92
80
- setBalance ( prettifyTokenNumber ( formatted ) ?? "-" )
93
+ const formattedBigDecimalValue = new BigDecimalNumber ( formatted )
94
+ setBalance (
95
+ formattedBigDecimalValue . lt ( 0.001 )
96
+ ? "< 0.001"
97
+ : prettifyTokenNumber ( formatted , { maxDecimalPlaces : 3 } ) ?? "-" ,
98
+ )
81
99
} catch ( e ) {
82
100
console . error ( e )
83
101
setBalance ( "-" )
102
+ } finally {
103
+ setIsFetchingBalance ( false )
84
104
}
85
105
}
86
106
@@ -105,27 +125,52 @@ const ConnectedButton: FC<ConnectedButtonProps> = ({
105
125
>
106
126
{ showBalance && (
107
127
< >
108
- < div className = "flex items-center" >
109
- < span >
110
- { balance } { symbol }
111
- </ span >
112
- </ div >
128
+ { isFetchingBalance ? (
129
+ < div className = "flex items-center justify-center w-8 h-2" >
130
+ < SkeletonLoading />
131
+ </ div >
132
+ ) : (
133
+ < div className = "flex items-center" >
134
+ < span >
135
+ { balance } { symbol }
136
+ </ span >
137
+ </ div >
138
+ ) }
113
139
< div className = "h-10 border border-solid border-neutrals.200" />
114
140
</ >
115
141
) }
116
- < div className = "flex items-center gap-2" >
117
- { starknetIdAvatar ? (
118
- < img className = "w-4 h-4" src = { starknetIdAvatar } />
119
- ) : (
120
- < div className = "flex items-center justify-center bg-[#F0F0F0] rounded-full w-6 h-6" >
121
- < ProfileIcon className = "w-4 h-4" />
122
- </ div >
123
- ) }
124
- { starknetId ? (
125
- < div > { starknetId } </ div >
126
- ) : (
127
- < div > { truncateAddress ( address ) } </ div >
128
- ) }
142
+ < div className = "flex flex-1 items-center justify-between" >
143
+ < div className = "flex items-center gap-2 relative" >
144
+ { isLoading ? (
145
+ < div className = "flex items-center justify-center w-4 h-2" >
146
+ < SkeletonLoading />
147
+ </ div >
148
+ ) : (
149
+ < >
150
+ { displayStarknetIdAvatar && data ?. starknetIdAvatar ? (
151
+ < img className = "w-6 h-6" src = { data . starknetIdAvatar } />
152
+ ) : (
153
+ < div className = "flex items-center justify-center bg-[#F0F0F0] rounded-full w-6 h-6" >
154
+ < ProfileIcon className = "w-4 h-4" />
155
+ </ div >
156
+ ) }
157
+ </ >
158
+ ) }
159
+
160
+ { isLoading ? (
161
+ < div className = "flex items-center justify-center w-4 h-2" >
162
+ < SkeletonLoading />
163
+ </ div >
164
+ ) : (
165
+ < >
166
+ { displayStarknetId && data ?. starknetId ? (
167
+ < div > { data . starknetId } </ div >
168
+ ) : (
169
+ < div > { truncateAddress ( address ) } </ div >
170
+ ) }
171
+ </ >
172
+ ) }
173
+ </ div >
129
174
</ div >
130
175
< ChevronDown />
131
176
</ button >
0 commit comments