From aee78ca152cc4adc85628365582cb6ab1d939543 Mon Sep 17 00:00:00 2001 From: Jaco Date: Wed, 27 Jul 2022 11:50:52 +0200 Subject: [PATCH] Alliance unscrupelous accounts & websites (#7917) --- .../page-alliance/src/{ => Overview}/Join.tsx | 12 ++-- .../src/{ => Overview}/Member.tsx | 6 +- .../src/{ => Overview}/Members.tsx | 30 ++-------- .../src/{ => Overview}/Summary.tsx | 0 packages/page-alliance/src/Overview/index.tsx | 50 ++++++++++++++++ .../src/Unscrupelous/Account.tsx | 23 ++++++++ .../src/Unscrupelous/Website.tsx | 21 +++++++ .../page-alliance/src/Unscrupelous/index.tsx | 58 +++++++++++++++++++ packages/page-alliance/src/index.tsx | 21 ++++++- packages/page-alliance/src/types.ts | 5 ++ packages/page-alliance/src/useMemberInfo.ts | 22 +++---- packages/page-alliance/src/useMembers.ts | 9 ++- packages/page-alliance/src/useUnscrupelous.ts | 32 ++++++++++ 13 files changed, 241 insertions(+), 48 deletions(-) rename packages/page-alliance/src/{ => Overview}/Join.tsx (84%) rename packages/page-alliance/src/{ => Overview}/Member.tsx (93%) rename packages/page-alliance/src/{ => Overview}/Members.tsx (50%) rename packages/page-alliance/src/{ => Overview}/Summary.tsx (100%) create mode 100644 packages/page-alliance/src/Overview/index.tsx create mode 100644 packages/page-alliance/src/Unscrupelous/Account.tsx create mode 100644 packages/page-alliance/src/Unscrupelous/Website.tsx create mode 100644 packages/page-alliance/src/Unscrupelous/index.tsx create mode 100644 packages/page-alliance/src/useUnscrupelous.ts diff --git a/packages/page-alliance/src/Join.tsx b/packages/page-alliance/src/Overview/Join.tsx similarity index 84% rename from packages/page-alliance/src/Join.tsx rename to packages/page-alliance/src/Overview/Join.tsx index 4baeb66970..c10db789fc 100644 --- a/packages/page-alliance/src/Join.tsx +++ b/packages/page-alliance/src/Overview/Join.tsx @@ -1,22 +1,23 @@ // Copyright 2017-2022 @polkadot/app-alliance authors & contributors // SPDX-License-Identifier: Apache-2.0 -import type { Member } from './types'; +import type { Member, Unscrupelous } from '../types'; import React, { useMemo, useState } from 'react'; import { InputAddress, InputBalance, Modal, TxButton } from '@polkadot/react-components'; import { useAccounts, useApi } from '@polkadot/react-hooks'; -import { useTranslation } from './translate'; +import { useTranslation } from '../translate'; interface Props { className?: string; members: Member[]; onClose: () => void; + unscrupelous: Unscrupelous; } -function Join ({ className, members, onClose }: Props): React.ReactElement { +function Join ({ className, members, onClose, unscrupelous: { accounts } }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); const { allAccounts } = useAccounts(); @@ -27,9 +28,12 @@ function Join ({ className, members, onClose }: Props): React.ReactElement !members.some(({ accountId }) => accountId === a + ) && + !accounts.some((accountId) => + accountId === a ) ), - [allAccounts, members] + [accounts, allAccounts, members] ); return ( diff --git a/packages/page-alliance/src/Member.tsx b/packages/page-alliance/src/Overview/Member.tsx similarity index 93% rename from packages/page-alliance/src/Member.tsx rename to packages/page-alliance/src/Overview/Member.tsx index 52986e2540..67a897145d 100644 --- a/packages/page-alliance/src/Member.tsx +++ b/packages/page-alliance/src/Overview/Member.tsx @@ -1,7 +1,7 @@ // Copyright 2017-2022 @polkadot/app-alliance authors & contributors // SPDX-License-Identifier: Apache-2.0 -import type { Member as MemberType } from './types'; +import type { Member as MemberType } from '../types'; import React, { useCallback, useContext, useMemo } from 'react'; @@ -9,8 +9,8 @@ import { AddressSmall, Badge, Menu, Popup, StatusContext } from '@polkadot/react import { useAccounts, useApi } from '@polkadot/react-hooks'; import { FormatBalance } from '@polkadot/react-query'; -import { useTranslation } from './translate'; -import useMemberInfo from './useMemberInfo'; +import { useTranslation } from '../translate'; +import useMemberInfo from '../useMemberInfo'; interface Props { className?: string; diff --git a/packages/page-alliance/src/Members.tsx b/packages/page-alliance/src/Overview/Members.tsx similarity index 50% rename from packages/page-alliance/src/Members.tsx rename to packages/page-alliance/src/Overview/Members.tsx index 52de8bd358..ed4c2c4d82 100644 --- a/packages/page-alliance/src/Members.tsx +++ b/packages/page-alliance/src/Overview/Members.tsx @@ -1,25 +1,22 @@ // Copyright 2017-2022 @polkadot/app-alliance authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { Member as MemberType } from '../types'; + import React, { useRef } from 'react'; -import { Button, Table } from '@polkadot/react-components'; -import { useToggle } from '@polkadot/react-hooks'; +import { Table } from '@polkadot/react-components'; -import Join from './Join'; +import { useTranslation } from '../translate'; import Member from './Member'; -import Summary from './Summary'; -import { useTranslation } from './translate'; -import useMembers from './useMembers'; interface Props { className?: string; + members?: MemberType[]; } -function Members ({ className }: Props): React.ReactElement { +function Members ({ className, members }: Props): React.ReactElement { const { t } = useTranslation(); - const [isJoinOpen, toggleJoin] = useToggle(); - const members = useMembers(); const hdrRef = useRef([ [t('members'), 'start', 2], @@ -30,21 +27,6 @@ function Members ({ className }: Props): React.ReactElement { return (
- - -
+ ); +} + +export default React.memo(Unscrupelous); diff --git a/packages/page-alliance/src/index.tsx b/packages/page-alliance/src/index.tsx index 6086542a10..838153b4e7 100644 --- a/packages/page-alliance/src/index.tsx +++ b/packages/page-alliance/src/index.tsx @@ -2,11 +2,14 @@ // SPDX-License-Identifier: Apache-2.0 import React, { useRef } from 'react'; +import { Route, Switch } from 'react-router'; import { Tabs } from '@polkadot/react-components'; -import Members from './Members'; +import Overview from './Overview'; import { useTranslation } from './translate'; +import Unscrupelous from './Unscrupelous'; +import useUnscrupelous from './useUnscrupelous'; interface Props { basePath: string; @@ -15,12 +18,17 @@ interface Props { function AllianceApp ({ basePath, className }: Props): React.ReactElement { const { t } = useTranslation(); + const unscrupelous = useUnscrupelous(); const itemsRef = useRef([ { isRoot: true, - name: 'index', + name: 'overview', text: t('Overview') + }, + { + name: 'unscrupelous', + text: t('Unscrupelous') } ]); @@ -30,7 +38,14 @@ function AllianceApp ({ basePath, className }: Props): React.ReactElement basePath={basePath} items={itemsRef.current} /> - + + + + + + + + ); } diff --git a/packages/page-alliance/src/types.ts b/packages/page-alliance/src/types.ts index a792c8dd13..78a83ef8ba 100644 --- a/packages/page-alliance/src/types.ts +++ b/packages/page-alliance/src/types.ts @@ -14,3 +14,8 @@ export interface MemberInfo { deposit?: BN | null; isUpForKicking: boolean; } + +export interface Unscrupelous { + accounts: string[]; + websites: string[]; +} diff --git a/packages/page-alliance/src/useMemberInfo.ts b/packages/page-alliance/src/useMemberInfo.ts index 05c97d7009..06efd6adc6 100644 --- a/packages/page-alliance/src/useMemberInfo.ts +++ b/packages/page-alliance/src/useMemberInfo.ts @@ -13,17 +13,17 @@ function useMemberInfoImpl (accountId: string): MemberInfo | undefined { const upForKicking = useCall(api.query.alliance.upForKicking, [accountId]); const depositOf = useCall>(api.query.alliance.depositOf, [accountId]); - return useMemo((): MemberInfo | undefined => { - if (upForKicking && depositOf) { - return { - accountId, - deposit: depositOf.unwrapOr(null), - isUpForKicking: upForKicking.isTrue - }; - } - - return undefined; - }, [accountId, upForKicking, depositOf]); + return useMemo( + (): MemberInfo | undefined => + upForKicking && depositOf + ? { + accountId, + deposit: depositOf.unwrapOr(null), + isUpForKicking: upForKicking.isTrue + } + : undefined, + [accountId, upForKicking, depositOf] + ); } export default createNamedHook('useMemberInfo', useMemberInfoImpl); diff --git a/packages/page-alliance/src/useMembers.ts b/packages/page-alliance/src/useMembers.ts index 78c762817b..1891d079ce 100644 --- a/packages/page-alliance/src/useMembers.ts +++ b/packages/page-alliance/src/useMembers.ts @@ -10,7 +10,7 @@ import { createNamedHook, useApi, useCallMulti } from '@polkadot/react-hooks'; const ROLES = ['Founder', 'Fellow', 'Ally']; -function addMembers (prev: Member[] = [], query: AccountId32[][]): Member[] { +function addMembers (prev: Member[], query: AccountId32[][]): Member[] { const all: Member[] = []; for (let i = 0; i < ROLES.length; i++) { @@ -19,7 +19,10 @@ function addMembers (prev: Member[] = [], query: AccountId32[][]): Member[] { for (let j = 0; j < accountIds.length; j++) { const accountId = accountIds[j].toString(); - const existing = prev.find((p) => p.accountId === accountId && p.role === role); + const existing = prev.find((p) => + p.accountId === accountId && + p.role === role + ); all.push(existing || { accountId, @@ -42,7 +45,7 @@ function useMembersImpl (): Member[] | undefined { useEffect((): void => { query && query.length === ROLES.length && - setState((prev) => addMembers(prev, query)); + setState((prev = []) => addMembers(prev, query)); }, [query]); return state; diff --git a/packages/page-alliance/src/useUnscrupelous.ts b/packages/page-alliance/src/useUnscrupelous.ts new file mode 100644 index 0000000000..5b125be624 --- /dev/null +++ b/packages/page-alliance/src/useUnscrupelous.ts @@ -0,0 +1,32 @@ +// Copyright 2017-2022 @polkadot/app-alliance authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import type { Bytes } from '@polkadot/types'; +import type { AccountId32 } from '@polkadot/types/interfaces'; +import type { Unscrupelous } from './types'; + +import { useMemo } from 'react'; + +import { createNamedHook, useApi, useCall } from '@polkadot/react-hooks'; + +function getUnscrupelous (accounts: AccountId32[], websites: Bytes[]): Unscrupelous { + return { + accounts: accounts.map((a) => a.toString()), + websites: websites.filter((b) => b.isAscii).map((b) => b.toString()) + }; +} + +function useUnscrupelousImpl (): Unscrupelous | undefined { + const { api } = useApi(); + const accounts = useCall(api.query.alliance.unscrupulousAccounts, []); + const websites = useCall(api.query.alliance.unscrupulousWebsites, []); + + return useMemo( + (): Unscrupelous | undefined => + accounts && websites && + getUnscrupelous(accounts, websites), + [accounts, websites] + ); +} + +export default createNamedHook('useUnscrupelous', useUnscrupelousImpl);