github.com/shyftnetwork/go-empyrean@v1.8.3-0.20191127201940-fbfca9338f04/shyftBlockExplorerUI/src/containers/App.js (about)

     1  import React, { Component } from "react";
     2  import axios from 'axios';
     3  import Nav from "../components/nav/nav";
     4  import { BrowserRouter, Route } from 'react-router-dom'
     5  import { API_URL } from "../constants/apiURL";
     6  import Modal from 'react-bootstrap/lib/Modal';
     7  import Button from 'react-bootstrap/lib/Button';
     8  import Grid from 'react-bootstrap/lib/Grid';
     9  import Col from 'react-bootstrap/lib/Col';
    10  import Row from 'react-bootstrap/lib/Row';
    11  
    12  ///**LANDING PAGE**///
    13  import Home from '../components/home/home';
    14  
    15  ///**TRANSACTIONS**///
    16  import TransactionRow from '../components/table/transactions/transactionRow';
    17  import DetailTransactionTable from "../components/table/transactions/transactionDetailsRow";
    18  import BlockTxs from "../components/table/transactions/blockTx";
    19  
    20  
    21  ///**INTERNAL TRANSACTIONS**///
    22  import InternalTransactionRow from '../components/table/internalTransactions/internalRow';
    23  
    24  ///**BLOCKS**///
    25  import BlocksRow from '../components/table/blocks/blockRows';
    26  import DetailBlockTable from '../components/table/blocks/blocksDetailsRow';
    27  import BlockDetailHeader from "../components/nav/blockHeaders/blockDetailHeader";
    28  import BlocksMinedTable from "../components/table/blocks/blocksMined";
    29  
    30  ///**ACCOUNTS**///
    31  import AccountsRow from '../components/table/accounts/accountRows';
    32  import DetailAccountsTable from "../components/table/accounts/detailAccountsRow";
    33  
    34  
    35  class App extends Component {
    36    constructor(props) {
    37      super(props);
    38      this.state = {
    39          blockDetailData: [],
    40          transactionDetailData: [],
    41          accountDetailData: [],
    42          internalDetailData: [],
    43          blocksMined: [],
    44          blockTransactions: [],
    45          accounts: [],
    46          reqAccount: '',
    47          overlayTriggered: false,
    48          overlayContent: "",
    49      };
    50    }
    51  
    52      detailBlockHandler = async(blockNumber) => {
    53          try {
    54              const response = await axios.get(`${API_URL}/get_block/${blockNumber}`);
    55              await this.setState({ blockDetailData: response.data, overlayTriggered: true, overlayContent: "block" })
    56          }
    57          catch(error) {
    58             console.log(error)
    59          }
    60      };
    61  
    62      detailTransactionHandler = async(txHash) => {
    63          try {
    64              const response = await axios.get(`${API_URL}/get_transaction/${txHash}`);
    65              await this.setState({ transactionDetailData: response.data, overlayTriggered: true, overlayContent: "transaction" })
    66          }
    67          catch(error) {
    68              console.log(error)
    69          }
    70      };
    71  
    72  
    73      detailAccountHandler = async(addr) => {
    74          try {
    75              const response = await axios.get(`${API_URL}/get_account_txs/${addr}`);
    76              await this.setState({ accountDetailData: response.data, reqAccount: addr, overlayTriggered: false, overlayContent: "account"  })
    77          }
    78          catch(error) {
    79              console.log(error)
    80          }
    81      };
    82  
    83      detailInternalHandler = async(txHash) => {
    84          try {
    85              const response = await axios.get(`${API_URL}/get_internal_transactions/${txHash}`);
    86              await this.setState({ internalDetailData: response.data, reqAccount: txHash, overlayTriggered: true, overlayContent: "internal" })
    87          }
    88          catch(error) {
    89              console.log(error)
    90          }
    91      };
    92  
    93      getInternalTransactions = async() => {
    94          try {
    95              const response = await axios.get(`${API_URL}/get_internal_transactions/`);
    96              await this.setState({ internalTransactions: response.data,  overlayTriggered: false })
    97          }
    98          catch(error) {
    99              console.log(error)
   100          }
   101      };
   102  
   103  
   104      getAccounts = async() => {
   105          try {
   106              const response = await axios.get(`${API_URL}/get_all_accounts`);
   107              await this.setState({ accounts: response.data,  overlayTriggered: false })
   108          }
   109          catch(error) {
   110              console.log(error)
   111          }
   112      };
   113  
   114      getBlockTransactions = async(blockNumber) => {
   115          try {
   116              const response = await axios.get(`${API_URL}/get_all_transactions_from_block/${blockNumber}`);
   117              await this.setState({ blockTransactions: response.data, reqBlockNum: blockNumber })
   118          }
   119          catch(error) {
   120              console.log(error)
   121          }
   122      };
   123  
   124      getBlocksMined = async(coinbase) => {
   125          try {
   126              const response = await axios.get(`${API_URL}/get_blocks_mined/${coinbase}`);
   127              await this.setState({ blocksMined: response.data, reqCoinbase: coinbase })
   128          }
   129          catch(error) {
   130              console.log(error)
   131          }
   132      };
   133  
   134      hideOverlay = () => {
   135          this.setState({overlayTriggered: false})
   136      };
   137  
   138      getBlockData = (data, page) => {
   139          let components = [];
   140          let dataEntry;
   141          if(page === "account" || page === "internal") {
   142              dataEntry = data[0];
   143          }
   144          else { 
   145              dataEntry = data;
   146          }
   147          for (let key in dataEntry) {
   148              let value = dataEntry[key];
   149              if (dataEntry["To"] === null) {
   150                  delete dataEntry["To"]
   151              }
   152              if( key === "Input" || key === "Output" || key === "Data") {
   153                  components.push( 
   154                      <Grid>
   155                          <Row className="show-grid">
   156                              <Col xs={3}  md={3}  style={{fontSize:'6.5pt', color: '#565656', paddingTop: '10pt', fontFamily: 'Open Sans, sans-serif'}}>
   157                                  {key}
   158                              </Col>
   159                              <Col xs={9}  md={9}  style={{fontSize:'6.5pt', color: '#565656', paddingTop: '5pt', marginLeft:'-5pt', fontFamily: 'Open Sans, sans-serif'}}>
   160                                  <Button style={{color: '#8f67c9'}} bsStyle="link" bsSize="small" onClick={()=> alert( value )}> Show {key} </Button> 
   161                              </Col>                          
   162                          </Row>
   163                      </Grid>
   164                  );             
   165              } else {
   166                  components.push( 
   167                      <Grid>
   168                          <Row className="show-grid">
   169                              <Col xs={3}  md={3}  style={{fontSize:'6.5pt', color: '#565656', paddingTop: '10pt', fontFamily: 'Open Sans, sans-serif'}}>
   170                                  {key}
   171                              </Col>
   172                              <Col xs={9}  md={9}  style={{fontSize:'6.5pt', color: '#565656', paddingTop: '10pt', fontFamily: 'Open Sans, sans-serif'}}>
   173                                  {value}
   174                              </Col>
   175                          </Row>
   176                      </Grid>
   177                  ); 
   178              }
   179          }
   180          return components;
   181      }
   182  
   183      renderOverlay = () => {
   184          const page = this.state.overlayContent;
   185          let data, title;
   186          switch (page) {
   187              case "block" : 
   188                  title = "BLOCK OVERVIEW";
   189                  data = this.state.blockDetailData;
   190              break; 
   191              case "transaction" :
   192                  title = "TRANSACTION OVERVIEW";
   193                  data =  this.state.transactionDetailData;
   194              break;
   195              case "account" : 
   196                  title = "ACCOUNT OVERVIEW";
   197                  data =  this.state.accountDetailData;
   198              break;
   199              case "internal" : 
   200                  title = "Internal Transaction Overview";
   201                  data = this.state.internalDetailData;
   202              break;
   203              default: console.log("error");
   204          }
   205          return ( 
   206              <div className="static-modal">
   207                  <Modal.Dialog>
   208                      <Modal.Header>
   209                          <Modal.Title style={{color: '#593c83', fontSize: '8pt', letterSpacing: '2pt',  fontFamily: 'Open Sans, sans-serif' }}> {title} </Modal.Title>
   210                      </Modal.Header>
   211                      <Modal.Body>
   212                          <ul>
   213                          {this.getBlockData(data, page)}         
   214                          </ul>       
   215                      </Modal.Body>
   216                      <Modal.Footer>
   217                      <Button onClick={this.hideOverlay}>Close</Button>                   
   218                      </Modal.Footer>
   219                  </Modal.Dialog>
   220              </div>
   221          );
   222      };
   223  
   224    render() {
   225      return (
   226          <BrowserRouter>
   227              <div>
   228                  
   229                  {
   230                      this.state.overlayTriggered ? this.renderOverlay() : null
   231                  }
   232          
   233                  <div style={ this.state.overlayTriggered ? {backgroundColor:"#f7f8f9", paddingBottom:"5%", opacity:0.5, zIndex: -10000, height: '100%', width: '100%'}  : {backgroundColor:"#f7f8f9", paddingBottom:"5%", height: '100%', width: '100%' }  }>
   234                      <Nav />
   235          
   236                      <Route path="/" exact render={({ match }) =>
   237                          <Home style={{width: '100%'}}/> 
   238                          }
   239                      />
   240  
   241                      <Route path="/transactions" render={({match}) =>
   242                          <div>                  
   243                              <TransactionRow
   244                                  getBlockTransactions={this.getBlockTransactions}
   245                                  detailTransactionHandler={this.detailTransactionHandler}
   246                                  detailAccountHandler={this.detailAccountHandler}/>
   247                          </div>
   248                          }
   249                      />
   250  
   251                      <Route path="/blocks" exact render={({match}) =>
   252                          <div>                        
   253                              <BlocksRow
   254                                  getBlocksMined={this.getBlocksMined}
   255                                  getBlockTransactions={this.getBlockTransactions}
   256                                  detailBlockHandler={this.detailBlockHandler}/>                        
   257                          </div>
   258                          }
   259                      />
   260  
   261                      <Route path="/internalTransactions" exact render={({match}) =>
   262                          <div>                        
   263                              <InternalTransactionRow                              
   264                                  getInternalTransactionsHandler={this.getInternalTransactions}
   265                                  detailInternalHandler={this.detailInternalHandler}
   266                                  />                        
   267                          </div>
   268                          }
   269                      />
   270  
   271                      <Route path="/accounts" exact render={({match}) =>
   272                          <div>         
   273                              <AccountsRow detailAccountHandler={this.detailAccountHandler}/>
   274                          </div>
   275                          }
   276                      />
   277  
   278                      <Route path="/transaction/details" exact render={({match}) =>
   279                      <div>
   280                          <DetailTransactionTable
   281                              data={this.state.transactionDetailData}/>
   282                      </div>}
   283                      />
   284  
   285                      <Route path="/blocks/detail" exact render={({match}) =>
   286                      <div>
   287                          <BlockDetailHeader
   288                              blockNumber={this.state.blockDetailData.Number}/>
   289                          <DetailBlockTable
   290                              getBlockTransactions={this.getBlockTransactions}
   291                              data={this.state.blockDetailData}/>
   292                      </div>}
   293                      />
   294  
   295                      <Route path="/block/transactions" exact render={({match}) =>
   296                      <div>
   297                          <BlockTxs
   298                              data={this.state.blockTransactions}
   299                              getBlockTransactions={this.getBlockTransactions}
   300                              detailTransactionHandler={this.detailTransactionHandler}
   301                              detailAccountHandler={this.detailAccountHandler}/>
   302  
   303                      </div>}
   304                      />
   305  
   306                      <Route path="/mined/blocks" exact render={({match}) =>
   307                      <div>                    
   308                          <BlocksMinedTable
   309                              getBlockTransactions={this.getBlockTransactions}
   310                              getBlocksMined={this.getBlocksMined}
   311                              data={this.state.blocksMined}/>
   312                      </div>}
   313                      />
   314  
   315                      <Route path="/account/detail" exact render={({match}) =>
   316                      <div>                     
   317                          <DetailAccountsTable
   318                              transactionDetailHandler={this.detailTransactionHandler}
   319                              addr={this.state.reqAccount}
   320                              data={this.state.accountDetailData}/>
   321                      </div>}
   322                      />
   323                  </div>
   324              </div>
   325          </BrowserRouter>
   326      );
   327    }
   328  }
   329  
   330  export default App;