diff --git a/src/canvas/PoolMembers/Lists/FetchPage.tsx b/src/canvas/PoolMembers/Lists/FetchPage.tsx index 22018ef3a0..0f56e0f7ea 100644 --- a/src/canvas/PoolMembers/Lists/FetchPage.tsx +++ b/src/canvas/PoolMembers/Lists/FetchPage.tsx @@ -51,7 +51,7 @@ export const MembersListInner = ({ }; // pagination - const totalPages = Math.ceil(memberCount / listItemsPerPage); + const totalPages = Math.ceil(Number(memberCount) / listItemsPerPage); const pageEnd = listItemsPerPage - 1; const pageStart = pageEnd - (listItemsPerPage - 1); diff --git a/src/canvas/PoolMembers/Lists/types.ts b/src/canvas/PoolMembers/Lists/types.ts index 4afd4dcd56..c6f74832ef 100644 --- a/src/canvas/PoolMembers/Lists/types.ts +++ b/src/canvas/PoolMembers/Lists/types.ts @@ -15,5 +15,5 @@ export type DefaultMembersListProps = MembersListProps & { }; export type FetchpageMembersListProps = MembersListProps & { - memberCount: number; + memberCount: string; }; diff --git a/src/canvas/PoolMembers/Members.tsx b/src/canvas/PoolMembers/Members.tsx index 4e6bf6e8ee..de96654816 100644 --- a/src/canvas/PoolMembers/Members.tsx +++ b/src/canvas/PoolMembers/Members.tsx @@ -18,8 +18,7 @@ export const Members = () => { const { mode } = useTheme(); const { pluginEnabled } = usePlugins(); const { getMembersOfPoolFromNode } = usePoolMembers(); - const { activePool, isOwner, isBouncer, activePoolMemberCount } = - useActivePool(); + const { activePool, isOwner, isBouncer } = useActivePool(); const { colors } = useNetwork().networkData; const annuncementBorderColor = colors.secondary[mode]; @@ -27,6 +26,8 @@ export const Members = () => { const showBlockedPrompt = activePool?.bondedPool?.state === 'Blocked' && (isOwner() || isBouncer()); + const memberCount = activePool?.bondedPool?.memberCounter ?? '0'; + const membersListProps = { batchKey: 'active_pool_members', pagination: true, @@ -80,7 +81,7 @@ export const Members = () => { {pluginEnabled('subscan') ? ( ) : ( {}, activePool: null, activePoolNominations: null, - activePoolMemberCount: 0, pendingPoolRewards: new BigNumber(0), }; diff --git a/src/contexts/Pools/ActivePool/index.tsx b/src/contexts/Pools/ActivePool/index.tsx index b8904850af..6d360ce834 100644 --- a/src/contexts/Pools/ActivePool/index.tsx +++ b/src/contexts/Pools/ActivePool/index.tsx @@ -11,16 +11,12 @@ import { useRef, useState, } from 'react'; -import type { Sync } from 'types'; import { useEffectIgnoreInitial } from '@w3ux/hooks'; -import { usePlugins } from 'contexts/Plugins'; import { useNetwork } from 'contexts/Network'; import { useActiveAccounts } from 'contexts/ActiveAccounts'; import { useApi } from '../../Api'; import { useBondedPools } from '../BondedPools'; -import { usePoolMembers } from '../PoolMembers'; import type { ActivePoolContextState } from './types'; -import { SubscanController } from 'controllers/SubscanController'; import { useCreatePoolAccounts } from 'hooks/useCreatePoolAccounts'; import { useBalances } from 'contexts/Balances'; import { ActivePoolsController } from 'controllers/ActivePoolsController'; @@ -38,12 +34,11 @@ export const useActivePool = () => useContext(ActivePoolContext); export const ActivePoolProvider = ({ children }: { children: ReactNode }) => { const { network } = useNetwork(); const { isReady, api } = useApi(); - const { pluginEnabled } = usePlugins(); const { getPoolMembership } = useBalances(); const { activeAccount } = useActiveAccounts(); const createPoolAccounts = useCreatePoolAccounts(); - const { getMembersOfPoolFromNode } = usePoolMembers(); const { getAccountPoolRoles, bondedPools } = useBondedPools(); + const membership = getPoolMembership(activeAccount); // Determine active pools to subscribe to. Dependencies of `activeAccount`, and `membership` mean @@ -103,12 +98,6 @@ export const ActivePoolProvider = ({ children }: { children: ReactNode }) => { ? poolNominations[activePoolId] : null; - // Store the member count of the selected pool. - const [activePoolMemberCount, setactivePoolMemberCount] = useState(0); - - // Keep track of whether the pool member count is being fetched. - const fetchingMemberCount = useRef('unsynced'); - // Sync active pool subscriptions. const syncActivePoolSubscriptions = async () => { if (api && accountPoolIds.length) { @@ -230,41 +219,6 @@ export const ActivePoolProvider = ({ children }: { children: ReactNode }) => { return new BigNumber(0); }; - // Gets the member count of the currently selected pool. If Subscan is enabled, it is used instead of the connected node. - const getMemberCount = async () => { - if (!activePool?.id) { - setactivePoolMemberCount(0); - return; - } - // If `Subscan` plugin is enabled, fetch member count directly from the API. - if ( - pluginEnabled('subscan') && - fetchingMemberCount.current === 'unsynced' - ) { - fetchingMemberCount.current = 'syncing'; - const poolDetails = await SubscanController.handleFetchPoolDetails( - activePool.id - ); - fetchingMemberCount.current = 'synced'; - setactivePoolMemberCount(poolDetails?.member_count || 0); - return; - } - // If no plugin available, fetch all pool members from RPC and filter them to determine current - // pool member count. NOTE: Expensive operation. - setactivePoolMemberCount( - getMembersOfPoolFromNode(activePool?.id || 0)?.length || 0 - ); - }; - - // Fetch pool member count. We use `membership` as a dependency as the member count could change - // in the UI when active account's membership changes. NOTE: Do not have `poolMembersNode` as a - // dependency - could trigger many re-renders if value is constantly changing - more suited as a - // custom event. - useEffect(() => { - fetchingMemberCount.current = 'unsynced'; - getMemberCount(); - }, [activeAccount, activePool, membership?.poolId]); - // Re-calculate pending rewards when membership changes. useEffectIgnoreInitial(() => { if (isReady) { @@ -308,7 +262,6 @@ export const ActivePoolProvider = ({ children }: { children: ReactNode }) => { getPoolRoles, setActivePoolId, activePool, - activePoolMemberCount, activePoolNominations, pendingPoolRewards, }} diff --git a/src/contexts/Pools/ActivePool/types.ts b/src/contexts/Pools/ActivePool/types.ts index bf30385589..1ef0b32509 100644 --- a/src/contexts/Pools/ActivePool/types.ts +++ b/src/contexts/Pools/ActivePool/types.ts @@ -19,7 +19,6 @@ export interface ActivePoolContextState { setActivePoolId: (p: string) => void; activePool: ActivePool | null; activePoolNominations: Nominations | null; - activePoolMemberCount: number; pendingPoolRewards: BigNumber; } diff --git a/src/controllers/SubscanController/index.ts b/src/controllers/SubscanController/index.ts index a83d14c99a..4d30175e9c 100644 --- a/src/controllers/SubscanController/index.ts +++ b/src/controllers/SubscanController/index.ts @@ -5,7 +5,6 @@ import type { SubscanPoolClaim, SubscanData, SubscanPayout, - SubscanPoolDetails, SubscanPoolMember, SubscanRequestBody, SubscanEraPoints, @@ -26,7 +25,6 @@ export class SubscanController { // List of endpoints to be used for Subscan API calls. static ENDPOINTS = { eraStat: '/api/scan/staking/era_stat', - poolDetails: '/api/scan/nomination_pool/pool', poolMembers: '/api/scan/nomination_pool/pool/members', poolRewards: '/api/scan/nomination_pool/rewards', rewardSlash: '/api/v2/scan/account/reward_slash', @@ -45,7 +43,7 @@ export class SubscanController { static payoutData: Record = {}; // Subscan pool data, keyed by `---...`. - static poolData: Record = {}; + static poolData: Record = {}; // Subscan era points data, keyed by `-
-`. static eraPointsData: Record = {}; @@ -178,19 +176,6 @@ export class SubscanController { .splice(0, result.list.length - 1); }; - // Fetch a pool's details from Subscan. - static fetchPoolDetails = async ( - poolId: number - ): Promise => { - const result = await this.makeRequest(this.ENDPOINTS.poolDetails, { - pool_id: poolId, - }); - if (!result) { - return { member_count: 0 }; - } - return { member_count: result.member_count }; - }; - // Fetch a pool's era points from Subscan. static fetchEraPoints = async ( address: string, @@ -235,20 +220,6 @@ export class SubscanController { } }; - // Handle fetching pool details. - static handleFetchPoolDetails = async (poolId: number) => { - const dataKey = `${this.network}-${poolId}-details}`; - const currentValue = this.poolData[dataKey]; - - if (currentValue) { - return currentValue as SubscanPoolDetails; - } else { - const result = await this.fetchPoolDetails(poolId); - this.poolData[dataKey] = result; - return result; - } - }; - // Handle fetching era point history. static handleFetchEraPoints = async (address: string, era: number) => { const dataKey = `${this.network}-${address}-${era}}`; diff --git a/src/controllers/SubscanController/types.ts b/src/controllers/SubscanController/types.ts index a436a3a65a..02d11191b0 100644 --- a/src/controllers/SubscanController/types.ts +++ b/src/controllers/SubscanController/types.ts @@ -39,8 +39,7 @@ export interface SubscanRequestPagination { export type SubscanResult = | SubscanPayout[] | SubscanPoolClaim[] - | SubscanPoolMember[] - | SubscanPoolDetails; + | SubscanPoolMember[]; export interface SubscanPoolClaim { account_display: { @@ -89,10 +88,6 @@ export interface SubscanPoolMember { claimable: string; } -export interface SubscanPoolDetails { - member_count: number; -} - export interface SubscanEraPoints { era: number; reward_point: number; diff --git a/src/pages/Pools/Home/PoolStats/index.tsx b/src/pages/Pools/Home/PoolStats/index.tsx index d9861e2dca..9f66c2afec 100644 --- a/src/pages/Pools/Home/PoolStats/index.tsx +++ b/src/pages/Pools/Home/PoolStats/index.tsx @@ -20,12 +20,12 @@ export const PoolStats = () => { const { networkData: { units, unit }, } = useNetwork(); + const { activePool } = useActivePool(); const { getCurrentCommission } = usePoolCommission(); - const { activePool, activePoolMemberCount } = useActivePool(); const poolId = activePool?.id || 0; - const { state, points } = activePool?.bondedPool || {}; + const { state, points, memberCounter } = activePool?.bondedPool || {}; const currentCommission = getCurrentCommission(poolId); const bonded = planckToUnit( @@ -65,13 +65,13 @@ export const PoolStats = () => { items.push( { label: t('pools.poolMembers'), - value: `${activePoolMemberCount}`, + value: `${memberCounter}`, button: { text: t('pools.browseMembers'), onClick: () => { openCanvas({ key: 'PoolMembers', size: 'xl' }); }, - disabled: activePoolMemberCount === 0, + disabled: memberCounter === '0', }, }, {