// Copyright 2017-2020 @polkadot/app-staking authors & contributors // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. import { DeriveSessionIndexes } from '@polkadot/api-derive/types'; import { SessionRewards } from '../types'; import { useEffect, useState } from 'react'; import { useApi, useCall, useIsMountedRef } from '@polkadot/react-hooks'; import { u32 } from '@polkadot/types'; export default function useBlockCounts (accountId: string, sessionRewards: SessionRewards[]): u32[] { const { api } = useApi(); const mountedRef = useIsMountedRef(); const indexes = useCall(api.derive.session?.indexes, []); const current = useCall(api.query.imOnline?.authoredBlocks, [indexes?.currentIndex, accountId]); const [counts, setCounts] = useState([]); const [historic, setHistoric] = useState([]); useEffect((): void => { if (api.query.imOnline?.authoredBlocks && sessionRewards?.length) { const filtered = sessionRewards.filter(({ sessionIndex }): boolean => sessionIndex.gtn(0)); if (filtered.length) { Promise .all(filtered.map(({ parentHash, sessionIndex }): Promise => api.query.imOnline.authoredBlocks.at(parentHash, sessionIndex.subn(1), accountId) as Promise )) .then((historic): void => { mountedRef.current && setHistoric(historic); }); } } }, [accountId, api, mountedRef, sessionRewards]); useEffect((): void => { setCounts([...historic, current || api.createType('u32')].slice(1)); }, [api, current, historic]); return counts; }