feat: create PaymentMethodDropdown
This commit is contained in:
@@ -35,7 +35,7 @@ export class ERC20TokenSelector extends React.Component<ERC20TokenSelectorProps>
|
||||
value={this.state.searchQuery}
|
||||
onChange={this._handleSearchInputChange}
|
||||
/>
|
||||
<Container overflow="scroll" height="400px" marginTop="10px">
|
||||
<Container overflow="scroll" height="390px" marginTop="10px">
|
||||
{_.map(tokens, token => {
|
||||
if (!this._isTokenQueryMatch(token)) {
|
||||
return null;
|
||||
|
||||
@@ -3,8 +3,8 @@ import * as React from 'react';
|
||||
|
||||
import { ColorOption } from '../style/theme';
|
||||
|
||||
import { PaymentMethodDropdown } from './payment_method_dropdown';
|
||||
import { Container } from './ui/container';
|
||||
import { Dropdown } from './ui/dropdown';
|
||||
import { Text } from './ui/text';
|
||||
|
||||
export interface PaymentMethodProps {}
|
||||
@@ -24,7 +24,7 @@ export class PaymentMethod extends React.Component<PaymentMethodProps> {
|
||||
Payment Method
|
||||
</Text>
|
||||
</Container>
|
||||
<Dropdown value="0x00000000000000" label="25.33 ETH" />
|
||||
<PaymentMethodDropdown />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
33
packages/instant/src/components/payment_method_dropdown.tsx
Normal file
33
packages/instant/src/components/payment_method_dropdown.tsx
Normal file
@@ -0,0 +1,33 @@
|
||||
import { BigNumber } from '@0x/utils';
|
||||
import * as React from 'react';
|
||||
|
||||
import { format } from '../util/format';
|
||||
|
||||
import { Dropdown, DropdownItemConfig } from './ui/dropdown';
|
||||
|
||||
export interface PaymentMethodDropdownProps {
|
||||
selectedEthAddress: string;
|
||||
addressEthBaseAmount: BigNumber;
|
||||
}
|
||||
|
||||
export class PaymentMethodDropdown extends React.Component<PaymentMethodDropdownProps> {
|
||||
public static defaultProps = {
|
||||
selectedEthAddress: '0xa1b2c3d4e5f6g7h8j9k10',
|
||||
addressEthBaseAmount: new BigNumber(10500000000000000000),
|
||||
};
|
||||
public render(): React.ReactNode {
|
||||
const { selectedEthAddress, addressEthBaseAmount } = this.props;
|
||||
const value = format.ethAddress(selectedEthAddress);
|
||||
const label = format.ethBaseAmount(addressEthBaseAmount) as string;
|
||||
return <Dropdown value={value} label={label} items={this._getDropdownItemConfigs()} />;
|
||||
}
|
||||
private readonly _getDropdownItemConfigs = (): DropdownItemConfig[] => {
|
||||
const viewOnEtherscan = {
|
||||
text: 'View on Etherscan',
|
||||
};
|
||||
const copyAddressToClipboard = {
|
||||
text: 'Copy address to clipboard',
|
||||
};
|
||||
return [viewOnEtherscan, copyAddressToClipboard];
|
||||
};
|
||||
}
|
||||
@@ -6,6 +6,8 @@ import { ColorOption, styled } from '../../style/theme';
|
||||
export interface ButtonProps {
|
||||
backgroundColor?: ColorOption;
|
||||
borderColor?: ColorOption;
|
||||
fontColor?: ColorOption;
|
||||
fontSize?: string;
|
||||
width?: string;
|
||||
padding?: string;
|
||||
type?: string;
|
||||
@@ -24,38 +26,50 @@ const darkenOnHoverAmount = 0.1;
|
||||
const darkenOnActiveAmount = 0.2;
|
||||
const saturateOnFocusAmount = 0.2;
|
||||
export const Button = styled(PlainButton)`
|
||||
cursor: ${props => (props.isDisabled ? 'default' : 'pointer')};
|
||||
transition: background-color, opacity 0.5s ease;
|
||||
padding: ${props => props.padding};
|
||||
border-radius: 3px;
|
||||
outline: none;
|
||||
width: ${props => props.width};
|
||||
background-color: ${props => (props.backgroundColor ? props.theme[props.backgroundColor] : 'none')};
|
||||
border: ${props => (props.borderColor ? `1px solid ${props.theme[props.borderColor]}` : 'none')};
|
||||
&:hover {
|
||||
background-color: ${props =>
|
||||
!props.isDisabled
|
||||
? darken(darkenOnHoverAmount, props.theme[props.backgroundColor || 'white'])
|
||||
: ''} !important;
|
||||
}
|
||||
&:active {
|
||||
background-color: ${props =>
|
||||
!props.isDisabled ? darken(darkenOnActiveAmount, props.theme[props.backgroundColor || 'white']) : ''};
|
||||
}
|
||||
&:disabled {
|
||||
opacity: 0.5;
|
||||
}
|
||||
&:focus {
|
||||
background-color: ${props => saturate(saturateOnFocusAmount, props.theme[props.backgroundColor || 'white'])};
|
||||
&& {
|
||||
all: initial;
|
||||
box-sizing: border-box;
|
||||
font-size: ${props => props.fontSize};
|
||||
font-family: 'Inter UI', sans-serif;
|
||||
font-weight: 600;
|
||||
color: ${props => props.fontColor && props.theme[props.fontColor]};
|
||||
cursor: ${props => (props.isDisabled ? 'default' : 'pointer')};
|
||||
transition: background-color, opacity 0.5s ease;
|
||||
padding: ${props => props.padding};
|
||||
border-radius: 3px;
|
||||
text-align: center;
|
||||
outline: none;
|
||||
width: ${props => props.width};
|
||||
background-color: ${props => (props.backgroundColor ? props.theme[props.backgroundColor] : 'none')};
|
||||
border: ${props => (props.borderColor ? `1px solid ${props.theme[props.borderColor]}` : 'none')};
|
||||
&:hover {
|
||||
background-color: ${props =>
|
||||
!props.isDisabled
|
||||
? darken(darkenOnHoverAmount, props.theme[props.backgroundColor || 'white'])
|
||||
: ''} !important;
|
||||
}
|
||||
&:active {
|
||||
background-color: ${props =>
|
||||
!props.isDisabled ? darken(darkenOnActiveAmount, props.theme[props.backgroundColor || 'white']) : ''};
|
||||
}
|
||||
&:disabled {
|
||||
opacity: 0.5;
|
||||
}
|
||||
&:focus {
|
||||
background-color: ${props =>
|
||||
saturate(saturateOnFocusAmount, props.theme[props.backgroundColor || 'white'])};
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
Button.defaultProps = {
|
||||
backgroundColor: ColorOption.primaryColor,
|
||||
borderColor: ColorOption.primaryColor,
|
||||
fontColor: ColorOption.white,
|
||||
width: 'auto',
|
||||
isDisabled: false,
|
||||
padding: '1em 2.2em',
|
||||
padding: '.6em 1.2em',
|
||||
fontSize: '15px',
|
||||
};
|
||||
|
||||
Button.displayName = 'Button';
|
||||
|
||||
@@ -17,7 +17,7 @@ export interface DropdownItemConfig {
|
||||
|
||||
export interface DropdownProps {
|
||||
value: string;
|
||||
label: string;
|
||||
label?: string;
|
||||
items: DropdownItemConfig[];
|
||||
}
|
||||
|
||||
@@ -27,14 +27,7 @@ export interface DropdownState {
|
||||
|
||||
export class Dropdown extends React.Component<DropdownProps, DropdownState> {
|
||||
public static defaultProps = {
|
||||
items: [
|
||||
{
|
||||
text: 'Item 1',
|
||||
},
|
||||
{
|
||||
text: 'Item 2',
|
||||
},
|
||||
],
|
||||
items: [],
|
||||
};
|
||||
public state: DropdownState = {
|
||||
isOpen: false,
|
||||
@@ -57,7 +50,7 @@ export class Dropdown extends React.Component<DropdownProps, DropdownState> {
|
||||
<Container
|
||||
cursor={hasItems ? 'pointer' : undefined}
|
||||
onClick={this._handleDropdownClick}
|
||||
hasBoxShadow={true}
|
||||
hasBoxShadow={isOpen}
|
||||
borderRadius={borderRadius}
|
||||
border="1px solid"
|
||||
borderColor={ColorOption.feintGrey}
|
||||
@@ -69,9 +62,11 @@ export class Dropdown extends React.Component<DropdownProps, DropdownState> {
|
||||
{value}
|
||||
</Text>
|
||||
<Container>
|
||||
<Text fontSize="16px" fontColor={ColorOption.lightGrey}>
|
||||
{label}
|
||||
</Text>
|
||||
{label && (
|
||||
<Text fontSize="16px" fontColor={ColorOption.lightGrey}>
|
||||
{label}
|
||||
</Text>
|
||||
)}
|
||||
{hasItems && (
|
||||
<Container marginLeft="5px" display="inline-block" position="relative" bottom="2px">
|
||||
<Icon padding="3px" icon="chevron" width={12} stroke={ColorOption.grey} />
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import * as _ from 'lodash';
|
||||
import * as React from 'react';
|
||||
|
||||
import { overlayBlack, styled } from '../../style/theme';
|
||||
import { zIndex } from '../../style/z_index';
|
||||
|
||||
@@ -6,7 +6,6 @@ import { LatestError } from '../containers/latest_error';
|
||||
import { SelectedAssetBuyOrderProgress } from '../containers/selected_asset_buy_order_progress';
|
||||
import { SelectedAssetBuyOrderStateButtons } from '../containers/selected_asset_buy_order_state_buttons';
|
||||
import { SelectedAssetInstantHeading } from '../containers/selected_asset_instant_heading';
|
||||
|
||||
import { ColorOption } from '../style/theme';
|
||||
import { zIndex } from '../style/z_index';
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import * as React from 'react';
|
||||
|
||||
import { ColorOption, overlayBlack, styled } from '../style/theme';
|
||||
import { ColorOption } from '../style/theme';
|
||||
|
||||
import { Container } from './ui/container';
|
||||
import { Flex } from './ui/flex';
|
||||
|
||||
@@ -50,4 +50,7 @@ export const format = {
|
||||
}
|
||||
return `$${ethUnitAmount.mul(ethUsdPrice).toFixed(decimalPlaces)}`;
|
||||
},
|
||||
ethAddress: (address: string): string => {
|
||||
return `0x${address.slice(2, 7)}…${address.slice(-5)}`;
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user