import React, { useState, useContext, useEffect } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import PropTypes from 'prop-types'; import { I18nContext } from '../../../contexts/i18n'; import Box from '../../ui/box'; import FormField from '../../ui/form-field'; import Typography from '../../ui/typography'; import { ALIGN_ITEMS, COLORS, DISPLAY, FLEX_DIRECTION, TEXT_ALIGN, FONT_WEIGHT, TYPOGRAPHY, JUSTIFY_CONTENT, SIZES, } from '../../../helpers/constants/design-system'; import { getCustomTokenAmount } from '../../../selectors'; import { setCustomTokenAmount } from '../../../ducks/app/app'; import { CustomSpendingCapTooltip } from './custom-spending-cap-tooltip'; export default function CustomSpendingCap({ tokenName, currentTokenBalance, dappProposedValue, siteOrigin, passTheErrorText, }) { const t = useContext(I18nContext); const dispatch = useDispatch(); const value = useSelector(getCustomTokenAmount); const [error, setError] = useState(''); const [showUseDefaultButton, setShowUseDefaultButton] = useState( value !== String(dappProposedValue) && true, ); const inputLogicEmptyStateText = t('inputLogicEmptyState'); const getInputTextLogic = (inputNumber) => { if (inputNumber <= currentTokenBalance) { return { className: 'custom-spending-cap__lowerValue', description: t('inputLogicEqualOrSmallerNumber', [ {inputNumber} {tokenName} , ]), }; } else if (inputNumber > currentTokenBalance) { return { className: 'custom-spending-cap__higherValue', description: t('inputLogicHigherNumber'), }; } return { className: 'custom-spending-cap__emptyState', description: t('inputLogicEmptyState'), }; }; const [customSpendingCapText, setCustomSpendingCapText] = useState( getInputTextLogic(value).description, ); const handleChange = (valueInput) => { let spendingCapError = ''; const inputTextLogic = getInputTextLogic(valueInput); const inputTextLogicDescription = inputTextLogic.description; if (valueInput < 0 || isNaN(valueInput)) { spendingCapError = t('spendingCapError'); setCustomSpendingCapText(t('spendingCapErrorDescription', [siteOrigin])); setError(spendingCapError); } else { setCustomSpendingCapText(inputTextLogicDescription); setError(''); } dispatch(setCustomTokenAmount(String(valueInput))); }; useEffect(() => { if (value !== String(dappProposedValue)) { setShowUseDefaultButton(true); } }, [value, dappProposedValue]); useEffect(() => { passTheErrorText(error); }, [error, passTheErrorText]); const chooseTooltipContentText = value > currentTokenBalance ? t('warningTooltipText', [ {t('beCareful')} , ]) : t('inputLogicEmptyState'); return ( <> ); } CustomSpendingCap.propTypes = { /** * Displayed the token name currently tracked in description related to the input state */ tokenName: PropTypes.string, /** * The current token balance of the token */ currentTokenBalance: PropTypes.number, /** * The dapp suggested amount */ dappProposedValue: PropTypes.number, /** * The origin of the site generally the URL */ siteOrigin: PropTypes.string, /** * Parent component's callback function passed in order to get the error text */ passTheErrorText: PropTypes.func, };