From e6bced1d9a37f0e9cf4df38c0a0c8b5992afd79f Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 12 Mar 2019 13:02:39 +0100 Subject: [PATCH] Block explorer expanded (#801) * Add extrinsic hash to detail display * Move BlockByHash -> ByHash * Query block by number * isEmpty check fro block and header --- .../app-explorer/src/BlockHeader/index.tsx | 4 +- .../BlockByHash.tsx => BlockQuery/ByHash.tsx} | 2 +- .../app-explorer/src/BlockQuery/ByNumber.tsx | 34 ++++++++++++++ .../{BlockByHash => BlockQuery}/Events.tsx | 0 .../Extrinsics.tsx | 0 .../src/{BlockByHash => BlockQuery}/Logs.tsx | 0 .../src/{BlockByHash => BlockQuery}/Query.tsx | 44 +++++++++++-------- .../src/{BlockByHash => BlockQuery}/index.tsx | 33 +++++++++----- packages/app-explorer/src/NodeInfo/index.tsx | 2 +- packages/app-explorer/src/index.tsx | 11 ++--- packages/ui-app/src/Call.tsx | 24 +++++++++- 11 files changed, 113 insertions(+), 41 deletions(-) rename packages/app-explorer/src/{BlockByHash/BlockByHash.tsx => BlockQuery/ByHash.tsx} (93%) create mode 100644 packages/app-explorer/src/BlockQuery/ByNumber.tsx rename packages/app-explorer/src/{BlockByHash => BlockQuery}/Events.tsx (100%) rename packages/app-explorer/src/{BlockByHash => BlockQuery}/Extrinsics.tsx (100%) rename packages/app-explorer/src/{BlockByHash => BlockQuery}/Logs.tsx (100%) rename packages/app-explorer/src/{BlockByHash => BlockQuery}/Query.tsx (61%) rename packages/app-explorer/src/{BlockByHash => BlockQuery}/index.tsx (53%) diff --git a/packages/app-explorer/src/BlockHeader/index.tsx b/packages/app-explorer/src/BlockHeader/index.tsx index 29d73de48e..779ebe58d2 100644 --- a/packages/app-explorer/src/BlockHeader/index.tsx +++ b/packages/app-explorer/src/BlockHeader/index.tsx @@ -36,7 +36,7 @@ export default class BlockHeader extends React.PureComponent {
{ withLink - ? {textNumber} + ? {textNumber} : textNumber } 
{hashHex}
@@ -65,7 +65,7 @@ export default class BlockHeader extends React.PureComponent {
{ blockNumber.gtn(1) - ? {parentHex} + ? {parentHex} : parentHex }
diff --git a/packages/app-explorer/src/BlockByHash/BlockByHash.tsx b/packages/app-explorer/src/BlockQuery/ByHash.tsx similarity index 93% rename from packages/app-explorer/src/BlockByHash/BlockByHash.tsx rename to packages/app-explorer/src/BlockQuery/ByHash.tsx index e8ddb5aeab..2c409a7174 100644 --- a/packages/app-explorer/src/BlockByHash/BlockByHash.tsx +++ b/packages/app-explorer/src/BlockQuery/ByHash.tsx @@ -26,7 +26,7 @@ class BlockByHash extends React.PureComponent { render () { const { system_events, chain_getBlock, chain_getHeader } = this.props; - if (!chain_getBlock || !chain_getHeader) { + if (!chain_getBlock || chain_getBlock.isEmpty || !chain_getHeader || chain_getHeader.isEmpty) { return null; } diff --git a/packages/app-explorer/src/BlockQuery/ByNumber.tsx b/packages/app-explorer/src/BlockQuery/ByNumber.tsx new file mode 100644 index 0000000000..ba2a3ccbd7 --- /dev/null +++ b/packages/app-explorer/src/BlockQuery/ByNumber.tsx @@ -0,0 +1,34 @@ +// Copyright 2017-2019 @polkadot/app-explorer authors & contributors +// This software may be modified and distributed under the terms +// of the Apache-2.0 license. See the LICENSE file for details. + +import { ApiProps } from '@polkadot/ui-api/types'; + +import React from 'react'; +import { Hash } from '@polkadot/types'; +import { withCalls } from '@polkadot/ui-api/index'; + +import BlockByHash from './ByHash'; + +type Props = ApiProps & { + chain_getBlockHash?: Hash, + value: string +}; + +class BlockByNumber extends React.PureComponent { + render () { + const { chain_getBlockHash } = this.props; + + if (!chain_getBlockHash) { + return null; + } + + return ( + + ); + } +} + +export default withCalls( + ['rpc.chain.getBlockHash', { paramName: 'value' }] +)(BlockByNumber); diff --git a/packages/app-explorer/src/BlockByHash/Events.tsx b/packages/app-explorer/src/BlockQuery/Events.tsx similarity index 100% rename from packages/app-explorer/src/BlockByHash/Events.tsx rename to packages/app-explorer/src/BlockQuery/Events.tsx diff --git a/packages/app-explorer/src/BlockByHash/Extrinsics.tsx b/packages/app-explorer/src/BlockQuery/Extrinsics.tsx similarity index 100% rename from packages/app-explorer/src/BlockByHash/Extrinsics.tsx rename to packages/app-explorer/src/BlockQuery/Extrinsics.tsx diff --git a/packages/app-explorer/src/BlockByHash/Logs.tsx b/packages/app-explorer/src/BlockQuery/Logs.tsx similarity index 100% rename from packages/app-explorer/src/BlockByHash/Logs.tsx rename to packages/app-explorer/src/BlockQuery/Logs.tsx diff --git a/packages/app-explorer/src/BlockByHash/Query.tsx b/packages/app-explorer/src/BlockQuery/Query.tsx similarity index 61% rename from packages/app-explorer/src/BlockByHash/Query.tsx rename to packages/app-explorer/src/BlockQuery/Query.tsx index cf014995d5..11c54c17cd 100644 --- a/packages/app-explorer/src/BlockByHash/Query.tsx +++ b/packages/app-explorer/src/BlockQuery/Query.tsx @@ -11,11 +11,12 @@ import { isHex } from '@polkadot/util'; import translate from '../translate'; type Props = I18nProps & { - hash?: string + value?: string }; type State = { - hash: string + value: string + isNumber: boolean, isValid: boolean }; @@ -23,17 +24,14 @@ class Query extends React.PureComponent { constructor (props: Props) { super(props); - const { hash } = this.props; + const { value } = this.props; - this.state = { - hash: hash || '', - isValid: isHex(hash, 256) - }; + this.state = this.stateFromValue(value || ''); } render () { const { t } = this.props; - const { hash, isValid } = this.state; + const { value, isValid } = this.state; return ( @@ -42,9 +40,9 @@ class Query extends React.PureComponent {
@@ -60,17 +58,27 @@ class Query extends React.PureComponent { ); } - private setHash = (hash: string) => { - this.setState({ - hash, - isValid: isHex(hash, 256) - }); + private setHash = (value: string) => { + this.setState( + this.stateFromValue(value) + ); } private onQuery = () => { - const { hash } = this.state; + const { value } = this.state; - window.location.hash = `/explorer/hash/${hash}`; + window.location.hash = `/explorer/query/${value}`; + } + + private stateFromValue (value: string): State { + const isValidHex = isHex(value, 256); + const isNumber = !isValidHex && /^\d+$/.test(value); + + return { + value, + isNumber, + isValid: isValidHex || isNumber + }; } } diff --git a/packages/app-explorer/src/BlockByHash/index.tsx b/packages/app-explorer/src/BlockQuery/index.tsx similarity index 53% rename from packages/app-explorer/src/BlockByHash/index.tsx rename to packages/app-explorer/src/BlockQuery/index.tsx index f5bb1ee4cc..4fd35071e2 100644 --- a/packages/app-explorer/src/BlockByHash/index.tsx +++ b/packages/app-explorer/src/BlockQuery/index.tsx @@ -5,42 +5,51 @@ import { BareProps } from '@polkadot/ui-app/types'; import React from 'react'; +import { isHex } from '@polkadot/util'; -import BlockByHash from './BlockByHash'; +import BlockByHash from './ByHash'; +import BlockByNumber from './ByNumber'; import Query from './Query'; type Props = BareProps & { match: { params: { - hash: string + value: string } } }; export default class Entry extends React.PureComponent { render () { - const { match: { params: { hash } } } = this.props; + const { match: { params: { value } } } = this.props; return ( <> - + {this.renderBlock()} ); } private renderBlock () { - const { match: { params: { hash } } } = this.props; + const { match: { params: { value } } } = this.props; - if (!hash) { + if (!value) { return null; } - return ( - - ); + return isHex(value) + ? ( + + ) + : ( + + ); } } diff --git a/packages/app-explorer/src/NodeInfo/index.tsx b/packages/app-explorer/src/NodeInfo/index.tsx index 97a1cff191..6df0465065 100644 --- a/packages/app-explorer/src/NodeInfo/index.tsx +++ b/packages/app-explorer/src/NodeInfo/index.tsx @@ -7,12 +7,12 @@ import { AppProps, I18nProps } from '@polkadot/ui-app/types'; import { Info } from './types'; import React from 'react'; -import Extrinsics from '@polkadot/app-explorer/BlockByHash/Extrinsics'; import { withApi, withMulti } from '@polkadot/ui-api/index'; import { Health, PeerInfo, PendingExtrinsics } from '@polkadot/types'; import './index.css'; +import Extrinsics from '../BlockQuery/Extrinsics'; import Peers from './Peers'; import Summary from './Summary'; import translate from './translate'; diff --git a/packages/app-explorer/src/index.tsx b/packages/app-explorer/src/index.tsx index 08e30db66a..1d66aacf7f 100644 --- a/packages/app-explorer/src/index.tsx +++ b/packages/app-explorer/src/index.tsx @@ -11,8 +11,9 @@ import { Route, Switch } from 'react-router'; import Tabs, { TabItem } from '@polkadot/ui-app/Tabs'; import translate from './translate'; -import BlockByHash from './BlockByHash'; -import Main from './Main';import NodeInfo from './NodeInfo'; +import BlockQuery from './BlockQuery'; +import Main from './Main'; +import NodeInfo from './NodeInfo'; type Props = AppProps & BareProps & I18nProps; @@ -34,7 +35,7 @@ class ExplorerApp extends React.Component { }, { hasParams: true, - name: 'hash', + name: 'query', text: t('Block query') }, { @@ -58,8 +59,8 @@ class ExplorerApp extends React.Component { /> - - + + diff --git a/packages/ui-app/src/Call.tsx b/packages/ui-app/src/Call.tsx index 04323fe4fc..397e289228 100644 --- a/packages/ui-app/src/Call.tsx +++ b/packages/ui-app/src/Call.tsx @@ -6,6 +6,7 @@ import { IExtrinsic, IMethod } from '@polkadot/types/types'; import { BareProps } from './types'; import React from 'react'; +import styled from 'styled-components'; import { Method, getTypeDef } from '@polkadot/types'; import Params from '@polkadot/ui-params/index'; @@ -16,6 +17,15 @@ export type Props = BareProps & { value: IExtrinsic | IMethod }; +const Wrapper = styled.div` + .hash { + opacity: 0.5; + overflow: hidden; + padding: 0 0.5rem 0.75rem 1.75rem; + text-overflow: ellipsis; + } +`; + export default class Call extends React.PureComponent { render () { const { children, className, style, value } = this.props; @@ -27,19 +37,29 @@ export default class Call extends React.PureComponent { isValid: true, value })); + const hash = (value as IExtrinsic).hash; return ( -
{children} + { + hash + ? ( +
+ {hash.toHex()} +
+ ) + : null + } -
+ ); } }