// Copyright 2017-2022 @polkadot/app-staking authors & contributors // SPDX-License-Identifier: Apache-2.0 import type { BN } from '@polkadot/util'; import type { MembersMapEntry, Params } from './types'; import React, { useCallback } from 'react'; import styled from 'styled-components'; import { AddressMini, ExpandButton, ExpanderScroll, Spinner } from '@polkadot/react-components'; import { useToggle } from '@polkadot/react-hooks'; import { FormatBalance } from '@polkadot/react-query'; import { formatNumber } from '@polkadot/util'; import { useTranslation } from '../translate'; import Join from './Join'; import usePoolInfo from './usePoolInfo'; interface Props { className?: string; members: MembersMapEntry[]; ownAccounts?: string[]; params: Params; poolId: BN; } function Pool ({ className = '', members, ownAccounts, params, poolId }: Props): React.ReactElement { const { t } = useTranslation(); const info = usePoolInfo(poolId); const [isExpanded, toggleExpanded] = useToggle(false); const renderMembers = useCallback( () => members.map(({ accountId, member }, count) => ( )), [members] ); const renderNominees = useCallback( () => info && info.nominating.map((stashId, count) => ( )), [info] ); return ( <>

{formatNumber(poolId)}

{info && info.metadata} {info && info.bonded.state.type} {info && } {info && !info.rewardClaimable.isZero() && } {info && info.nominating.length !== 0 && ( ('No nominees')} renderChildren={renderNominees} summary={t('Nominees ({{count}})', { replace: { count: info.nominating.length } })} /> )} {members && members.length !== 0 && ( ('No members')} renderChildren={renderMembers} summary={t('Members ({{count}})', { replace: { count: members.length } })} /> )} {info ? ( <> ) : } {info && isExpanded && (
{t('creator')}
{info.bonded.roles.root.isSome && (
{t('root')}
)} {info.bonded.roles.nominator.isSome && (
{t('nominator')}
)} {info.bonded.roles.stateToggler.isSome && (
{t('toggler')}
)}
{t('stash')}
{t('rewards')}
)} ); } export default React.memo(styled(Pool)` .label-column-right, .label-column-left{ display: flex; align-items: center; .label { width: 50%; } } .label { text-align: right; padding: 0 1.7rem 0 0; line-height: normal; color: var(--color-label); text-transform: lowercase; } `);