117 lines
3.2 KiB
TypeScript
117 lines
3.2 KiB
TypeScript
import { FunctionComponent, useState } from 'react'
|
|
import useMangoStore from '../stores/useMangoStore'
|
|
import {
|
|
ExclamationCircleIcon,
|
|
InformationCircleIcon,
|
|
} from '@heroicons/react/solid'
|
|
import Input, { Label } from './Input'
|
|
import Button from './Button'
|
|
import Modal from './Modal'
|
|
import { ElementTitle } from './styles'
|
|
import Tooltip from './Tooltip'
|
|
import { notify } from '../utils/notifications'
|
|
import { useTranslation } from 'next-i18next'
|
|
import { useWallet } from '@solana/wallet-adapter-react'
|
|
|
|
interface AccountNameModalProps {
|
|
accountName?: string
|
|
isOpen: boolean
|
|
onClose?: (x?) => void
|
|
}
|
|
|
|
const AccountNameModal: FunctionComponent<AccountNameModalProps> = ({
|
|
accountName,
|
|
isOpen,
|
|
onClose,
|
|
}) => {
|
|
const { t } = useTranslation('common')
|
|
const { wallet } = useWallet()
|
|
const [name, setName] = useState(accountName || '')
|
|
const [invalidNameMessage, setInvalidNameMessage] = useState('')
|
|
const mangoGroup = useMangoStore((s) => s.selectedMangoGroup.current)
|
|
const mangoAccount = useMangoStore((s) => s.selectedMangoAccount.current)
|
|
const actions = useMangoStore((s) => s.actions)
|
|
|
|
const submitName = async () => {
|
|
const mangoClient = useMangoStore.getState().connection.client
|
|
if (!wallet || !mangoAccount || !mangoGroup) return
|
|
try {
|
|
const txid = await mangoClient.addMangoAccountInfo(
|
|
mangoGroup,
|
|
mangoAccount,
|
|
wallet?.adapter,
|
|
name
|
|
)
|
|
actions.fetchAllMangoAccounts(wallet)
|
|
await actions.reloadMangoAccount()
|
|
onClose?.()
|
|
notify({
|
|
title: t('name-updated'),
|
|
txid,
|
|
})
|
|
} catch (err) {
|
|
console.warn('Error setting account name:', err)
|
|
notify({
|
|
title: t('name-error'),
|
|
description: `${err}`,
|
|
txid: err.txid,
|
|
type: 'error',
|
|
})
|
|
}
|
|
}
|
|
|
|
const validateNameInput = () => {
|
|
if (name.length >= 33) {
|
|
setInvalidNameMessage(t('character-limit'))
|
|
}
|
|
if (name.length === 0) {
|
|
setInvalidNameMessage(t('enter-name'))
|
|
}
|
|
}
|
|
|
|
const onChangeNameInput = (name) => {
|
|
setName(name)
|
|
if (invalidNameMessage) {
|
|
setInvalidNameMessage('')
|
|
}
|
|
}
|
|
|
|
return (
|
|
<Modal onClose={onClose} isOpen={isOpen}>
|
|
<Modal.Header>
|
|
<ElementTitle noMarginBottom>{t('name-your-account')}</ElementTitle>
|
|
<p className="flex items-center justify-center">
|
|
{t('edit-nickname')}
|
|
<Tooltip content={t('tooltip-name-onchain')}>
|
|
<InformationCircleIcon className="ml-2 h-5 w-5 text-th-fgd-4" />
|
|
</Tooltip>
|
|
</p>
|
|
</Modal.Header>
|
|
<Label>{t('account-name')}</Label>
|
|
<Input
|
|
type="text"
|
|
error={!!invalidNameMessage}
|
|
placeholder="e.g. Calypso"
|
|
value={name}
|
|
onBlur={validateNameInput}
|
|
onChange={(e) => onChangeNameInput(e.target.value)}
|
|
/>
|
|
{invalidNameMessage ? (
|
|
<div className="flex items-center pt-1.5 text-th-red">
|
|
<ExclamationCircleIcon className="mr-1.5 h-4 w-4" />
|
|
{invalidNameMessage}
|
|
</div>
|
|
) : null}
|
|
<Button
|
|
onClick={() => submitName()}
|
|
disabled={name.length >= 33}
|
|
className="mt-6 w-full"
|
|
>
|
|
{t('save-name')}
|
|
</Button>
|
|
</Modal>
|
|
)
|
|
}
|
|
|
|
export default AccountNameModal
|