import { Serum3OrderType, Serum3SelfTradeBehavior, Serum3Side, } from '@blockworks-foundation/mango-v4' import Checkbox from '@components/forms/Checkbox' import Button from '@components/shared/Button' import Tooltip from '@components/shared/Tooltip' import mangoStore from '@store/mangoStore' import Decimal from 'decimal.js' import { useTranslation } from 'next-i18next' import { useCallback, useMemo, useState } from 'react' import NumberFormat, { NumberFormatValues } from 'react-number-format' import { notify } from 'utils/notifications' const AdvancedTradeForm = () => { const { t } = useTranslation('common') const set = mangoStore.getState().set const tradeForm = mangoStore((s) => s.tradeForm) const selectedMarket = mangoStore((s) => s.selectedMarket.current) const [useMargin, setUseMargin] = useState(true) const baseSymbol = useMemo(() => { return selectedMarket?.name.split('/')[0] }, [selectedMarket]) const quoteSymbol = useMemo(() => { return selectedMarket?.name.split('/')[1] }, [selectedMarket]) const setTradeType = useCallback( (tradeType: 'Limit' | 'Market') => { set((s) => { s.tradeForm.tradeType = tradeType }) }, [set] ) const handlePriceChange = useCallback( (e: NumberFormatValues) => { set((s) => { s.tradeForm.price = e.value }) }, [set] ) const handleBaseSizeChange = useCallback( (e: NumberFormatValues) => { set((s) => { s.tradeForm.baseSize = e.value }) }, [set] ) const handlePostOnlyChange = useCallback( (postOnly: boolean) => { set((s) => { s.tradeForm.postOnly = postOnly if (s.tradeForm.ioc === true) { s.tradeForm.ioc = !postOnly } }) }, [set] ) const handleIocChange = useCallback( (ioc: boolean) => { set((s) => { s.tradeForm.ioc = ioc if (s.tradeForm.postOnly === true) { s.tradeForm.postOnly = !ioc } }) }, [set] ) const handleSetSide = useCallback( (side: 'buy' | 'sell') => { set((s) => { s.tradeForm.side = side }) }, [set] ) const handlePlaceOrder = useCallback(async () => { const client = mangoStore.getState().client const group = mangoStore.getState().group const mangoAccount = mangoStore.getState().mangoAccount.current const tradeForm = mangoStore.getState().tradeForm const actions = mangoStore.getState().actions if (!group || !mangoAccount) return try { const orderType = tradeForm.ioc ? Serum3OrderType.immediateOrCancel : tradeForm.postOnly ? Serum3OrderType.postOnly : Serum3OrderType.limit const tx = await client.serum3PlaceOrder( group, mangoAccount, selectedMarket!.serumMarketExternal, tradeForm.side === 'buy' ? Serum3Side.bid : Serum3Side.ask, new Decimal(tradeForm.price).toNumber(), new Decimal(tradeForm.baseSize).toNumber(), Serum3SelfTradeBehavior.decrementTake, orderType, Date.now(), 10 ) actions.reloadMangoAccount() notify({ type: 'success', title: 'Transaction successful', txid: tx, }) } catch (e: any) { notify({ title: t('order-error'), description: e.message, txid: e.txid, type: 'error', }) console.error('Place trade error:', e) } }, []) return (
setTradeType('Limit')} className={`flex h-12 items-center justify-center px-4 text-sm font-bold hover:cursor-pointer ${ tradeForm.tradeType === 'Limit' ? 'bg-th-bkg-2 text-th-primary' : 'text-th-fgd-4 hover:text-th-fgd-2' }`} > Limit
setTradeType('Market')} className={`flex h-12 items-center justify-center px-4 text-sm font-bold hover:cursor-pointer ${ tradeForm.tradeType === 'Market' ? 'bg-th-bkg-2 text-th-primary' : 'text-th-fgd-4 hover:text-th-fgd-2' }`} > Market

{t('amount')}

{baseSymbol}
{tradeForm.tradeType === 'Limit' ? ( <>

Limit Price

{quoteSymbol}
) : null}
{tradeForm.tradeType === 'Limit' ? (
handlePostOnlyChange(e.target.checked)} > Post
handleIocChange(e.target.checked)} > IOC
) : null}
setUseMargin(e.target.checked)} > {t('margin')}
) } export default AdvancedTradeForm