From ebad8635f747505673298e53a52ff4c83b808609 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 17 Aug 2020 12:24:51 +0200 Subject: [PATCH] Adjust useCall options (#3430) * Adjust useCall options * Extract useCall options * typo * Apply suggestions from code review * Adjust param creation in calls --- packages/apps/src/Content/Status.tsx | 2 +- packages/apps/src/SideBar/ChainInfo.tsx | 2 +- packages/apps/src/SideBar/Item.tsx | 2 +- packages/apps/src/WarmUp.tsx | 11 +++--- .../page-accounts/src/Accounts/Account.tsx | 10 +++--- .../src/Accounts/modals/IdentitySub.tsx | 12 ++++--- packages/page-claims/src/index.tsx | 8 +++-- packages/page-council/src/Overview/index.tsx | 34 +++++++++---------- packages/page-council/src/index.tsx | 8 +++-- packages/page-council/src/useCounter.ts | 10 +++--- .../src/Overview/DispatchEntry.tsx | 4 +-- .../src/Overview/DispatchQueue.tsx | 2 +- .../page-democracy/src/Overview/Externals.tsx | 2 +- .../page-democracy/src/Overview/Proposals.tsx | 2 +- .../src/Overview/Referendum.tsx | 4 +-- .../page-democracy/src/Overview/Scheduled.tsx | 3 +- .../page-democracy/src/Overview/Scheduler.tsx | 34 +++++++++---------- .../page-democracy/src/Overview/Summary.tsx | 8 ++--- .../src/Overview/TreasuryCell.tsx | 8 +++-- .../page-democracy/src/Overview/index.tsx | 2 +- packages/page-democracy/src/useChangeCalc.ts | 2 +- packages/page-democracy/src/useCounter.ts | 4 +-- packages/page-explorer/src/BestHash.tsx | 2 +- .../page-explorer/src/BlockInfo/ByHash.tsx | 20 ++++++----- .../page-explorer/src/BlockInfo/index.tsx | 2 +- packages/page-explorer/src/SummarySession.tsx | 4 +-- .../src/Overview/Parachain.tsx | 24 +++++++------ packages/page-poll/src/index.tsx | 6 ++-- packages/page-society/src/Overview/Bids.tsx | 2 +- .../page-society/src/Overview/Candidates.tsx | 2 +- .../page-society/src/Overview/Defender.tsx | 16 ++++----- .../page-society/src/Overview/Members.tsx | 2 +- .../page-society/src/Overview/Summary.tsx | 4 +-- packages/page-society/src/Overview/index.tsx | 2 +- packages/page-society/src/useCounter.ts | 2 +- packages/page-society/src/useMembers.ts | 2 +- .../Account/InputValidationController.tsx | 28 ++++++++------- .../src/Actions/Account/index.tsx | 26 +++++++++----- .../page-staking/src/Actions/useInactives.ts | 2 +- .../src/Actions/useUnbondDuration.ts | 2 +- .../src/Overview/Address/index.tsx | 20 ++++++++--- .../page-staking/src/Overview/CurrentList.tsx | 4 +-- packages/page-staking/src/Payouts/index.tsx | 4 +-- .../page-staking/src/Payouts/useEraBlocks.ts | 6 ++-- .../src/Payouts/useStakerPayouts.ts | 2 +- .../page-staking/src/Query/ChartRewards.tsx | 2 +- .../page-staking/src/Query/useBlockCounts.tsx | 2 +- packages/page-staking/src/Slashes/Summary.tsx | 2 +- packages/page-staking/src/Targets/Summary.tsx | 2 +- packages/page-staking/src/index.tsx | 10 +++--- packages/page-staking/src/useSortedTargets.ts | 20 ++++++----- .../page-tech-comm/src/Overview/Summary.tsx | 2 +- .../page-tech-comm/src/Proposals/Proposal.tsx | 16 +++++---- packages/page-tech-comm/src/index.tsx | 9 +++-- packages/page-tech-comm/src/useCounter.ts | 10 +++--- .../page-treasury/src/Overview/Summary.tsx | 4 +-- .../page-treasury/src/Overview/TipReason.tsx | 14 ++++---- packages/page-treasury/src/Overview/Tips.tsx | 2 +- .../page-treasury/src/Overview/Voting.tsx | 2 +- packages/page-treasury/src/Overview/index.tsx | 2 +- packages/page-treasury/src/useCounter.ts | 2 +- .../react-components/src/DemocracyLocks.tsx | 2 +- .../src/StakingRedeemable.tsx | 14 ++++---- .../react-components/src/StakingUnbonding.tsx | 2 +- .../react-hooks/src/useAvailableSlashes.ts | 4 +-- packages/react-hooks/src/useCall.ts | 10 +++--- packages/react-hooks/src/useMembers.ts | 10 +++--- packages/react-hooks/src/useOwnEraRewards.ts | 2 +- packages/react-hooks/src/useRegistrars.ts | 2 +- packages/react-hooks/src/useStashIds.ts | 8 +++-- packages/react-hooks/src/useSudo.ts | 10 +++--- packages/react-hooks/src/useVotingStatus.ts | 2 +- packages/react-query/src/BestFinalized.tsx | 2 +- packages/react-query/src/BestNumber.tsx | 2 +- packages/react-query/src/BlockAuthors.tsx | 2 +- packages/react-query/src/Bonded.tsx | 16 +++++---- packages/react-query/src/TimeNow.tsx | 2 +- packages/react-query/src/TotalIssuance.tsx | 2 +- 78 files changed, 307 insertions(+), 244 deletions(-) diff --git a/packages/apps/src/Content/Status.tsx b/packages/apps/src/Content/Status.tsx index ffcc5f3547..534d8dc67a 100644 --- a/packages/apps/src/Content/Status.tsx +++ b/packages/apps/src/Content/Status.tsx @@ -66,7 +66,7 @@ function Status ({ optionsAll }: Props): React.ReactElement { const { api, isApiReady } = useApi(); const { allAccounts } = useAccounts(); const { t } = useTranslation(); - const events = useCall(isApiReady && api.query.system?.events, []); + const events = useCall(isApiReady && api.query.system?.events); useEffect((): void => { const filtered = filterEvents(allAccounts, t, optionsAll, events); diff --git a/packages/apps/src/SideBar/ChainInfo.tsx b/packages/apps/src/SideBar/ChainInfo.tsx index 76bf8f5bd5..a967896379 100644 --- a/packages/apps/src/SideBar/ChainInfo.tsx +++ b/packages/apps/src/SideBar/ChainInfo.tsx @@ -21,7 +21,7 @@ interface Props { function ChainInfo ({ className = '', isToggled, onClick }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); - const runtimeVersion = useCall(api.rpc.state.subscribeRuntimeVersion, []); + const runtimeVersion = useCall(api.rpc.state.subscribeRuntimeVersion); return (
| null { const { allAccounts, hasAccounts } = useAccounts(); const apiProps = useApi(); - const sudoKey = useCall(apiProps.isApiReady && apiProps.api.query.sudo?.key, []); + const sudoKey = useCall(apiProps.isApiReady && apiProps.api.query.sudo?.key); const [hasSudo, setHasSudo] = useState(false); const [isVisible, setIsVisible] = useState(false); const count = (route.useCounter || DUMMY_COUNTER)(); diff --git a/packages/apps/src/WarmUp.tsx b/packages/apps/src/WarmUp.tsx index 478045592d..d33b6c89cd 100644 --- a/packages/apps/src/WarmUp.tsx +++ b/packages/apps/src/WarmUp.tsx @@ -7,15 +7,14 @@ import { useApi, useCall } from '@polkadot/react-hooks'; function WarmUp (): React.ReactElement { const { api, isApiReady } = useApi(); - const indexes = useCall(isApiReady && api.derive.accounts?.indexes, []); - const registrars = useCall(isApiReady && api.query.identity?.registrars, []); - const staking = null; // useCall(isApiReady && api.derive.staking?.overview, []); - const issuance = useCall(isApiReady && api.query.balances?.totalIssuance, []); - const historyDepth = useCall(api.query.staking?.historyDepth, []); + const indexes = useCall(isApiReady && api.derive.accounts?.indexes); + const registrars = useCall(isApiReady && api.query.identity?.registrars); + const issuance = useCall(isApiReady && api.query.balances?.totalIssuance); + const historyDepth = useCall(api.query.staking?.historyDepth); const [hasValues, setHasValues] = useState(false); useEffect((): void => { - setHasValues(!!historyDepth || !!indexes || !!issuance || !!registrars || !!staking); + setHasValues(!!historyDepth || !!indexes || !!issuance || !!registrars); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); diff --git a/packages/page-accounts/src/Accounts/Account.tsx b/packages/page-accounts/src/Accounts/Account.tsx index bf55d8797a..df046b10de 100644 --- a/packages/page-accounts/src/Accounts/Account.tsx +++ b/packages/page-accounts/src/Accounts/Account.tsx @@ -73,16 +73,18 @@ function createClearDemocracyTx (api: ApiPromise, address: string, unlockableIds ); } +const transformRecovery = { + transform: (opt: Option) => opt.unwrapOr(null) +}; + function Account ({ account: { address, meta }, className = '', delegation, filter, isFavorite, proxy, setBalance, toggleFavorite }: Props): React.ReactElement | null { const { t } = useTranslation(); const { queueExtrinsic } = useContext(StatusContext); const api = useApi(); - const bestNumber = useCall(api.api.derive.chain.bestNumber, []); + const bestNumber = useCall(api.api.derive.chain.bestNumber); const balancesAll = useCall(api.api.derive.balances.all, [address]); const democracyLocks = useCall(api.api.derive.democracy?.locks, [address]); - const recoveryInfo = useCall(api.api.query.recovery?.recoverable, [address], { - transform: (opt: Option) => opt.unwrapOr(null) - }); + const recoveryInfo = useCall(api.api.query.recovery?.recoverable, [address], transformRecovery); const multiInfos = useMultisigApprovals(address); const proxyInfo = useProxies(address); const { flags: { isDevelopment, isExternal, isHardware, isInjected, isMultisig, isProxied }, genesisHash, identity, name: accName, onSetGenesisHash, tags } = useAccountInfo(address); diff --git a/packages/page-accounts/src/Accounts/modals/IdentitySub.tsx b/packages/page-accounts/src/Accounts/modals/IdentitySub.tsx index c9c4548cae..65507b50bb 100644 --- a/packages/page-accounts/src/Accounts/modals/IdentitySub.tsx +++ b/packages/page-accounts/src/Accounts/modals/IdentitySub.tsx @@ -79,14 +79,18 @@ function IdentitySub ({ address, index, name, setAddress, setName, t }: SubProps const IdentitySubMemo = React.memo(IdentitySub); +const transformIds = { + transform: ([, ids]: ITuple<[Balance, Vec]>) => ids.map((a) => a.toString()) +}; + +const transformInfo = { withParams: true }; + function IdentitySubModal ({ address, className, onClose }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); const { allAccounts } = useAccounts(); - const queryIds = useCall(api.query.identity.subsOf, [address], { - transform: ([, ids]: ITuple<[Balance, Vec]>) => ids.map((a) => a.toString()) - }); - const queryInfos = useCall<[[string[]], Option>[]]>(queryIds && queryIds.length !== 0 && api.query.identity.superOf.multi, [queryIds], { withParams: true }); + const queryIds = useCall(api.query.identity.subsOf, [address], transformIds); + const queryInfos = useCall<[[string[]], Option>[]]>(queryIds && queryIds.length !== 0 && api.query.identity.superOf.multi, [queryIds], transformInfo); const [infos, setInfos] = useState<[string, string][] | undefined>(); useEffect((): void => { diff --git a/packages/page-claims/src/index.tsx b/packages/page-claims/src/index.tsx index 7883c4d99e..86ebd083b2 100644 --- a/packages/page-claims/src/index.tsx +++ b/packages/page-claims/src/index.tsx @@ -68,6 +68,10 @@ const Signature = styled.textarea` } `; +const transformStatement = { + transform: (option: Option) => option.unwrapOr(null) +}; + function ClaimsApp (): React.ReactElement { const [didCopy, setDidCopy] = useState(false); const [ethereumAddress, setEthereumAddress] = useState(null); @@ -165,9 +169,7 @@ function ClaimsApp (): React.ReactElement { // If it's 1/ not preclaimed and 2/ not the old claiming process, fetch the // statement kind to sign. - const statementKind = useCall(!isPreclaimed && !isOldClaimProcess && !!ethereumAddress && api.query.claims.signing, [ethereumAddress], { - transform: (option: Option) => option.unwrapOr(null) - }); + const statementKind = useCall(!isPreclaimed && !isOldClaimProcess && !!ethereumAddress && api.query.claims.signing, [ethereumAddress], transformStatement); const statementSentence = getStatement(systemChain, statementKind)?.sentence || ''; diff --git a/packages/page-council/src/Overview/index.tsx b/packages/page-council/src/Overview/index.tsx index 458a06a5d9..95db8797dc 100644 --- a/packages/page-council/src/Overview/index.tsx +++ b/packages/page-council/src/Overview/index.tsx @@ -20,29 +20,29 @@ interface Props { prime: AccountId | null; } -function transformVotes (entries: DeriveCouncilVotes): Record { - return entries.reduce((result: Record, [voter, { votes }]): Record => { - votes.forEach((candidate): void => { - const address = candidate.toString(); +const transformVotes = { + transform: (entries: DeriveCouncilVotes): Record => { + return entries.reduce((result: Record, [voter, { votes }]): Record => { + votes.forEach((candidate): void => { + const address = candidate.toString(); - if (!result[address]) { - result[address] = []; - } + if (!result[address]) { + result[address] = []; + } - result[address].push(voter); - }); + result[address].push(voter); + }); - return result; - }, {}); -} + return result; + }, {}); + } +}; function Overview ({ className = '', prime }: Props): React.ReactElement { const { api } = useApi(); - const bestNumber = useCall(api.derive.chain.bestNumber, []); - const electionsInfo = useCall(api.derive.elections.info, []); - const allVotes = useCall>(api.derive.council.votes, [], { - transform: transformVotes - }); + const bestNumber = useCall(api.derive.chain.bestNumber); + const electionsInfo = useCall(api.derive.elections.info); + const allVotes = useCall>(api.derive.council.votes, undefined, transformVotes); return (
diff --git a/packages/page-council/src/index.tsx b/packages/page-council/src/index.tsx index 84f4406366..fcf2caf49a 100644 --- a/packages/page-council/src/index.tsx +++ b/packages/page-council/src/index.tsx @@ -25,14 +25,16 @@ interface Props { className?: string; } +const transformPrime = { + transform: (result: Option): AccountId | null => result.unwrapOr(null) +}; + function CouncilApp ({ basePath, className }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); const { pathname } = useLocation(); const numMotions = useCounter(); - const prime = useCall(api.query.council.prime, [], { - transform: (result: Option): AccountId | null => result.unwrapOr(null) - }) || null; + const prime = useCall(api.query.council.prime, undefined, transformPrime) || null; const motions = useCall(api.derive.council.proposals); const items = useMemo(() => [ diff --git a/packages/page-council/src/useCounter.ts b/packages/page-council/src/useCounter.ts index 9b5977b730..35fd26ddf6 100644 --- a/packages/page-council/src/useCounter.ts +++ b/packages/page-council/src/useCounter.ts @@ -6,16 +6,14 @@ import { DeriveCollectiveProposals } from '@polkadot/api-derive/types'; import { useAccounts, useApi, useCall } from '@polkadot/react-hooks'; -function transform (motions: DeriveCollectiveProposals): number { - return motions.filter(({ votes }): boolean => !!votes).length; -} +const transformCounter = { + transform: (motions: DeriveCollectiveProposals) => motions.filter(({ votes }): boolean => !!votes).length +}; export default function useCounter (): number { const { hasAccounts } = useAccounts(); const { api, isApiReady } = useApi(); - const counter = useCall(isApiReady && hasAccounts && api.derive.council?.proposals, [], { - transform - }) || 0; + const counter = useCall(isApiReady && hasAccounts && api.derive.council?.proposals, undefined, transformCounter) || 0; return counter; } diff --git a/packages/page-democracy/src/Overview/DispatchEntry.tsx b/packages/page-democracy/src/Overview/DispatchEntry.tsx index 3a05c925e1..b756277a20 100644 --- a/packages/page-democracy/src/Overview/DispatchEntry.tsx +++ b/packages/page-democracy/src/Overview/DispatchEntry.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { LinkExternal } from '@polkadot/react-components'; import { useApi, useCall } from '@polkadot/react-hooks'; import { BlockToTime } from '@polkadot/react-query'; -import { BN_ZERO, formatNumber } from '@polkadot/util'; +import { formatNumber } from '@polkadot/util'; import ProposalCell from './ProposalCell'; import PreImageButton from './PreImageButton'; @@ -20,7 +20,7 @@ interface Props { function DispatchEntry ({ value: { at, image, imageHash, index } }: Props): React.ReactElement { const { api } = useApi(); - const bestNumber = useCall(api.derive.chain.bestNumber, []) || BN_ZERO; + const bestNumber = useCall(api.derive.chain.bestNumber); return ( diff --git a/packages/page-democracy/src/Overview/DispatchQueue.tsx b/packages/page-democracy/src/Overview/DispatchQueue.tsx index dce395695c..13d00e47ea 100644 --- a/packages/page-democracy/src/Overview/DispatchQueue.tsx +++ b/packages/page-democracy/src/Overview/DispatchQueue.tsx @@ -18,7 +18,7 @@ interface Props { function DispatchQueue ({ className }: Props): React.ReactElement | null { const { t } = useTranslation(); const { api } = useApi(); - const queued = useCall(api.derive.democracy.dispatchQueue, []); + const queued = useCall(api.derive.democracy.dispatchQueue); const headerRef = useRef([ [t('dispatch queue'), 'start', 2], diff --git a/packages/page-democracy/src/Overview/Externals.tsx b/packages/page-democracy/src/Overview/Externals.tsx index 04d6651a74..b2ef4af2e0 100644 --- a/packages/page-democracy/src/Overview/Externals.tsx +++ b/packages/page-democracy/src/Overview/Externals.tsx @@ -18,7 +18,7 @@ interface Props { function Externals ({ className }: Props): React.ReactElement | null { const { t } = useTranslation(); const { api } = useApi(); - const external = useCall(api.derive.democracy.nextExternal, []); + const external = useCall(api.derive.democracy.nextExternal); const headerRef = useRef([ [t('external'), 'start'], diff --git a/packages/page-democracy/src/Overview/Proposals.tsx b/packages/page-democracy/src/Overview/Proposals.tsx index 33de54df63..7555e62efa 100644 --- a/packages/page-democracy/src/Overview/Proposals.tsx +++ b/packages/page-democracy/src/Overview/Proposals.tsx @@ -18,7 +18,7 @@ interface Props { function Proposals ({ className }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); - const proposals = useCall(api.derive.democracy.proposals, []); + const proposals = useCall(api.derive.democracy.proposals); const headerRef = useRef([ [t('proposals'), 'start', 2], diff --git a/packages/page-democracy/src/Overview/Referendum.tsx b/packages/page-democracy/src/Overview/Referendum.tsx index 2acd752424..11e73e32a8 100644 --- a/packages/page-democracy/src/Overview/Referendum.tsx +++ b/packages/page-democracy/src/Overview/Referendum.tsx @@ -40,8 +40,8 @@ function Referendum ({ className = '', value: { allAye, allNay, image, imageHash const { t } = useTranslation(); const { api } = useApi(); const { allAccounts } = useAccounts(); - const bestNumber = useCall(api.derive.chain.bestNumber, []); - const totalIssuance = useCall(api.query.balances.totalIssuance, []); + const bestNumber = useCall(api.derive.chain.bestNumber); + const totalIssuance = useCall(api.query.balances.totalIssuance); const [percentages, setPercentages] = useState(null); const [{ hasVoted, hasVotedAye }, setHasVoted] = useState({ hasVoted: false, hasVotedAye: false }); const { changeAye, changeNay } = useChangeCalc(status.threshold, votedAye, votedNay, votedTotal); diff --git a/packages/page-democracy/src/Overview/Scheduled.tsx b/packages/page-democracy/src/Overview/Scheduled.tsx index 8787c4b643..0706705009 100644 --- a/packages/page-democracy/src/Overview/Scheduled.tsx +++ b/packages/page-democracy/src/Overview/Scheduled.tsx @@ -18,7 +18,8 @@ interface Props { function Scheduled ({ className = '', value: { blockNumber, call, maybePeriodic } }: Props): React.ReactElement { const { api } = useApi(); - const bestNumber = useCall(api.derive.chain.bestNumber, []); + const bestNumber = useCall(api.derive.chain.bestNumber); + const period = maybePeriodic.unwrapOr(null); return ( diff --git a/packages/page-democracy/src/Overview/Scheduler.tsx b/packages/page-democracy/src/Overview/Scheduler.tsx index edb3f2d8db..51e8de7640 100644 --- a/packages/page-democracy/src/Overview/Scheduler.tsx +++ b/packages/page-democracy/src/Overview/Scheduler.tsx @@ -17,29 +17,29 @@ interface Props { className?: string; } -function transformEntries (entries: [{ args: [BlockNumber] }, Option[]][]): ScheduledExt[] { - return entries - .filter(([, vecSchedOpt]) => vecSchedOpt.some((schedOpt) => schedOpt.isSome)) - .reduce((items: ScheduledExt[], [key, vecSchedOpt]): ScheduledExt[] => { - const blockNumber = key.args[0]; +const transformEntries = { + transform: (entries: [{ args: [BlockNumber] }, Option[]][]): ScheduledExt[] => { + return entries + .filter(([, vecSchedOpt]) => vecSchedOpt.some((schedOpt) => schedOpt.isSome)) + .reduce((items: ScheduledExt[], [key, vecSchedOpt]): ScheduledExt[] => { + const blockNumber = key.args[0]; - return vecSchedOpt - .filter((schedOpt) => schedOpt.isSome) - .map((schedOpt) => schedOpt.unwrap()) - .reduce((items: ScheduledExt[], { call, maybeId, maybePeriodic, priority }, index) => { - items.push({ blockNumber, call, key: `${blockNumber.toString()}-${index}`, maybeId, maybePeriodic, priority }); + return vecSchedOpt + .filter((schedOpt) => schedOpt.isSome) + .map((schedOpt) => schedOpt.unwrap()) + .reduce((items: ScheduledExt[], { call, maybeId, maybePeriodic, priority }, index) => { + items.push({ blockNumber, call, key: `${blockNumber.toString()}-${index}`, maybeId, maybePeriodic, priority }); - return items; - }, items); - }, []); -} + return items; + }, items); + }, []); + } +}; function Schedule ({ className = '' }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); - const items = useCall(api.query.scheduler.agenda.entries as any, [], { - transform: transformEntries - }); + const items = useCall(api.query.scheduler.agenda.entries as any, undefined, transformEntries); const headerRef = useRef([ [t('scheduled'), 'start'], diff --git a/packages/page-democracy/src/Overview/Summary.tsx b/packages/page-democracy/src/Overview/Summary.tsx index ed92cbae23..9fc17e7376 100644 --- a/packages/page-democracy/src/Overview/Summary.tsx +++ b/packages/page-democracy/src/Overview/Summary.tsx @@ -17,10 +17,10 @@ interface Props { function Summary ({ referendumCount }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); - const activeProposals = useCall(api.derive.democracy.proposals, []); - const bestNumber = useCall(api.derive.chain.bestNumber, []); - const publicPropCount = useCall(api.query.democracy.publicPropCount, []); - const referendumTotal = useCall(api.query.democracy.referendumCount, []); + const activeProposals = useCall(api.derive.democracy.proposals); + const bestNumber = useCall(api.derive.chain.bestNumber); + const publicPropCount = useCall(api.query.democracy.publicPropCount); + const referendumTotal = useCall(api.query.democracy.referendumCount); return ( diff --git a/packages/page-democracy/src/Overview/TreasuryCell.tsx b/packages/page-democracy/src/Overview/TreasuryCell.tsx index 602049aaa5..07f561319f 100644 --- a/packages/page-democracy/src/Overview/TreasuryCell.tsx +++ b/packages/page-democracy/src/Overview/TreasuryCell.tsx @@ -30,12 +30,14 @@ interface ParamState { values: Value[]; } +const transformProposal = { + transform: (optProp: Option) => optProp.unwrapOr(null) +}; + function TreasuryCell ({ className = '', value }: Props): React.ReactElement | null { const { api } = useApi(); const [proposalId] = useState(value.unwrap()); - const proposal = useCall(api.query.treasury.proposals, [proposalId], { - transform: (optProp: Option) => optProp.unwrapOr(null) - }); + const proposal = useCall(api.query.treasury.proposals, [proposalId], transformProposal); const [{ params, values }, setExtracted] = useState({ params: [], values: [] }); useEffect((): void => { diff --git a/packages/page-democracy/src/Overview/index.tsx b/packages/page-democracy/src/Overview/index.tsx index 166f859eaa..e2193ac7c3 100644 --- a/packages/page-democracy/src/Overview/index.tsx +++ b/packages/page-democracy/src/Overview/index.tsx @@ -28,7 +28,7 @@ function Overview ({ className }: Props): React.ReactElement { const { api } = useApi(); const [isPreimageOpen, togglePreimage] = useToggle(); const [isProposeOpen, togglePropose] = useToggle(); - const referendums = useCall(api.derive.democracy.referendums, []); + const referendums = useCall(api.derive.democracy.referendums); return (
diff --git a/packages/page-democracy/src/useChangeCalc.ts b/packages/page-democracy/src/useChangeCalc.ts index 0f5af475fc..fbc51ba906 100644 --- a/packages/page-democracy/src/useChangeCalc.ts +++ b/packages/page-democracy/src/useChangeCalc.ts @@ -18,7 +18,7 @@ interface Result { export default function useChangeCalc (threshold: VoteThreshold, votedAye: BN, votedNay: BN, votedTotal: BN): Result { const { api } = useApi(); - const sqrtElectorate = useCall(api.derive.democracy.sqrtElectorate, []); + const sqrtElectorate = useCall(api.derive.democracy.sqrtElectorate); const [result, setResult] = useState({ changeAye: BN_ZERO, changeNay: BN_ZERO }); useEffect((): void => { diff --git a/packages/page-democracy/src/useCounter.ts b/packages/page-democracy/src/useCounter.ts index 9ea951c8d0..b5158fde6c 100644 --- a/packages/page-democracy/src/useCounter.ts +++ b/packages/page-democracy/src/useCounter.ts @@ -9,8 +9,8 @@ export default function useCounter (): number { const { hasAccounts } = useAccounts(); const { api, isApiReady } = useApi(); const mountedRef = useIsMountedRef(); - const proposals = useCall(isApiReady && hasAccounts && api.derive.democracy?.proposals, []); - const referenda = useCall(isApiReady && hasAccounts && api.derive.democracy?.referendumsActive, []); + const proposals = useCall(isApiReady && hasAccounts && api.derive.democracy?.proposals); + const referenda = useCall(isApiReady && hasAccounts && api.derive.democracy?.referendumsActive); const [counter, setCounter] = useState(0); useEffect((): void => { diff --git a/packages/page-explorer/src/BestHash.tsx b/packages/page-explorer/src/BestHash.tsx index a8e22ce487..0580396389 100644 --- a/packages/page-explorer/src/BestHash.tsx +++ b/packages/page-explorer/src/BestHash.tsx @@ -14,7 +14,7 @@ interface Props { function BestHash ({ className = '', label }: Props): React.ReactElement { const { api } = useApi(); - const newHead = useCall
(api.rpc.chain.subscribeNewHeads, []); + const newHead = useCall
(api.rpc.chain.subscribeNewHeads); return (
diff --git a/packages/page-explorer/src/BlockInfo/ByHash.tsx b/packages/page-explorer/src/BlockInfo/ByHash.tsx index c511169bd0..01f6791df5 100644 --- a/packages/page-explorer/src/BlockInfo/ByHash.tsx +++ b/packages/page-explorer/src/BlockInfo/ByHash.tsx @@ -22,18 +22,20 @@ interface Props { value: string; } +const transformEvents = { + isSingle: true, + transform: (events: EventRecord[]): KeyedEvent[] => + events.map((record, index) => ({ + indexes: [index], + key: `${Date.now()}-${index}-${record.hash.toHex()}`, + record + })) +}; + function BlockByHash ({ className = '', value }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); - const events = useCall(api.query.system.events.at, [value], { - isSingle: true, - transform: (events: EventRecord[]): KeyedEvent[] => - events.map((record, index) => ({ - indexes: [index], - key: `${Date.now()}-${index}-${record.hash.toHex()}`, - record - })) - }); + const events = useCall(api.query.system.events.at, [value], transformEvents); const getBlock = useCall(api.rpc.chain.getBlock, [value], { isSingle: true }); const getHeader = useCall(api.derive.chain.getHeader, [value]); diff --git a/packages/page-explorer/src/BlockInfo/index.tsx b/packages/page-explorer/src/BlockInfo/index.tsx index b830235037..58a0b86539 100644 --- a/packages/page-explorer/src/BlockInfo/index.tsx +++ b/packages/page-explorer/src/BlockInfo/index.tsx @@ -15,7 +15,7 @@ import BlockByNumber from './ByNumber'; function Entry (): React.ReactElement | null { const { api } = useApi(); - const bestNumber = useCall(api.derive.chain.bestNumber, []); + const bestNumber = useCall(api.derive.chain.bestNumber); const { value } = useParams<{ value: string }>(); const [stateValue, setStateValue] = useState(value); diff --git a/packages/page-explorer/src/SummarySession.tsx b/packages/page-explorer/src/SummarySession.tsx index f20d4b86dd..b830acdbab 100644 --- a/packages/page-explorer/src/SummarySession.tsx +++ b/packages/page-explorer/src/SummarySession.tsx @@ -20,8 +20,8 @@ interface Props { function SummarySession ({ withEra = true, withSession = true }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); - const sessionInfo = useCall(api.query.staking && api.derive.session?.progress, []); - const forcing = useCall(api.query.staking?.forceEra, []); + const sessionInfo = useCall(api.query.staking && api.derive.session?.progress); + const forcing = useCall(api.query.staking?.forceEra); const eraLabel = t('era'); const sessionLabel = sessionInfo?.isEpoch diff --git a/packages/page-parachains/src/Overview/Parachain.tsx b/packages/page-parachains/src/Overview/Parachain.tsx index c2b03214a4..ca86edcdf1 100644 --- a/packages/page-parachains/src/Overview/Parachain.tsx +++ b/packages/page-parachains/src/Overview/Parachain.tsx @@ -21,20 +21,22 @@ interface Props { parachain: DeriveParachain; } +const transformHead = { + transform: (headData: Option): string | null => { + if (headData.isSome) { + const hex = headData.unwrap().toHex(); + + return `${hex.slice(0, 10)}…${hex.slice(-8)}`; + } + + return null; + } +}; + function Parachain ({ className = '', parachain: { didUpdate, id, info, pendingSwapId, relayDispatchQueueSize = 0 } }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); - const headHex = useCall(api.query.parachains.heads, [id], { - transform: (headData: Option): string | null => { - if (headData.isSome) { - const hex = headData.unwrap().toHex(); - - return `${hex.slice(0, 10)}…${hex.slice(-8)}`; - } - - return null; - } - }); + const headHex = useCall(api.query.parachains.heads, [id], transformHead); const history = useHistory(); const _onClick = useCallback( diff --git a/packages/page-poll/src/index.tsx b/packages/page-poll/src/index.tsx index e22b0704f5..6bfc6bd315 100644 --- a/packages/page-poll/src/index.tsx +++ b/packages/page-poll/src/index.tsx @@ -30,9 +30,9 @@ const DIV = new BN(1_000_000); function PollApp ({ className }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); - const totals = useCall>(api.query.poll.totals, []); - const bestNumber = useCall(api.derive.chain.bestNumber, []); - const totalIssuance = useCall(api.query.balances.totalIssuance, []); + const totals = useCall>(api.query.poll.totals); + const bestNumber = useCall(api.derive.chain.bestNumber); + const totalIssuance = useCall(api.query.balances.totalIssuance); const [accountId, setAccountId] = useState(null); const [turnout, setTurnout] = useState(null); const [opt10m, setOpt10m] = useState(false); diff --git a/packages/page-society/src/Overview/Bids.tsx b/packages/page-society/src/Overview/Bids.tsx index 3edb6a6231..b7de5cb6e2 100644 --- a/packages/page-society/src/Overview/Bids.tsx +++ b/packages/page-society/src/Overview/Bids.tsx @@ -18,7 +18,7 @@ interface Props { function Bids ({ className }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); - const bids = useCall(api.query.society.bids, []); + const bids = useCall(api.query.society.bids); const headerRef = useRef([ [t('bids'), 'start'], diff --git a/packages/page-society/src/Overview/Candidates.tsx b/packages/page-society/src/Overview/Candidates.tsx index 29abdd1429..0e4ca15ca5 100644 --- a/packages/page-society/src/Overview/Candidates.tsx +++ b/packages/page-society/src/Overview/Candidates.tsx @@ -21,7 +21,7 @@ interface Props { function Candidates ({ allMembers, className = '', isMember, ownMembers }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); - const candidates = useCall(api.derive.society.candidates, []); + const candidates = useCall(api.derive.society.candidates); const headerRef = useRef([ [t('candidates'), 'start'], diff --git a/packages/page-society/src/Overview/Defender.tsx b/packages/page-society/src/Overview/Defender.tsx index 5ee66e1fc4..624604b808 100644 --- a/packages/page-society/src/Overview/Defender.tsx +++ b/packages/page-society/src/Overview/Defender.tsx @@ -21,18 +21,18 @@ interface Props { ownMembers: string[]; } -function transformVotes (members: DeriveSocietyMember[]): VoteType[] { - return members - .filter(({ vote }): boolean => !!vote) - .map(({ accountId, vote }): VoteType => [accountId.toString(), vote as SocietyVote]); -} +const transformVotes = { + transform: (members: DeriveSocietyMember[]): VoteType[] => { + return members + .filter(({ vote }): boolean => !!vote) + .map(({ accountId, vote }): VoteType => [accountId.toString(), vote as SocietyVote]); + } +}; function Defender ({ className = '', info, isMember, ownMembers }: Props): React.ReactElement | null { const { t } = useTranslation(); const { api } = useApi(); - const votes = useCall(api.derive.society.members, [], { - transform: transformVotes - }); + const votes = useCall(api.derive.society.members, undefined, transformVotes); const headerRef = useRef([ [t('defender'), 'start'], diff --git a/packages/page-society/src/Overview/Members.tsx b/packages/page-society/src/Overview/Members.tsx index c6b5d64a31..db52a79da6 100644 --- a/packages/page-society/src/Overview/Members.tsx +++ b/packages/page-society/src/Overview/Members.tsx @@ -19,7 +19,7 @@ interface Props { function Members ({ className = '', info }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); - const members = useCall(api.derive.society.members, []); + const members = useCall(api.derive.society.members); const headerRef = useRef([ [t('members'), 'start', 3], diff --git a/packages/page-society/src/Overview/Summary.tsx b/packages/page-society/src/Overview/Summary.tsx index 782d84628c..f3cfa20299 100644 --- a/packages/page-society/src/Overview/Summary.tsx +++ b/packages/page-society/src/Overview/Summary.tsx @@ -21,8 +21,8 @@ interface Props { function Summary ({ className = '', info }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); - const members = useCall(api.derive.society.members, []); - const bestNumber = useCall(api.derive.chain.bestNumber, []); + const members = useCall(api.derive.society.members); + const bestNumber = useCall(api.derive.chain.bestNumber); const pot = useMemo((): string | null => { return info && info.pot.gtn(0) diff --git a/packages/page-society/src/Overview/index.tsx b/packages/page-society/src/Overview/index.tsx index 467338dfd0..0b7c26411d 100644 --- a/packages/page-society/src/Overview/index.tsx +++ b/packages/page-society/src/Overview/index.tsx @@ -26,7 +26,7 @@ interface Props { function Overview ({ className }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); - const info = useCall(api.derive.society.info, []); + const info = useCall(api.derive.society.info); const { allMembers, isMember, ownMembers } = useMembers(); const [isBidOpen, toggleBidOpen] = useToggle(); diff --git a/packages/page-society/src/useCounter.ts b/packages/page-society/src/useCounter.ts index ff415cae25..21004d46dd 100644 --- a/packages/page-society/src/useCounter.ts +++ b/packages/page-society/src/useCounter.ts @@ -8,7 +8,7 @@ import { useApi, useCall } from '@polkadot/react-hooks'; export default function useCounter (): number { const { api } = useApi(); - const bids = useCall(api.query.society?.bids, []); + const bids = useCall(api.query.society?.bids); return bids?.length || 0; } diff --git a/packages/page-society/src/useMembers.ts b/packages/page-society/src/useMembers.ts index ed53fb2421..f152d683ad 100644 --- a/packages/page-society/src/useMembers.ts +++ b/packages/page-society/src/useMembers.ts @@ -22,7 +22,7 @@ export default function useMembers (): OwnMembers { const { api } = useApi(); const { allAccounts } = useAccounts(); const [state, setState] = useState({ allMembers: [], isMember: false, ownMembers: [] }); - const members = useCall(api.derive.society?.members, []); + const members = useCall(api.derive.society?.members); useEffect((): void => { allAccounts && members && setState( diff --git a/packages/page-staking/src/Actions/Account/InputValidationController.tsx b/packages/page-staking/src/Actions/Account/InputValidationController.tsx index 525d013fbc..e005e67fb1 100644 --- a/packages/page-staking/src/Actions/Account/InputValidationController.tsx +++ b/packages/page-staking/src/Actions/Account/InputValidationController.tsx @@ -23,21 +23,25 @@ interface ErrorState { isFatal: boolean; } +const transformBonded = { + transform: (value: Option): string | null => + value.isSome + ? value.unwrap().toString() + : null +}; + +const transformStash = { + transform: (value: Option): string | null => + value.isSome + ? value.unwrap().stash.toString() + : null +}; + function ValidateController ({ accountId, controllerId, defaultController, onError }: Props): React.ReactElement | null { const { t } = useTranslation(); const { api } = useApi(); - const bondedId = useCall(controllerId ? api.query.staking.bonded : null, [controllerId], { - transform: (value: Option): string | null => - value.isSome - ? value.unwrap().toString() - : null - }); - const stashId = useCall(controllerId ? api.query.staking.ledger : null, [controllerId], { - transform: (value: Option): string | null => - value.isSome - ? value.unwrap().stash.toString() - : null - }); + const bondedId = useCall(controllerId ? api.query.staking.bonded : null, [controllerId], transformBonded); + const stashId = useCall(controllerId ? api.query.staking.ledger : null, [controllerId], transformStash); const allBalances = useCall(controllerId ? api.derive.balances.all : null, [controllerId]); const [{ error, isFatal }, setError] = useState({ error: null, isFatal: false }); diff --git a/packages/page-staking/src/Actions/Account/index.tsx b/packages/page-staking/src/Actions/Account/index.tsx index 434a423cee..544c9aecb5 100644 --- a/packages/page-staking/src/Actions/Account/index.tsx +++ b/packages/page-staking/src/Actions/Account/index.tsx @@ -11,6 +11,7 @@ import { Slash } from '../types'; import BN from 'bn.js'; import React, { useCallback, useContext, useMemo } from 'react'; import styled from 'styled-components'; +import { ApiPromise } from '@polkadot/api'; import { AddressInfo, AddressMini, AddressSmall, Badge, Button, Menu, Popup, StakingBonded, StakingRedeemable, StakingUnbonding, StatusContext, TxButton } from '@polkadot/react-components'; import { useApi, useCall, useToggle } from '@polkadot/react-hooks'; import { Option } from '@polkadot/types'; @@ -49,18 +50,26 @@ function extractSlashes (stashId: string, allSlashes: [BN, UnappliedSlash[]][] = .filter(({ slashes }) => slashes.length); } +const transformSpan = { + transform: (optSpans: Option): number => + optSpans.isNone + ? 0 + : optSpans.unwrap().prior.length + 1 +}; + +function useStashCalls (api: ApiPromise, stashId: string) { + const params = useMemo(() => [stashId], [stashId]); + const balancesAll = useCall(api.derive.balances.all, params); + const spanCount = useCall(api.query.staking.slashingSpans, params, transformSpan); + const stakingAccount = useCall(api.derive.staking.account, params); + + return { balancesAll, spanCount, stakingAccount }; +} + function Account ({ allSlashes, className = '', info: { controllerId, destination, destinationId, hexSessionIdNext, hexSessionIdQueue, isLoading, isOwnController, isOwnStash, isStashNominating, isStashValidating, nominating, sessionIds, stakingLedger, stashId }, isDisabled, targets }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); const { queueExtrinsic } = useContext(StatusContext); - const balancesAll = useCall(api.derive.balances.all, [stashId]); - const stakingAccount = useCall(api.derive.staking.account, [stashId]); - const spanCount = useCall(api.query.staking.slashingSpans, [stashId], { - transform: (optSpans: Option): number => - optSpans.isNone - ? 0 - : optSpans.unwrap().prior.length + 1 - }); const [isBondExtraOpen, toggleBondExtra] = useToggle(); const [isInjectOpen, toggleInject] = useToggle(); const [isNominateOpen, toggleNominate] = useToggle(); @@ -70,6 +79,7 @@ function Account ({ allSlashes, className = '', info: { controllerId, destinatio const [isSettingsOpen, toggleSettings] = useToggle(); const [isUnbondOpen, toggleUnbond] = useToggle(); const [isValidateOpen, toggleValidate] = useToggle(); + const { balancesAll, spanCount, stakingAccount } = useStashCalls(api, stashId); const slashes = useMemo( () => extractSlashes(stashId, allSlashes), diff --git a/packages/page-staking/src/Actions/useInactives.ts b/packages/page-staking/src/Actions/useInactives.ts index 4e2c425217..5e3aff2e26 100644 --- a/packages/page-staking/src/Actions/useInactives.ts +++ b/packages/page-staking/src/Actions/useInactives.ts @@ -65,7 +65,7 @@ export default function useInactives (stashId: string, nominees?: string[]): Ina const { api } = useApi(); const mountedRef = useIsMountedRef(); const [state, setState] = useState({}); - const indexes = useCall(api.derive.session.indexes, []); + const indexes = useCall(api.derive.session.indexes); useEffect((): () => void => { let unsub: (() => void) | undefined; diff --git a/packages/page-staking/src/Actions/useUnbondDuration.ts b/packages/page-staking/src/Actions/useUnbondDuration.ts index c6b07e8535..96765fda6f 100644 --- a/packages/page-staking/src/Actions/useUnbondDuration.ts +++ b/packages/page-staking/src/Actions/useUnbondDuration.ts @@ -11,7 +11,7 @@ import { BN_ONE } from '@polkadot/util'; export default function useUnbondDuration (): BN | undefined { const { api } = useApi(); - const sessionInfo = useCall(api.derive.session.info, []); + const sessionInfo = useCall(api.derive.session.info); return useMemo( () => (sessionInfo && sessionInfo.sessionLength.gt(BN_ONE)) diff --git a/packages/page-staking/src/Overview/Address/index.tsx b/packages/page-staking/src/Overview/Address/index.tsx index 63286b3e33..300b8d78e3 100644 --- a/packages/page-staking/src/Overview/Address/index.tsx +++ b/packages/page-staking/src/Overview/Address/index.tsx @@ -7,6 +7,7 @@ import { DeriveAccountInfo, DeriveStakingQuery } from '@polkadot/api-derive/type import BN from 'bn.js'; import React, { useCallback, useMemo } from 'react'; +import { ApiPromise } from '@polkadot/api'; import { AddressSmall, Icon, LinkExternal } from '@polkadot/react-components'; import { checkVisibility } from '@polkadot/react-components/util'; import { useApi, useCall } from '@polkadot/react-hooks'; @@ -71,13 +72,22 @@ function expandInfo ({ exposure, validatorPrefs }: DeriveStakingQuery): StakingS }; } +const transformSlashes = { + transform: (opt: Option) => opt.unwrapOr(null) +}; + +function useAddressCalls (api: ApiPromise, address: string, isMain?: boolean) { + const params = useMemo(() => [address], [address]); + const accountInfo = useCall(api.derive.accounts.info, params); + const slashingSpans = useCall(!isMain && api.query.staking.slashingSpans, params, transformSlashes); + const stakingInfo = useCall(api.derive.staking.query, params); + + return { accountInfo, slashingSpans, stakingInfo }; +} + function Address ({ address, className = '', filterName, hasQueries, isElected, isFavorite, isMain, lastBlock, nominatedBy, onlineCount, onlineMessage, points, toggleFavorite, withIdentity }: Props): React.ReactElement | null { const { api } = useApi(); - const accountInfo = useCall(api.derive.accounts.info, [address]); - const stakingInfo = useCall(api.derive.staking.query, [address]); - const slashingSpans = useCall(!isMain && api.query.staking.slashingSpans, [address], { - transform: (opt: Option) => opt.unwrapOr(null) - }); + const { accountInfo, slashingSpans, stakingInfo } = useAddressCalls(api, address, isMain); const { commission, nominators, stakeOther, stakeOwn } = useMemo( () => stakingInfo ? expandInfo(stakingInfo) : { nominators: [] }, diff --git a/packages/page-staking/src/Overview/CurrentList.tsx b/packages/page-staking/src/Overview/CurrentList.tsx index e9a9b80b4b..0773b21d4b 100644 --- a/packages/page-staking/src/Overview/CurrentList.tsx +++ b/packages/page-staking/src/Overview/CurrentList.tsx @@ -95,8 +95,8 @@ function CurrentList ({ favorites, hasQueries, isIntentions, next, stakingOvervi const { t } = useTranslation(); const { api } = useApi(); const { byAuthor, eraPoints } = useContext(isIntentions ? EmptyAuthorsContext : BlockAuthorsContext); - const recentlyOnline = useCall(!isIntentions && api.derive.imOnline?.receivedHeartbeats, []); - const nominators = useCall<[StorageKey, Option][]>(isIntentions && api.query.staking.nominators.entries as any, []); + const recentlyOnline = useCall(!isIntentions && api.derive.imOnline?.receivedHeartbeats); + const nominators = useCall<[StorageKey, Option][]>(isIntentions && api.query.staking.nominators.entries as any); const [nameFilter, setNameFilter] = useState(''); const [withIdentity, setWithIdentity] = useState(false); diff --git a/packages/page-staking/src/Payouts/index.tsx b/packages/page-staking/src/Payouts/index.tsx index df8fa91f25..bbd3b5cb9d 100644 --- a/packages/page-staking/src/Payouts/index.tsx +++ b/packages/page-staking/src/Payouts/index.tsx @@ -157,8 +157,8 @@ function Payouts ({ className = '', isInElection, ownValidators }: Props): React const [hasOwnValidators] = useState(ownValidators.length !== 0); const [myStashesIndex, setMyStashesIndex] = useState((api.tx.staking.payoutStakers && hasOwnValidators) ? 0 : 1); const [eraSelectionIndex, setEraSelectionIndex] = useState(0); - const eraLength = useCall(api.derive.session.eraLength, []); - const historyDepth = useCall(api.query.staking.historyDepth, []); + const eraLength = useCall(api.derive.session.eraLength); + const historyDepth = useCall(api.query.staking.historyDepth); const stakerPayoutsAfter = useStakerPayouts(); const isDisabled = isInElection || !isFunction(api.tx.utility?.batch); diff --git a/packages/page-staking/src/Payouts/useEraBlocks.ts b/packages/page-staking/src/Payouts/useEraBlocks.ts index 92b2be710c..eb39c4af0c 100644 --- a/packages/page-staking/src/Payouts/useEraBlocks.ts +++ b/packages/page-staking/src/Payouts/useEraBlocks.ts @@ -12,9 +12,9 @@ import { BN_ONE } from '@polkadot/util'; export default function useEraBlocks (era?: BN): BN | undefined { const { api } = useApi(); - const depth = useCall(api.query.staking.historyDepth, []); - const progress = useCall(api.derive.session.progress, []); - const forcing = useCall(api.query.staking.forceEra, []); + const depth = useCall(api.query.staking.historyDepth); + const progress = useCall(api.derive.session.progress); + const forcing = useCall(api.query.staking.forceEra); return useMemo( () => (depth && era && forcing && progress && progress.sessionLength.gt(BN_ONE)) diff --git a/packages/page-staking/src/Payouts/useStakerPayouts.ts b/packages/page-staking/src/Payouts/useStakerPayouts.ts index aea9c453a1..d507fe3798 100644 --- a/packages/page-staking/src/Payouts/useStakerPayouts.ts +++ b/packages/page-staking/src/Payouts/useStakerPayouts.ts @@ -12,7 +12,7 @@ import { isFunction } from '@polkadot/util'; export default function useStakerPayouts (): BN { const { api } = useApi(); - const migrateEraOpt = useCall>(api.query.staking?.migrateEra, []); + const migrateEraOpt = useCall>(api.query.staking?.migrateEra); return useMemo( () => (migrateEraOpt && migrateEraOpt.isSome && migrateEraOpt.unwrap()) || ( diff --git a/packages/page-staking/src/Query/ChartRewards.tsx b/packages/page-staking/src/Query/ChartRewards.tsx index 1ff038f6e2..4edea08d9c 100644 --- a/packages/page-staking/src/Query/ChartRewards.tsx +++ b/packages/page-staking/src/Query/ChartRewards.tsx @@ -56,7 +56,7 @@ function ChartRewards ({ validatorId }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); const ownSlashes = useCall(api.derive.staking.ownSlashes, [validatorId, true]); - const erasRewards = useCall(api.derive.staking.erasRewards, []); + const erasRewards = useCall(api.derive.staking.erasRewards); const stakerPoints = useCall(api.derive.staking.stakerPoints, [validatorId, true]); const { currency, divisor } = useMemo((): { currency: string; divisor: BN } => ({ diff --git a/packages/page-staking/src/Query/useBlockCounts.tsx b/packages/page-staking/src/Query/useBlockCounts.tsx index 597ec99fc7..398d23655e 100644 --- a/packages/page-staking/src/Query/useBlockCounts.tsx +++ b/packages/page-staking/src/Query/useBlockCounts.tsx @@ -13,7 +13,7 @@ import { isFunction } from '@polkadot/util'; export default function useBlockCounts (accountId: string, sessionRewards: SessionRewards[]): u32[] { const { api } = useApi(); const mountedRef = useIsMountedRef(); - const indexes = useCall(api.derive.session?.indexes, []); + const indexes = useCall(api.derive.session?.indexes); const current = useCall(api.query.imOnline?.authoredBlocks, [indexes?.currentIndex, accountId]); const [counts, setCounts] = useState([]); const [historic, setHistoric] = useState([]); diff --git a/packages/page-staking/src/Slashes/Summary.tsx b/packages/page-staking/src/Slashes/Summary.tsx index 6c30d8348d..7171119f4a 100644 --- a/packages/page-staking/src/Slashes/Summary.tsx +++ b/packages/page-staking/src/Slashes/Summary.tsx @@ -21,7 +21,7 @@ interface Props { function Header ({ slash: { era, nominators, reporters, total, validators } }: Props): React.ReactElement | null { const { t } = useTranslation(); const { api } = useApi(); - const sessionInfo = useCall(api.derive.session?.progress, []); + const sessionInfo = useCall(api.derive.session?.progress); const [blockProgress, blockEnd] = useMemo( () => sessionInfo diff --git a/packages/page-staking/src/Targets/Summary.tsx b/packages/page-staking/src/Targets/Summary.tsx index aee4120b8c..88ca7d78f6 100644 --- a/packages/page-staking/src/Targets/Summary.tsx +++ b/packages/page-staking/src/Targets/Summary.tsx @@ -24,7 +24,7 @@ interface Props { function Summary ({ avgStaked, lastReward, lowStaked, numNominators, numValidators, totalStaked }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); - const totalIssuance = useCall(api.query.balances?.totalIssuance, []); + const totalIssuance = useCall(api.query.balances?.totalIssuance); const progressStake = useMemo( () => totalIssuance && totalStaked && totalStaked.gtn(0) diff --git a/packages/page-staking/src/index.tsx b/packages/page-staking/src/index.tsx index 964329f144..c80a665199 100644 --- a/packages/page-staking/src/index.tsx +++ b/packages/page-staking/src/index.tsx @@ -30,6 +30,10 @@ import useSortedTargets from './useSortedTargets'; const HIDDEN_ACC = ['actions', 'payouts', 'query']; const HIDDEN_QUE = ['returns', 'query']; +const transformElection = { + transform: (status: ElectionStatus) => status.isOpen +}; + function StakingApp ({ basePath, className = '' }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); @@ -40,10 +44,8 @@ function StakingApp ({ basePath, className = '' }: Props): React.ReactElement(api.derive.staking.overview, []); - const isInElection = useCall(api.query.staking?.eraElectionStatus, [], { - transform: (status: ElectionStatus) => status.isOpen - }); + const stakingOverview = useCall(api.derive.staking.overview); + const isInElection = useCall(api.query.staking?.eraElectionStatus, undefined, transformElection); const hasQueries = useMemo( () => hasAccounts && !!(api.query.imOnline?.authoredBlocks) && !!(api.query.staking.activeEra), diff --git a/packages/page-staking/src/useSortedTargets.ts b/packages/page-staking/src/useSortedTargets.ts index 44206d089c..584e89b9c9 100644 --- a/packages/page-staking/src/useSortedTargets.ts +++ b/packages/page-staking/src/useSortedTargets.ts @@ -149,17 +149,21 @@ function extractInfo (allAccounts: string[], amount: BN = baseBalance(), elected return { avgStaked: totalStaked.divn(electedDerive.info.length), lowStaked, nominators, totalStaked, validatorIds, validators }; } +const transformEra = { + transform: ({ activeEra }: DeriveSessionIndexes) => activeEra.gtn(0) ? activeEra.subn(1) : BN_ZERO +}; + +const transformReward = { + transform: (optBalance: Option) => optBalance.unwrapOrDefault() +}; + export default function useSortedTargets (favorites: string[]): SortedTargets { const { api } = useApi(); const { allAccounts } = useAccounts(); - const electedInfo = useCall(api.derive.staking.electedInfo, []); - const waitingInfo = useCall(api.derive.staking.waitingInfo, []); - const lastEra = useCall(api.derive.session.indexes, [], { - transform: ({ activeEra }: DeriveSessionIndexes) => activeEra.gtn(0) ? activeEra.subn(1) : BN_ZERO - }); - const lastReward = useCall(lastEra && api.query.staking.erasValidatorReward, [lastEra], { - transform: (optBalance: Option) => optBalance.unwrapOrDefault() - }); + const electedInfo = useCall(api.derive.staking.electedInfo); + const waitingInfo = useCall(api.derive.staking.waitingInfo); + const lastEra = useCall(api.derive.session.indexes, undefined, transformEra); + const lastReward = useCall(lastEra && api.query.staking.erasValidatorReward, [lastEra], transformReward); const [calcWith, setCalcWith] = useState(baseBalance()); const calcWithDebounce = useDebounce(calcWith); const [state, setState] = useState({ setCalcWith }); diff --git a/packages/page-tech-comm/src/Overview/Summary.tsx b/packages/page-tech-comm/src/Overview/Summary.tsx index e11b130312..18544eeff4 100644 --- a/packages/page-tech-comm/src/Overview/Summary.tsx +++ b/packages/page-tech-comm/src/Overview/Summary.tsx @@ -15,7 +15,7 @@ import { useTranslation } from '../translate'; function Summary ({ className = '', members, proposals }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); - const proposalCount = useCall(api.query.technicalCommittee.proposalCount, []); + const proposalCount = useCall(api.query.technicalCommittee.proposalCount); return ( diff --git a/packages/page-tech-comm/src/Proposals/Proposal.tsx b/packages/page-tech-comm/src/Proposals/Proposal.tsx index 9683d0d9a6..8b06a619d0 100644 --- a/packages/page-tech-comm/src/Proposals/Proposal.tsx +++ b/packages/page-tech-comm/src/Proposals/Proposal.tsx @@ -23,14 +23,18 @@ interface Props { prime?: AccountId | null; } +const transformProposal = { + transform: (optProp: Option) => optProp.unwrapOr(null) +}; + +const transformVotes = { + transform: (optVotes: Option) => optVotes.unwrapOr(null) +}; + function Proposal ({ className = '', imageHash, isMember, members, prime }: Props): React.ReactElement | null { const { api } = useApi(); - const proposal = useCall(api.query.technicalCommittee.proposalOf, [imageHash], { - transform: (optProp: Option) => optProp.unwrapOr(null) - }); - const votes = useCall(api.query.technicalCommittee.voting, [imageHash], { - transform: (optVotes: Option) => optVotes.unwrapOr(null) - }); + const proposal = useCall(api.query.technicalCommittee.proposalOf, [imageHash], transformProposal); + const votes = useCall(api.query.technicalCommittee.voting, [imageHash], transformVotes); const { hasFailed, isCloseable, isVoteable, remainingBlocks } = useVotingStatus(votes, members.length, 'technicalCommittee'); if (!proposal || !votes) { diff --git a/packages/page-tech-comm/src/index.tsx b/packages/page-tech-comm/src/index.tsx index e79307feea..c5dcd5305a 100644 --- a/packages/page-tech-comm/src/index.tsx +++ b/packages/page-tech-comm/src/index.tsx @@ -21,14 +21,17 @@ interface Props { className?: string; } +const transformPrime = { + transform: (result: Option): AccountId | null => result.unwrapOr(null) +}; + function TechCommApp ({ basePath, className }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); const { isMember, members } = useMembers('technicalCommittee'); - const prime = useCall(api.query.technicalCommittee.prime, [], { - transform: (result: Option): AccountId | null => result.unwrapOr(null) - }) || null; + const prime = useCall(api.query.technicalCommittee.prime, undefined, transformPrime) || null; const proposals = useCall(api.query.technicalCommittee.proposals); + const items = useMemo(() => [ { isRoot: true, diff --git a/packages/page-tech-comm/src/useCounter.ts b/packages/page-tech-comm/src/useCounter.ts index 15fb8e4d4d..057db158c9 100644 --- a/packages/page-tech-comm/src/useCounter.ts +++ b/packages/page-tech-comm/src/useCounter.ts @@ -6,15 +6,13 @@ import { Hash } from '@polkadot/types/interfaces'; import { useApi, useCall } from '@polkadot/react-hooks'; -function transform (proposals: Hash[]): number { - return proposals.length; -} +const transformCounter = { + transform: (proposals: Hash[]) => proposals.length +}; export default function useCounter (): number { const { api, isApiReady } = useApi(); - const counter = useCall(isApiReady && api.query.technicalCommittee?.proposals, [], { - transform - }) || 0; + const counter = useCall(isApiReady && api.query.technicalCommittee?.proposals, undefined, transformCounter) || 0; return counter; } diff --git a/packages/page-treasury/src/Overview/Summary.tsx b/packages/page-treasury/src/Overview/Summary.tsx index 8e3a64b3d1..937bda73b2 100644 --- a/packages/page-treasury/src/Overview/Summary.tsx +++ b/packages/page-treasury/src/Overview/Summary.tsx @@ -24,8 +24,8 @@ interface Props { function Summary ({ approvalCount, proposalCount }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); - const bestNumber = useCall(api.derive.chain.bestNumber, []); - const totalProposals = useCall(api.query.treasury.proposalCount, []); + const bestNumber = useCall(api.derive.chain.bestNumber); + const totalProposals = useCall(api.query.treasury.proposalCount); const treasuryBalance = useCall(api.derive.balances.account, [TREASURY_ACCOUNT]); const spendPeriod = api.consts.treasury.spendPeriod; diff --git a/packages/page-treasury/src/Overview/TipReason.tsx b/packages/page-treasury/src/Overview/TipReason.tsx index dde2a16b00..5e2990897a 100644 --- a/packages/page-treasury/src/Overview/TipReason.tsx +++ b/packages/page-treasury/src/Overview/TipReason.tsx @@ -13,14 +13,16 @@ interface Props { hash: Hash; } +const transformTip = { + transform: (optBytes: Option) => + optBytes.isSome + ? hexToString(optBytes.unwrap().toHex()) + : null +}; + function TipReason ({ hash }: Props): React.ReactElement { const { api } = useApi(); - const reasonText = useCall(api.query.treasury.reasons, [hash], { - transform: (optBytes: Option) => - optBytes.isSome - ? hexToString(optBytes.unwrap().toHex()) - : null - }); + const reasonText = useCall(api.query.treasury.reasons, [hash], transformTip); return ( {reasonText || hash.toHex()} diff --git a/packages/page-treasury/src/Overview/Tips.tsx b/packages/page-treasury/src/Overview/Tips.tsx index 81b46a9149..4914b7d019 100644 --- a/packages/page-treasury/src/Overview/Tips.tsx +++ b/packages/page-treasury/src/Overview/Tips.tsx @@ -24,7 +24,7 @@ type Tip = [string, OpenTip | OpenTipTo225]; function Tips ({ className = '', hashes, isMember, members }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); - const bestNumber = useCall(api.derive.chain.bestNumber, []); + const bestNumber = useCall(api.derive.chain.bestNumber); const [tips, setTips] = useState(); const optTips = useCall[]>(hashes && api.query.treasury.tips.multi, [hashes]); diff --git a/packages/page-treasury/src/Overview/Voting.tsx b/packages/page-treasury/src/Overview/Voting.tsx index 21bab3a0a4..77bcfc4c08 100644 --- a/packages/page-treasury/src/Overview/Voting.tsx +++ b/packages/page-treasury/src/Overview/Voting.tsx @@ -32,7 +32,7 @@ function Voting ({ councilProposals, isDisabled, members }: Props): React.ReactE const { t } = useTranslation(); const { hasAccounts } = useAccounts(); const { api } = useApi(); - const bestNumber = useCall(api.derive.chain.bestNumber, []); + const bestNumber = useCall(api.derive.chain.bestNumber); const [councilOpts, setCouncilOpts] = useState([]); const [councilOptId, setCouncilOptId] = useState(0); const [accountId, setAccountId] = useState(null); diff --git a/packages/page-treasury/src/Overview/index.tsx b/packages/page-treasury/src/Overview/index.tsx index a7507f4cbb..831e4b5ff1 100644 --- a/packages/page-treasury/src/Overview/index.tsx +++ b/packages/page-treasury/src/Overview/index.tsx @@ -17,7 +17,7 @@ import Tips from './Tips'; function Overview ({ className }: Props): React.ReactElement { const { api } = useApi(); - const info = useCall(api.derive.treasury.proposals, []); + const info = useCall(api.derive.treasury.proposals); const { isMember, members } = useMembers(); const mountedRef = useIsMountedRef(); diff --git a/packages/page-treasury/src/useCounter.ts b/packages/page-treasury/src/useCounter.ts index 0e553e03f9..f8fda4d119 100644 --- a/packages/page-treasury/src/useCounter.ts +++ b/packages/page-treasury/src/useCounter.ts @@ -10,7 +10,7 @@ import { useAccounts, useApi, useCall } from '@polkadot/react-hooks'; export default function useCounter (): number { const { hasAccounts } = useAccounts(); const { api, isApiReady } = useApi(); - const proposals = useCall(isApiReady && hasAccounts && api.derive.treasury?.proposals, []); + const proposals = useCall(isApiReady && hasAccounts && api.derive.treasury?.proposals); const [counter, setCounter] = useState(0); useEffect((): void => { diff --git a/packages/react-components/src/DemocracyLocks.tsx b/packages/react-components/src/DemocracyLocks.tsx index a02bbde054..0c61bdcfcd 100644 --- a/packages/react-components/src/DemocracyLocks.tsx +++ b/packages/react-components/src/DemocracyLocks.tsx @@ -85,7 +85,7 @@ function groupLocks (t: TFunction, bestNumber: BN, locks: DeriveDemocracyLock[] function DemocracyLocks ({ className = '', value }: Props): React.ReactElement | null { const { t } = useTranslation(); const { api } = useApi(); - const bestNumber = useCall(api.derive.chain.bestNumber, []); + const bestNumber = useCall(api.derive.chain.bestNumber); const [trigger] = useState(`${Date.now()}-democracy-locks-${++id}`); const [{ maxBalance, sorted }, setState] = useState({ maxBalance: BN_ZERO, sorted: [] }); diff --git a/packages/react-components/src/StakingRedeemable.tsx b/packages/react-components/src/StakingRedeemable.tsx index 149556c122..808592c21b 100644 --- a/packages/react-components/src/StakingRedeemable.tsx +++ b/packages/react-components/src/StakingRedeemable.tsx @@ -18,16 +18,18 @@ interface Props { stakingInfo?: DeriveStakingAccount; } +const transformSpan = { + transform: (optSpans: Option): number => + optSpans.isNone + ? 0 + : optSpans.unwrap().prior.length + 1 +}; + function StakingRedeemable ({ className = '', stakingInfo }: Props): React.ReactElement | null { const { api } = useApi(); const { allAccounts } = useAccounts(); const { t } = useTranslation(); - const spanCount = useCall(api.query.staking.slashingSpans, [stakingInfo?.stashId], { - transform: (optSpans: Option): number => - optSpans.isNone - ? 0 - : optSpans.unwrap().prior.length + 1 - }); + const spanCount = useCall(api.query.staking.slashingSpans, [stakingInfo?.stashId], transformSpan); if (!stakingInfo?.redeemable?.gtn(0)) { return null; diff --git a/packages/react-components/src/StakingUnbonding.tsx b/packages/react-components/src/StakingUnbonding.tsx index effb90a554..bd213a3033 100644 --- a/packages/react-components/src/StakingUnbonding.tsx +++ b/packages/react-components/src/StakingUnbonding.tsx @@ -29,7 +29,7 @@ function remainingBlocks (remainingEras: BN, { eraLength, eraProgress }: DeriveS function StakingUnbonding ({ className = '', stakingInfo }: Props): React.ReactElement | null { const { api } = useApi(); - const progress = useCall(api.derive.session.progress, []); + const progress = useCall(api.derive.session.progress); const { t } = useTranslation(); if (!stakingInfo?.unlocking || !progress) { diff --git a/packages/react-hooks/src/useAvailableSlashes.ts b/packages/react-hooks/src/useAvailableSlashes.ts index d9a81f9912..20c48777da 100644 --- a/packages/react-hooks/src/useAvailableSlashes.ts +++ b/packages/react-hooks/src/useAvailableSlashes.ts @@ -14,8 +14,8 @@ type Unsub = () => void; export default function useAvailableSlashes (): [BN, UnappliedSlash[]][] { const { api } = useApi(); - const indexes = useCall(api.derive.session?.indexes, []); - const earliestSlash = useCall>(api.query.staking?.earliestUnappliedSlash, []); + const indexes = useCall(api.derive.session?.indexes); + const earliestSlash = useCall>(api.query.staking?.earliestUnappliedSlash); const mountedRef = useIsMountedRef(); const [slashes, setSlashes] = useState<[BN, UnappliedSlash[]][]>([]); diff --git a/packages/react-hooks/src/useCall.ts b/packages/react-hooks/src/useCall.ts index 4dcf909511..0071a26b63 100644 --- a/packages/react-hooks/src/useCall.ts +++ b/packages/react-hooks/src/useCall.ts @@ -38,7 +38,7 @@ function transformIdentity (value: unknown): T { } // extract the serialized and mapped params, all ready for use in our call -function extractParams (fn: unknown, params: unknown[], paramMap: (params: unknown[]) => CallParams): [string, CallParams | null] { +function extractParams (fn: unknown, params: unknown[], { paramMap = transformIdentity }: CallOptions = {}): [string, CallParams | null] { return [ JSON.stringify({ f: (fn as { name: string })?.name, p: params }), params.length === 0 || !params.some((param) => isNull(param) || isUndefined(param)) @@ -58,7 +58,7 @@ function unsubscribe (tracker: TrackerRef): void { } // subscribe, trying to play nice with the browser threads -function subscribe (mountedRef: MountedRef, tracker: TrackerRef, fn: TrackFn | undefined, params: CallParams, setValue: (value: T) => void, { isSingle, transform = transformIdentity, withParams }: CallOptions): void { +function subscribe (mountedRef: MountedRef, tracker: TrackerRef, fn: TrackFn | undefined, params: CallParams, setValue: (value: T) => void, { isSingle, transform = transformIdentity, withParams }: CallOptions = {}): void { const validParams = params.filter((p): boolean => !isUndefined(p)); unsubscribe(tracker); @@ -94,10 +94,10 @@ function subscribe (mountedRef: MountedRef, tracker: TrackerRef, fn: TrackFn // - returns a promise with an unsubscribe function // - has a callback to set the value // FIXME The typings here need some serious TLC -export default function useCall (fn: TrackFn | undefined | null | false, params: CallParams = [], options: CallOptions = {}): T | undefined { +export default function useCall (fn: TrackFn | undefined | null | false, params?: CallParams, options?: CallOptions): T | undefined { const mountedRef = useIsMountedRef(); const tracker = useRef({ count: 0, isActive: false, serialized: null, subscriber: null }); - const [value, setValue] = useState(options.defaultValue); + const [value, setValue] = useState((options || {}).defaultValue); // initial effect, we need an un-subscription useEffect((): () => void => { @@ -108,7 +108,7 @@ export default function useCall (fn: TrackFn | undefined | null | false, par useEffect((): void => { // check if we have a function & that we are mounted if (mountedRef.current && fn) { - const [serialized, mappedParams] = extractParams(fn, params, options.paramMap || transformIdentity); + const [serialized, mappedParams] = extractParams(fn, params || [], options); if (mappedParams && serialized !== tracker.current.serialized) { tracker.current.serialized = serialized; diff --git a/packages/react-hooks/src/useMembers.ts b/packages/react-hooks/src/useMembers.ts index 2b19d7895a..284dc55138 100644 --- a/packages/react-hooks/src/useMembers.ts +++ b/packages/react-hooks/src/useMembers.ts @@ -12,13 +12,15 @@ interface Result { members: string[]; } +const transformMembers = { + transform: (accounts: AccountId[]) => + accounts.map((accountId) => accountId.toString()) +}; + export default function useMembers (collective: 'council' | 'technicalCommittee' = 'council'): Result { const { api } = useApi(); const { allAccounts, hasAccounts } = useAccounts(); - const retrieved = useCall(hasAccounts && api.query[collective]?.members, [], { - transform: (accounts: AccountId[]) => - accounts.map((accountId) => accountId.toString()) - }); + const retrieved = useCall(hasAccounts && api.query[collective]?.members, undefined, transformMembers); return useMemo( () => ({ diff --git a/packages/react-hooks/src/useOwnEraRewards.ts b/packages/react-hooks/src/useOwnEraRewards.ts index 3775948cb9..d53a06d0bb 100644 --- a/packages/react-hooks/src/useOwnEraRewards.ts +++ b/packages/react-hooks/src/useOwnEraRewards.ts @@ -92,7 +92,7 @@ export default function useOwnEraRewards (maxEras?: number, ownValidators?: Stak const { api } = useApi(); const mountedRef = useIsMountedRef(); const stashIds = useOwnStashIds(); - const allEras = useCall(api.derive.staking?.erasHistoric, []); + const allEras = useCall(api.derive.staking?.erasHistoric); const [{ filteredEras, validatorEras }, setFiltered] = useState({ filteredEras: [], validatorEras: [] }); const [state, setState] = useState({ isLoadingRewards: true, rewardCount: 0 }); const stakerRewards = useCall<[[string[]], DeriveStakerReward[][]]>(!ownValidators?.length && !!filteredEras.length && stashIds && api.derive.staking?.stakerRewardsMultiEras, [stashIds, filteredEras], { withParams: true }); diff --git a/packages/react-hooks/src/useRegistrars.ts b/packages/react-hooks/src/useRegistrars.ts index 0734de0e61..9277813d72 100644 --- a/packages/react-hooks/src/useRegistrars.ts +++ b/packages/react-hooks/src/useRegistrars.ts @@ -30,7 +30,7 @@ interface State { export default function useRegistrars (skipQuery?: boolean): State { const { api } = useApi(); const { allAccounts, hasAccounts } = useAccounts(); - const query = useCall[]>(!skipQuery && hasAccounts && api.query.identity?.registrars, []); + const query = useCall[]>(!skipQuery && hasAccounts && api.query.identity?.registrars); const [state, setState] = useState({ isRegistrar: false, registrars: [] }); // determine if we have a registrar or not - registrars are allowed to approve diff --git a/packages/react-hooks/src/useStashIds.ts b/packages/react-hooks/src/useStashIds.ts index 9d890fc83c..1934793972 100644 --- a/packages/react-hooks/src/useStashIds.ts +++ b/packages/react-hooks/src/useStashIds.ts @@ -7,11 +7,13 @@ import { AccountId } from '@polkadot/types/interfaces'; import useApi from './useApi'; import useCall from './useCall'; +const transformStashes = { + transform: (stashes: AccountId[]) => stashes.map((accountId) => accountId.toString()) +}; + export default function useStashIds (): string[] | undefined { const { api } = useApi(); - const allStashes = useCall(api.derive.staking.stashes, [], { - transform: (stashes: AccountId[]) => stashes.map((accountId) => accountId.toString()) - }); + const allStashes = useCall(api.derive.staking.stashes, undefined, transformStashes); return allStashes; } diff --git a/packages/react-hooks/src/useSudo.ts b/packages/react-hooks/src/useSudo.ts index fd163dfaa0..ba4f2f1853 100644 --- a/packages/react-hooks/src/useSudo.ts +++ b/packages/react-hooks/src/useSudo.ts @@ -2,7 +2,7 @@ // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. -import { Codec } from '@polkadot/types/types'; +import { AccountId } from '@polkadot/types/interfaces'; import { UseSudo } from './types'; import { useEffect, useState } from 'react'; @@ -11,12 +11,14 @@ import useAccounts from './useAccounts'; import useApi from './useApi'; import useCall from './useCall'; +const transformSudo = { + transform: (key: AccountId) => key.toString() +}; + export default function useSudo (): UseSudo { const { api } = useApi(); const { allAccounts, hasAccounts } = useAccounts(); - const sudoKey = useCall(hasAccounts && api.query.sudo?.key, [], { - transform: (k: Codec) => k.toString() - }); + const sudoKey = useCall(hasAccounts && api.query.sudo?.key, undefined, transformSudo); const [isMine, setIsMine] = useState(false); useEffect((): void => { diff --git a/packages/react-hooks/src/useVotingStatus.ts b/packages/react-hooks/src/useVotingStatus.ts index 262d075493..4b497d2ea0 100644 --- a/packages/react-hooks/src/useVotingStatus.ts +++ b/packages/react-hooks/src/useVotingStatus.ts @@ -49,7 +49,7 @@ function getStatus (api: ApiPromise, bestNumber: BlockNumber, votes: Votes, numM export default function useVotingStatus (votes: Votes | null | undefined, numMembers: number, section: 'council' | 'technicalCommittee'): State { const { api } = useApi(); - const bestNumber = useCall(api.derive.chain.bestNumber, []); + const bestNumber = useCall(api.derive.chain.bestNumber); const [state, setState] = useState({ hasFailed: false, hasPassed: false, isCloseable: false, isVoteable: false, remainingBlocks: null }); useEffect((): void => { diff --git a/packages/react-query/src/BestFinalized.tsx b/packages/react-query/src/BestFinalized.tsx index b6c1cdfb4b..5bce4edb6f 100644 --- a/packages/react-query/src/BestFinalized.tsx +++ b/packages/react-query/src/BestFinalized.tsx @@ -16,7 +16,7 @@ interface Props { function BestFinalized ({ children, className = '', label }: Props): React.ReactElement { const { api } = useApi(); - const bestNumberFinalized = useCall(api.derive.chain.bestNumberFinalized, []); + const bestNumberFinalized = useCall(api.derive.chain.bestNumberFinalized); return (
diff --git a/packages/react-query/src/BestNumber.tsx b/packages/react-query/src/BestNumber.tsx index d4b0514d67..18a07b490b 100644 --- a/packages/react-query/src/BestNumber.tsx +++ b/packages/react-query/src/BestNumber.tsx @@ -17,7 +17,7 @@ interface Props { function BestNumber ({ children, className = '', label, withPound }: Props): React.ReactElement { const { api, isApiReady } = useApi(); - const bestNumber = useCall(isApiReady && api.derive.chain.bestNumber, []); + const bestNumber = useCall(isApiReady && api.derive.chain.bestNumber); return (
diff --git a/packages/react-query/src/BlockAuthors.tsx b/packages/react-query/src/BlockAuthors.tsx index 579591ca21..3ccd32e484 100644 --- a/packages/react-query/src/BlockAuthors.tsx +++ b/packages/react-query/src/BlockAuthors.tsx @@ -31,7 +31,7 @@ const ValidatorsContext: React.Context = React.createContext function BlockAuthorsBase ({ children }: Props): React.ReactElement { const { api, isApiReady } = useApi(); - const queryPoints = useCall(isApiReady && api.derive.staking?.currentPoints, []); + const queryPoints = useCall(isApiReady && api.derive.staking?.currentPoints); const [state, setState] = useState({ byAuthor, eraPoints, lastBlockAuthors: [], lastHeaders: [] }); const [validators, setValidators] = useState([]); diff --git a/packages/react-query/src/Bonded.tsx b/packages/react-query/src/Bonded.tsx index e6a8853797..c5dcb474fb 100644 --- a/packages/react-query/src/Bonded.tsx +++ b/packages/react-query/src/Bonded.tsx @@ -17,14 +17,18 @@ interface Props { label?: React.ReactNode; } +const transformController = { + transform: (value: Option) => value.unwrapOr(null) +}; + +const transformLedger = { + transform: (value: Option) => value.unwrapOr(null) +}; + function BondedDisplay ({ children, className = '', label, params }: Props): React.ReactElement { const { api } = useApi(); - const controllerId = useCall(api.query.staking?.bonded, [params], { - transform: (value: Option) => value.unwrapOr(null) - }); - const stakingLedger = useCall(controllerId && api.query.staking?.ledger, [controllerId], { - transform: (value: Option) => value.unwrapOr(null) - }); + const controllerId = useCall(api.query.staking?.bonded, [params], transformController); + const stakingLedger = useCall(controllerId && api.query.staking?.ledger, [controllerId], transformLedger); return ( { const { api, isSubstrateV2 } = useApi(); - const timestamp = useCall(api.query.timestamp.now, []); + const timestamp = useCall(api.query.timestamp.now); const [now, setNow] = useState(); useEffect((): void => { diff --git a/packages/react-query/src/TotalIssuance.tsx b/packages/react-query/src/TotalIssuance.tsx index 3db26a4c99..94c898f032 100644 --- a/packages/react-query/src/TotalIssuance.tsx +++ b/packages/react-query/src/TotalIssuance.tsx @@ -14,7 +14,7 @@ interface Props { function TotalIssuance ({ children, className = '', label }: Props): React.ReactElement { const { api } = useApi(); - const totalIssuance = useCall(api.query.balances?.totalIssuance, []); + const totalIssuance = useCall(api.query.balances?.totalIssuance); return (