@bzxnetwork/portal
Version:
Frontend demo portal for bZx
773 lines (737 loc) • 27 kB
JSX
import { Fragment } from "react";
import withRoot from "../lib/material-ui/withRoot";
import Layout from "../src/common/Layout";
import {
Card,
Header,
HeaderTitle,
HeaderTitleNoProvider,
HeaderTitleSiteName,
HeaderTitleContext,
HeaderData,
TabGroup,
Tab,
Content,
ContentContainer
} from "../src/common/MainContent";
import styled from "styled-components";
import { withRouter } from 'next/router'
import Balances from "../src/balances";
import LoanTokens from "../src/tokenization/LoanTokens";
import PositionTokens from "../src/tokenization/PositionTokens";
import DebugTokenization from "../src/tokenization/DebugTokenization";
import GenerateOrder from "../src/orders/GenerateOrder";
import FillOrder from "../src/orders/FillOrder";
import OrderHistory from "../src/orders/OrderHistory";
import OrderBook from "../src/orders/OrderBook";
import Borrowing from "../src/borrowing";
import Lending from "../src/lending";
import Bounties from "../src/bounties";
import Debug from "../src/debug";
//import Tokensale from "../src/tokensale";
import Web3Container from "../src/web3/Web3Container";
import NetworkIndicator from "../src/common/NetworkIndicator";
import { Divider } from "../src/common/FormSection";
import { getTrackedTokens } from "../src/common/trackedTokens";
const ORDER_TABS = [
{ id: `Orders_GenOrder`, label: `Generate Order` },
{ id: `Orders_OrderBook`, label: `Order Book` },
{ id: `Orders_FillOrder`, label: `Fill Order` },
{ id: `Orders_OrderHistory`, label: `Order History` }
];
const TOKENIZED_TABS = [
{ id: `tokenizedloans_loantokens`, label: `Loan Tokens` },
{ id: `tokenizedloans_positiontokens`, label: `Position Tokens` },
{ id: `tokenizedloans_debug`, label: `Debug` }
];
const getDomainData = () => {
if (typeof window === 'undefined')
return {};
var result = {};
var full = window.location.host
var parts = full.split('.')
result.subdomain = parts[1] ? parts[0] : undefined;
result.domain = parts[1] ? parts[1] : parts[0];
result.type = parts[2];
return result;
};
let domainData = getDomainData();
let IndexExport;
switch (domainData.subdomain) {
case undefined:
//case `portal`:
default:
IndexExport = withRouter(withRoot(class extends React.Component {
state = {
activeCard: `balances`,
activeOrderTab: `Orders_GenOrder`,
activeTokenizedTab: `tokenizedloans_loantokens`,
activeOrder: null,
trackedTokens: [],
providerName: `MetaMask`,
getWeb3: true,
web3IsReceived: false,
hideChooseProviderDialog: false,
lastTokenRefresh: null,
currentHash: ``,
currentTrader: ``,
bZx: null
};
componentDidMount() {
if (this.props.router.query.p) {
this.setState({ activeCard: this.props.router.query.p });
}
}
setProvider = provider => {
switch (provider) {
case `MetaMask`:
this.setState({
providerName: provider,
getWeb3: true,
web3IsReceived: false
});
break;
case `Ledger`:
case `Trezor`:
default:
this.setState({
providerName: ``,
getWeb3: false,
web3IsReceived: false
});
break;
}
};
setCurrentLoan = (hash, trader) => this.setState({ currentHash: hash, currentTrader: trader });
toggleProviderDialog = event => {
event.preventDefault();
/*this.setState(p => ({
hideChooseProviderDialog: !p.hideChooseProviderDialog
}));*/
this.setProvider(`MetaMask`);
};
changeCard = cardId => this.setState({ activeCard: cardId });
changeOrderTab = (tabId, order) =>
this.setState({ activeOrderTab: tabId, activeOrder: order });
changeTokenizedTab = (tabId, order) =>
this.setState({ activeTokenizedTab: tabId, activeOrder: order });
web3Received = (bZx) => this.setState({ bZx, getWeb3: false, web3IsReceived: true });
clearProvider = () => {
this.setProvider(null);
};
updateTrackedTokens = tokens => hardRefresh => {
if (window.pqueueTokens.size == 0) {
if (hardRefresh) {
this.setState({ trackedTokens: [] }, () =>
this.setState({
trackedTokens: getTrackedTokens(tokens),
lastTokenRefresh: new Date().getTime()
})
);
} else {
this.setState({
trackedTokens: getTrackedTokens(tokens),
lastTokenRefresh: new Date().getTime()
});
}
}
};
headerSection = cardId => {
switch (cardId) {
case `balances`:
return (
<Fragment>
<HeaderTitle>
<HeaderTitleSiteName>bZx Portal</HeaderTitleSiteName>
<HeaderTitleContext>Balances</HeaderTitleContext>
</HeaderTitle>
<HeaderData />
</Fragment>
);
break; // eslint-disable-line no-unreachable
case `orders`:
return (
<Fragment>
<HeaderTitle>
<HeaderTitleSiteName>bZx Portal</HeaderTitleSiteName>
<HeaderTitleContext>Orders</HeaderTitleContext>
</HeaderTitle>
<HeaderData />
<TabGroup>
{ORDER_TABS.map(tab => (
<Tab
key={tab.id}
active={this.state.activeOrderTab === tab.id}
onClick={() => this.changeOrderTab(tab.id)}
>
{tab.label}
</Tab>
))}
</TabGroup>
</Fragment>
);
break; // eslint-disable-line no-unreachable
case `borrowing`:
return (
<Fragment>
<HeaderTitle>
<HeaderTitleSiteName>bZx Portal</HeaderTitleSiteName>
<HeaderTitleContext>Borrowing</HeaderTitleContext>
</HeaderTitle>
<HeaderData />
</Fragment>
);
break; // eslint-disable-line no-unreachable
case `lending`:
return (
<Fragment>
<HeaderTitle>
<HeaderTitleSiteName>bZx Portal</HeaderTitleSiteName>
<HeaderTitleContext>Lending</HeaderTitleContext>
</HeaderTitle>
<HeaderData />
</Fragment>
);
break; // eslint-disable-line no-unreachable
case `bounties`:
return (
<Fragment>
<HeaderTitle>
<HeaderTitleSiteName>bZx Portal</HeaderTitleSiteName>
<HeaderTitleContext>Bounties</HeaderTitleContext>
</HeaderTitle>
<HeaderData />
</Fragment>
);
break; // eslint-disable-line no-unreachable
case `tokenizedloans`:
return (
<Fragment>
<HeaderTitle>
<HeaderTitleSiteName>bZx Portal</HeaderTitleSiteName>
<HeaderTitleContext>Tokenized Loans</HeaderTitleContext>
</HeaderTitle>
<HeaderData />
<TabGroup>
{TOKENIZED_TABS.map(tab => {
if (tab.label === `Debug` && (!this.state.bZx || this.state.bZx.networkId !== 50)) {
return;
}
return (
<Tab
key={tab.id}
active={this.state.activeOrderTab === tab.id}
onClick={() => this.changeTokenizedTab(tab.id)}
>
{tab.label}
</Tab>
)})}
</TabGroup>
</Fragment>
);
break; // eslint-disable-line no-unreachable
case `debug`:
return (
<Fragment>
<HeaderTitle>
<HeaderTitleSiteName>bZx Portal</HeaderTitleSiteName>
<HeaderTitleContext>Debug</HeaderTitleContext>
</HeaderTitle>
<HeaderData />
</Fragment>
);
break; // eslint-disable-line no-unreachable
/*case `tokensale`:
return (
<Fragment>
<HeaderTitle>
<HeaderTitleSiteName>bZx Portal</HeaderTitleSiteName>
<HeaderTitleContext>Buy BZRX Token</HeaderTitleContext>
</HeaderTitle>
<HeaderData />
</Fragment>
);
break; // eslint-disable-line no-unreachable*/
default:
break;
}
return null;
};
contentSection = (
{ web3, zeroEx, tokens, bZx, accounts, oracles, networkId },
cardId,
tabId
) => {
switch (cardId) {
case `balances`:
return (
<Fragment>
<NetworkIndicator
networkId={networkId}
accounts={accounts}
etherscanURL={bZx.etherscanURL}
providerName={this.state.providerName}
clearProvider={this.clearProvider}
/>
<Balances
bZx={bZx}
web3={web3}
accounts={accounts}
tokens={tokens}
trackedTokens={this.state.trackedTokens}
updateTrackedTokens={this.updateTrackedTokens(tokens)}
lastTokenRefresh={this.state.lastTokenRefresh}
/>
</Fragment>
);
break; // eslint-disable-line no-unreachable
case `orders`:
return (
<Fragment>
<NetworkIndicator
networkId={networkId}
accounts={accounts}
etherscanURL={bZx.etherscanURL}
providerName={this.state.providerName}
clearProvider={this.clearProvider}
/>
<ContentContainer
show={this.state.activeOrderTab === `Orders_OrderBook`}
>
<p>On-chain Fillable Orders</p>
<Divider />
<OrderBook
bZx={bZx}
accounts={accounts}
tokens={tokens}
changeOrderTab={this.changeOrderTab}
tabId={tabId}
/>
</ContentContainer>
<ContentContainer show={this.state.activeOrderTab === `Orders_GenOrder`}>
<GenerateOrder
tokens={tokens}
bZx={bZx}
accounts={accounts}
web3={web3}
oracles={oracles}
/>
</ContentContainer>
<ContentContainer
show={this.state.activeOrderTab === `Orders_FillOrder`}
>
<FillOrder
tokens={tokens}
oracles={oracles}
bZx={bZx}
web3={web3}
accounts={accounts}
activeOrder={this.state.activeOrder}
changeOrderTab={this.changeOrderTab}
/>
</ContentContainer>
<ContentContainer
show={this.state.activeOrderTab === `Orders_OrderHistory`}
>
<OrderHistory
bZx={bZx}
accounts={accounts}
tokens={tokens}
changeTab={this.changeTab}
tabId={tabId}
/>
</ContentContainer>
</Fragment>
);
break; // eslint-disable-line no-unreachable
case `borrowing`:
return (
<Fragment>
<NetworkIndicator
networkId={networkId}
accounts={accounts}
etherscanURL={bZx.etherscanURL}
providerName={this.state.providerName}
clearProvider={this.clearProvider}
/>
<p>Manage your margin account positions.</p>
<Divider />
<Borrowing
bZx={bZx}
web3={web3}
accounts={accounts}
tokens={tokens}
trackedTokens={this.state.trackedTokens}
updateTrackedTokens={this.updateTrackedTokens(tokens)}
/>
</Fragment>
);
break; // eslint-disable-line no-unreachable
case `lending`:
return (
<Fragment>
<NetworkIndicator
networkId={networkId}
accounts={accounts}
etherscanURL={bZx.etherscanURL}
providerName={this.state.providerName}
clearProvider={this.clearProvider}
/>
<p>Manage active loans and view past loans.</p>
<Divider />
<Lending
web3={web3}
zeroEx={zeroEx}
bZx={bZx}
accounts={accounts}
tokens={tokens}
/>
</Fragment>
);
break; // eslint-disable-line no-unreachable
case `bounties`:
return (
<Fragment>
<NetworkIndicator
networkId={networkId}
accounts={accounts}
etherscanURL={bZx.etherscanURL}
providerName={this.state.providerName}
clearProvider={this.clearProvider}
/>
<p>
Make margin calls and earn bounty rewards.
<br />
If a margin account is under margin maintenance, it needs to be
liquidated.
</p>
<Divider />
<Bounties
web3={web3}
zeroEx={zeroEx}
bZx={bZx}
accounts={accounts}
tokens={tokens}
setCurrentLoan={this.setCurrentLoan}
changeCard={this.changeCard}
/>
</Fragment>
);
break; // eslint-disable-line no-unreachable
case `tokenizedloans`:
return (
<Fragment>
<NetworkIndicator
networkId={networkId}
accounts={accounts}
etherscanURL={bZx.etherscanURL}
providerName={this.state.providerName}
clearProvider={this.clearProvider}
/>
<ContentContainer show={this.state.activeTokenizedTab === `tokenizedloans_loantokens`}>
<LoanTokens
web3={web3}
zeroEx={zeroEx}
bZx={bZx}
accounts={accounts}
tokens={tokens}
setCurrentLoan={this.setCurrentLoan}
currentHash={this.state.currentHash}
currentTrader={this.state.currentTrader}
/>
</ContentContainer>
{<ContentContainer show={this.state.activeTokenizedTab === `tokenizedloans_positiontokens`}>
<PositionTokens
tokens={tokens}
bZx={bZx}
accounts={accounts}
web3={web3}
oracles={oracles}
currentHash={this.state.currentHash}
currentTrader={this.state.currentTrader}
/>
</ContentContainer>}
<ContentContainer show={this.state.activeTokenizedTab === `tokenizedloans_debug`}>
<DebugTokenization
tokens={tokens}
bZx={bZx}
accounts={accounts}
web3={web3}
oracles={oracles}
currentHash={this.state.currentHash}
currentTrader={this.state.currentTrader}
/>
</ContentContainer>
</Fragment>
);
break; // eslint-disable-line no-unreachable
case `debug`:
return (
<Fragment>
<NetworkIndicator
networkId={networkId}
accounts={accounts}
etherscanURL={bZx.etherscanURL}
providerName={this.state.providerName}
clearProvider={this.clearProvider}
/>
<Debug
web3={web3}
zeroEx={zeroEx}
bZx={bZx}
accounts={accounts}
tokens={tokens}
setCurrentLoan={this.setCurrentLoan}
currentHash={this.state.currentHash}
currentTrader={this.state.currentTrader}
/>
</Fragment>
);
break; // eslint-disable-line no-unreachable
/*case `tokensale`:
return (
<Fragment>
<NetworkIndicator
networkId={networkId}
accounts={accounts}
etherscanURL={bZx.etherscanURL}
providerName={this.state.providerName}
clearProvider={this.clearProvider}
/>
<p>
Purchase BZRX Token for immediate delivery to your ERC20-compatable wallet!
<br/><br/>
Please note that the token cannot be transferred out of your wallet until after the public sale ends, unless the token is being used with the bZx protocol.
<br/><br/>
You can read more about the BZRX token on <a href="https://medium.com/@b0xNet/bzx-public-presale-announcement-ae13aa95ee7a">Medium</a>.
</p>
<Divider />
<Tokensale
web3={web3}
zeroEx={zeroEx}
bZx={bZx}
accounts={accounts}
tokens={tokens}
/>
</Fragment>
);
break; // eslint-disable-line no-unreachable*/
default:
break;
}
return null;
};
render() {
const {
activeCard,
activeOrderTab,
activeTokenizedTab,
// trackedTokens,
providerName,
getWeb3,
web3IsReceived,
hideChooseProviderDialog,
bZx,
} = this.state;
return (
<Layout
changeCard={this.changeCard}
providerName={providerName}
web3IsReceived={web3IsReceived}
bZx={bZx}
>
<Card>
<Header>
{!web3IsReceived ? (
<Fragment>
<HeaderTitleNoProvider>
WELCOME TO THE bZx PORTAL
</HeaderTitleNoProvider>
<HeaderData />
</Fragment>
) : (
this.headerSection(activeCard)
)}
</Header>
<Content
style={
!hideChooseProviderDialog && !web3IsReceived && !getWeb3
? { display: `none` }
: {}
}
>
<Web3Container
// eslint-disable-next-line
render={({
web3,
zeroEx,
tokens,
accounts,
oracles,
networkId
}) =>
this.contentSection(
{
providerName,
web3,
zeroEx,
tokens,
bZx,
accounts,
oracles,
networkId
},
activeCard,
activeOrderTab,
activeTokenizedTab
)
}
providerName={providerName}
setProvider={this.setProvider}
clearProvider={this.clearProvider}
toggleProviderDialog={this.toggleProviderDialog}
hideChooseProviderDialog={hideChooseProviderDialog}
getWeb3={getWeb3}
web3Received={this.web3Received}
/>
</Content>
</Card>
</Layout>
);
}
}));
break;
/*default:
IndexExport = withRouter(withRoot(class extends React.Component {
state = {
activeCard: this.props.router.query.p ? this.props.router.query.p : `balances`,
activeOrderTab: ``,
activeTokenizedTab: ``,
activeOrder: null,
trackedTokens: [],
providerName: `MetaMask`,
getWeb3: true,
web3IsReceived: false,
hideChooseProviderDialog: false,
lastTokenRefresh: null,
subLink: domainData.subdomain,
};
setProvider = provider => {
switch (provider) {
case `MetaMask`:
this.setState({
providerName: provider,
getWeb3: true,
web3IsReceived: false
});
break;
case `Ledger`:
case `Trezor`:
default:
this.setState({
providerName: ``,
getWeb3: false,
web3IsReceived: false
});
break;
}
};
toggleProviderDialog = event => {
event.preventDefault();
this.setProvider(`MetaMask`);
};
web3Received = () => this.setState({ getWeb3: false, web3IsReceived: true });
clearProvider = () => {
this.setProvider(null);
};
render() {
const {
providerName,
getWeb3,
web3IsReceived,
hideChooseProviderDialog
} = this.state;
return (
<Layout
providerName={providerName}
web3IsReceived={web3IsReceived}
noHeaderBar={true}
>
<Card>
<Header>
{!web3IsReceived ? (
<Fragment>
<HeaderTitleNoProvider>
WELCOME TO THE bZx PORTAL
</HeaderTitleNoProvider>
<HeaderData />
</Fragment>
) : (
<Fragment>
<HeaderTitle>
<HeaderTitleSiteName>bZx Portal</HeaderTitleSiteName>
<HeaderTitleContext style={{ display: `inline-flex` }}>
Buy BZRX Token
</HeaderTitleContext>
</HeaderTitle>
<HeaderData />
</Fragment>
)}
</Header>
<Content
style={
!hideChooseProviderDialog && !web3IsReceived && !getWeb3
? { display: `none` }
: {}
}
>
<Web3Container
// eslint-disable-next-line
render={({
web3,
zeroEx,
bZx,
accounts,
networkId
}) => (
<Fragment>
<NetworkIndicator
networkId={networkId}
accounts={accounts}
etherscanURL={bZx.etherscanURL}
providerName={this.state.providerName}
clearProvider={this.clearProvider}
/>
<p>
Purchase BZRX Token for immediate delivery to your ERC20-compatable wallet!
<br/><br/>
Please note that the token cannot be transferred out of your wallet until after the public sale ends, unless the token is being used with the bZx protocol.
<br/><br/>
You can read more about the BZRX token on <a href="https://medium.com/@b0xNet/bzx-public-presale-announcement-ae13aa95ee7a">Medium</a>.
</p>
<Divider />
<Tokensale
web3={web3}
zeroEx={zeroEx}
bZx={bZx}
accounts={accounts}
affiliate={this.state.subLink}
/>
</Fragment>
)}
providerName={providerName}
setProvider={this.setProvider}
clearProvider={this.clearProvider}
toggleProviderDialog={this.toggleProviderDialog}
hideChooseProviderDialog={hideChooseProviderDialog}
getWeb3={getWeb3}
web3Received={this.web3Received}
/>
</Content>
</Card>
</Layout>
);
}
}));*/
}
export default IndexExport;