diff --git a/packages/app-democracy/src/Item.tsx b/packages/app-democracy/src/Overview/Item.tsx similarity index 97% rename from packages/app-democracy/src/Item.tsx rename to packages/app-democracy/src/Overview/Item.tsx index 30e4d6e52a..7d8cd62937 100644 --- a/packages/app-democracy/src/Item.tsx +++ b/packages/app-democracy/src/Overview/Item.tsx @@ -10,7 +10,7 @@ import { Method, Proposal } from '@polkadot/types'; import { Call } from '@polkadot/ui-app'; import { formatNumber } from '@polkadot/util'; -import translate from './translate'; +import translate from '../translate'; type Props = I18nProps & { children?: React.ReactNode, diff --git a/packages/app-democracy/src/Proposal.tsx b/packages/app-democracy/src/Overview/Proposal.tsx similarity index 98% rename from packages/app-democracy/src/Proposal.tsx rename to packages/app-democracy/src/Overview/Proposal.tsx index e34aa33f7a..1f179f3798 100644 --- a/packages/app-democracy/src/Proposal.tsx +++ b/packages/app-democracy/src/Overview/Proposal.tsx @@ -12,7 +12,7 @@ import { withCalls, withMulti } from '@polkadot/ui-api'; import { formatBalance } from '@polkadot/util'; import Item from './Item'; -import translate from './translate'; +import translate from '../translate'; type Props = I18nProps & { democracy_depositOf?: Option, diff --git a/packages/app-democracy/src/Proposals.tsx b/packages/app-democracy/src/Overview/Proposals.tsx similarity index 87% rename from packages/app-democracy/src/Proposals.tsx rename to packages/app-democracy/src/Overview/Proposals.tsx index 2130685c6c..196af2e739 100644 --- a/packages/app-democracy/src/Proposals.tsx +++ b/packages/app-democracy/src/Overview/Proposals.tsx @@ -9,19 +9,29 @@ import { Tuple } from '@polkadot/types'; import { withCalls, withMulti } from '@polkadot/ui-api'; import Proposal from './Proposal'; -import translate from './translate'; +import translate from '../translate'; type Props = I18nProps & { democracy_publicProps?: Array }; +type State = { + isProposeOpen: boolean +}; + class Proposals extends React.PureComponent { + state: State = { + isProposeOpen: false + }; + render () { const { t } = this.props; return (
-

{t('proposals')}

+

+ {t('proposals')} +

{this.renderProposals()}
); diff --git a/packages/app-democracy/src/Referendum.tsx b/packages/app-democracy/src/Overview/Referendum.tsx similarity index 99% rename from packages/app-democracy/src/Referendum.tsx rename to packages/app-democracy/src/Overview/Referendum.tsx index 8133007dec..0f53ef8d2d 100644 --- a/packages/app-democracy/src/Referendum.tsx +++ b/packages/app-democracy/src/Overview/Referendum.tsx @@ -17,7 +17,7 @@ import { formatBalance, formatNumber } from '@polkadot/util'; import Item from './Item'; import Voting from './Voting'; -import translate from './translate'; +import translate from '../translate'; const COLORS_YAY = settings.uiTheme === 'substrate' ? ['#4d4', '#4e4'] diff --git a/packages/app-democracy/src/Referendums.tsx b/packages/app-democracy/src/Overview/Referendums.tsx similarity index 97% rename from packages/app-democracy/src/Referendums.tsx rename to packages/app-democracy/src/Overview/Referendums.tsx index 54fde49252..4160f7e853 100644 --- a/packages/app-democracy/src/Referendums.tsx +++ b/packages/app-democracy/src/Overview/Referendums.tsx @@ -10,7 +10,7 @@ import { Option } from '@polkadot/types'; import { withCalls } from '@polkadot/ui-api'; import Referendum from './Referendum'; -import translate from './translate'; +import translate from '../translate'; type Props = I18nProps & { democracy_referendums?: Array> diff --git a/packages/app-democracy/src/Summary.tsx b/packages/app-democracy/src/Overview/Summary.tsx similarity index 98% rename from packages/app-democracy/src/Summary.tsx rename to packages/app-democracy/src/Overview/Summary.tsx index 837d08d13d..bebe65013b 100644 --- a/packages/app-democracy/src/Summary.tsx +++ b/packages/app-democracy/src/Overview/Summary.tsx @@ -10,7 +10,7 @@ import { SummaryBox, CardSummary } from '@polkadot/ui-app'; import { withCalls } from '@polkadot/ui-api'; import { formatNumber } from '@polkadot/util'; -import translate from './translate'; +import translate from '../translate'; type Props = I18nProps & { chain_bestNumber?: BN, diff --git a/packages/app-democracy/src/Voting.tsx b/packages/app-democracy/src/Overview/Voting.tsx similarity index 98% rename from packages/app-democracy/src/Voting.tsx rename to packages/app-democracy/src/Overview/Voting.tsx index 83761ffcfc..3f80d297bb 100644 --- a/packages/app-democracy/src/Voting.tsx +++ b/packages/app-democracy/src/Overview/Voting.tsx @@ -12,7 +12,7 @@ import accountObservable from '@polkadot/ui-keyring/observable/accounts'; import { withMulti, withObservable } from '@polkadot/ui-api'; import VotingButtons from './VotingButtons'; -import translate from './translate'; +import translate from '../translate'; type Props = I18nProps & { allAccounts?: SubjectInfo, diff --git a/packages/app-democracy/src/VotingButtons.tsx b/packages/app-democracy/src/Overview/VotingButtons.tsx similarity index 97% rename from packages/app-democracy/src/VotingButtons.tsx rename to packages/app-democracy/src/Overview/VotingButtons.tsx index 27d8b3ff50..c09d305152 100644 --- a/packages/app-democracy/src/VotingButtons.tsx +++ b/packages/app-democracy/src/Overview/VotingButtons.tsx @@ -10,7 +10,7 @@ import React from 'react'; import { Button, TxButton } from '@polkadot/ui-app'; import { withApi, withMulti } from '@polkadot/ui-api'; -import translate from './translate'; +import translate from '../translate'; type Props = ApiProps & I18nProps & { accountId?: string, diff --git a/packages/app-democracy/src/Overview/index.tsx b/packages/app-democracy/src/Overview/index.tsx new file mode 100644 index 0000000000..5e2fbd713c --- /dev/null +++ b/packages/app-democracy/src/Overview/index.tsx @@ -0,0 +1,27 @@ +// Copyright 2017-2019 @polkadot/app-democracy 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 { AppProps, BareProps, I18nProps } from '@polkadot/ui-app/types'; + +import '../index.css'; + +import React from 'react'; + +import Proposals from './Proposals'; +import Referendums from './Referendums'; +import Summary from './Summary'; + +type Props = AppProps & BareProps & I18nProps; + +export default class Overview extends React.PureComponent { + render () { + return ( + <> + + + + + ); + } +} diff --git a/packages/app-democracy/src/Propose.tsx b/packages/app-democracy/src/Propose.tsx new file mode 100644 index 0000000000..a08fa78ea9 --- /dev/null +++ b/packages/app-democracy/src/Propose.tsx @@ -0,0 +1,132 @@ +// Copyright 2017-2019 @polkadot/ui-staking 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 { I18nProps } from '@polkadot/ui-app/types'; +import { ApiProps } from '@polkadot/ui-api/types'; + +import BN from 'bn.js'; +import React from 'react'; +import { RouteComponentProps } from 'react-router'; +import { withRouter } from 'react-router-dom'; +import { Method, Proposal } from '@polkadot/types'; + +import { Button, Extrinsic, InputAddress, InputBalance, TxButton } from '@polkadot/ui-app'; +import { withApi, withMulti } from '@polkadot/ui-api'; + +import translate from './translate'; + +type Props = I18nProps & ApiProps & RouteComponentProps & { + basePath: string +}; + +type State = { + accountId?: string, + method: Method | null, + value: BN, + isValid: boolean +}; + +class Propose extends React.PureComponent { + state: State = { + method: null, + value: new BN(0), + isValid: false + }; + + render () { + const { api, apiDefaultTx, t } = this.props; + const { isValid, accountId, method, value } = this.state; + const hasValue = !!value && value.gtn(0); + + const defaultExtrinsic = (() => { + try { + return api.tx.consensus.setCode; + } catch (error) { + return apiDefaultTx; + } + })(); + + return ( +
+ + + + + + +
+ ); + } + + private nextState (newState: State): void { + this.setState( + (prevState: State): State => { + const { accountId = prevState.accountId, method = prevState.method, value = prevState.value } = newState; + const isValid = !!method && !!value && value.gt(new BN(0)) && !!accountId && accountId.length > 0; + + return { + accountId, + method, + value, + isValid + }; + } + ); + } + + private onChangeAccount = (accountId: string): void => { + this.nextState({ accountId } as State); + } + + private onChangeExtrinsic = (method: Method): void => { + if (!method) { + return; + } + + this.nextState({ method } as State); + } + + private onChangeValue = (value?: BN): void => { + this.nextState({ value } as State); + } + + private onSubmitProposal = () => { + const { history, basePath } = this.props; + + history.push(basePath); + } +} + +export default withMulti( + Propose, + translate, + withApi, + withRouter +); diff --git a/packages/app-democracy/src/index.css b/packages/app-democracy/src/index.css index 37ca6505ce..77ccf2277e 100644 --- a/packages/app-democracy/src/index.css +++ b/packages/app-democracy/src/index.css @@ -55,6 +55,10 @@ margin-bottom: 0; } +.democracy--Proposal-new { + float: right; +} + .democracy--Referendum-results { margin-bottom: 1em; } diff --git a/packages/app-democracy/src/index.tsx b/packages/app-democracy/src/index.tsx index f57b96ad21..dceaebff25 100644 --- a/packages/app-democracy/src/index.tsx +++ b/packages/app-democracy/src/index.tsx @@ -7,12 +7,12 @@ import { AppProps, BareProps, I18nProps } from '@polkadot/ui-app/types'; import './index.css'; import React from 'react'; +import { Route, Switch } from 'react-router'; import { HelpOverlay,Tabs } from '@polkadot/ui-app'; import basicMd from './md/basic.md'; -import Proposals from './Proposals'; -import Referendums from './Referendums'; -import Summary from './Summary'; +import Overview from './Overview'; +import Propose from './Propose'; import translate from './translate'; type Props = AppProps & BareProps & I18nProps; @@ -27,15 +27,22 @@ class App extends React.PureComponent {
- - - + + } /> + + ); }