import { FunctionComponent, useState } from 'react' import mangoStore from '@store/mangoStore' import { useTranslation } from 'next-i18next' import Modal from '@components/shared/Modal' import Button, { LinkButton } from '@components/shared/Button' import { notify } from 'utils/notifications' import Loading from '@components/shared/Loading' import { isMangoError } from 'types' import { ModalProps } from 'types/modal' import useMangoGroup from 'hooks/useMangoGroup' import useOpenPerpPositions from 'hooks/useOpenPerpPositions' import { floorToDecimal, getDecimalCount } from 'utils/numbers' import MarketLogos from './MarketLogos' import PerpSideBadge from './PerpSideBadge' import FormatNumericValue from '@components/shared/FormatNumericValue' import { MAX_PERP_SLIPPAGE } from 'utils/constants' export const handleCloseAll = async ( setSubmitting?: (s: boolean) => void, onClose?: () => void, ) => { const client = mangoStore.getState().client const mangoAccount = mangoStore.getState().mangoAccount.current const actions = mangoStore.getState().actions const group = mangoStore.getState().group if (!group || !mangoAccount) { notify({ title: 'Something went wrong. Try again later', type: 'error', }) return } if (setSubmitting) { setSubmitting(true) } try { const { signature: tx } = await client.perpCloseAll( group, mangoAccount, MAX_PERP_SLIPPAGE, ) actions.fetchOpenOrders() notify({ type: 'success', title: 'Transaction successful', txid: tx, }) } catch (e) { if (isMangoError(e)) { notify({ title: 'There was an issue.', description: e.message, txid: e?.txid, type: 'error', }) } console.error('Place trade error:', e) } finally { if (setSubmitting) { setSubmitting(false) } if (onClose) { onClose() } } } const CloseAllPositionsModal: FunctionComponent = ({ onClose, isOpen, }) => { const { t } = useTranslation(['common', 'trade']) const [submitting, setSubmitting] = useState(false) const { openPerpPositions } = useOpenPerpPositions() const { group } = useMangoGroup() if (!group) return null return (

{t('trade:close-all-positions')}

{t('trade:price-expect')}
{openPerpPositions.map((position, i) => { const market = group.getPerpMarketByMarketIndex(position.marketIndex) const basePosition = position.getBasePositionUi(market) const floorBasePosition = floorToDecimal( basePosition, getDecimalCount(market.minOrderSize), ).toNumber() if (!basePosition) return null return (

{market.name}

|

) })}
{t('cancel')}
) } export default CloseAllPositionsModal