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;