// 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 { BareProps } from '@polkadot/react-components/types';
import React from 'react';
import { Link } from 'react-router-dom';
import styled from 'styled-components';
import { HeaderExtended } from '@polkadot/api-derive';
import { AddressMini, LinkPolkascan } from '@polkadot/react-components';
import { formatNumber } from '@polkadot/util';
interface Props extends BareProps {
isSummary?: boolean;
value?: HeaderExtended;
withExplorer?: boolean;
withLink?: boolean;
}
const renderDetails = ({ number: blockNumber, extrinsicsRoot, parentHash, stateRoot }: HeaderExtended): React.ReactNode => {
const parentHex = parentHash.toHex();
return (
{
blockNumber.unwrap().gtn(1)
? {parentHex}
: parentHex
}
{extrinsicsRoot.toHex()}
{stateRoot.toHex()}
);
};
function BlockHeader ({ className, isSummary, value, withExplorer, withLink }: Props): React.ReactElement | null {
if (!value) {
return null;
}
const hashHex = value.hash.toHex();
const textNumber = formatNumber(value.number);
return (
{
withLink
? {textNumber}
: textNumber
}
{hashHex}
{
value.author
?
: undefined
}
{
isSummary
? undefined
: renderDetails(value)
}
{
withExplorer
?
: undefined
}
);
}
export default styled(BlockHeader)`
.author {
font-size: 1rem;
text-align: right;
vertical-align: middle;
> .ui--AddressMini.padded {
padding: 0;
}
}
.header {
color: rgba(0, 0, 0, 0.6);
display: flex;
align-items: center;
justify-content: space-between;
text-align: left;
text-overflow: ellipsis;
white-space: nowrap;
vertical-align: middle;
> div {
display: inline-block;
font-weight: 100;
vertical-align: middle;
white-space: nowrap;
}
> .number {
font-size: 2.25rem;
}
.hash {
font-size: 1.5rem;
font-family: sans-serif;
}
}
.hash {
font-family: monospace;
overflow: hidden;
text-overflow: ellipsis;
}
.number {
align-items: center;
box-sizing: border-box;
}
.contains {
border: 0;
margin-top: 0.5rem;
text-align: center;
> .info {
margin-bottom: 0.125em;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
.ui--Labelled {
text-align: center;
}
> label {
display: inline-block;
}
> span,
> label {
vertical-align: middle;
}
label {
margin-right: 0.5rem;
min-width: 10rem;
text-align: right;
}
}
}
`;