Back button and title components

This commit is contained in:
Brandon Millman
2018-05-11 14:17:40 -07:00
parent 55d1228abb
commit ef1e974346
3 changed files with 112 additions and 64 deletions

View File

@@ -3,7 +3,7 @@ import { BigNumber } from '@0xproject/utils';
import * as _ from 'lodash';
import * as React from 'react';
import * as DocumentTitle from 'react-document-title';
import { Route, RouteComponentProps, Switch } from 'react-router-dom';
import { Link, Route, RouteComponentProps, Switch } from 'react-router-dom';
import { Blockchain } from 'ts/blockchain';
import { BlockchainErrDialog } from 'ts/components/dialogs/blockchain_err_dialog';
@@ -78,6 +78,7 @@ enum TokenManagementState {
const THROTTLE_TIMEOUT = 100;
const TOP_BAR_HEIGHT = TopBar.heightForDisplayType(TopBarDisplayType.Expanded);
const BACK_BUTTON_HEIGHT = 28;
const styles: Styles = {
root: {
@@ -97,6 +98,16 @@ const styles: Styles = {
fontWeight: 'bold',
fontSize: 20,
},
backButton: {
height: BACK_BUTTON_HEIGHT,
backgroundColor: colors.white,
borderRadius: BACK_BUTTON_HEIGHT,
boxShadow: `0px 4px 6px ${colors.walletBoxShadow}`,
},
backButtonIcon: {
color: colors.mediumBlue,
fontSize: 20,
},
};
export class Portal extends React.Component<PortalProps, PortalState> {
@@ -190,9 +201,6 @@ export class Portal extends React.Component<PortalProps, PortalState> {
<div id="portal" style={styles.body}>
<div className="sm-flex flex-center">
<div className="flex-last px3">
<div className="py3" style={styles.title}>
Your Account
</div>
<div style={{ width: 346 }}>
<Switch>
<Route
@@ -208,9 +216,6 @@ export class Portal extends React.Component<PortalProps, PortalState> {
</div>
</div>
<div className="flex-auto px3" style={styles.scrollContainer}>
<div className="py3" style={styles.title}>
Explore 0x Ecosystem
</div>
<Switch>
<Route
path={`${WebsitePaths.Portal}/weth`}
@@ -218,7 +223,7 @@ export class Portal extends React.Component<PortalProps, PortalState> {
/>
<Route path={`${WebsitePaths.Portal}/fill`} render={this._renderFillOrder.bind(this)} />
<Route
path={`${WebsitePaths.Portal}/balances`}
path={`${WebsitePaths.Portal}/account`}
render={this._renderTokenBalances.bind(this)}
/>
<Route
@@ -268,29 +273,37 @@ export class Portal extends React.Component<PortalProps, PortalState> {
);
}
private _renderMenu(routeComponentProps: RouteComponentProps<any>) {
return <PortalMenu selectedPath={routeComponentProps.location.pathname} />;
return (
<div>
<BackButton />
<PortalMenu selectedPath={routeComponentProps.location.pathname} />
</div>
);
}
private _renderWallet() {
const allTokens = _.values(this.props.tokenByAddress);
const trackedTokens = _.filter(allTokens, t => t.isTracked);
return (
<Wallet
userAddress={this.props.userAddress}
networkId={this.props.networkId}
blockchain={this._blockchain}
blockchainIsLoaded={this.props.blockchainIsLoaded}
blockchainErr={this.props.blockchainErr}
dispatcher={this.props.dispatcher}
tokenByAddress={this.props.tokenByAddress}
trackedTokens={trackedTokens}
userEtherBalanceInWei={this.props.userEtherBalanceInWei}
lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
injectedProviderName={this.props.injectedProviderName}
providerType={this.props.providerType}
onToggleLedgerDialog={this._onToggleLedgerDialog.bind(this)}
onAddToken={this._onAddToken.bind(this)}
onRemoveToken={this._onRemoveToken.bind(this)}
/>
<div>
<Title titleText={'Your Account'} />
<Wallet
userAddress={this.props.userAddress}
networkId={this.props.networkId}
blockchain={this._blockchain}
blockchainIsLoaded={this.props.blockchainIsLoaded}
blockchainErr={this.props.blockchainErr}
dispatcher={this.props.dispatcher}
tokenByAddress={this.props.tokenByAddress}
trackedTokens={trackedTokens}
userEtherBalanceInWei={this.props.userEtherBalanceInWei}
lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
injectedProviderName={this.props.injectedProviderName}
providerType={this.props.providerType}
onToggleLedgerDialog={this._onToggleLedgerDialog.bind(this)}
onAddToken={this._onAddToken.bind(this)}
onRemoveToken={this._onRemoveToken.bind(this)}
/>
</div>
);
}
private _renderEthWrapper() {
@@ -319,19 +332,22 @@ export class Portal extends React.Component<PortalProps, PortalState> {
const allTokens = _.values(this.props.tokenByAddress);
const trackedTokens = _.filter(allTokens, t => t.isTracked);
return (
<TokenBalances
blockchain={this._blockchain}
blockchainErr={this.props.blockchainErr}
blockchainIsLoaded={this.props.blockchainIsLoaded}
dispatcher={this.props.dispatcher}
screenWidth={this.props.screenWidth}
tokenByAddress={this.props.tokenByAddress}
trackedTokens={trackedTokens}
userAddress={this.props.userAddress}
userEtherBalanceInWei={this.props.userEtherBalanceInWei}
networkId={this.props.networkId}
lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
/>
<div>
<Title titleText={'Your Account'} />
<TokenBalances
blockchain={this._blockchain}
blockchainErr={this.props.blockchainErr}
blockchainIsLoaded={this.props.blockchainIsLoaded}
dispatcher={this.props.dispatcher}
screenWidth={this.props.screenWidth}
tokenByAddress={this.props.tokenByAddress}
trackedTokens={trackedTokens}
userAddress={this.props.userAddress}
userEtherBalanceInWei={this.props.userEtherBalanceInWei}
networkId={this.props.networkId}
lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
/>
</div>
);
}
private _renderFillOrder(match: any, location: Location, history: History) {
@@ -363,7 +379,12 @@ export class Portal extends React.Component<PortalProps, PortalState> {
);
}
private _renderRelayerIndex() {
return <RelayerIndex networkId={this.props.networkId} />;
return (
<div>
<Title titleText={'Explore 0x Relayers'} />
<RelayerIndex networkId={this.props.networkId} />
</div>
);
}
private _onTokenChosen(tokenAddress: string): void {
if (_.isEmpty(tokenAddress)) {
@@ -419,3 +440,31 @@ export class Portal extends React.Component<PortalProps, PortalState> {
this.props.dispatcher.updateScreenWidth(newScreenWidth);
}
}
interface TitleProps {
titleText: string;
}
const Title = (props: TitleProps) => {
return (
<div className="py3" style={styles.title}>
{props.titleText}
</div>
);
};
const BackButton = () => {
return (
<div style={{ height: 65, paddingTop: 25 }}>
<Link to={`${WebsitePaths.Portal}`} style={{ textDecoration: 'none' }}>
<div className="flex right" style={{ ...styles.backButton, paddingTop: 10 }}>
<div style={{ marginLeft: 12 }}>
<i style={styles.backButtonIcon} className={`zmdi zmdi-arrow-left`} />
</div>
<div style={{ marginLeft: 12, marginRight: 12 }}>
<div style={{ fontSize: 16, color: colors.lightGrey }}>back to Relayers</div>
</div>
</div>
</Link>
</div>
);
};

View File

@@ -17,39 +17,34 @@ interface MenuItemEntry {
const menuItemEntries: MenuItemEntry[] = [
{
to: `${WebsitePaths.Portal}`,
labelText: 'Generate order',
iconName: 'zmdi-arrow-right-top',
},
{
to: `${WebsitePaths.Portal}/fill`,
labelText: 'Fill order',
iconName: 'zmdi-arrow-left-bottom',
},
{
to: `${WebsitePaths.Portal}/balances`,
labelText: 'Balances',
to: `${WebsitePaths.Portal}/account`,
labelText: 'Account Overview',
iconName: 'zmdi-balance-wallet',
},
{
to: `${WebsitePaths.Portal}/trades`,
labelText: 'Trade History',
labelText: 'Trade history',
iconName: 'zmdi-format-list-bulleted',
},
{
to: `${WebsitePaths.Portal}/weth`,
labelText: 'Wrap ETH',
labelText: 'Wrapped ETH',
iconName: 'zmdi-circle-o',
},
{
to: `${WebsitePaths.Portal}/direct`,
labelText: 'Trade direct',
iconName: 'zmdi-swap',
},
];
const DEFAULT_LABEL_COLOR = colors.darkerGrey;
const DEFAULT_ICON_COLOR = colors.darkerGrey;
const SELECTED_ICON_COLOR = colors.yellow800;
const SELECTED_ICON_COLOR = colors.yellow900;
export const PortalMenu: React.StatelessComponent<PortalMenuProps> = (props: PortalMenuProps) => {
return (
<div>
<div style={{ paddingLeft: 185 }}>
{_.map(menuItemEntries, entry => {
const selected = entry.to === props.selectedPath;
return (
@@ -80,7 +75,7 @@ const PortalMenuItemLabel: React.StatelessComponent<PortalMenuItemLabelProps> =
};
return (
<div className="flex">
<div className="pr1 pl2">
<div className="pr1">
<i style={styles.iconStyle} className={`zmdi ${props.iconName}`} />
</div>
<div className="pl1" style={styles.textStyle}>

View File

@@ -18,6 +18,7 @@ import NavigationArrowDownward from 'material-ui/svg-icons/navigation/arrow-down
import NavigationArrowUpward from 'material-ui/svg-icons/navigation/arrow-upward';
import Close from 'material-ui/svg-icons/navigation/close';
import * as React from 'react';
import { Link } from 'react-router-dom';
import ReactTooltip = require('react-tooltip');
import firstBy = require('thenby');
@@ -38,6 +39,7 @@ import {
TokenByAddress,
TokenState,
TokenStateByAddress,
WebsitePaths,
} from 'ts/types';
import { backendClient } from 'ts/utils/backend_client';
import { constants } from 'ts/utils/constants';
@@ -237,13 +239,15 @@ export class Wallet extends React.Component<WalletProps, WalletState> {
const userAddress = this.props.userAddress;
const primaryText = utils.getAddressBeginAndEnd(userAddress);
return (
<ListItem
key={HEADER_ITEM_KEY}
primaryText={primaryText}
leftIcon={<Identicon address={userAddress} diameter={ICON_DIMENSION} />}
style={{ ...styles.paddedItem, ...styles.borderedItem }}
innerDivStyle={styles.headerItemInnerDiv}
/>
<Link to={`${WebsitePaths.Portal}/account`} style={{ textDecoration: 'none' }}>
<ListItem
key={HEADER_ITEM_KEY}
primaryText={primaryText}
leftIcon={<Identicon address={userAddress} diameter={ICON_DIMENSION} />}
style={{ ...styles.paddedItem, ...styles.borderedItem }}
innerDivStyle={styles.headerItemInnerDiv}
/>
</Link>
);
}
private _renderBody(): React.ReactElement<{}> {