diff --git a/packages/page-parachains/src/Crowdloan/Fund.tsx b/packages/page-parachains/src/Crowdloan/Fund.tsx index d777a9970c..aa95cb4037 100644 --- a/packages/page-parachains/src/Crowdloan/Fund.tsx +++ b/packages/page-parachains/src/Crowdloan/Fund.tsx @@ -21,7 +21,7 @@ interface Props { value: Campaign; } -function Fund ({ bestNumber, className, isOngoing, value: { info: { cap, depositor, end, firstSlot, lastSlot, raised, retiring }, isCapped, isEnded, isWinner, paraId } }: Props): React.ReactElement { +function Fund ({ bestNumber, className, isOngoing, value: { info: { cap, depositor, end, firstSlot, lastSlot, raised, retiring }, isCapped, isEnded, isRetired, isWinner, paraId, retireEnd } }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); const { allAccounts } = useAccounts(); @@ -35,9 +35,18 @@ function Fund ({ bestNumber, className, isOngoing, value: { info: { cap, deposit [allAccounts, depositor] ); - const blocksLeft = useMemo( - () => bestNumber && end.gt(bestNumber) && end.sub(bestNumber), - [bestNumber, end] + const [blocksLeft, retiringLeft] = useMemo( + () => bestNumber + ? [ + end.gt(bestNumber) + ? end.sub(bestNumber) + : null, + retireEnd?.gt(bestNumber) + ? retireEnd.sub(bestNumber) + : null + ] + : [null, null], + [bestNumber, end, retireEnd] ); // TODO Dissolve should look at retirement and the actual period @@ -50,25 +59,35 @@ function Fund ({ bestNumber, className, isOngoing, value: { info: { cap, deposit ); const canContribute = blocksLeft && !isCapped && !isWinner && retiring.isFalse; - const canDissolve = raised.isZero(); + const canDissolve = raised.isZero() || isRetired; return (

{formatNumber(paraId)}

- {retiring.isTrue - ? t('Retiring') - : isWinner - ? t('Winner') - : blocksLeft - ? isCapped - ? t('Capped') - : t('Active') - : t('Ended') + {isWinner + ? t('Winner') + : isRetired + ? t('Retired') + : retiring.isTrue + ? t('Retiring') + : blocksLeft + ? isCapped + ? t('Capped') + : t('Active') + : t('Ended') } + {!isOngoing && ( + + {retiringLeft && retiring.isTrue && ( + + )} + {!blocksLeft && <>#{formatNumber(retireEnd)}} + + )} {blocksLeft && ( @@ -85,31 +104,29 @@ function Fund ({ bestNumber, className, isOngoing, value: { info: { cap, deposit />
{percentage}
- {isOngoing && ( - - {canDissolve && ( - ('Dissolve') - : t('Cancel') - } - params={[paraId]} - tx={api.tx.crowdloan.dissolve} - /> - )} - {canContribute && ( - - )} - - )} + + {canDissolve && ( + ('Dissolve') + : t('Cancel') + } + params={[paraId]} + tx={api.tx.crowdloan.dissolve} + /> + )} + {isOngoing && canContribute && ( + + )} + ); } diff --git a/packages/page-parachains/src/Crowdloan/Funds.tsx b/packages/page-parachains/src/Crowdloan/Funds.tsx index 3987cd9dde..231145d43e 100644 --- a/packages/page-parachains/src/Crowdloan/Funds.tsx +++ b/packages/page-parachains/src/Crowdloan/Funds.tsx @@ -19,7 +19,10 @@ interface Props { function extractLists (value: Campaign[] | null): [Campaign[] | null, Campaign[] | null] { return value - ? [value.filter(({ isEnded }) => !isEnded), value.filter(({ isEnded }) => isEnded)] + ? [ + value.filter(({ isCapped, isEnded, isWinner }) => !(isCapped || isEnded || isWinner)), + value.filter(({ isCapped, isEnded, isWinner }) => (isCapped || isEnded || isWinner)) + ] : [null, null]; } @@ -36,9 +39,11 @@ function Funds ({ bestNumber, className, value }: Props): React.ReactElement [ bestNumber.gt(end) ? ar : ar.iadd(raised), bestNumber.gt(end) ? ac : ac.iadd(cap), @@ -83,7 +92,7 @@ function createResult (bestNumber: BlockNumber, minContribution: BN, funds: Camp !prev.funds || prev.funds.length !== funds.length || hasNewActiveCap || hasNewActiveRaised || hasNewTotalCap || hasNewTotalRaised || - funds.some((c) => isFundUpdated(bestNumber, minContribution, c, leases)) || + funds.some((c) => isFundUpdated(bestNumber, minContribution, retirementPeriod, c, leases)) || true; if (!hasChanged) { @@ -98,21 +107,25 @@ function createResult (bestNumber: BlockNumber, minContribution: BN, funds: Camp ? activeRaised : prev.activeRaised, funds: funds - .map((c) => updateCampaign(bestNumber, minContribution, c, leases)) + .map((c) => updateCampaign(bestNumber, minContribution, retirementPeriod, c, leases)) .sort((a, b) => a.isWinner !== b.isWinner ? a.isWinner - ? 1 - : -1 + ? -1 + : 1 : a.isCapped !== b.isCapped ? a.isCapped - ? 1 - : -1 - : a.isEnded !== b.isEnded - ? a.isEnded + ? -1 + : 1 + : a.isRetired !== b.isRetired + ? a.isRetired ? 1 : -1 - : 0 + : a.isEnded !== b.isEnded + ? a.isEnded + ? 1 + : -1 + : 0 ), totalCap: hasNewTotalCap ? totalCap @@ -168,7 +181,7 @@ export default function useFunds (): Result { // here we manually add the actual ending status and calculate the totals useEffect((): void => { bestNumber && campaigns && leases && setResult((prev) => - createResult(bestNumber, api.consts.crowdloan.minContribution as BlockNumber, campaigns, leases, prev) + createResult(bestNumber, api.consts.crowdloan.minContribution as BlockNumber, api.consts.crowdloan.retirementPeriod as BlockNumber, campaigns, leases, prev) ); }, [api, bestNumber, campaigns, leases]);