polkadot-js/apps

View on GitHub
packages/page-staking-legacy/src/Actions/Pool/useAccountInfo.ts

Summary

Maintainability
C
1 day
Test Coverage
// Copyright 2017-2024 @polkadot/app-staking authors & contributors
// SPDX-License-Identifier: Apache-2.0

import type { Option } from '@polkadot/types';
import type { PalletNominationPoolsPoolMember } from '@polkadot/types/lookup';
import type { AccountInfo } from './types.js';

import { useEffect, useState } from 'react';

import { createNamedHook, useApi, useCall, useIsMountedRef } from '@polkadot/react-hooks';

const OPT_DEL = {
  transform: (opt: Option<PalletNominationPoolsPoolMember>): PalletNominationPoolsPoolMember | null =>
    opt.unwrapOr(null)
};

function useAccountInfoImpl (accountId: string): AccountInfo | null {
  const { api } = useApi();
  const isMountedRef = useIsMountedRef();
  const [state, setState] = useState<AccountInfo | null>(null);
  const member = useCall(api.query.nominationPools.poolMembers, [accountId], OPT_DEL);

  useEffect((): void => {
    member &&
      api.call.nominationPoolsApi
        ?.pendingRewards(accountId)
        .then((claimable) =>
          isMountedRef.current && setState({ claimable, member })
        )
        .catch(console.error);
  }, [accountId, member, api, isMountedRef]);

  return state;
}

export default createNamedHook('useAccountInfo', useAccountInfoImpl);