// Copyright 2017-2023 @polkadot/react-components authors & contributors // SPDX-License-Identifier: Apache-2.0 import type { SiDef } from '@polkadot/util/types'; import React, { useMemo } from 'react'; import styled from 'styled-components'; import { BN, BN_TEN, formatBalance, isString, isUndefined } from '@polkadot/util'; import InputNumber from './InputNumber'; interface Props { autoFocus?: boolean; children?: React.ReactNode; className?: string; defaultValue?: BN | string; help?: React.ReactNode; isDisabled?: boolean; isError?: boolean; isFull?: boolean; isWarning?: boolean; isZeroable?: boolean; label?: React.ReactNode; labelExtra?: React.ReactNode; maxValue?: BN; onChange?: (value?: BN) => void; onEnter?: () => void; onEscape?: () => void; placeholder?: string; siDecimals?: number; siSymbol?: string; value?: BN; withEllipsis?: boolean; withLabel?: boolean; withMax?: boolean; } const DEFAULT_BITLENGTH = 128; function reformat (value?: string | BN, isDisabled?: boolean, siDecimals?: number): { defaultValue?: string; siDefault?: SiDef } { if (!value) { return {}; } const decimals = isUndefined(siDecimals) ? formatBalance.getDefaults().decimals : siDecimals; const maxDisabled = BN_TEN.pow(new BN(decimals - 1)).toString(10); const siDefault = isString(value) && (value.length < maxDisabled.length) && value !== '0' ? formatBalance.calcSi(value.toString(), decimals) : formatBalance.findSi('-'); const defaultValue = formatBalance(value, { decimals, forceUnit: siDefault.value, withSi: false }); return { defaultValue: isDisabled ? defaultValue : defaultValue.replace(/,/g, isDisabled ? ',' : ''), siDefault }; } function InputBalance ({ autoFocus, children, className = '', defaultValue: inDefault, help, isDisabled, isError, isFull, isWarning, isZeroable, label, labelExtra, maxValue, onChange, onEnter, onEscape, placeholder, siDecimals, siSymbol, value, withEllipsis, withLabel, withMax }: Props): React.ReactElement { const { defaultValue, siDefault } = useMemo( () => reformat(inDefault, isDisabled, siDecimals), [inDefault, isDisabled, siDecimals] ); return ( {children} ); } export default React.memo(styled(InputBalance)` &&:not(.isSmall) .labelExtra { right: 6.5rem; } .ui.action.input.ui--Input > .buttons { align-items: stretch; .ui--SiDropdown.ui.button.compact.floating.selection.dropdown { &.disabled { border-style: solid; opacity: 1 !important; } > div.text:first-child { font-size: var(--font-size-small); position: absolute; top: 50%; transform: translateY(-50%); left: 0.5rem; width: 3rem; } } } `);