import BN from 'bn.js'; import React from 'react'; import { ApiProps } from '@polkadot/react-api/types'; import { I18nProps } from '@polkadot/react-components/types'; import { withCalls } from '@polkadot/react-api/hoc'; import { Option } from '@polkadot/types'; import { BlockNumber, Balance } from '@polkadot/types/interfaces'; import { Label, Icon } from 'semantic-ui-react'; import { formatNumber, formatBalance } from '@polkadot/util'; import Section from '@polkadot/joy-utils/react/components/Section'; import { queryToProp } from '@polkadot/joy-utils/functions/misc'; import { ElectionStage, Seat } from '@joystream/types/council'; import translate from './translate'; import { RouteProps } from 'react-router-dom'; type Props = RouteProps & ApiProps & I18nProps & { bestNumber?: BN; activeCouncil?: Seat[]; termEndsAt?: BlockNumber; autoStart?: boolean; newTermDuration?: BN; candidacyLimit?: BN; councilSize?: BN; minCouncilStake?: Balance; minVotingStake?: Balance; announcingPeriod?: BlockNumber; votingPeriod?: BlockNumber; revealingPeriod?: BlockNumber; round?: BN; stage?: Option; }; type State = Record; class Dashboard extends React.PureComponent { state: State = {}; renderCouncil () { const p = this.props; const { activeCouncil = [] } = p; const title = `Council ${activeCouncil.length > 0 ? '' : '(not elected)'}`; return
; } renderElection () { const { bestNumber, round, stage } = this.props; let stageName: string | undefined; let stageEndsAt: BlockNumber | undefined; if (stage && stage.isSome) { const stageValue = stage.value as ElectionStage; stageEndsAt = stageValue.value as BlockNumber; // contained value stageName = stageValue.type; // name of Enum variant } let leftBlocks: BN | undefined; if (stageEndsAt && bestNumber) { leftBlocks = stageEndsAt.sub(bestNumber); } const isRunning: boolean = stage !== undefined && stage.isSome; const stateClass = `JoyElection--${isRunning ? '' : 'Not'}Running`; const stateText = `is ${isRunning ? '' : 'not'} running`; const title = <>Election ({stateText}); return
{isRunning && <> }
; } renderConfig () { const p = this.props; const isAutoStart = (p.autoStart || false).valueOf(); return
; } render () { return (
{this.renderCouncil()} {this.renderElection()} {this.renderConfig()}
); } } // inject the actual API calls automatically into props export default translate( withCalls( queryToProp('derive.chain.bestNumber'), queryToProp('query.council.activeCouncil'), queryToProp('query.council.termEndsAt'), queryToProp('query.councilElection.autoStart'), queryToProp('query.councilElection.newTermDuration'), queryToProp('query.councilElection.candidacyLimit'), queryToProp('query.councilElection.councilSize'), queryToProp('query.councilElection.minCouncilStake'), queryToProp('query.councilElection.minVotingStake'), queryToProp('query.councilElection.announcingPeriod'), queryToProp('query.councilElection.votingPeriod'), queryToProp('query.councilElection.revealingPeriod'), queryToProp('query.councilElection.stage'), queryToProp('query.councilElection.round') )(Dashboard) );