UNPKG

@bzxnetwork/portal

Version:
773 lines (737 loc) 27 kB
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;