diff --git a/packages/page-crowdloan/src/Fund.tsx b/packages/page-crowdloan/src/Fund.tsx index 7534d517b8..750838ca3f 100644 --- a/packages/page-crowdloan/src/Fund.tsx +++ b/packages/page-crowdloan/src/Fund.tsx @@ -10,6 +10,8 @@ import { AddressMini, ParaLink } from '@polkadot/react-components'; import { BlockToTime, FormatBalance } from '@polkadot/react-query'; import { formatNumber } from '@polkadot/util'; +import FundContribute from './FundContribute'; + interface Props { bestNumber?: BN; className?: string; @@ -18,21 +20,41 @@ interface Props { } function Fund ({ bestNumber, className, info: { cap, depositor, end, raised }, paraId }: Props): React.ReactElement { - const remaining = useMemo(() => bestNumber && end.sub(bestNumber), [bestNumber, end]); + const remaining = useMemo( + () => bestNumber && end.gt(bestNumber) && end.sub(bestNumber), + [bestNumber, end] + ); + + const percentage = useMemo( + () => `${(raised.muln(10000).div(cap).toNumber() / 100).toFixed(2)}%`, + [cap, raised] + ); return (

{formatNumber(paraId)}

- + + +
{percentage}
+ {remaining && ( <> #{formatNumber(end)} )} + + {remaining && ( + + )} + ); } diff --git a/packages/page-crowdloan/src/FundAdd.tsx b/packages/page-crowdloan/src/FundAdd.tsx index e1802c7117..aff3ea3b97 100644 --- a/packages/page-crowdloan/src/FundAdd.tsx +++ b/packages/page-crowdloan/src/FundAdd.tsx @@ -122,6 +122,7 @@ function FundAdd ({ bestNumber, className }: Props): React.ReactElement { accountId={accountId} icon='plus' isDisabled={!paraId?.gt(BN_ZERO) || !cap?.gt(BN_ZERO) || !firstSlot?.gt(BN_ZERO) || isEndError || isLastError} + label={t('Add')} onStart={toggleOpen} params={[paraId, cap, firstSlot, lastSlot, endBlock, null]} tx={api.tx.crowdloan.create} diff --git a/packages/page-crowdloan/src/FundContribute.tsx b/packages/page-crowdloan/src/FundContribute.tsx new file mode 100644 index 0000000000..300a2b12c4 --- /dev/null +++ b/packages/page-crowdloan/src/FundContribute.tsx @@ -0,0 +1,102 @@ +// Copyright 2017-2021 @polkadot/app-crowdloan authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import type BN from 'bn.js'; +import type { Balance, ParaId } from '@polkadot/types/interfaces'; + +import React, { useMemo, useState } from 'react'; + +import { Button, InputAddress, InputBalance, Modal, TxButton } from '@polkadot/react-components'; +import { useAccounts, useApi, useToggle } from '@polkadot/react-hooks'; +import { BN_ZERO } from '@polkadot/util'; + +import { useTranslation } from './translate'; + +interface Props { + cap: Balance; + className?: string; + paraId: ParaId; + raised: Balance; +} + +function FundContribute ({ cap, className, paraId, raised }: Props): React.ReactElement { + const { t } = useTranslation(); + const { api } = useApi(); + const { hasAccounts } = useAccounts(); + const [isOpen, toggleOpen] = useToggle(); + const [accountId, setAccountId] = useState(null); + const [amount, setAmount] = useState(); + + const maxAmount = useMemo( + () => cap.sub(raised), + [cap, raised] + ); + + // TODO verifier signature + // TODO check against min contribution + + const isAmountError = !amount?.gt(BN_ZERO); + + return ( + <> +