import Button from '@components/shared/Button' import InlineNotification from '@components/shared/InlineNotification' import Loading from '@components/shared/Loading' import Tooltip from '@components/shared/Tooltip' import mangoStore from '@store/mangoStore' import useMangoAccount from 'hooks/useMangoAccount' import { useTranslation } from 'next-i18next' import { useCallback, useEffect, useState } from 'react' import NumberFormat, { NumberFormatValues, SourceInfo, } from 'react-number-format' import { isMangoError } from 'types' import { notify } from 'utils/notifications' type FormErrors = Partial> type AccountSettingsForm = { tokenAccounts: string | undefined } const DEFAULT_FORM = { tokenAccounts: '', } const AccountSettings = () => { const { t } = useTranslation(['common', 'settings']) const { mangoAccount, mangoAccountAddress } = useMangoAccount() const [accountSettingsForm, setAccountSettingsForm] = useState(DEFAULT_FORM) const [formErrors, setFormErrors] = useState() const [submitting, setSubmitting] = useState(false) useEffect(() => { if (mangoAccountAddress) { setAccountSettingsForm({ tokenAccounts: mangoAccount?.tokens.length.toString(), }) } }, [mangoAccountAddress]) const isFormValid = (form: AccountSettingsForm) => { const mangoAccount = mangoStore.getState().mangoAccount.current const invalidFields: FormErrors = {} setFormErrors({}) const tokenAccounts: (keyof AccountSettingsForm)[] = ['tokenAccounts'] for (const key of tokenAccounts) { const value = form[key] as string const minLength = mangoAccount?.tokens.length || 8 if (parseInt(value) <= minLength) { invalidFields[key] = t('settings:error-amount', { type: t('settings:token-accounts'), greaterThan: mangoAccount?.tokens.length, lessThan: '17', }) } } if (Object.keys(invalidFields).length) { setFormErrors(invalidFields) } return invalidFields } const handleSetForm = ( propertyName: string, e: NumberFormatValues, info: SourceInfo, ) => { if (info.source !== 'event') return setFormErrors({}) setAccountSettingsForm((prevState) => ({ ...prevState, [propertyName]: e.value, })) } const handleUpdateAccountSize = useCallback(async () => { const invalidFields = isFormValid(accountSettingsForm) if (Object.keys(invalidFields).length) { return } const client = mangoStore.getState().client const group = mangoStore.getState().group const mangoAccount = mangoStore.getState().mangoAccount.current const actions = mangoStore.getState().actions const { tokenAccounts } = accountSettingsForm if (!mangoAccount || !group || !tokenAccounts) return setSubmitting(true) try { const tx = await client.accountExpandV2( group, mangoAccount, parseInt(tokenAccounts), mangoAccount.serum3.length, mangoAccount.perps.length, mangoAccount.perpOpenOrders.length, mangoAccount.tokenConditionalSwaps.length, ) notify({ title: 'Transaction confirmed', type: 'success', txid: tx, }) await actions.reloadMangoAccount() setSubmitting(false) } catch (e) { console.error(e) if (!isMangoError(e)) return notify({ title: 'Transaction failed', description: e.message, txid: e.txid, type: 'error', }) } finally { setSubmitting(false) } }, [accountSettingsForm]) return ( <>

{t('account')}

{t('settings:increase-token-accounts')}

handleSetForm('tokenAccounts', e, sourceInfo) } />
{formErrors?.tokenAccounts ? (
) : null}
) } export default AccountSettings