diff --git a/packages/page-accounts/src/Accounts/useKnownAddresses.ts b/packages/page-accounts/src/Accounts/useKnownAddresses.ts index 450304356c..bd007020e2 100644 --- a/packages/page-accounts/src/Accounts/useKnownAddresses.ts +++ b/packages/page-accounts/src/Accounts/useKnownAddresses.ts @@ -3,9 +3,9 @@ import { useMemo } from 'react'; -import { useAccounts, useAddresses } from '@polkadot/react-hooks'; +import { createNamedHook, useAccounts, useAddresses } from '@polkadot/react-hooks'; -export default function useKnownAddresses (exclude?: string): string[] { +function useKnownAddressesImpl (exclude?: string): string[] { const { allAccounts } = useAccounts(); const { allAddresses } = useAddresses(); @@ -14,3 +14,5 @@ export default function useKnownAddresses (exclude?: string): string[] { [allAccounts, allAddresses, exclude] ); } + +export default createNamedHook('useKnownAddresses', useKnownAddressesImpl); diff --git a/packages/page-accounts/src/Accounts/useMultisigApprovals.ts b/packages/page-accounts/src/Accounts/useMultisigApprovals.ts index 50e1e80ceb..f82065868b 100644 --- a/packages/page-accounts/src/Accounts/useMultisigApprovals.ts +++ b/packages/page-accounts/src/Accounts/useMultisigApprovals.ts @@ -6,10 +6,10 @@ import type { H256, Multisig } from '@polkadot/types/interfaces'; import { useContext, useEffect, useState } from 'react'; -import { useApi, useIncrement, useIsMountedRef } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useIncrement, useIsMountedRef } from '@polkadot/react-hooks'; import { EventsContext } from '@polkadot/react-query'; -export default function useMultisigApprovals (address: string): [H256, Multisig][] { +function useMultisigApprovalsImpl (address: string): [H256, Multisig][] { const { events } = useContext(EventsContext); const { api } = useApi(); const [multiInfos, setMultiInfos] = useState<[H256, Multisig][]>([]); @@ -49,3 +49,5 @@ export default function useMultisigApprovals (address: string): [H256, Multisig] return multiInfos; } + +export default createNamedHook('useMultisigApprovals', useMultisigApprovalsImpl); diff --git a/packages/page-accounts/src/Accounts/useProxies.ts b/packages/page-accounts/src/Accounts/useProxies.ts index cce6670237..0aed5ea7e8 100644 --- a/packages/page-accounts/src/Accounts/useProxies.ts +++ b/packages/page-accounts/src/Accounts/useProxies.ts @@ -3,19 +3,20 @@ import type BN from 'bn.js'; import type { Vec } from '@polkadot/types'; -import type { AccountId, BalanceOf, ProxyDefinition, ProxyType } from '@polkadot/types/interfaces'; +import type { AccountId, BalanceOf } from '@polkadot/types/interfaces'; +import type { NodeRuntimeProxyType, PalletProxyProxyDefinition } from '@polkadot/types/lookup'; import type { ITuple } from '@polkadot/types/types'; import { useEffect, useState } from 'react'; -import { useAccounts, useApi, useIsMountedRef } from '@polkadot/react-hooks'; +import { createNamedHook, useAccounts, useApi, useIsMountedRef } from '@polkadot/react-hooks'; import { BN_ZERO } from '@polkadot/util'; interface Proxy { address: string; delay: BN; isOwned: boolean; - type: ProxyType; + type: NodeRuntimeProxyType; } interface State { @@ -30,7 +31,7 @@ const EMPTY_STATE: State = { proxies: [] }; -function createProxy (allAccounts: string[], delegate: AccountId, type: ProxyType, delay = BN_ZERO): Proxy { +function createProxy (allAccounts: string[], delegate: AccountId, type: NodeRuntimeProxyType, delay = BN_ZERO): Proxy { const address = delegate.toString(); return { @@ -41,7 +42,7 @@ function createProxy (allAccounts: string[], delegate: AccountId, type: ProxyTyp }; } -export default function useProxies (address?: string | null): State { +function useProxiesImpl (address?: string | null): State { const { api } = useApi(); const { allAccounts } = useAccounts(); const mountedRef = useIsMountedRef(); @@ -52,13 +53,13 @@ export default function useProxies (address?: string | null): State { address && api.query.proxy && api.query.proxy - .proxies | ProxyDefinition>, BalanceOf]>>(address) + .proxies | PalletProxyProxyDefinition>, BalanceOf]>>(address) .then(([_proxies]): void => { const proxies = api.tx.proxy.addProxy.meta.args.length === 3 - ? (_proxies as ProxyDefinition[]).map(({ delay, delegate, proxyType }) => + ? (_proxies as PalletProxyProxyDefinition[]).map(({ delay, delegate, proxyType }) => createProxy(allAccounts, delegate, proxyType, delay) ) - : (_proxies as [AccountId, ProxyType][]).map(([delegate, proxyType]) => + : (_proxies as [AccountId, NodeRuntimeProxyType][]).map(([delegate, proxyType]) => createProxy(allAccounts, delegate, proxyType) ); const owned = proxies.filter(({ isOwned }) => isOwned); @@ -74,3 +75,5 @@ export default function useProxies (address?: string | null): State { return known; } + +export default createNamedHook('useProxies', useProxiesImpl); diff --git a/packages/page-accounts/src/useCounter.ts b/packages/page-accounts/src/useCounter.ts index 3cc08416b8..0e32aad16f 100644 --- a/packages/page-accounts/src/useCounter.ts +++ b/packages/page-accounts/src/useCounter.ts @@ -1,10 +1,12 @@ // Copyright 2017-2021 @polkadot/app-accounts authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { useAccounts } from '@polkadot/react-hooks'; +import { createNamedHook, useAccounts } from '@polkadot/react-hooks'; -export default function useCounter (): string | null { +function useCounterImpl (): string | null { const { hasAccounts } = useAccounts(); return hasAccounts ? null : '!'; } + +export default createNamedHook('useCounter', useCounterImpl); diff --git a/packages/page-assets/src/Balances/useBalances.ts b/packages/page-assets/src/Balances/useBalances.ts index 2511ac70f9..b571f800ec 100644 --- a/packages/page-assets/src/Balances/useBalances.ts +++ b/packages/page-assets/src/Balances/useBalances.ts @@ -4,7 +4,7 @@ import type BN from 'bn.js'; import type { PalletAssetsAssetBalance } from '@polkadot/types/lookup'; -import { useAccounts, useApi, useCall } from '@polkadot/react-hooks'; +import { createNamedHook, useAccounts, useApi, useCall } from '@polkadot/react-hooks'; interface BalanceResult { accountId: string; @@ -29,10 +29,12 @@ const queryOptions = { withParamsTransform: true }; -export default function useBalances (id?: BN | null): BalanceResult[] | null { +function useBalancesImpl (id?: BN | null): BalanceResult[] | null { const { api } = useApi(); const { allAccounts } = useAccounts(); const query = useCall(id && api.query.assets.account.multi, id && [allAccounts.map((a) => [id, a])], queryOptions); return (query && id && (query.assetId === id) && query.balances) || null; } + +export default createNamedHook('useBalances', useBalancesImpl); diff --git a/packages/page-assets/src/useAssetIds.ts b/packages/page-assets/src/useAssetIds.ts index 7202ca6f8e..13ff45620e 100644 --- a/packages/page-assets/src/useAssetIds.ts +++ b/packages/page-assets/src/useAssetIds.ts @@ -4,7 +4,7 @@ import type { StorageKey } from '@polkadot/types'; import type { AssetId } from '@polkadot/types/interfaces'; -import { useApi, useEventTrigger, useMapKeys } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useEventTrigger, useMapKeys } from '@polkadot/react-hooks'; function extractAssetIds (keys: StorageKey<[AssetId]>[]): AssetId[] { return keys @@ -12,9 +12,11 @@ function extractAssetIds (keys: StorageKey<[AssetId]>[]): AssetId[] { .sort((a, b) => a.cmp(b)); } -export default function useAssetIds (): AssetId[] | undefined { +function useAssetIdsImpl (): AssetId[] | undefined { const { api } = useApi(); const trigger = useEventTrigger([api.events.assets.Created, api.events.assets.Destroyed]); return useMapKeys(api.query.assets.asset, { at: trigger.blockHash, transform: extractAssetIds }); } + +export default createNamedHook('useAssetIds', useAssetIdsImpl); diff --git a/packages/page-assets/src/useAssetInfos.ts b/packages/page-assets/src/useAssetInfos.ts index bc7577c7a5..6fb83fe726 100644 --- a/packages/page-assets/src/useAssetInfos.ts +++ b/packages/page-assets/src/useAssetInfos.ts @@ -9,7 +9,7 @@ import type { AssetInfo } from './types'; import { useEffect, useState } from 'react'; -import { useAccounts, useApi, useCall } from '@polkadot/react-hooks'; +import { createNamedHook, useAccounts, useApi, useCall } from '@polkadot/react-hooks'; const EMPTY_FLAGS = { isAdminMe: false, @@ -48,7 +48,7 @@ function extractInfo (allAccounts: string[], id: BN, optDetails: Option(api.query.assets.metadata.multi, [ids], QUERY_OPTS); @@ -66,3 +66,5 @@ export default function useAssetInfos (ids?: BN[]): AssetInfo[] | undefined { return state; } + +export default createNamedHook('useAssetInfos', useAssetInfosImpl); diff --git a/packages/page-bounties/src/hooks/useBalance.ts b/packages/page-bounties/src/hooks/useBalance.ts index b459bd61bc..8849266625 100644 --- a/packages/page-bounties/src/hooks/useBalance.ts +++ b/packages/page-bounties/src/hooks/useBalance.ts @@ -4,10 +4,12 @@ import type { Balance } from '@polkadot/types/interfaces'; import { DeriveBalancesAll } from '@polkadot/api-derive/types'; -import { useApi, useCall } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useCall } from '@polkadot/react-hooks'; -export function useBalance (accountId: string | null): Balance | undefined { +function useBalanceImpl (accountId: string | null): Balance | undefined { const { api } = useApi(); return useCall(api.derive.balances?.all, [accountId])?.availableBalance; } + +export const useBalance = createNamedHook('useBalance', useBalanceImpl); diff --git a/packages/page-bounties/src/hooks/useBounties.tsx b/packages/page-bounties/src/hooks/useBounties.tsx index 5e49cfdcdc..22430f88ad 100644 --- a/packages/page-bounties/src/hooks/useBounties.tsx +++ b/packages/page-bounties/src/hooks/useBounties.tsx @@ -5,7 +5,7 @@ import type BN from 'bn.js'; import type { SubmittableExtrinsicFunction } from '@polkadot/api/types'; import { DeriveBounties } from '@polkadot/api-derive/types'; -import { useApi, useBestNumber, useCall } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useBestNumber, useCall } from '@polkadot/react-hooks'; import { BalanceOf, BlockNumber, BountyIndex } from '@polkadot/types/interfaces'; export type BountyApi = { @@ -29,7 +29,7 @@ export type BountyApi = { unassignCurator: SubmittableExtrinsicFunction<'promise'>; }; -export function useBounties (): BountyApi { +function useBountiesImpl (): BountyApi { const { api } = useApi(); const bounties = useCall(api.derive.bounties.bounties); const bountyIndex = useCall((api.query.bounties || api.query.treasury).bountyCount); @@ -72,3 +72,5 @@ export function useBounties (): BountyApi { unassignCurator }; } + +export const useBounties = createNamedHook('useBounties', useBountiesImpl); diff --git a/packages/page-bounties/src/hooks/useBountyStatus.ts b/packages/page-bounties/src/hooks/useBountyStatus.ts index 71bf0c92af..1c511e4ed6 100644 --- a/packages/page-bounties/src/hooks/useBountyStatus.ts +++ b/packages/page-bounties/src/hooks/useBountyStatus.ts @@ -1,14 +1,18 @@ // Copyright 2017-2021 @polkadot/app-bounties authors & contributors // SPDX-License-Identifier: Apache-2.0 +import type { BountyStatusType } from '@polkadot/app-bounties/types'; + import { useCallback } from 'react'; import { getBountyStatus } from '@polkadot/app-bounties/helpers'; -import { BountyStatusType } from '@polkadot/app-bounties/types'; +import { createNamedHook } from '@polkadot/react-hooks'; import { BountyStatus } from '@polkadot/types/interfaces'; -export function useBountyStatus (status: BountyStatus): BountyStatusType { +function useBountyStatusImpl (status: BountyStatus): BountyStatusType { const updateStatus = useCallback(() => getBountyStatus(status), [status]); return updateStatus(); } + +export const useBountyStatus = createNamedHook('useBountyStatus', useBountyStatusImpl); diff --git a/packages/page-bounties/src/hooks/useUserRole.ts b/packages/page-bounties/src/hooks/useUserRole.ts index cbfeb9d4d7..51f5d6527b 100644 --- a/packages/page-bounties/src/hooks/useUserRole.ts +++ b/packages/page-bounties/src/hooks/useUserRole.ts @@ -5,32 +5,34 @@ import type { AccountId } from '@polkadot/types/interfaces'; import { useMemo } from 'react'; -import { useAccounts, useCollectiveMembers } from '@polkadot/react-hooks'; +import { createNamedHook, useAccounts, useCollectiveMembers } from '@polkadot/react-hooks'; import { UserRole } from '../types'; export type UserRolesInfo = { roles: UserRole[], isCurator: boolean }; -export function useUserRole (curatorId?: AccountId): UserRolesInfo { +function useUserRoleImpl (curatorId?: AccountId): UserRolesInfo { const { allAccounts, hasAccounts } = useAccounts(); - const { isMember } = useCollectiveMembers('council'); - const isCurator = useMemo(() => curatorId && allAccounts.includes(curatorId.toString()), [allAccounts, curatorId]); + return useMemo((): UserRolesInfo => { + const isCurator = !!curatorId && allAccounts.includes(curatorId.toString()); + const roles: UserRole[] = []; - const roles: UserRole[] = []; + if (isCurator) { + roles.push('Curator'); + } - if (isCurator) { - roles.push('Curator'); - } + if (isMember) { + roles.push('Member'); + } - if (isMember) { - roles.push('Member'); - } + if (hasAccounts) { + roles.push('User'); + } - if (hasAccounts) { - roles.push('User'); - } - - return { isCurator: !!isCurator, roles }; + return { isCurator, roles }; + }, [allAccounts, curatorId, hasAccounts, isMember]); } + +export const useUserRole = createNamedHook('useUserRole', useUserRoleImpl); diff --git a/packages/page-bounties/src/useCounter.ts b/packages/page-bounties/src/useCounter.ts index dff2fac2f1..97431754c8 100644 --- a/packages/page-bounties/src/useCounter.ts +++ b/packages/page-bounties/src/useCounter.ts @@ -4,9 +4,9 @@ import { useMemo } from 'react'; import { DeriveBounties } from '@polkadot/api-derive/types'; -import { useApi, useCall } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useCall } from '@polkadot/react-hooks'; -export default function useCounter (): number { +function useCounterImpl (): number { const { api, isApiReady } = useApi(); const bounties = useCall(isApiReady && api.derive.bounties?.bounties); @@ -15,3 +15,5 @@ export default function useCounter (): number { [bounties] ); } + +export default createNamedHook('useCounter', useCounterImpl); diff --git a/packages/page-calendar/src/useScheduled.ts b/packages/page-calendar/src/useScheduled.ts index 215305ae09..35eb57c7f7 100644 --- a/packages/page-calendar/src/useScheduled.ts +++ b/packages/page-calendar/src/useScheduled.ts @@ -11,7 +11,7 @@ import type { EntryInfo, EntryInfoTyped, EntryType } from './types'; import { useEffect, useState } from 'react'; import { useLeaseRangeMax } from '@polkadot/app-parachains/useLeaseRanges'; -import { useApi, useBestNumber, useBlockTime, useCall } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useBestNumber, useBlockTime, useCall } from '@polkadot/react-hooks'; import { BN_ONE, BN_ZERO } from '@polkadot/util'; interface DateExt { @@ -196,7 +196,7 @@ function addFiltered (state: EntryInfoTyped[], types: [EntryType, EntryInfo[]][] } // TODO council votes, tips closing -export default function useScheduled (): EntryInfo[] { +function useScheduledImpl (): EntryInfo[] { const { api } = useApi(); const [blockTime] = useBlockTime(); const bestNumber = useBestNumber(); @@ -261,3 +261,5 @@ export default function useScheduled (): EntryInfo[] { return state; } + +export default createNamedHook('useScheduled', useScheduledImpl); diff --git a/packages/page-claims/src/useCounter.ts b/packages/page-claims/src/useCounter.ts index 2a5288d567..c39530a5f9 100644 --- a/packages/page-claims/src/useCounter.ts +++ b/packages/page-claims/src/useCounter.ts @@ -1,10 +1,14 @@ // Copyright 2017-2021 @polkadot/app-settings authors & contributors // SPDX-License-Identifier: Apache-2.0 +import { createNamedHook } from '@polkadot/react-hooks'; + import usePolkadotPreclaims from './usePolkadotPreclaims'; -export default function useCounter (): number { +function useCounterImpl (): number { const needAttest = usePolkadotPreclaims(); return needAttest.length; } + +export default createNamedHook('useCounter', useCounterImpl); diff --git a/packages/page-claims/src/usePolkadotPreclaims.ts b/packages/page-claims/src/usePolkadotPreclaims.ts index 510359ce35..d013f823a0 100644 --- a/packages/page-claims/src/usePolkadotPreclaims.ts +++ b/packages/page-claims/src/usePolkadotPreclaims.ts @@ -8,9 +8,9 @@ import type { Codec } from '@polkadot/types/types'; import { useEffect, useState } from 'react'; -import { useAccounts, useApi, useCall, useIsMountedRef } from '@polkadot/react-hooks'; +import { createNamedHook, useAccounts, useApi, useCall, useIsMountedRef } from '@polkadot/react-hooks'; -export default function usePolkadotPreclaims (): string[] { +function usePolkadotPreclaimsImpl (): string[] { const { allAccounts } = useAccounts(); const { api } = useApi(); const mountedRef = useIsMountedRef(); @@ -48,3 +48,5 @@ export default function usePolkadotPreclaims (): string[] { return needsAttest; } + +export default createNamedHook('usePolkadotPreclaims', usePolkadotPreclaimsImpl); diff --git a/packages/page-contracts/src/useAbi.ts b/packages/page-contracts/src/useAbi.ts index 4bf49bdd85..57b62f7660 100644 --- a/packages/page-contracts/src/useAbi.ts +++ b/packages/page-contracts/src/useAbi.ts @@ -5,6 +5,7 @@ import { useCallback, useEffect, useState } from 'react'; import { Abi } from '@polkadot/api-contract'; import { api } from '@polkadot/react-api'; +import { createNamedHook } from '@polkadot/react-hooks'; import { u8aToString } from '@polkadot/util'; import store from './store'; @@ -46,7 +47,7 @@ const EMPTY: AbiState = { isAbiValid: false }; -export default function useAbi (initialValue: [string | null | undefined, Abi | null | undefined] = [null, null], codeHash: string | null = null, isRequired = false): UseAbi { +function useAbiImpl (initialValue: [string | null | undefined, Abi | null | undefined] = [null, null], codeHash: string | null = null, isRequired = false): UseAbi { const [state, setAbi] = useState(() => fromInitial(initialValue, isRequired)); useEffect( @@ -98,3 +99,5 @@ export default function useAbi (initialValue: [string | null | undefined, Abi | onRemoveAbi }; } + +export default createNamedHook('useAbi', useAbiImpl); diff --git a/packages/page-contracts/src/useCodes.ts b/packages/page-contracts/src/useCodes.ts index 1f12031272..de796e2654 100644 --- a/packages/page-contracts/src/useCodes.ts +++ b/packages/page-contracts/src/useCodes.ts @@ -5,7 +5,7 @@ import type { CodeStored } from './types'; import { useEffect, useState } from 'react'; -import { useIsMountedRef } from '@polkadot/react-hooks'; +import { createNamedHook, useIsMountedRef } from '@polkadot/react-hooks'; import store from './store'; @@ -16,15 +16,17 @@ interface UseCodes { const DEFAULT_STATE: UseCodes = { allCodes: [], codeTrigger: Date.now() }; -export function useCodes (): UseCodes { +function useCodesImpl (): UseCodes { const mountedRef = useIsMountedRef(); const [state, setState] = useState(DEFAULT_STATE); useEffect( (): void => { const triggerUpdate = (): void => { - mountedRef.current && - setState({ allCodes: store.getAllCode(), codeTrigger: Date.now() }); + mountedRef.current && setState({ + allCodes: store.getAllCode(), + codeTrigger: Date.now() + }); }; store.on('new-code', triggerUpdate); @@ -37,3 +39,5 @@ export function useCodes (): UseCodes { return state; } + +export const useCodes = createNamedHook('useCodes', useCodesImpl); diff --git a/packages/page-contracts/src/useContracts.ts b/packages/page-contracts/src/useContracts.ts index e362ca3acf..41b3d92f24 100644 --- a/packages/page-contracts/src/useContracts.ts +++ b/packages/page-contracts/src/useContracts.ts @@ -3,7 +3,7 @@ import { useEffect, useState } from 'react'; -import { useIsMountedRef } from '@polkadot/react-hooks'; +import { createNamedHook, useIsMountedRef } from '@polkadot/react-hooks'; import { keyring } from '@polkadot/ui-keyring'; interface UseContracts { @@ -12,9 +12,13 @@ interface UseContracts { isContract: (address: string) => boolean; } -const DEFAULT_STATE: UseContracts = { allContracts: [], hasContracts: false, isContract: () => false }; +const DEFAULT_STATE: UseContracts = { + allContracts: [], + hasContracts: false, + isContract: () => false +}; -export function useContracts (): UseContracts { +function useContractsImpl (): UseContracts { const mountedRef = useIsMountedRef(); const [state, setState] = useState(DEFAULT_STATE); @@ -37,3 +41,5 @@ export function useContracts (): UseContracts { return state; } + +export const useContracts = createNamedHook('useContracts', useContractsImpl); diff --git a/packages/page-contracts/src/useWeight.ts b/packages/page-contracts/src/useWeight.ts index a4823fa380..5659b9398d 100644 --- a/packages/page-contracts/src/useWeight.ts +++ b/packages/page-contracts/src/useWeight.ts @@ -7,10 +7,10 @@ import type { UseWeight } from './types'; import { useCallback, useMemo, useState } from 'react'; -import { useApi, useBlockTime } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useBlockTime } from '@polkadot/react-hooks'; import { BN_MILLION, BN_TEN, BN_ZERO } from '@polkadot/util'; -export default function useWeight (): UseWeight { +function useWeightImpl (): UseWeight { const { api } = useApi(); const [blockTime] = useBlockTime(); const [megaGas, _setMegaGas] = useState( @@ -63,3 +63,5 @@ export default function useWeight (): UseWeight { }; }, [api, blockTime, isEmpty, megaGas, setIsEmpty, setMegaGas]); } + +export default createNamedHook('useWeight', useWeightImpl); diff --git a/packages/page-council/src/useCounter.ts b/packages/page-council/src/useCounter.ts index 4b0c54f01b..4923015e24 100644 --- a/packages/page-council/src/useCounter.ts +++ b/packages/page-council/src/useCounter.ts @@ -3,16 +3,18 @@ import type { DeriveCollectiveProposal } from '@polkadot/api-derive/types'; -import { useAccounts, useApi, useCall } from '@polkadot/react-hooks'; +import { createNamedHook, useAccounts, useApi, useCall } from '@polkadot/react-hooks'; const transformCounter = { transform: (motions: DeriveCollectiveProposal[]) => motions.filter(({ votes }): boolean => !!votes).length }; -export default function useCounter (): number { +function useCounterImpl (): number { const { hasAccounts } = useAccounts(); const { api, isApiReady } = useApi(); const counter = useCall(isApiReady && hasAccounts && api.derive.council?.proposals, undefined, transformCounter) || 0; return counter; } + +export default createNamedHook('useCounter', useCounterImpl); diff --git a/packages/page-council/src/useModuleElections.ts b/packages/page-council/src/useModuleElections.ts index 7315551133..f268eda17d 100644 --- a/packages/page-council/src/useModuleElections.ts +++ b/packages/page-council/src/useModuleElections.ts @@ -3,20 +3,21 @@ import { useMemo } from 'react'; -import { useApi } from '@polkadot/react-hooks'; +import { createNamedHook, useApi } from '@polkadot/react-hooks'; -export function useModuleElections (): string | null { +function useModuleElectionsImpl (): string | null { const { api } = useApi(); return useMemo( - (): string | null => - api.tx.phragmenElection - ? 'phragmenElection' - : api.tx.electionsPhragmen - ? 'electionsPhragmen' - : api.tx.elections - ? 'elections' - : null, + () => api.tx.phragmenElection + ? 'phragmenElection' + : api.tx.electionsPhragmen + ? 'electionsPhragmen' + : api.tx.elections + ? 'elections' + : null, [api] ); } + +export const useModuleElections = createNamedHook('useModuleElections', useModuleElectionsImpl); diff --git a/packages/page-democracy/src/Execute/useCounter.ts b/packages/page-democracy/src/Execute/useCounter.ts index 59c5ec002c..42f74599dd 100644 --- a/packages/page-democracy/src/Execute/useCounter.ts +++ b/packages/page-democracy/src/Execute/useCounter.ts @@ -1,11 +1,13 @@ // Copyright 2017-2021 @polkadot/app-democracy authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { useApi, useCall } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useCall } from '@polkadot/react-hooks'; -export default function useCounter (): number { +function useCounterImpl (): number { const { api } = useApi(); const queued = useCall(api.derive.democracy.dispatchQueue); return queued?.length || 0; } + +export default createNamedHook('useCounter', useCounterImpl); diff --git a/packages/page-democracy/src/useChangeCalc.ts b/packages/page-democracy/src/useChangeCalc.ts index df7830c9e9..1d14ab202f 100644 --- a/packages/page-democracy/src/useChangeCalc.ts +++ b/packages/page-democracy/src/useChangeCalc.ts @@ -6,7 +6,7 @@ import type { VoteThreshold } from '@polkadot/types/interfaces'; import { useEffect, useState } from 'react'; -import { useApi, useCall } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useCall } from '@polkadot/react-hooks'; import { BN_ZERO } from '@polkadot/util'; import { approxChanges } from './util'; @@ -16,7 +16,7 @@ interface Result { changeNay: BN; } -export default function useChangeCalc (threshold: VoteThreshold, votedAye: BN, votedNay: BN, votedTotal: BN): Result { +function useChangeCalcImpl (threshold: VoteThreshold, votedAye: BN, votedNay: BN, votedTotal: BN): Result { const { api } = useApi(); const sqrtElectorate = useCall(api.derive.democracy.sqrtElectorate); const [result, setResult] = useState({ changeAye: BN_ZERO, changeNay: BN_ZERO }); @@ -29,3 +29,5 @@ export default function useChangeCalc (threshold: VoteThreshold, votedAye: BN, v return result; } + +export default createNamedHook('useChangeCalc', useChangeCalcImpl); diff --git a/packages/page-democracy/src/useCounter.ts b/packages/page-democracy/src/useCounter.ts index 119e1025f8..52fb99a6af 100644 --- a/packages/page-democracy/src/useCounter.ts +++ b/packages/page-democracy/src/useCounter.ts @@ -3,9 +3,9 @@ import { useEffect, useState } from 'react'; -import { useAccounts, useApi, useCall, useIsMountedRef } from '@polkadot/react-hooks'; +import { createNamedHook, useAccounts, useApi, useCall, useIsMountedRef } from '@polkadot/react-hooks'; -export default function useCounter (): number { +function useCounterImpl (): number { const { hasAccounts } = useAccounts(); const { api, isApiReady } = useApi(); const mountedRef = useIsMountedRef(); @@ -22,3 +22,5 @@ export default function useCounter (): number { return counter; } + +export default createNamedHook('useCounter', useCounterImpl); diff --git a/packages/page-gilt/src/Overview/useInfo.ts b/packages/page-gilt/src/Overview/useInfo.ts index 86fa83fa38..a1add4e127 100644 --- a/packages/page-gilt/src/Overview/useInfo.ts +++ b/packages/page-gilt/src/Overview/useInfo.ts @@ -7,7 +7,7 @@ import type { GiltInfo, QueueTotal } from './types'; import { useMemo } from 'react'; -import { useApi, useCallMulti } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useCallMulti } from '@polkadot/react-hooks'; import { BN_ONE } from '@polkadot/util'; interface State { @@ -27,7 +27,7 @@ const optGiltInfo = { }) }; -export default function useInfo (): State { +function useInfoImpl (): State { const { api } = useApi(); const info = useCallMulti([ api.query.gilt.activeTotal, @@ -47,3 +47,5 @@ export default function useInfo (): State { [info] ); } + +export default createNamedHook('useInfo', useInfoImpl); diff --git a/packages/page-gilt/src/useProxies.ts b/packages/page-gilt/src/useProxies.ts index 9d30fd153e..d8c672877e 100644 --- a/packages/page-gilt/src/useProxies.ts +++ b/packages/page-gilt/src/useProxies.ts @@ -7,11 +7,11 @@ import type { ITuple } from '@polkadot/types/types'; import { useEffect, useState } from 'react'; -import { useAccounts, useApi, useIsMountedRef } from '@polkadot/react-hooks'; +import { createNamedHook, useAccounts, useApi, useIsMountedRef } from '@polkadot/react-hooks'; type ProxyResult = ITuple<[Vec, BalanceOf]>; -export function useProxies (): Record { +function useProxiesImpl (): Record { const { api } = useApi(); const { allAccounts } = useAccounts(); const mountedRef = useIsMountedRef(); @@ -38,3 +38,5 @@ export function useProxies (): Record { return state; } + +export const useProxies = createNamedHook('useProxies', useProxiesImpl); diff --git a/packages/page-membership/src/useCounter.ts b/packages/page-membership/src/useCounter.ts index dfc9c167ad..d0e3fd279b 100644 --- a/packages/page-membership/src/useCounter.ts +++ b/packages/page-membership/src/useCounter.ts @@ -3,15 +3,17 @@ import type { Hash } from '@polkadot/types/interfaces'; -import { useApi, useCall } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useCall } from '@polkadot/react-hooks'; const transformCounter = { transform: (proposals: Hash[]) => proposals.length }; -export default function useCounter (): number { +function useCounterImpl (): number { const { api, isApiReady } = useApi(); const counter = useCall(isApiReady && api.query.membership?.proposals, undefined, transformCounter) || 0; return counter; } + +export default createNamedHook('useCounter', useCounterImpl); diff --git a/packages/page-settings/src/useChainInfo.ts b/packages/page-settings/src/useChainInfo.ts index 7c88c35b0e..b63888a312 100644 --- a/packages/page-settings/src/useChainInfo.ts +++ b/packages/page-settings/src/useChainInfo.ts @@ -7,12 +7,12 @@ import { useMemo } from 'react'; import { getSystemColor, getSystemIcon } from '@polkadot/apps-config'; import { DEFAULT_DECIMALS, DEFAULT_SS58 } from '@polkadot/react-api'; -import { useApi } from '@polkadot/react-hooks'; +import { createNamedHook, useApi } from '@polkadot/react-hooks'; import { getSpecTypes } from '@polkadot/types-known'; import { formatBalance, isNumber } from '@polkadot/util'; import { base64Encode } from '@polkadot/util-crypto'; -export default function useChainInfo (): ChainInfo | null { +function useChainInfoImpl (): ChainInfo | null { const { api, isApiReady, isEthereum, specName, systemChain, systemName } = useApi(); return useMemo( @@ -38,3 +38,5 @@ export default function useChainInfo (): ChainInfo | null { [api, isApiReady, specName, systemChain, systemName, isEthereum] ); } + +export default createNamedHook('useChainInfo', useChainInfoImpl); diff --git a/packages/page-settings/src/useCounter.ts b/packages/page-settings/src/useCounter.ts index 8e5d36fca6..7cba1e6dbe 100644 --- a/packages/page-settings/src/useCounter.ts +++ b/packages/page-settings/src/useCounter.ts @@ -1,10 +1,14 @@ // Copyright 2017-2021 @polkadot/app-settings authors & contributors // SPDX-License-Identifier: Apache-2.0 +import { createNamedHook } from '@polkadot/react-hooks'; + import useExtensions from './useExtensions'; -export default function useCounter (): number { +function useCounterImpl (): number { const { count } = useExtensions(); return count; } + +export default createNamedHook('useCounter', useCounterImpl); diff --git a/packages/page-settings/src/useExtensions.ts b/packages/page-settings/src/useExtensions.ts index 2dc8177f71..ea4a511dc5 100644 --- a/packages/page-settings/src/useExtensions.ts +++ b/packages/page-settings/src/useExtensions.ts @@ -7,7 +7,7 @@ import type { InjectedExtension, InjectedMetadataKnown, MetadataDef } from '@pol import { useEffect, useMemo, useState } from 'react'; import store from 'store'; -import { useApi } from '@polkadot/react-hooks'; +import { createNamedHook, useApi } from '@polkadot/react-hooks'; interface ExtensionKnown { extension: InjectedExtension; @@ -141,7 +141,7 @@ async function getKnown (api: ApiPromise, extensions: InjectedExtension[], _: nu const EMPTY_STATE = { count: 0, extensions: [] }; -export default function useExtensions (): Extensions { +function useExtensionsImpl (): Extensions { const { api, extensions, isApiReady, isDevelopment } = useApi(); const [all, setAll] = useState(); const [trigger, setTrigger] = useState(0); @@ -167,3 +167,5 @@ export default function useExtensions (): Extensions { [all, api, isApiReady, isDevelopment] ); } + +export default createNamedHook('useExtensions', useExtensionsImpl); diff --git a/packages/page-society/src/useCounter.ts b/packages/page-society/src/useCounter.ts index 1511185995..4ac9cc8a9d 100644 --- a/packages/page-society/src/useCounter.ts +++ b/packages/page-society/src/useCounter.ts @@ -3,11 +3,13 @@ import type { Bid } from '@polkadot/types/interfaces'; -import { useApi, useCall } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useCall } from '@polkadot/react-hooks'; -export default function useCounter (): number { +function useCounterImpl (): number { const { api } = useApi(); const bids = useCall(api.query.society?.candidates); return bids?.length || 0; } + +export default createNamedHook('useCounter', useCounterImpl); diff --git a/packages/page-society/src/useMembers.ts b/packages/page-society/src/useMembers.ts index 324e03d3e1..0852ae17c8 100644 --- a/packages/page-society/src/useMembers.ts +++ b/packages/page-society/src/useMembers.ts @@ -6,7 +6,7 @@ import type { OwnMembers } from './types'; import { useEffect, useState } from 'react'; -import { useAccounts, useApi, useCall } from '@polkadot/react-hooks'; +import { createNamedHook, useAccounts, useApi, useCall } from '@polkadot/react-hooks'; const EMPTY_MEMBERS: OwnMembers = { allMembers: [], isMember: false, ownMembers: [] }; @@ -19,7 +19,7 @@ function transform (allAccounts: string[], members: DeriveSocietyMember[]): OwnM return { allMembers, isMember: ownMembers.length !== 0, ownMembers }; } -export default function useMembers (): OwnMembers { +function useMembersImpl (): OwnMembers { const { api } = useApi(); const { allAccounts } = useAccounts(); const [state, setState] = useState(EMPTY_MEMBERS); @@ -33,3 +33,5 @@ export default function useMembers (): OwnMembers { return state; } + +export default createNamedHook('useMembers', useMembersImpl); diff --git a/packages/page-society/src/useVoters.ts b/packages/page-society/src/useVoters.ts index 89afda977e..1b542fc42a 100644 --- a/packages/page-society/src/useVoters.ts +++ b/packages/page-society/src/useVoters.ts @@ -7,7 +7,7 @@ import type { Voters } from './types'; import { useEffect, useState } from 'react'; -import { useApi, useCall, useEventTrigger } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useCall, useEventTrigger } from '@polkadot/react-hooks'; const EMPTY_VOTERS: Voters = {}; @@ -39,7 +39,7 @@ async function getVoters (api: ApiPromise, candidates: DeriveSocietyCandidate[]) return { candidates, skeptics, voters }; } -export default function useVoters (): Voters { +function useVotersImpl (): Voters { const { api } = useApi(); const voteTrigger = useEventTrigger([api.events.society.Vote]); const candidates = useCall(api.derive.society.candidates); @@ -52,3 +52,5 @@ export default function useVoters (): Voters { return state; } + +export default createNamedHook('useVoters', useVotersImpl); diff --git a/packages/page-staking/src/Actions/useInactives.ts b/packages/page-staking/src/Actions/useInactives.ts index c5bb7f7491..49e1d5907c 100644 --- a/packages/page-staking/src/Actions/useInactives.ts +++ b/packages/page-staking/src/Actions/useInactives.ts @@ -9,7 +9,7 @@ import type { EraIndex, Exposure, Nominations, SlashingSpans } from '@polkadot/t import { useEffect, useState } from 'react'; import { ApiPromise } from '@polkadot/api'; -import { useApi, useCall, useIsMountedRef } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useCall, useIsMountedRef } from '@polkadot/react-hooks'; import { BN_ZERO } from '@polkadot/util'; interface Inactives { @@ -82,7 +82,7 @@ function extractState (api: ApiPromise, stashId: string, slashes: Option({}); @@ -124,3 +124,5 @@ export default function useInactives (stashId: string, nominees?: string[]): Ina return state; } + +export default createNamedHook('useInactives', useInactivesImpl); diff --git a/packages/page-staking/src/Actions/useUnbondDuration.ts b/packages/page-staking/src/Actions/useUnbondDuration.ts index 6b5a6cb99f..75f7bf00cb 100644 --- a/packages/page-staking/src/Actions/useUnbondDuration.ts +++ b/packages/page-staking/src/Actions/useUnbondDuration.ts @@ -6,10 +6,10 @@ import type { DeriveSessionInfo } from '@polkadot/api-derive/types'; import { useMemo } from 'react'; -import { useApi, useCall } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useCall } from '@polkadot/react-hooks'; import { BN_ONE } from '@polkadot/util'; -export default function useUnbondDuration (): BN | undefined { +function useUnbondDurationImpl (): BN | undefined { const { api } = useApi(); const sessionInfo = useCall(api.derive.session.info); @@ -20,3 +20,5 @@ export default function useUnbondDuration (): BN | undefined { [api, sessionInfo] ); } + +export default createNamedHook('useUnbondDuration', useUnbondDurationImpl); diff --git a/packages/page-staking/src/Payouts/useEraBlocks.ts b/packages/page-staking/src/Payouts/useEraBlocks.ts index 81fb72f8d8..28bb2a6a34 100644 --- a/packages/page-staking/src/Payouts/useEraBlocks.ts +++ b/packages/page-staking/src/Payouts/useEraBlocks.ts @@ -7,10 +7,10 @@ import type { Forcing } from '@polkadot/types/interfaces'; import { useMemo } from 'react'; -import { useApi, useCall } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useCall } from '@polkadot/react-hooks'; import { BN_ONE } from '@polkadot/util'; -export default function useEraBlocks (era?: BN): BN | undefined { +function useEraBlocksImpl (era?: BN): BN | undefined { const { api } = useApi(); const depth = useCall(api.query.staking.historyDepth); const progress = useCall(api.derive.session.progress); @@ -36,3 +36,5 @@ export default function useEraBlocks (era?: BN): BN | undefined { [depth, era, forcing, progress] ); } + +export default createNamedHook('useEraBlocks', useEraBlocksImpl); diff --git a/packages/page-staking/src/Query/useBlockCounts.tsx b/packages/page-staking/src/Query/useBlockCounts.tsx index ce8de7e528..07b2851864 100644 --- a/packages/page-staking/src/Query/useBlockCounts.tsx +++ b/packages/page-staking/src/Query/useBlockCounts.tsx @@ -7,10 +7,10 @@ import type { SessionRewards } from '../types'; import { useEffect, useState } from 'react'; -import { useApi, useCall, useIsMountedRef } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useCall, useIsMountedRef } from '@polkadot/react-hooks'; import { BN_ONE, BN_ZERO, isFunction } from '@polkadot/util'; -export default function useBlockCounts (accountId: string, sessionRewards: SessionRewards[]): u32[] { +function useBlockCountsImpl (accountId: string, sessionRewards: SessionRewards[]): u32[] { const { api } = useApi(); const mountedRef = useIsMountedRef(); const indexes = useCall(api.derive.session?.indexes); @@ -40,3 +40,5 @@ export default function useBlockCounts (accountId: string, sessionRewards: Sessi return counts; } + +export default createNamedHook('useBlockCounts', useBlockCountsImpl); diff --git a/packages/page-staking/src/Targets/useOwnNominators.ts b/packages/page-staking/src/Targets/useOwnNominators.ts index 666a62d095..01578ba2d7 100644 --- a/packages/page-staking/src/Targets/useOwnNominators.ts +++ b/packages/page-staking/src/Targets/useOwnNominators.ts @@ -5,9 +5,13 @@ import type { StakerState } from '@polkadot/react-hooks/types'; import { useMemo } from 'react'; -export default function useOwnNominators (ownStashes?: StakerState[]): StakerState[] | undefined { +import { createNamedHook } from '@polkadot/react-hooks'; + +function useOwnNominatorsImpl (ownStashes?: StakerState[]): StakerState[] | undefined { return useMemo( () => ownStashes && ownStashes.filter(({ isOwnController, isStashValidating }) => isOwnController && !isStashValidating), [ownStashes] ); } + +export default createNamedHook('useOwnNominators', useOwnNominatorsImpl); diff --git a/packages/page-staking/src/useIdentities.ts b/packages/page-staking/src/useIdentities.ts index 9b8271741a..a1c17b905f 100644 --- a/packages/page-staking/src/useIdentities.ts +++ b/packages/page-staking/src/useIdentities.ts @@ -3,7 +3,7 @@ import type { DeriveHasIdentity } from '@polkadot/api-derive/types'; -import { useApi, useCall } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useCall } from '@polkadot/react-hooks'; function transformIdentity ([[validatorIds], hasIdentities]: [[string[]], DeriveHasIdentity[]]): Record { return validatorIds.reduce((result: Record, validatorId, index): Record => { @@ -15,9 +15,11 @@ function transformIdentity ([[validatorIds], hasIdentities]: [[string[]], Derive type Result = Record; -export default function useIdentities (validatorIds: string[] = []): Result | undefined { +function useIdentitiesImpl (validatorIds: string[] = []): Result | undefined { const { api } = useApi(); const allIdentity = useCall(api.derive.accounts.hasIdentityMulti, [validatorIds], { transform: transformIdentity, withParamsTransform: true }); return allIdentity; } + +export default createNamedHook('useIdentities', useIdentitiesImpl); diff --git a/packages/page-staking/src/useNominations.ts b/packages/page-staking/src/useNominations.ts index 673199587e..7e5a76ff88 100644 --- a/packages/page-staking/src/useNominations.ts +++ b/packages/page-staking/src/useNominations.ts @@ -7,7 +7,7 @@ import type { NominatedBy } from './types'; import { useMemo } from 'react'; -import { useApi, useCall } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useCall } from '@polkadot/react-hooks'; type Result = Record; @@ -33,7 +33,7 @@ function extractNominators (nominations: [StorageKey, Option][]): R }, {}); } -export default function useNominations (isActive = true): Result | undefined { +function useNominationsImpl (isActive = true): Result | undefined { const { api } = useApi(); const nominators = useCall<[StorageKey, Option][]>(isActive && api.query.staking.nominators.entries); @@ -42,3 +42,5 @@ export default function useNominations (isActive = true): Result | undefined { [nominators] ); } + +export default createNamedHook('useNominations', useNominationsImpl); diff --git a/packages/page-staking/src/useSortedTargets.ts b/packages/page-staking/src/useSortedTargets.ts index efadee17ff..f68782c936 100644 --- a/packages/page-staking/src/useSortedTargets.ts +++ b/packages/page-staking/src/useSortedTargets.ts @@ -10,7 +10,7 @@ import type { SortedTargets, TargetSortBy, ValidatorInfo } from './types'; import BN from 'bn.js'; import { useMemo } from 'react'; -import { useAccounts, useApi, useCall, useCallMulti, useInflation } from '@polkadot/react-hooks'; +import { createNamedHook, useAccounts, useApi, useCall, useCallMulti, useInflation } from '@polkadot/react-hooks'; import { arrayFlatten, BN_HUNDRED, BN_MAX_INTEGER, BN_ONE, BN_ZERO } from '@polkadot/util'; interface LastEra { @@ -272,7 +272,7 @@ const transformMulti = { }) }; -export default function useSortedTargets (favorites: string[], withLedger: boolean): SortedTargets { +function useSortedTargetsImpl (favorites: string[], withLedger: boolean): SortedTargets { const { api } = useApi(); const { allAccounts } = useAccounts(); const { counterForNominators, counterForValidators, historyDepth, maxNominatorsCount, maxValidatorsCount, minNominatorBond, minValidatorBond, totalIssuance } = useCallMulti([ @@ -318,3 +318,5 @@ export default function useSortedTargets (favorites: string[], withLedger: boole ...partial }; } + +export default createNamedHook('useSortedTargets', useSortedTargetsImpl); diff --git a/packages/page-tech-comm/src/useCounter.ts b/packages/page-tech-comm/src/useCounter.ts index e81c9df57d..f10fbba105 100644 --- a/packages/page-tech-comm/src/useCounter.ts +++ b/packages/page-tech-comm/src/useCounter.ts @@ -3,15 +3,17 @@ import type { Hash } from '@polkadot/types/interfaces'; -import { useApi, useCall } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useCall } from '@polkadot/react-hooks'; const transformCounter = { transform: (proposals: Hash[]) => proposals.length }; -export default function useCounter (): number { +function useCounterImpl (): number { const { api, isApiReady } = useApi(); const counter = useCall(isApiReady && api.derive.technicalCommittee?.proposals, undefined, transformCounter) || 0; return counter; } + +export default createNamedHook('useCounter', useCounterImpl); diff --git a/packages/page-treasury/src/useCounter.ts b/packages/page-treasury/src/useCounter.ts index 221bb4ee55..9d1a5d123e 100644 --- a/packages/page-treasury/src/useCounter.ts +++ b/packages/page-treasury/src/useCounter.ts @@ -5,9 +5,9 @@ import type { DeriveTreasuryProposals } from '@polkadot/api-derive/types'; import { useMemo } from 'react'; -import { useAccounts, useApi, useCall } from '@polkadot/react-hooks'; +import { createNamedHook, useAccounts, useApi, useCall } from '@polkadot/react-hooks'; -export default function useCounter (): number { +function useCounterImpl (): number { const { hasAccounts } = useAccounts(); const { api, isApiReady } = useApi(); const proposals = useCall(isApiReady && hasAccounts && api.derive.treasury?.proposals); @@ -17,3 +17,5 @@ export default function useCounter (): number { [proposals] ); } + +export default createNamedHook('useCounter', useCounterImpl); diff --git a/packages/page-treasury/src/useTipHashes.ts b/packages/page-treasury/src/useTipHashes.ts index d99189651b..627cc2faec 100644 --- a/packages/page-treasury/src/useTipHashes.ts +++ b/packages/page-treasury/src/useTipHashes.ts @@ -4,15 +4,17 @@ import type { StorageKey } from '@polkadot/types'; import type { Hash } from '@polkadot/types/interfaces'; -import { useApi, useEventTrigger, useMapKeys } from '@polkadot/react-hooks'; +import { createNamedHook, useApi, useEventTrigger, useMapKeys } from '@polkadot/react-hooks'; function extractHashes (keys: StorageKey<[Hash]>[]): string[] { return keys.map(({ args: [hash] }) => hash.toHex()); } -export default function useTipHashes (): string[] | undefined { +function useTipHashesImpl (): string[] | undefined { const { api } = useApi(); const trigger = useEventTrigger([api.events.tips?.NewTip, api.events.tips?.TipClosed, api.events.tips?.TipRetracted]); return useMapKeys((api.query.tips || api.query.treasury)?.tips, { at: trigger.blockHash, transform: extractHashes }); } + +export default createNamedHook('useTipHashes', useTipHashesImpl); diff --git a/packages/react-components/src/InputRpc/useRpcs.ts b/packages/react-components/src/InputRpc/useRpcs.ts index 97daf2ab1f..f9d6441f96 100644 --- a/packages/react-components/src/InputRpc/useRpcs.ts +++ b/packages/react-components/src/InputRpc/useRpcs.ts @@ -5,11 +5,11 @@ import type { DefinitionRpcExt } from '@polkadot/types/types'; import { useMemo } from 'react'; -import { useApi } from '@polkadot/react-hooks'; +import { createNamedHook, useApi } from '@polkadot/react-hooks'; import { getAllRpc } from './rpcs'; -export default function useRpcs (): Record> { +function useRpcsImpl (): Record> { const { api } = useApi(); return useMemo( @@ -17,3 +17,5 @@ export default function useRpcs (): Record void): [string | null, (_: string | null) => void] { +import { createNamedHook } from './createNamedHook'; + +function useAccountIdImpl (initialValue: string | null = null, onChangeAccountId?: (_: string | null) => void): [string | null, (_: string | null) => void] { const [accountId, setAccountId] = useState(initialValue); const _setAccountId = useCallback( @@ -17,3 +19,5 @@ export function useAccountId (initialValue: string | null = null, onChangeAccoun return [accountId, _setAccountId]; } + +export const useAccountId = createNamedHook('useAccountId', useAccountIdImpl); diff --git a/packages/react-hooks/src/useAccountInfo.ts b/packages/react-hooks/src/useAccountInfo.ts index 48a156b449..17a52779f0 100644 --- a/packages/react-hooks/src/useAccountInfo.ts +++ b/packages/react-hooks/src/useAccountInfo.ts @@ -11,11 +11,11 @@ import { useCallback, useEffect, useState } from 'react'; import { keyring } from '@polkadot/ui-keyring'; import { isFunction } from '@polkadot/util'; +import { createNamedHook } from './createNamedHook'; import { useAccounts } from './useAccounts'; import { useAddresses } from './useAddresses'; import { useApi } from './useApi'; import { useCall } from './useCall'; -import { createNamedHook } from './useNamedHook'; import { useToggle } from './useToggle'; const IS_NONE = { diff --git a/packages/react-hooks/src/useAccounts.ts b/packages/react-hooks/src/useAccounts.ts index 0eb5099312..7ff0016c04 100644 --- a/packages/react-hooks/src/useAccounts.ts +++ b/packages/react-hooks/src/useAccounts.ts @@ -7,8 +7,8 @@ import { keyring } from '@polkadot/ui-keyring'; import { u8aToHex } from '@polkadot/util'; import { decodeAddress } from '@polkadot/util-crypto'; +import { createNamedHook } from './createNamedHook'; import { useIsMountedRef } from './useIsMountedRef'; -import { createNamedHook } from './useNamedHook'; export interface UseAccounts { allAccounts: string[]; diff --git a/packages/react-hooks/src/useAddresses.ts b/packages/react-hooks/src/useAddresses.ts index c7fa07384a..6fde8b6526 100644 --- a/packages/react-hooks/src/useAddresses.ts +++ b/packages/react-hooks/src/useAddresses.ts @@ -5,8 +5,8 @@ import { useEffect, useState } from 'react'; import { keyring } from '@polkadot/ui-keyring'; +import { createNamedHook } from './createNamedHook'; import { useIsMountedRef } from './useIsMountedRef'; -import { createNamedHook } from './useNamedHook'; interface UseAddresses { allAddresses: string[]; diff --git a/packages/react-hooks/src/useApi.ts b/packages/react-hooks/src/useApi.ts index cf4694c78f..b3b93f447b 100644 --- a/packages/react-hooks/src/useApi.ts +++ b/packages/react-hooks/src/useApi.ts @@ -7,6 +7,10 @@ import { useContext } from 'react'; import { ApiContext } from '@polkadot/react-api'; -export function useApi (): ApiProps { +import { createNamedHook } from './createNamedHook'; + +function useApiImpl (): ApiProps { return useContext(ApiContext); } + +export const useApi = createNamedHook('useApi', useApiImpl); diff --git a/packages/react-hooks/src/useApiUrl.ts b/packages/react-hooks/src/useApiUrl.ts index acbe3a7e83..088c0f18fb 100644 --- a/packages/react-hooks/src/useApiUrl.ts +++ b/packages/react-hooks/src/useApiUrl.ts @@ -7,13 +7,14 @@ import { ApiPromise, WsProvider } from '@polkadot/api'; import { typesBundle, typesChain } from '@polkadot/apps-config'; import { isString } from '@polkadot/util'; +import { createNamedHook } from './createNamedHook'; import { useIsMountedRef } from './useIsMountedRef'; function disconnect (api: ApiPromise | null): void { api && api.disconnect().catch(console.error); } -export function useApiUrl (url?: string | string[]): ApiPromise | null { +function useApiUrlImpl (url?: string | string[]): ApiPromise | null { const apiRef = useRef(null); const mountedRef = useIsMountedRef(); const [state, setState] = useState(null); @@ -53,3 +54,5 @@ export function useApiUrl (url?: string | string[]): ApiPromise | null { return state; } + +export const useApiUrl = createNamedHook('useApiUrl', useApiUrlImpl); diff --git a/packages/react-hooks/src/useAvailableSlashes.ts b/packages/react-hooks/src/useAvailableSlashes.ts index c6d3eea6c9..add266e5c4 100644 --- a/packages/react-hooks/src/useAvailableSlashes.ts +++ b/packages/react-hooks/src/useAvailableSlashes.ts @@ -11,10 +11,10 @@ import { useEffect, useState } from 'react'; import { BN_ONE } from '@polkadot/util'; +import { createNamedHook } from './createNamedHook'; import { useApi } from './useApi'; import { useCall } from './useCall'; import { useIsMountedRef } from './useIsMountedRef'; -import { createNamedHook } from './useNamedHook'; type Unsub = () => void; diff --git a/packages/react-hooks/src/useBalancesAll.ts b/packages/react-hooks/src/useBalancesAll.ts index aa85cdb8b1..ffeb75d76f 100644 --- a/packages/react-hooks/src/useBalancesAll.ts +++ b/packages/react-hooks/src/useBalancesAll.ts @@ -3,9 +3,9 @@ import type { DeriveBalancesAll } from '@polkadot/api-derive/types'; +import { createNamedHook } from './createNamedHook'; import { useApi } from './useApi'; import { useCall } from './useCall'; -import { createNamedHook } from './useNamedHook'; /** * Gets the account full balance information diff --git a/packages/react-hooks/src/useBestHash.ts b/packages/react-hooks/src/useBestHash.ts index 1ba866312e..01349084d1 100644 --- a/packages/react-hooks/src/useBestHash.ts +++ b/packages/react-hooks/src/useBestHash.ts @@ -3,9 +3,9 @@ import type { Header } from '@polkadot/types/interfaces'; +import { createNamedHook } from './createNamedHook'; import { useApi } from './useApi'; import { useCall } from './useCall'; -import { createNamedHook } from './useNamedHook'; const optCall = { transform: (header: Header) => header.hash.toHex() diff --git a/packages/react-hooks/src/useBestNumber.ts b/packages/react-hooks/src/useBestNumber.ts index 465d6d2807..8b7491e778 100644 --- a/packages/react-hooks/src/useBestNumber.ts +++ b/packages/react-hooks/src/useBestNumber.ts @@ -3,9 +3,9 @@ import type { BlockNumber } from '@polkadot/types/interfaces'; +import { createNamedHook } from './createNamedHook'; import { useApi } from './useApi'; import { useCall } from './useCall'; -import { createNamedHook } from './useNamedHook'; function useBestNumberImpl (): BlockNumber | undefined { const { api } = useApi(); diff --git a/packages/react-hooks/src/useBlockTime.ts b/packages/react-hooks/src/useBlockTime.ts index e2dd4bd91e..3b1eecdc02 100644 --- a/packages/react-hooks/src/useBlockTime.ts +++ b/packages/react-hooks/src/useBlockTime.ts @@ -8,9 +8,9 @@ import { useMemo } from 'react'; import { BN, BN_ONE, BN_THOUSAND, BN_TWO, bnToBn, extractTime } from '@polkadot/util'; +import { createNamedHook } from './createNamedHook'; import { useTranslation } from './translate'; import { useApi } from './useApi'; -import { createNamedHook } from './useNamedHook'; type Result = [number, string, Time]; diff --git a/packages/react-hooks/src/useBlocksPerDays.ts b/packages/react-hooks/src/useBlocksPerDays.ts index f51165c52f..c0a44edd53 100644 --- a/packages/react-hooks/src/useBlocksPerDays.ts +++ b/packages/react-hooks/src/useBlocksPerDays.ts @@ -5,8 +5,8 @@ import { useMemo } from 'react'; import { BN, bnToBn } from '@polkadot/util'; +import { createNamedHook } from './createNamedHook'; import { useBlockTime } from './useBlockTime'; -import { createNamedHook } from './useNamedHook'; const A_DAY = new BN(24 * 60 * 60 * 1000); diff --git a/packages/react-hooks/src/useCacheKey.ts b/packages/react-hooks/src/useCacheKey.ts index 28125a5916..d80afacb1a 100644 --- a/packages/react-hooks/src/useCacheKey.ts +++ b/packages/react-hooks/src/useCacheKey.ts @@ -7,6 +7,7 @@ import store from 'store'; import { useApi } from './useApi'; // create a chain-specific key for the local cache +// FIXME Since we use generics, this cannot be a createNamedHook as of yet export function useCacheKey (storageKeyBase: string): [(defaultValue?: T) => T | undefined, (value: T) => T] { const { api, isDevelopment } = useApi(); const storageKey = useMemo( diff --git a/packages/react-hooks/src/useCall.ts b/packages/react-hooks/src/useCall.ts index 3b03a44cdb..400b9d4648 100644 --- a/packages/react-hooks/src/useCall.ts +++ b/packages/react-hooks/src/useCall.ts @@ -137,6 +137,7 @@ 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 +// FIXME This is generic, we cannot really use createNamedHook export function useCall (fn: TrackFn | undefined | null | false, params?: CallParams | null, options?: CallOptions): T | undefined { const mountedRef = useIsMountedRef(); const tracker = useRef({ isActive: false, serialized: null, subscriber: null }); diff --git a/packages/react-hooks/src/useCallMulti.ts b/packages/react-hooks/src/useCallMulti.ts index c78b9d574c..776d2cf30a 100644 --- a/packages/react-hooks/src/useCallMulti.ts +++ b/packages/react-hooks/src/useCallMulti.ts @@ -64,6 +64,7 @@ function subscribe (api: ApiPromise, mountedRef: MountedRef, tracker: Tracke } // very much copied from useCall +// FIXME This is generic, we cannot really use createNamedHook export function useCallMulti (calls?: QueryableStorageMultiArg<'promise'>[] | null | false, options?: CallOptions): T { const { api } = useApi(); const mountedRef = useIsMountedRef(); diff --git a/packages/react-hooks/src/useCollectiveInstance.ts b/packages/react-hooks/src/useCollectiveInstance.ts index e95cf164c5..86c387e80e 100644 --- a/packages/react-hooks/src/useCollectiveInstance.ts +++ b/packages/react-hooks/src/useCollectiveInstance.ts @@ -8,7 +8,7 @@ import { useMemo } from 'react'; import { useApi } from '@polkadot/react-hooks'; import { isFunction } from '@polkadot/util'; -import { createNamedHook } from './useNamedHook'; +import { createNamedHook } from './createNamedHook'; function useCollectiveInstanceImpl (instanceType: CollectiveType, instanceIndex?: number): CollectiveType | null { const { api } = useApi(); diff --git a/packages/react-hooks/src/useCollectiveMembers.ts b/packages/react-hooks/src/useCollectiveMembers.ts index 0c9b2bdf23..a3f02d8358 100644 --- a/packages/react-hooks/src/useCollectiveMembers.ts +++ b/packages/react-hooks/src/useCollectiveMembers.ts @@ -6,10 +6,10 @@ import type { CollectiveType } from './types'; import { useMemo } from 'react'; +import { createNamedHook } from './createNamedHook'; import { useAccounts } from './useAccounts'; import { useApi } from './useApi'; import { useCall } from './useCall'; -import { createNamedHook } from './useNamedHook'; interface Result { isMember: boolean; diff --git a/packages/react-hooks/src/useDebounce.ts b/packages/react-hooks/src/useDebounce.ts index 101551695e..0ecf168534 100644 --- a/packages/react-hooks/src/useDebounce.ts +++ b/packages/react-hooks/src/useDebounce.ts @@ -7,7 +7,7 @@ import { useIsMountedRef } from './useIsMountedRef'; const DEFAULT_DELAY = 250; -// Debounces inputs +// FIXE Due to generics, cannot use createNamedHook export function useDebounce (value: T, delay?: number): T { const mountedRef = useIsMountedRef(); const [debouncedValue, setDebouncedValue] = useState(value); diff --git a/packages/react-hooks/src/useDelegations.ts b/packages/react-hooks/src/useDelegations.ts index b338aaed0b..8381f4cd28 100644 --- a/packages/react-hooks/src/useDelegations.ts +++ b/packages/react-hooks/src/useDelegations.ts @@ -5,7 +5,7 @@ import type { PalletDemocracyVoteVoting } from '@polkadot/types/lookup'; import { useAccounts, useApi, useCall } from '@polkadot/react-hooks'; -import { createNamedHook } from './useNamedHook'; +import { createNamedHook } from './createNamedHook'; function useDelegationsImpl (): PalletDemocracyVoteVoting[] | undefined { const { api } = useApi(); diff --git a/packages/react-hooks/src/useElementPosition.ts b/packages/react-hooks/src/useElementPosition.ts index 54f3e4dd32..8d317c70d3 100644 --- a/packages/react-hooks/src/useElementPosition.ts +++ b/packages/react-hooks/src/useElementPosition.ts @@ -3,8 +3,9 @@ import React, { useEffect, useState } from 'react'; -import { useScroll } from '@polkadot/react-hooks/useScroll'; -import { useWindowSize } from '@polkadot/react-hooks/useWindowSize'; +import { createNamedHook } from './createNamedHook'; +import { useScroll } from './useScroll'; +import { useWindowSize } from './useWindowSize'; export interface ElementPosition { x: number, @@ -13,7 +14,7 @@ export interface ElementPosition { height: number, } -export function useElementPosition (ref: React.MutableRefObject): ElementPosition | undefined { +function useElementPositionImpl (ref: React.MutableRefObject): ElementPosition | undefined { const [elementPosition, setElementPosition] = useState(); const windowSize = useWindowSize(); const scrollY = useScroll(); @@ -33,3 +34,5 @@ export function useElementPosition (ref: React.MutableRefObject | false | undefined | null; diff --git a/packages/react-hooks/src/useExtrinsicTrigger.ts b/packages/react-hooks/src/useExtrinsicTrigger.ts index a98dcd98f7..16aabbebe1 100644 --- a/packages/react-hooks/src/useExtrinsicTrigger.ts +++ b/packages/react-hooks/src/useExtrinsicTrigger.ts @@ -6,10 +6,10 @@ import type { SignedBlockExtended } from '@polkadot/api-derive/types'; import { useEffect, useState } from 'react'; +import { createNamedHook } from './createNamedHook'; import { useApi } from './useApi'; import { useCall } from './useCall'; import { useIsMountedRef } from './useIsMountedRef'; -import { createNamedHook } from './useNamedHook'; type ExtrinsicCheck = SubmittableExtrinsicFunction<'promise'> | false | undefined | null; diff --git a/packages/react-hooks/src/useFavorites.ts b/packages/react-hooks/src/useFavorites.ts index fe87e1e634..38232a766c 100644 --- a/packages/react-hooks/src/useFavorites.ts +++ b/packages/react-hooks/src/useFavorites.ts @@ -1,18 +1,19 @@ // Copyright 2017-2021 @polkadot/react-hooks authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { useCallback, useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; +import { createNamedHook } from './createNamedHook'; import { useCacheKey } from './useCacheKey'; // hook for favorites with local storage -export function useFavorites (storageKeyBase: string): [string[], (address: string) => void] { +function useFavoritesImpl (storageKeyBase: string): [string[], (address: string) => void] { const [getCache, setCache] = useCacheKey(storageKeyBase); const [favorites, setFavorites] = useState(() => getCache() || []); const toggleFavorite = useCallback( (address: string): void => setFavorites( - (favorites: string[]) => setCache( + (favorites) => setCache( favorites.includes(address) ? favorites.filter((a) => address !== a) : [...favorites, address] @@ -21,5 +22,10 @@ export function useFavorites (storageKeyBase: string): [string[], (address: stri [setCache] ); - return [favorites, toggleFavorite]; + return useMemo( + () => [favorites, toggleFavorite], + [favorites, toggleFavorite] + ); } + +export const useFavorites = createNamedHook('useFavorites', useFavoritesImpl); diff --git a/packages/react-hooks/src/useFormField.ts b/packages/react-hooks/src/useFormField.ts index 97df26cb30..ebf6d7d942 100644 --- a/packages/react-hooks/src/useFormField.ts +++ b/packages/react-hooks/src/useFormField.ts @@ -15,6 +15,7 @@ type ValidateFn = (_: T) => boolean; const defaultValidate = (): boolean => true; +// FIXME Since we use generics, this cannot be a createNamedHook as of yet export function useFormField (defaultValue: T | null, validate: ValidateFn = defaultValidate): FormField { const [value, setValue] = useState(defaultValue); const isValid = useMemo( diff --git a/packages/react-hooks/src/useIncrement.ts b/packages/react-hooks/src/useIncrement.ts index 5c703d94bc..6cd97c4088 100644 --- a/packages/react-hooks/src/useIncrement.ts +++ b/packages/react-hooks/src/useIncrement.ts @@ -3,9 +3,10 @@ import { useCallback, useState } from 'react'; +import { createNamedHook } from './createNamedHook'; import { useIsMountedRef } from './useIsMountedRef'; -export function useIncrement (defaultValue = 1): [number, () => void, (value: number) => void] { +function useIncrementImpl (defaultValue = 1): [number, () => void, (value: number) => void] { const mountedRef = useIsMountedRef(); const [value, setValue] = useState(defaultValue); @@ -18,3 +19,5 @@ export function useIncrement (defaultValue = 1): [number, () => void, (value: nu return [value, increment, setValue]; } + +export const useIncrement = createNamedHook('useIncrement', useIncrementImpl); diff --git a/packages/react-hooks/src/useInflation.ts b/packages/react-hooks/src/useInflation.ts index 01c729d3e8..037eb3f85b 100644 --- a/packages/react-hooks/src/useInflation.ts +++ b/packages/react-hooks/src/useInflation.ts @@ -10,9 +10,9 @@ import { useEffect, useState } from 'react'; import { getInflationParams } from '@polkadot/apps-config'; import { BN_MILLION, BN_ZERO } from '@polkadot/util'; +import { createNamedHook } from './createNamedHook'; import { useApi } from './useApi'; import { useCall } from './useCall'; -import { createNamedHook } from './useNamedHook'; const EMPTY: Inflation = { idealInterest: 0, idealStake: 0, inflation: 0, stakedFraction: 0, stakedReturn: 0 }; diff --git a/packages/react-hooks/src/useIpfs.ts b/packages/react-hooks/src/useIpfs.ts index 82dd3ada55..bb5bcbd1da 100644 --- a/packages/react-hooks/src/useIpfs.ts +++ b/packages/react-hooks/src/useIpfs.ts @@ -3,6 +3,8 @@ import { useState } from 'react'; +import { createNamedHook } from './createNamedHook'; + const KNOWN = ['ipfs', 'ipns']; const SECTIONS = KNOWN.map((part) => `/${part}/`); const LOCAL_IPFS = '.ipfs.localhost'; @@ -111,8 +113,10 @@ export function extractIpfsDetails (): State { : extractOther(url); } -export function useIpfs (): State { +function useIpfsImpl (): State { const [state] = useState(() => extractIpfsDetails()); return state; } + +export const useIpfs = createNamedHook('useIpfs', useIpfsImpl); diff --git a/packages/react-hooks/src/useIsMountedRef.ts b/packages/react-hooks/src/useIsMountedRef.ts index e42ce4443d..e59a15ddc3 100644 --- a/packages/react-hooks/src/useIsMountedRef.ts +++ b/packages/react-hooks/src/useIsMountedRef.ts @@ -3,9 +3,11 @@ import { useEffect, useRef } from 'react'; +import { createNamedHook } from './createNamedHook'; + export type MountedRef = React.MutableRefObject; -export function useIsMountedRef (): MountedRef { +function useIsMountedRefImpl (): MountedRef { const isMounted = useRef(false); useEffect((): () => void => { @@ -18,3 +20,5 @@ export function useIsMountedRef (): MountedRef { return isMounted; } + +export const useIsMountedRef = createNamedHook('useIsMountedRef', useIsMountedRefImpl); diff --git a/packages/react-hooks/src/useJudgements.tsx b/packages/react-hooks/src/useJudgements.tsx index d3ad7879b8..b3ce646a3b 100644 --- a/packages/react-hooks/src/useJudgements.tsx +++ b/packages/react-hooks/src/useJudgements.tsx @@ -7,8 +7,8 @@ import { useMemo } from 'react'; import { getJudgements } from './utils/getJudgements'; import { matchRegistrarAccountsWithIndexes } from './utils/matchRegistrarAccountsWithIndexes'; +import { createNamedHook } from './createNamedHook'; import { useAccountInfo } from './useAccountInfo'; -import { createNamedHook } from './useNamedHook'; import { useRegistrars } from './useRegistrars'; function useJudgementsImpl (address: string): UseJudgements { diff --git a/packages/react-hooks/src/useLedger.ts b/packages/react-hooks/src/useLedger.ts index f6081c65aa..93b5ce80a0 100644 --- a/packages/react-hooks/src/useLedger.ts +++ b/packages/react-hooks/src/useLedger.ts @@ -11,8 +11,8 @@ import { knownGenesis, knownLedger } from '@polkadot/networks/defaults'; import uiSettings from '@polkadot/ui-settings'; import { assert } from '@polkadot/util'; +import { createNamedHook } from './createNamedHook'; import { useApi } from './useApi'; -import { createNamedHook } from './useNamedHook'; interface StateBase { isLedgerCapable: boolean; diff --git a/packages/react-hooks/src/useLoadingDelay.ts b/packages/react-hooks/src/useLoadingDelay.ts index 1537eb5a61..1457c5bf50 100644 --- a/packages/react-hooks/src/useLoadingDelay.ts +++ b/packages/react-hooks/src/useLoadingDelay.ts @@ -3,9 +3,10 @@ import { useEffect, useState } from 'react'; +import { createNamedHook } from './createNamedHook'; import { useIsMountedRef } from './useIsMountedRef'; -export function useLoadingDelay (delay = 100): boolean { +function useLoadingDelayImpl (delay = 100): boolean { const mountedRef = useIsMountedRef(); const [isLoading, setIsLoading] = useState(true); @@ -19,3 +20,5 @@ export function useLoadingDelay (delay = 100): boolean { return isLoading; } + +export const useLoadingDelay = createNamedHook('useLoadingDelay', useLoadingDelayImpl); diff --git a/packages/react-hooks/src/useMapEntries.ts b/packages/react-hooks/src/useMapEntries.ts index 416d655607..0d2c72cd92 100644 --- a/packages/react-hooks/src/useMapEntries.ts +++ b/packages/react-hooks/src/useMapEntries.ts @@ -10,6 +10,7 @@ interface Options { transform?: (value: any[]) => T; } +// FIXME This is generic, we cannot really use createNamedHook export function useMapEntries (entry?: QueryableStorageEntry<'promise'> | null | false, { at, transform }: Options = {}): T | undefined { const [state, setState] = useState(); diff --git a/packages/react-hooks/src/useMapKeys.ts b/packages/react-hooks/src/useMapKeys.ts index b4e365facb..926fd85817 100644 --- a/packages/react-hooks/src/useMapKeys.ts +++ b/packages/react-hooks/src/useMapKeys.ts @@ -10,6 +10,7 @@ interface Options { transform?: (value: any[]) => T[]; } +// FIXME This is generic, we cannot really use createNamedHook export function useMapKeys (entry?: QueryableStorageEntry<'promise'> | null | false, { at, transform }: Options = {}): T[] | undefined { const [state, setState] = useState(); diff --git a/packages/react-hooks/src/useModal.ts b/packages/react-hooks/src/useModal.ts index 811239c51c..ea45b9efa9 100644 --- a/packages/react-hooks/src/useModal.ts +++ b/packages/react-hooks/src/useModal.ts @@ -5,9 +5,10 @@ import type { ModalState } from './types'; import { useCallback } from 'react'; +import { createNamedHook } from './createNamedHook'; import { useToggle } from './useToggle'; -export function useModal (defaultIsOpen?: boolean, onOpen?: () => void, onClose?: () => void): ModalState { +function useModalImpl (defaultIsOpen?: boolean, onOpen?: () => void, onClose?: () => void): ModalState { const [isOpen, , setIsOpen] = useToggle(defaultIsOpen || false); const _onOpen = useCallback( (): void => { @@ -28,3 +29,5 @@ export function useModal (defaultIsOpen?: boolean, onOpen?: () => void, onClose? return { isOpen, onClose: _onClose, onOpen: _onOpen }; } + +export const useModal = createNamedHook('useModal', useModalImpl); diff --git a/packages/react-hooks/src/useNonEmptyString.ts b/packages/react-hooks/src/useNonEmptyString.ts index 2eac1a2cb3..96004f3715 100644 --- a/packages/react-hooks/src/useNonEmptyString.ts +++ b/packages/react-hooks/src/useNonEmptyString.ts @@ -1,12 +1,15 @@ // Copyright 2017-2021 @polkadot/react-hooks authors & contributors // SPDX-License-Identifier: Apache-2.0 +import { createNamedHook } from './createNamedHook'; import { FormField, useFormField } from './useFormField'; function isValid (value?: string | null): boolean { return (value && value.length > 0) || false; } -export function useNonEmptyString (initialValue = ''): FormField { +function useNonEmptyStringImpl (initialValue = ''): FormField { return useFormField(initialValue, isValid); } + +export const useNonEmptyString = createNamedHook('useNonEmptyString', useNonEmptyStringImpl); diff --git a/packages/react-hooks/src/useNonZeroBn.ts b/packages/react-hooks/src/useNonZeroBn.ts index fa9d444150..291f4b9574 100644 --- a/packages/react-hooks/src/useNonZeroBn.ts +++ b/packages/react-hooks/src/useNonZeroBn.ts @@ -7,14 +7,17 @@ import { useMemo } from 'react'; import { BN_ZERO, bnToBn } from '@polkadot/util'; +import { createNamedHook } from './createNamedHook'; import { FormField, useFormField } from './useFormField'; function isValid (value: BN): boolean { return !value.isZero(); } -export function useNonZeroBn (initialValue: BN | number = BN_ZERO): FormField { +function useNonZeroBnImpl (initialValue: BN | number = BN_ZERO): FormField { const value = useMemo(() => bnToBn(initialValue), [initialValue]); return useFormField(value, isValid); } + +export const useNonZeroBn = createNamedHook('useNonZeroBn', useNonZeroBnImpl); diff --git a/packages/react-hooks/src/useOwnEraRewards.ts b/packages/react-hooks/src/useOwnEraRewards.ts index 7bbede3676..85608b0e81 100644 --- a/packages/react-hooks/src/useOwnEraRewards.ts +++ b/packages/react-hooks/src/useOwnEraRewards.ts @@ -10,10 +10,10 @@ import { useEffect, useState } from 'react'; import { BN_ZERO } from '@polkadot/util'; +import { createNamedHook } from './createNamedHook'; import { useApi } from './useApi'; import { useCall } from './useCall'; import { useIsMountedRef } from './useIsMountedRef'; -import { createNamedHook } from './useNamedHook'; import { useOwnStashIds } from './useOwnStashes'; interface State { diff --git a/packages/react-hooks/src/useOwnStashInfos.ts b/packages/react-hooks/src/useOwnStashInfos.ts index bcfd07c085..3101cd717d 100644 --- a/packages/react-hooks/src/useOwnStashInfos.ts +++ b/packages/react-hooks/src/useOwnStashInfos.ts @@ -11,10 +11,10 @@ import { useEffect, useMemo, useState } from 'react'; import { u8aConcat, u8aToHex } from '@polkadot/util'; +import { createNamedHook } from './createNamedHook'; import { useAccounts } from './useAccounts'; import { useApi } from './useApi'; import { useIsMountedRef } from './useIsMountedRef'; -import { createNamedHook } from './useNamedHook'; import { useOwnStashes } from './useOwnStashes'; type ValidatorInfo = ITuple<[ValidatorPrefs, Codec]> | ValidatorPrefs; diff --git a/packages/react-hooks/src/useOwnStashes.ts b/packages/react-hooks/src/useOwnStashes.ts index 961e6b34d6..7be3524bac 100644 --- a/packages/react-hooks/src/useOwnStashes.ts +++ b/packages/react-hooks/src/useOwnStashes.ts @@ -6,10 +6,10 @@ import type { AccountId, StakingLedger } from '@polkadot/types/interfaces'; import { useMemo } from 'react'; +import { createNamedHook } from './createNamedHook'; import { useAccounts } from './useAccounts'; import { useApi } from './useApi'; import { useCall } from './useCall'; -import { createNamedHook } from './useNamedHook'; type IsInKeyring = boolean; diff --git a/packages/react-hooks/src/useParaApi.ts b/packages/react-hooks/src/useParaApi.ts index 13a86ba675..59326c55f1 100644 --- a/packages/react-hooks/src/useParaApi.ts +++ b/packages/react-hooks/src/useParaApi.ts @@ -8,6 +8,7 @@ import { useEffect, useState } from 'react'; import { ApiPromise } from '@polkadot/api'; +import { createNamedHook } from './createNamedHook'; import { useApiUrl } from './useApiUrl'; import { useIsMountedRef } from './useIsMountedRef'; import { useParaEndpoints } from './useParaEndpoints'; @@ -35,7 +36,7 @@ function arrayShuffle (result: string[]): string[] { return result; } -export function useParaApi (paraId: BN | number): Result { +function useParaApiImpl (paraId: BN | number): Result { const mountedRef = useIsMountedRef(); const endpoints = useParaEndpoints(paraId); const [state, setState] = useState(() => ({ @@ -63,3 +64,5 @@ export function useParaApi (paraId: BN | number): Result { return state; } + +export const useParaApi = createNamedHook('useParaApi', useParaApiImpl); diff --git a/packages/react-hooks/src/useParaEndpoints.ts b/packages/react-hooks/src/useParaEndpoints.ts index 86c0e43cae..c80405474a 100644 --- a/packages/react-hooks/src/useParaEndpoints.ts +++ b/packages/react-hooks/src/useParaEndpoints.ts @@ -9,6 +9,7 @@ import { useMemo } from 'react'; import { createWsEndpoints } from '@polkadot/apps-config'; import { bnToBn } from '@polkadot/util'; +import { createNamedHook } from './createNamedHook'; import { useApi } from './useApi'; const endpoints = createWsEndpoints((key: string, value: string | undefined) => value || key); @@ -25,7 +26,7 @@ function extractParaEndpoints (allEndpoints: LinkOption[], paraId: BN | number): return allEndpoints.filter(({ paraId }) => paraId === numId); } -export function useRelayEndpoints (): LinkOption[] { +function useRelayEndpointsImpl (): LinkOption[] { const { api } = useApi(); return useMemo( @@ -34,7 +35,9 @@ export function useRelayEndpoints (): LinkOption[] { ); } -export function useParaEndpoints (paraId: BN | number): LinkOption[] { +export const useRelayEndpoints = createNamedHook('useRelayEndpoints', useRelayEndpointsImpl); + +function useParaEndpointsImpl (paraId: BN | number): LinkOption[] { const endpoints = useRelayEndpoints(); return useMemo( @@ -43,7 +46,9 @@ export function useParaEndpoints (paraId: BN | number): LinkOption[] { ); } -export function useIsParasLinked (ids?: (BN | number)[] | null): Record { +export const useParaEndpoints = createNamedHook('useParaEndpoints', useParaEndpointsImpl); + +function useIsParasLinkedImpl (ids?: (BN | number)[] | null): Record { const endpoints = useRelayEndpoints(); return useMemo( @@ -56,3 +61,5 @@ export function useIsParasLinked (ids?: (BN | number)[] | null): Record; @@ -12,7 +14,7 @@ interface PasswordProps { setIsPasswordValid: React.Dispatch; } -export function usePassword (): PasswordProps { +function usePasswordImpl (): PasswordProps { const [password, setPassword] = useState(''); const [isPasswordValid, setIsPasswordValid] = useState(false); @@ -27,3 +29,5 @@ export function usePassword (): PasswordProps { setPassword }; } + +export const usePassword = createNamedHook('usePassword', usePasswordImpl); diff --git a/packages/react-hooks/src/usePopupWindow.ts b/packages/react-hooks/src/usePopupWindow.ts index e50a619352..a99dd765d3 100644 --- a/packages/react-hooks/src/usePopupWindow.ts +++ b/packages/react-hooks/src/usePopupWindow.ts @@ -1,21 +1,28 @@ // Copyright 2017-2021 @polkadot/react-hooks authors & contributors // SPDX-License-Identifier: Apache-2.0 -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useMemo, useState } from 'react'; import { HorizontalPosition, VerticalPosition } from '@polkadot/react-components/Popup/types'; import { getPosition } from '@polkadot/react-components/Popup/utils'; +import { createNamedHook } from './createNamedHook'; import { useElementPosition } from './useElementPosition'; import { useScroll } from './useScroll'; import { useWindowSize } from './useWindowSize'; -export function usePopupWindow ( - windowRef: React.RefObject, - triggerRef: React.RefObject, - position: HorizontalPosition -): {renderWindowPosition: {x: number, y: number} | undefined, verticalPosition: VerticalPosition | undefined} { - const [renderWindowPosition, setRenderWindowPosition] = useState<{x: number, y: number}>(); +interface Coord { + x: number; + y: number; +} + +interface Result { + renderWindowPosition?: Coord; + verticalPosition: VerticalPosition | undefined +} + +function usePopupWindowImpl (windowRef: React.RefObject, triggerRef: React.RefObject, position: HorizontalPosition): Result { + const [renderWindowPosition, setRenderWindowPosition] = useState(); const [verticalPosition, setVerticalPosition] = useState(); const windowPosition = useElementPosition(windowRef); const triggerPosition = useElementPosition(triggerRef); @@ -35,5 +42,10 @@ export function usePopupWindow ( } }, [position, scrollY, triggerPosition, verticalPosition, windowPosition, windowSize]); - return { renderWindowPosition, verticalPosition }; + return useMemo( + () => ({ renderWindowPosition, verticalPosition }), + [renderWindowPosition, verticalPosition] + ); } + +export const usePopupWindow = createNamedHook('usePopupWindow', usePopupWindowImpl); diff --git a/packages/react-hooks/src/useProxies.ts b/packages/react-hooks/src/useProxies.ts index 9f5547363f..e5d055e8d5 100644 --- a/packages/react-hooks/src/useProxies.ts +++ b/packages/react-hooks/src/useProxies.ts @@ -6,10 +6,10 @@ import BN from 'bn.js'; import { AccountId } from '@polkadot/types/interfaces'; import { NodeRuntimeProxyType, PalletProxyProxyDefinition } from '@polkadot/types/lookup'; +import { createNamedHook } from './createNamedHook'; import { useAccounts } from './useAccounts'; import { useApi } from './useApi'; import { useCall } from './useCall'; -import { createNamedHook } from './useNamedHook'; function useProxiesImpl (): [PalletProxyProxyDefinition[], BN][] | undefined { const { api } = useApi(); diff --git a/packages/react-hooks/src/useRegistrars.ts b/packages/react-hooks/src/useRegistrars.ts index 77f3850db3..7cd219aec2 100644 --- a/packages/react-hooks/src/useRegistrars.ts +++ b/packages/react-hooks/src/useRegistrars.ts @@ -7,10 +7,10 @@ import type { Registrar } from './types'; import { useMemo } from 'react'; +import { createNamedHook } from './createNamedHook'; import { useAccounts } from './useAccounts'; import { useApi } from './useApi'; import { useCall } from './useCall'; -import { createNamedHook } from './useNamedHook'; interface RegistrarNull { address: string | null; diff --git a/packages/react-hooks/src/useSavedFlags.ts b/packages/react-hooks/src/useSavedFlags.ts index 61b242371c..7eae1aba53 100644 --- a/packages/react-hooks/src/useSavedFlags.ts +++ b/packages/react-hooks/src/useSavedFlags.ts @@ -36,6 +36,7 @@ function getSetters (flags: T, setFlags: React.Dispatch); } +// TODO Uses generics, we cannot use createNameHook as of yet export function useSavedFlags (storageKey: string, initial: T): State { const [flags, setFlags] = useState(() => getInitial(storageKey, initial)); const [setters] = useState(() => getSetters(initial, setFlags)); diff --git a/packages/react-hooks/src/useScroll.ts b/packages/react-hooks/src/useScroll.ts index 15bc81a0f6..5c285a4988 100644 --- a/packages/react-hooks/src/useScroll.ts +++ b/packages/react-hooks/src/useScroll.ts @@ -3,7 +3,9 @@ import { useCallback, useEffect, useState } from 'react'; -export function useScroll (): number { +import { createNamedHook } from './createNamedHook'; + +function useScrollImpl (): number { const [scrollY, setScrollY] = useState(window.pageYOffset); const setYOffset = useCallback((): void => setScrollY(window.pageYOffset), []); @@ -21,3 +23,5 @@ export function useScroll (): number { return scrollY; } + +export const useScroll = createNamedHook('useScroll', useScrollImpl); diff --git a/packages/react-hooks/src/useStakingInfo.ts b/packages/react-hooks/src/useStakingInfo.ts index 81a06e0f50..655185ecee 100644 --- a/packages/react-hooks/src/useStakingInfo.ts +++ b/packages/react-hooks/src/useStakingInfo.ts @@ -3,9 +3,9 @@ import type { DeriveStakingAccount } from '@polkadot/api-derive/types'; +import { createNamedHook } from './createNamedHook'; import { useApi } from './useApi'; import { useCall } from './useCall'; -import { createNamedHook } from './useNamedHook'; function useStakingInfoImpl (accountId: string | null): DeriveStakingAccount | undefined { const { api } = useApi(); diff --git a/packages/react-hooks/src/useStepper.ts b/packages/react-hooks/src/useStepper.ts index 7cfba6577d..a4c7ac9452 100644 --- a/packages/react-hooks/src/useStepper.ts +++ b/packages/react-hooks/src/useStepper.ts @@ -1,11 +1,13 @@ // Copyright 2017-2021 @polkadot/react-hooks authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { useCallback, useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; + +import { createNamedHook } from './createNamedHook'; type Result = [number, () => void, () => void, (step: number) => void]; -export function useStepper (): Result { +function useStepperImpl (): Result { const [step, setStep] = useState(1); const nextStep = useCallback( @@ -18,5 +20,10 @@ export function useStepper (): Result { [] ); - return [step, nextStep, prevStep, setStep]; + return useMemo( + () => [step, nextStep, prevStep, setStep], + [step, nextStep, prevStep, setStep] + ); } + +export const useStepper = createNamedHook('useStepper', useStepperImpl); diff --git a/packages/react-hooks/src/useSubidentities.ts b/packages/react-hooks/src/useSubidentities.ts index 5a5211781d..7f7bb69b0d 100644 --- a/packages/react-hooks/src/useSubidentities.ts +++ b/packages/react-hooks/src/useSubidentities.ts @@ -3,9 +3,9 @@ import { AccountId, BalanceOf } from '@polkadot/types/interfaces'; +import { createNamedHook } from './createNamedHook'; import { useApi } from './useApi'; import { useCall } from './useCall'; -import { createNamedHook } from './useNamedHook'; function useSubidentitiesImpl (address: string): AccountId[] | undefined { const { api } = useApi(); diff --git a/packages/react-hooks/src/useSudo.ts b/packages/react-hooks/src/useSudo.ts index 8314757b8c..a42e59dd05 100644 --- a/packages/react-hooks/src/useSudo.ts +++ b/packages/react-hooks/src/useSudo.ts @@ -6,10 +6,10 @@ import type { UseSudo } from './types'; import { useEffect, useState } from 'react'; +import { createNamedHook } from './createNamedHook'; import { useAccounts } from './useAccounts'; import { useApi } from './useApi'; import { useCall } from './useCall'; -import { createNamedHook } from './useNamedHook'; const transformSudo = { transform: (key: AccountId) => key.toString() diff --git a/packages/react-hooks/src/useTeleport.ts b/packages/react-hooks/src/useTeleport.ts index 5b22b96984..c3095b08eb 100644 --- a/packages/react-hooks/src/useTeleport.ts +++ b/packages/react-hooks/src/useTeleport.ts @@ -9,9 +9,9 @@ import { useEffect, useState } from 'react'; import { createWsEndpoints } from '@polkadot/apps-config'; import { isNumber } from '@polkadot/util'; +import { createNamedHook } from './createNamedHook'; import { useApi } from './useApi'; import { useCall } from './useCall'; -import { createNamedHook } from './useNamedHook'; interface Teleport { allowTeleport: boolean; diff --git a/packages/react-hooks/src/useToggle.ts b/packages/react-hooks/src/useToggle.ts index 0e259745c0..f50e25d5cd 100644 --- a/packages/react-hooks/src/useToggle.ts +++ b/packages/react-hooks/src/useToggle.ts @@ -1,12 +1,13 @@ // Copyright 2017-2021 @polkadot/react-hooks authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { useCallback, useEffect, useState } from 'react'; +import { useCallback, useEffect, useMemo, useState } from 'react'; +import { createNamedHook } from './createNamedHook'; import { useIsMountedRef } from './useIsMountedRef'; // Simple wrapper for a true/false toggle -export function useToggle (defaultValue = false, onToggle?: (isActive: boolean) => void): [boolean, () => void, (value: boolean) => void] { +function useToggleImpl (defaultValue = false, onToggle?: (isActive: boolean) => void): [boolean, () => void, (value: boolean) => void] { const mountedRef = useIsMountedRef(); const [isActive, setActive] = useState(defaultValue); @@ -29,5 +30,10 @@ export function useToggle (defaultValue = false, onToggle?: (isActive: boolean) [isActive, onToggle] ); - return [isActive, _toggleActive, _setActive]; + return useMemo( + () => [isActive, _toggleActive, _setActive], + [isActive, _toggleActive, _setActive] + ); } + +export const useToggle = createNamedHook('useToggle', useToggleImpl); diff --git a/packages/react-hooks/src/useTreasury.ts b/packages/react-hooks/src/useTreasury.ts index 148dd82e08..d55d507f2c 100644 --- a/packages/react-hooks/src/useTreasury.ts +++ b/packages/react-hooks/src/useTreasury.ts @@ -9,9 +9,9 @@ import { useEffect, useState } from 'react'; import { DeriveBalancesAccount } from '@polkadot/api-derive/types'; import { BN_MILLION, BN_ZERO, u8aConcat } from '@polkadot/util'; +import { createNamedHook } from './createNamedHook'; import { useApi } from './useApi'; import { useCall } from './useCall'; -import { createNamedHook } from './useNamedHook'; const EMPTY_U8A_32 = new Uint8Array(32); diff --git a/packages/react-hooks/src/useTxBatch.ts b/packages/react-hooks/src/useTxBatch.ts index 6ff0a902a5..5f15915a7b 100644 --- a/packages/react-hooks/src/useTxBatch.ts +++ b/packages/react-hooks/src/useTxBatch.ts @@ -9,9 +9,9 @@ import { useEffect, useMemo, useState } from 'react'; import { isFunction } from '@polkadot/util'; +import { createNamedHook } from './createNamedHook'; import { useAccounts } from './useAccounts'; import { useApi } from './useApi'; -import { createNamedHook } from './useNamedHook'; interface Options { batchSize?: number; diff --git a/packages/react-hooks/src/useVotingStatus.ts b/packages/react-hooks/src/useVotingStatus.ts index 90bdb17ca0..0190bbcb9c 100644 --- a/packages/react-hooks/src/useVotingStatus.ts +++ b/packages/react-hooks/src/useVotingStatus.ts @@ -9,9 +9,9 @@ import { useMemo } from 'react'; import { ApiPromise } from '@polkadot/api'; import { isFunction } from '@polkadot/util'; +import { createNamedHook } from './createNamedHook'; import { useApi } from './useApi'; import { useBestNumber } from './useBestNumber'; -import { createNamedHook } from './useNamedHook'; interface State { hasFailed: boolean; diff --git a/packages/react-hooks/src/useWeight.ts b/packages/react-hooks/src/useWeight.ts index d1b0cb33b5..fd420b3b3e 100644 --- a/packages/react-hooks/src/useWeight.ts +++ b/packages/react-hooks/src/useWeight.ts @@ -8,9 +8,9 @@ import { useEffect, useState } from 'react'; import { BN_ZERO, isFunction } from '@polkadot/util'; +import { createNamedHook } from './createNamedHook'; import { useApi } from './useApi'; import { useIsMountedRef } from './useIsMountedRef'; -import { createNamedHook } from './useNamedHook'; // a random address that we are using for our queries const ZERO_ACCOUNT = '5CAUdnwecHGxxyr5vABevAfZ34Fi4AaraDRMwfDQXQ52PXqg'; diff --git a/packages/react-hooks/src/useWeightFee.ts b/packages/react-hooks/src/useWeightFee.ts index 7008d177a8..e6b1299379 100644 --- a/packages/react-hooks/src/useWeightFee.ts +++ b/packages/react-hooks/src/useWeightFee.ts @@ -9,8 +9,8 @@ import { useMemo } from 'react'; import { BN_BILLION, BN_ZERO, bnToBn, isUndefined } from '@polkadot/util'; +import { createNamedHook } from './createNamedHook'; import { useApi } from './useApi'; -import { createNamedHook } from './useNamedHook'; function useWeightFeeImpl (weight: BN | number, apiOverride?: ApiPromise | null): BN { const { api } = useApi(); diff --git a/packages/react-hooks/src/useWindowSize.ts b/packages/react-hooks/src/useWindowSize.ts index e0812f3c3e..cf5e12c1e7 100644 --- a/packages/react-hooks/src/useWindowSize.ts +++ b/packages/react-hooks/src/useWindowSize.ts @@ -3,12 +3,14 @@ import { useEffect, useState } from 'react'; +import { createNamedHook } from './createNamedHook'; + export interface WindowSize { width: number; height: number; } -export function useWindowSize (): WindowSize { +function useWindowSizeImpl (): WindowSize { const [windowSize, setWindowSize] = useState({ height: 0, width: 0 @@ -30,3 +32,5 @@ export function useWindowSize (): WindowSize { return windowSize; } + +export const useWindowSize = createNamedHook('useWindowSize', useWindowSizeImpl); diff --git a/packages/react-params/src/Param/useParamDefs.ts b/packages/react-params/src/Param/useParamDefs.ts index cd59bcc97f..3528552ccc 100644 --- a/packages/react-params/src/Param/useParamDefs.ts +++ b/packages/react-params/src/Param/useParamDefs.ts @@ -6,6 +6,7 @@ import type { ParamDef } from '../types'; import { useEffect, useState } from 'react'; +import { createNamedHook } from '@polkadot/react-hooks'; import { getTypeDef } from '@polkadot/types/create'; function expandDef (registry: Registry, td: TypeDef): TypeDef { @@ -18,7 +19,7 @@ function expandDef (registry: Registry, td: TypeDef): TypeDef { } } -export default function useParamDefs (registry: Registry, type: TypeDef): ParamDef[] { +function useParamDefsImpl (registry: Registry, type: TypeDef): ParamDef[] { const [params, setParams] = useState([]); useEffect((): void => { @@ -39,3 +40,5 @@ export default function useParamDefs (registry: Registry, type: TypeDef): ParamD return params; } + +export default createNamedHook('useParamDefs', useParamDefsImpl);