From 566335c2cc5e30dd62fbb39905dde5e82cd18dbb Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 28 Jan 2020 23:02:29 +0100 Subject: [PATCH] Society voting on defender (#2216) * Society voting on defender * Bump deps * Bump API (correct types) --- package.json | 6 +- packages/app-contracts/package.json | 2 +- .../app-society/src/Overview/Candidate.tsx | 71 +------------- .../app-society/src/Overview/Candidates.tsx | 7 +- .../app-society/src/Overview/Defender.tsx | 57 ++++++++++++ .../src/Overview/DefenderVoting.tsx | 66 +++++++++++++ packages/app-society/src/Overview/Members.tsx | 18 +++- packages/app-society/src/Overview/Summary.tsx | 4 +- .../app-society/src/Overview/VoteDisplay.tsx | 79 ++++++++++++++++ packages/app-society/src/Overview/index.tsx | 25 ++++- packages/app-society/src/types.ts | 19 ++++ packages/app-society/src/useMembers.ts | 7 +- packages/react-api/package.json | 2 +- yarn.lock | 92 +++++++++---------- 14 files changed, 318 insertions(+), 137 deletions(-) create mode 100644 packages/app-society/src/Overview/Defender.tsx create mode 100644 packages/app-society/src/Overview/DefenderVoting.tsx create mode 100644 packages/app-society/src/Overview/VoteDisplay.tsx create mode 100644 packages/app-society/src/types.ts diff --git a/package.json b/package.json index e40c7d3aaf..244ae9d203 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,10 @@ "packages/*" ], "resolutions": { - "@polkadot/api": "^1.0.0-beta.33", - "@polkadot/api-contract": "^1.0.0-beta.33", + "@polkadot/api": "^1.0.0-beta.35", + "@polkadot/api-contract": "^1.0.0-beta.35", "@polkadot/keyring": "^2.0.0-beta.9", - "@polkadot/types": "^1.0.0-beta.33", + "@polkadot/types": "^1.0.0-beta.35", "@polkadot/util": "^2.0.0-beta.9", "@polkadot/util-crypto": "^2.0.0-beta.9", "babel-core": "^7.0.0-bridge.0", diff --git a/packages/app-contracts/package.json b/packages/app-contracts/package.json index 03a95bb73f..ec72f3e1aa 100644 --- a/packages/app-contracts/package.json +++ b/packages/app-contracts/package.json @@ -11,6 +11,6 @@ "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.8.3", - "@polkadot/api-contract": "^1.0.0-beta.33" + "@polkadot/api-contract": "^1.0.0-beta.35" } } diff --git a/packages/app-society/src/Overview/Candidate.tsx b/packages/app-society/src/Overview/Candidate.tsx index e333afca98..67417ca4a0 100644 --- a/packages/app-society/src/Overview/Candidate.tsx +++ b/packages/app-society/src/Overview/Candidate.tsx @@ -4,15 +4,17 @@ import { DeriveSocietyCandidate } from '@polkadot/api-derive/types'; import { AccountId, SocietyVote } from '@polkadot/types/interfaces'; +import { VoteType } from '../types'; -import React, { useEffect, useState } from 'react'; -import { AddressMini, AddressSmall } from '@polkadot/react-components'; +import React from 'react'; +import { AddressSmall } from '@polkadot/react-components'; import { useApi, useCall } from '@polkadot/react-hooks'; import { FormatBalance } from '@polkadot/react-query'; import { Option } from '@polkadot/types'; import { useTranslation } from '../translate'; import CandidateVoting from './CandidateVoting'; +import VoteDisplay from './VoteDisplay'; interface Props { allMembers: string[]; @@ -21,18 +23,9 @@ interface Props { value: DeriveSocietyCandidate; } -type VoteType = [string, SocietyVote]; - -interface VoteSplit { - allAye: VoteType[]; - allNay: VoteType[]; - allSkeptic: VoteType[]; -} - export default function Candidate ({ allMembers, isMember, ownMembers, value: { accountId, kind, value } }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); - const [{ allAye, allNay, allSkeptic }, setVoteSplit] = useState({ allAye: [], allNay: [], allSkeptic: [] }); const votes = useCall(api.query.society.votes.multi as any, [allMembers.map((memberId): [AccountId, string] => [accountId, memberId])] as any, { transform: (voteOpts: Option[]): VoteType[] => voteOpts @@ -41,16 +34,6 @@ export default function Candidate ({ allMembers, isMember, ownMembers, value: { .map(([accountId, voteOpt]): VoteType => [accountId, voteOpt.unwrap()]) }); - useEffect((): void => { - if (votes) { - setVoteSplit({ - allAye: votes.filter(([, vote]): boolean => vote.isApprove), - allNay: votes.filter(([, vote]): boolean => vote.isReject), - allSkeptic: votes.filter(([, vote]): boolean => vote.isSkeptic) - }); - } - }, [votes]); - return ( @@ -66,51 +49,7 @@ export default function Candidate ({ allMembers, isMember, ownMembers, value: { value={value} /> - - {allSkeptic.length !== 0 && ( -
- - {t('Skeptics ({{count}})', { replace: { count: allSkeptic.length } })} - - {allSkeptic.map(([who]): React.ReactNode => - - )} -
- )} - - - {allAye.length !== 0 && ( -
- - {t('Approvals ({{count}})', { replace: { count: allAye.length } })} - - {allAye.map(([who]): React.ReactNode => - - )} -
- )} - - - {allNay.length !== 0 && ( -
- - {t('Rejections ({{count}})', { replace: { count: allNay.length } })} - - {allNay.map(([who]): React.ReactNode => - - )} -
- )} - + { +export default function Candidates ({ allMembers, className, isMember, ownMembers }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); const candidates = useCall(api.derive.society.candidates, []); - const { allMembers, isMember, ownMembers } = useMembers(); return (
diff --git a/packages/app-society/src/Overview/Defender.tsx b/packages/app-society/src/Overview/Defender.tsx new file mode 100644 index 0000000000..129d20e2bc --- /dev/null +++ b/packages/app-society/src/Overview/Defender.tsx @@ -0,0 +1,57 @@ +// Copyright 2017-2020 @polkadot/app-society 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 { DeriveSociety, DeriveSocietyMember } from '@polkadot/api-derive/types'; +import { SocietyVote } from '@polkadot/types/interfaces'; +import { OwnMembers, VoteType } from '../types'; + +import React from 'react'; +import { AddressSmall, Table } from '@polkadot/react-components'; +import { useApi, useCall } from '@polkadot/react-hooks'; + +import { useTranslation } from '../translate'; +import DefenderVoting from './DefenderVoting'; +import VoteDisplay from './VoteDisplay'; + +interface Props extends OwnMembers { + className?: string; + info?: DeriveSociety; +} + +export default function Defender ({ className, info, isMember, ownMembers }: Props): React.ReactElement | null { + const { t } = useTranslation(); + const { api } = useApi(); + const votes = useCall(api.derive.society.members, [], { + transform: (members: DeriveSocietyMember[]): VoteType[] => + members + .filter(({ vote }): boolean => !!vote) + .map(({ accountId, vote }): VoteType => [accountId.toString(), vote as SocietyVote]) + }); + + if (!info || !info.hasDefender || !info.defender) { + return null; + } + + return ( +
+

{t('defender')}

+ + + + + + + + +
+ + + +
+
+ ); +} diff --git a/packages/app-society/src/Overview/DefenderVoting.tsx b/packages/app-society/src/Overview/DefenderVoting.tsx new file mode 100644 index 0000000000..5b5c5dcdb1 --- /dev/null +++ b/packages/app-society/src/Overview/DefenderVoting.tsx @@ -0,0 +1,66 @@ +// Copyright 2017-2020 @polkadot/app-society 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 React, { useMemo, useState } from 'react'; +import { useToggle } from '@polkadot/react-hooks'; + +import { useTranslation } from '../translate'; +import { Button, Dropdown, InputAddress, Modal, TxButton } from '@polkadot/react-components'; + +interface Props { + isMember: boolean; + ownMembers: string[]; +} + +export default function DefenderVoting ({ isMember, ownMembers }: Props): React.ReactElement { + const { t } = useTranslation(); + const [isVisible, toggleVisible] = useToggle(); + const [vote, setVote] = useState(true); + const [accountId, setAccountId] = useState(null); + const voteOpts = useMemo(() => [ + { text: t('Aye, I approve'), value: true }, + { text: t('Nay, I do not approve'), value: false } + ], [t]); + + return ( + <> + {isVisible && ( + + + + + + + + + + )} +