From 4ff279f9662ed73b992956768e0d6ef29388f6ea Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 16 Mar 2021 12:40:02 +0100 Subject: [PATCH] Show society suspended info (#4862) --- .../page-society/src/Candidates/index.tsx | 2 +- packages/page-society/src/Overview/Member.tsx | 10 ++- packages/page-society/src/Overview/index.tsx | 8 +-- .../page-society/src/Suspended/Suspension.tsx | 24 +++++++ packages/page-society/src/Suspended/index.tsx | 72 +++++++++++++++++++ packages/page-society/src/index.tsx | 14 ++++ 6 files changed, 122 insertions(+), 8 deletions(-) create mode 100644 packages/page-society/src/Suspended/Suspension.tsx create mode 100644 packages/page-society/src/Suspended/index.tsx diff --git a/packages/page-society/src/Candidates/index.tsx b/packages/page-society/src/Candidates/index.tsx index 62e5aa106c..c62b6bbe75 100644 --- a/packages/page-society/src/Candidates/index.tsx +++ b/packages/page-society/src/Candidates/index.tsx @@ -18,7 +18,7 @@ interface Props { ownMembers: string[]; } -function Candidates ({ allMembers, className = '', isMember, ownMembers }: Props): React.ReactElement { +function Candidates ({ allMembers, className, isMember, ownMembers }: Props): React.ReactElement { const { t } = useTranslation(); const [isBidOpen, toggleBidOpen] = useToggle(); diff --git a/packages/page-society/src/Overview/Member.tsx b/packages/page-society/src/Overview/Member.tsx index 670ed9ebea..3a021ba80b 100644 --- a/packages/page-society/src/Overview/Member.tsx +++ b/packages/page-society/src/Overview/Member.tsx @@ -2,11 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 import type { DeriveSocietyMember } from '@polkadot/api-derive/types'; +import type { bool } from '@polkadot/types'; import React, { useEffect, useRef, useState } from 'react'; import { AddressSmall, Icon, Modal, Tag } from '@polkadot/react-components'; -import { useApi, useToggle } from '@polkadot/react-hooks'; +import { useApi, useCall, useToggle } from '@polkadot/react-hooks'; import drawCanary from '../draw/canary'; import { useTranslation } from '../translate'; @@ -25,6 +26,7 @@ const CANVAS_STYLE = { function Member ({ className = '', isHead, value: { accountId, strikes } }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); + const suspended = useCall(api.query.society.suspendedMembers, [accountId]); const canvasRef = useRef(null); const [canInk] = useState(() => api.genesisHash.eq('0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe')); const [isInkShowing, toggleInk] = useToggle(); @@ -52,6 +54,12 @@ function Member ({ className = '', isHead, value: { accountId, strikes } }: Prop label={t('society head')} /> )} + {suspended?.isTrue && ( + ('suspended')} + /> + )}   diff --git a/packages/page-society/src/Overview/index.tsx b/packages/page-society/src/Overview/index.tsx index 6edc6218b6..2afb735eca 100644 --- a/packages/page-society/src/Overview/index.tsx +++ b/packages/page-society/src/Overview/index.tsx @@ -6,22 +6,18 @@ import type { DeriveSociety } from '@polkadot/api-derive/types'; import React from 'react'; import styled from 'styled-components'; -import { useApi, useCall } from '@polkadot/react-hooks'; - import Defender from './Defender'; import Members from './Members'; import Summary from './Summary'; interface Props { className?: string; + info?: DeriveSociety; isMember: boolean; ownMembers: string[]; } -function Overview ({ className, isMember, ownMembers }: Props): React.ReactElement { - const { api } = useApi(); - const info = useCall(api.derive.society.info); - +function Overview ({ className, info, isMember, ownMembers }: Props): React.ReactElement { return (
diff --git a/packages/page-society/src/Suspended/Suspension.tsx b/packages/page-society/src/Suspended/Suspension.tsx new file mode 100644 index 0000000000..bda8ee2062 --- /dev/null +++ b/packages/page-society/src/Suspended/Suspension.tsx @@ -0,0 +1,24 @@ +// Copyright 2017-2021 @polkadot/app-society authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import type { AccountId } from '@polkadot/types/interfaces'; + +import React from 'react'; + +import { AddressSmall } from '@polkadot/react-components'; + +interface Props { + value: AccountId; +} + +function Suspension ({ value }: Props): React.ReactElement { + return ( + + + + + + ); +} + +export default React.memo(Suspension); diff --git a/packages/page-society/src/Suspended/index.tsx b/packages/page-society/src/Suspended/index.tsx new file mode 100644 index 0000000000..78c0a2a920 --- /dev/null +++ b/packages/page-society/src/Suspended/index.tsx @@ -0,0 +1,72 @@ +// Copyright 2017-2021 @polkadot/app-society authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import type { StorageKey } from '@polkadot/types'; +import type { AccountId } from '@polkadot/types/interfaces'; + +import React, { useRef } from 'react'; + +import { Table } from '@polkadot/react-components'; +import { useApi, useCall } from '@polkadot/react-hooks'; + +import { useTranslation } from '../translate'; +import Suspension from './Suspension'; + +interface Props { + className?: string; +} + +const optExtract = { + transform: (keys: StorageKey<[AccountId]>[]): AccountId[] => + keys + .map(({ args: [accountId] }) => accountId) + .filter((a) => !!a) +}; + +function Suspended ({ className }: Props): React.ReactElement { + const { t } = useTranslation(); + const { api } = useApi(); + const candidates = useCall(api.query.society.suspendedCandidates.keys, undefined, optExtract); + const members = useCall(api.query.society.suspendedMembers.keys, undefined, optExtract); + + const headerRefC = useRef([ + [t('candidates'), 'start'] + ]); + + const headerRefM = useRef([ + [t('members'), 'start'] + ]); + + console.log(JSON.stringify({ candidates, members }, null, 2)); + + return ( +
+ ('No suspended members')} + header={headerRefM.current} + > + {members && members.map((accountId): React.ReactNode => ( + + ))} +
+ ('No suspended candidates')} + header={headerRefC.current} + > + {candidates && candidates.map((accountId): React.ReactNode => ( + + ))} +
+
+ ); +} + +export default React.memo(Suspended); diff --git a/packages/page-society/src/index.tsx b/packages/page-society/src/index.tsx index 25192aa8ef..1e61fb7161 100644 --- a/packages/page-society/src/index.tsx +++ b/packages/page-society/src/index.tsx @@ -1,13 +1,17 @@ // Copyright 2017-2021 @polkadot/app-society authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { DeriveSociety } from '@polkadot/api-derive/types'; + import React, { useMemo } from 'react'; import { Route, Switch } from 'react-router'; import { Tabs } from '@polkadot/react-components'; +import { useApi, useCall } from '@polkadot/react-hooks'; import Candidates from './Candidates'; import Overview from './Overview'; +import Suspended from './Suspended'; import { useTranslation } from './translate'; import useCounter from './useCounter'; import useMembers from './useMembers'; @@ -21,8 +25,10 @@ export { useCounter }; function SocietyApp ({ basePath, className }: Props): React.ReactElement { const { t } = useTranslation(); + const { api } = useApi(); const candidateCount = useCounter(); const { allMembers, isMember, ownMembers } = useMembers(); + const info = useCall(api.derive.society.info); const items = useMemo(() => [ { @@ -34,6 +40,10 @@ function SocietyApp ({ basePath, className }: Props): React.ReactElement count: candidateCount, name: 'candidates', text: t('Candidates') + }, + { + name: 'suspended', + text: t('Suspended') } ], [candidateCount, t]); @@ -53,8 +63,12 @@ function SocietyApp ({ basePath, className }: Props): React.ReactElement ownMembers={ownMembers} /> + + +