mirror of
https://github.com/pezkuwichain/pezkuwi-apps.git
synced 2026-06-13 02:21:02 +00:00
d21bfb1320
Rebranded terminology: - Polkadot → Pezkuwi - Kusama → Dicle - Westend → Zagros - Rococo → PezkuwiChain - Substrate → Bizinikiwi - parachain → teyrchain Custom logos with Kurdistan brand colors (#e6007a → #86e62a): - bizinikiwi-hexagon.svg - sora-bizinikiwi.svg - hezscanner.svg - heztreasury.svg - pezkuwiscan.svg - pezkuwistats.svg - pezkuwiassembly.svg - pezkuwiholic.svg
93 lines
2.8 KiB
TypeScript
93 lines
2.8 KiB
TypeScript
// Copyright 2017-2025 @pezkuwi/app-staking-async authors & contributors
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
import type { PalletStakingStakingLedger } from '@pezkuwi/types/lookup';
|
|
import type { BN } from '@pezkuwi/util';
|
|
|
|
import React, { useState } from 'react';
|
|
|
|
import { InputBalance, Modal, Static, styled, TxButton } from '@pezkuwi/react-components';
|
|
import { useApi } from '@pezkuwi/react-hooks';
|
|
import { BlockToTime, FormatBalance } from '@pezkuwi/react-query';
|
|
import { BN_ZERO } from '@pezkuwi/util';
|
|
|
|
import { useTranslation } from '../../translate.js';
|
|
import SenderInfo from '../partials/SenderInfo.js';
|
|
import useUnbondDuration from '../useUnbondDuration.js';
|
|
|
|
interface Props {
|
|
controllerId?: string | null;
|
|
onClose: () => void;
|
|
stakingLedger?: PalletStakingStakingLedger;
|
|
stashId: string;
|
|
}
|
|
|
|
function Unbond ({ controllerId, onClose, stakingLedger, stashId }: Props): React.ReactElement<Props> {
|
|
const { t } = useTranslation();
|
|
const { api } = useApi();
|
|
const bondedBlocks = useUnbondDuration();
|
|
const [maxBalance] = useState<BN | null>(() => stakingLedger?.active?.unwrap() || null);
|
|
const [maxUnbond, setMaxUnbond] = useState<BN | undefined>();
|
|
|
|
return (
|
|
<StyledModal
|
|
header={t('Unbond funds')}
|
|
onClose={onClose}
|
|
size='large'
|
|
>
|
|
<Modal.Content>
|
|
<SenderInfo
|
|
controllerId={controllerId}
|
|
stashId={stashId}
|
|
/>
|
|
<Modal.Columns hint={t('The funds will only be available for withdrawal after the unbonding period, however will not be part of the staked amount after the next validator election. You can follow the unlock countdown in the UI.')}>
|
|
<InputBalance
|
|
autoFocus
|
|
defaultValue={maxBalance}
|
|
label={t('unbond amount')}
|
|
labelExtra={
|
|
<FormatBalance
|
|
label={<span className='label'>{t('bonded')}</span>}
|
|
value={maxBalance}
|
|
/>
|
|
}
|
|
maxValue={maxBalance}
|
|
onChange={setMaxUnbond}
|
|
withMax
|
|
/>
|
|
{bondedBlocks?.gtn(0) && (
|
|
<Static
|
|
label={t('on-chain bonding duration')}
|
|
>
|
|
<BlockToTime value={bondedBlocks} />
|
|
</Static>
|
|
)}
|
|
</Modal.Columns>
|
|
</Modal.Content>
|
|
<Modal.Actions>
|
|
<TxButton
|
|
accountId={controllerId}
|
|
icon='unlock'
|
|
isDisabled={!maxUnbond?.gt(BN_ZERO)}
|
|
label={t('Unbond')}
|
|
onStart={onClose}
|
|
params={[maxUnbond]}
|
|
tx={api.tx.staking.unbond}
|
|
/>
|
|
</Modal.Actions>
|
|
</StyledModal>
|
|
);
|
|
}
|
|
|
|
const StyledModal = styled(Modal)`
|
|
.staking--Unbond--max > div {
|
|
justify-content: flex-end;
|
|
|
|
& .column {
|
|
flex: 0;
|
|
}
|
|
}
|
|
`;
|
|
|
|
export default React.memo(Unbond);
|