1- import { useMemo , useRef , useState } from 'react'
1+ import { useCallback , useMemo , useRef , useState } from 'react'
22import type { AriaButtonProps } from 'react-aria'
33import { useButton } from 'react-aria'
44import { styled } from 'styled-components'
@@ -7,7 +7,7 @@ import Icon from '@ui/Icon'
77import Spinner from '@ui/Spinner'
88import { FORMAT_OPTIONS , formatNumber } from '@ui/utils'
99import { fetchTokenUsdRate } from '@ui-kit/lib/model/entities/token-usd-rate'
10- import { copyToClipboard } from '@ui-kit/utils'
10+ import { copyToClipboard , shortenAddress } from '@ui-kit/utils'
1111
1212interface ButtonProps extends AriaButtonProps {
1313 className ?: string
@@ -50,11 +50,11 @@ const ChipToken = ({ className, isHighlight, tokenName, tokenAddress, ...props }
5050 const [ usdRate , setUsdRate ] = useState < number | undefined > ( undefined )
5151 const parsedUsdRate = formatNumber ( usdRate , { ...FORMAT_OPTIONS . USD , defaultValue : '-' } )
5252
53- const handleMouseEnter = ( foundUsdRate ?: string ) => {
54- if ( ! foundUsdRate ) {
53+ const handleMouseEnter = useCallback ( ( ) => {
54+ if ( usdRate == null ) {
5555 void fetchTokenUsdRate ( { chainId, tokenAddress } ) . then ( setUsdRate )
5656 }
57- }
57+ } , [ usdRate , chainId , tokenAddress ] )
5858
5959 const parsedTokenName = useMemo ( ( ) => {
6060 if ( tokenName && tokenName . length > 10 ) {
@@ -64,18 +64,28 @@ const ChipToken = ({ className, isHighlight, tokenName, tokenAddress, ...props }
6464 } , [ tokenName ] )
6565
6666 return (
67- < ChipTokenWrapper className = { className } onMouseEnter = { ( ) => handleMouseEnter ( parsedUsdRate ) } >
67+ < ChipTokenWrapper className = { className } onMouseEnter = { handleMouseEnter } >
6868 < span > { isHighlight ? < strong > { parsedTokenName } </ strong > : parsedTokenName } </ span >
6969 < ChipTokenAdditionalInfo >
7070 < Button { ...props } onPress = { ( ) => copyToClipboard ( tokenAddress ) } >
71- < ChipTokenUsdRate > { typeof usdRate === 'undefined' ? < Spinner size = { 10 } /> : parsedUsdRate } </ ChipTokenUsdRate >
72- < ChipTokenCopyButtonIcon name = "Copy" size = { 16 } />
71+ < AlignmentWrapper >
72+ < ChipTokenUsdRate >
73+ { usdRate == null ? < ChipTokenUsdRateSpinner size = { 10 } /> : parsedUsdRate }
74+ </ ChipTokenUsdRate >
75+ < ChipTokenAddress > { shortenAddress ( tokenAddress ) } </ ChipTokenAddress >
76+ < ChipTokenCopyButtonIcon name = "Copy" size = { 16 } />
77+ </ AlignmentWrapper >
7378 </ Button >
7479 </ ChipTokenAdditionalInfo >
7580 </ ChipTokenWrapper >
7681 )
7782}
7883
84+ const AlignmentWrapper = styled . div `
85+ display: flex;
86+ gap: 4px;
87+ align-items: end;
88+ `
7989const ChipTokenAdditionalInfo = styled . span `
8090 align-items: center;
8191 max-width: 0;
@@ -101,19 +111,22 @@ const ChipTokenWrapper = styled.span`
101111 }
102112 }
103113`
114+ const ChipTokenAddress = styled . span `
115+ font-family: var(--font-mono);
116+ font-size: var(--font-size-2);
117+ margin-bottom: 2px;
118+ `
104119
105120const ChipTokenUsdRate = styled . span `
106- margin: 0 2px;
107- position: relative;
108- top: -2px;
109121 font-size: var(--font-size-1);
110122 font-weight: bold;
123+ margin-bottom: 2px;
111124`
112125
126+ const ChipTokenUsdRateSpinner = styled ( Spinner ) ``
127+
113128const ChipTokenCopyButtonIcon = styled ( Icon ) `
114- position: relative;
115- top: 1px;
116- margin: 0 2px;
129+ margin-bottom: 2px;
117130`
118131
119132export default ChipToken
0 commit comments