From c339e7166ab8a4e665dff27682dade785c8f67fd Mon Sep 17 00:00:00 2001 From: Jaco Date: Sat, 2 Apr 2022 10:27:12 +0200 Subject: [PATCH] Rebag all dislocated (#7289) * Perform per-loaded bag rebag calculations * Allow global rebag --- packages/page-staking/src/Bags/Bag.tsx | 38 +++++---- packages/page-staking/src/Bags/Rebag.tsx | 77 +++++++++++++++++++ packages/page-staking/src/Bags/Stash.tsx | 14 ++-- packages/page-staking/src/Bags/Summary.tsx | 10 +-- packages/page-staking/src/Bags/index.tsx | 32 ++++---- packages/page-staking/src/Bags/types.ts | 4 +- packages/page-staking/src/Bags/useBagsList.ts | 10 +-- 7 files changed, 135 insertions(+), 50 deletions(-) create mode 100644 packages/page-staking/src/Bags/Rebag.tsx diff --git a/packages/page-staking/src/Bags/Bag.tsx b/packages/page-staking/src/Bags/Bag.tsx index cbecfd0cdc..1784823700 100644 --- a/packages/page-staking/src/Bags/Bag.tsx +++ b/packages/page-staking/src/Bags/Bag.tsx @@ -12,33 +12,34 @@ import { AddressMini, Spinner } from '@polkadot/react-components'; import { FormatBalance } from '@polkadot/react-query'; import { formatNumber } from '@polkadot/util'; +import Rebag from './Rebag'; import Stash from './Stash'; import useBagEntries from './useBagEntries'; import useBonded from './useBonded'; interface Props { + bagLower: BN; + bagUpper: BN; index: number; info: PalletBagsListListBag; - lower: BN; stashNodes?: StashNode[]; - upper: BN; } -function getRebags (bonded: ListNode[], stashNodes: StashNode[], lower: BN, upper: BN): string[] { +function getRebags (bonded: ListNode[], stashNodes: StashNode[], bagUpper: BN, bagLower: BN): string[] { return bonded .filter(({ bonded, stashId }) => ( - bonded.gt(upper) || - bonded.lt(lower) + bonded.gt(bagUpper) || + bonded.lt(bagLower) ) && stashNodes.every((n) => n.stashId !== stashId) ) .map(({ stashId }) => stashId); } -function Bag ({ info, lower, stashNodes, upper }: Props): React.ReactElement { +function Bag ({ bagLower, bagUpper, info, stashNodes }: Props): React.ReactElement { const [[headId, trigger], setHeadId] = useState<[AccountId32 | null, number]>([null, 0]); - const [, setRebags] = useState([]); + const [rebags, setRebags] = useState([]); const [isLoading, setLoading] = useState(true); const [isCompleted, list] = useBagEntries(headId, trigger); const bonded = useBonded(list); @@ -56,32 +57,28 @@ function Bag ({ info, lower, stashNodes, upper }: Props): React.ReactElement { - // NOTE: There may be some issues if these are indeed rebagged - we need - // the StashNode to see if this item is indeed still within this list !isLoading && bonded && stashNodes && setRebags( - getRebags(bonded, stashNodes, lower, upper) + getRebags(bonded, stashNodes, bagUpper, bagLower) ); - }, [bonded, isLoading, lower, stashNodes, upper]); + }, [bagLower, bagUpper, bonded, isLoading, stashNodes]); return ( - - + + {info.head.isSome && } {info.tail.isSome && } {stashNodes?.map(({ stashId }) => ( ))} @@ -93,6 +90,13 @@ function Bag ({ info, lower, stashNodes, upper }: Props): React.ReactElement + + + ); } diff --git a/packages/page-staking/src/Bags/Rebag.tsx b/packages/page-staking/src/Bags/Rebag.tsx new file mode 100644 index 0000000000..40e3850410 --- /dev/null +++ b/packages/page-staking/src/Bags/Rebag.tsx @@ -0,0 +1,77 @@ +// Copyright 2017-2022 @polkadot/app-staking authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import type { BN } from '@polkadot/util'; + +import React, { useMemo, useState } from 'react'; + +import { Button, InputAddress, Modal, TxButton } from '@polkadot/react-components'; +import { useApi, useToggle, useTxBatch } from '@polkadot/react-hooks'; + +import { useTranslation } from '../translate'; +import useBagsNodes from './useBagsNodes'; + +interface Props { + bagLower: BN; + bagUpper: BN; + stashIds: string[]; +} + +function Rebag ({ bagUpper, stashIds }: Props): React.ReactElement | null { + const { t } = useTranslation(); + const { api } = useApi(); + const [accountId, setAccountId] = useState(null); + const [isVisible, toggleVisible] = useToggle(); + const map = useBagsNodes(stashIds); + const changes = useMemo( + () => map && Object + .values(map[bagUpper.toString()] || {}) + .map(({ stashId }) => api.tx.bagsList.rebag(stashId)), + [api, bagUpper, map] + ); + const tx = useTxBatch(changes); + + if (!changes || !changes.length) { + return null; + } + + return ( + <> +