Token Details component for Tokens Detected page (#14169)
parent
dfd3e233e8
commit
96610742ce
@ -0,0 +1,41 @@ |
||||
import React from 'react'; |
||||
import { useSelector } from 'react-redux'; |
||||
import PropTypes from 'prop-types'; |
||||
|
||||
import Box from '../../../ui/box'; |
||||
import Identicon from '../../../ui/identicon'; |
||||
import DetectedTokenValues from '../detected-token-values/detected-token-values'; |
||||
import DetectedTokenAddress from '../detected-token-address/detected-token-address'; |
||||
import DetectedTokenAggregators from '../detected-token-aggregators/detected-token-aggregators'; |
||||
import { DISPLAY } from '../../../../helpers/constants/design-system'; |
||||
import { getTokenList } from '../../../../selectors'; |
||||
|
||||
const DetectedTokenDetails = ({ tokenAddress }) => { |
||||
const tokenList = useSelector(getTokenList); |
||||
const token = tokenList[tokenAddress]; |
||||
|
||||
return ( |
||||
<Box display={DISPLAY.FLEX} className="detected-token-details"> |
||||
<Identicon |
||||
className="detected-token-details__identicon" |
||||
address={tokenAddress} |
||||
diameter={40} |
||||
/> |
||||
<Box |
||||
display={DISPLAY.GRID} |
||||
marginLeft={2} |
||||
className="detected-token-details__data" |
||||
> |
||||
<DetectedTokenValues token={token} /> |
||||
<DetectedTokenAddress address={token.address} /> |
||||
<DetectedTokenAggregators aggregatorsList={token.aggregators} /> |
||||
</Box> |
||||
</Box> |
||||
); |
||||
}; |
||||
|
||||
DetectedTokenDetails.propTypes = { |
||||
tokenAddress: PropTypes.string, |
||||
}; |
||||
|
||||
export default DetectedTokenDetails; |
@ -0,0 +1,26 @@ |
||||
import React from 'react'; |
||||
|
||||
import DetectedTokenDetails from './detected-token-details'; |
||||
|
||||
export default { |
||||
title: 'Components/App/DetectedToken/DetectedTokenDetails', |
||||
id: __filename, |
||||
argTypes: { |
||||
address: { control: 'text' }, |
||||
}, |
||||
args: { |
||||
address: '0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f', |
||||
}, |
||||
}; |
||||
|
||||
const Template = (args) => { |
||||
return ( |
||||
<div style={{ width: '320px' }}> |
||||
<DetectedTokenDetails tokenAddress={args.address} /> |
||||
</div> |
||||
); |
||||
}; |
||||
|
||||
export const DefaultStory = Template.bind({}); |
||||
|
||||
DefaultStory.storyName = 'Default'; |
@ -0,0 +1,35 @@ |
||||
import * as React from 'react'; |
||||
import { |
||||
renderWithProvider, |
||||
screen, |
||||
fireEvent, |
||||
} from '../../../../../test/jest'; |
||||
import configureStore from '../../../../store/store'; |
||||
import testData from '../../../../../.storybook/test-data'; |
||||
|
||||
import DetectedTokenDetails from './detected-token-details'; |
||||
|
||||
describe('DetectedTokenDetails', () => { |
||||
const args = { |
||||
tokenAddress: '0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f', |
||||
}; |
||||
|
||||
it('should render the detected token details', async () => { |
||||
const store = configureStore(testData); |
||||
renderWithProvider(<DetectedTokenDetails {...args} />, store); |
||||
|
||||
expect(screen.getByText('0 SNX')).toBeInTheDocument(); |
||||
expect(screen.getByText('$0')).toBeInTheDocument(); |
||||
expect(screen.getByText('Token address:')).toBeInTheDocument(); |
||||
expect(screen.getByText('0xc01...2a6f')).toBeInTheDocument(); |
||||
expect(screen.getByText('From token lists:')).toBeInTheDocument(); |
||||
expect(screen.getByText('Aave, Bancor')).toBeInTheDocument(); |
||||
expect(screen.getByText('+ 10 more')).toBeInTheDocument(); |
||||
fireEvent.click(screen.getByText('+ 10 more')); |
||||
expect( |
||||
screen.getByText( |
||||
'Aave, Bancor, CMC, Crypto.com, CoinGecko, 1inch, Paraswap, PMM, Synthetix, Zapper, Zerion, 0x.', |
||||
), |
||||
).toBeInTheDocument(); |
||||
}); |
||||
}); |
@ -0,0 +1,9 @@ |
||||
.detected-token-details { |
||||
&__identicon { |
||||
margin-top: 4px; |
||||
} |
||||
|
||||
&__data { |
||||
flex-grow: 1; |
||||
} |
||||
} |
Loading…
Reference in new issue