import { Serum3Market, Serum3Side } from '@blockworks-foundation/mango-v4' import { IconButton } from '@components/shared/Button' import Loading from '@components/shared/Loading' import SideBadge from '@components/shared/SideBadge' import Tooltip from '@components/shared/Tooltip' import { LinkIcon, TrashIcon } from '@heroicons/react/20/solid' import { Order } from '@project-serum/serum/lib/market' import { useWallet } from '@solana/wallet-adapter-react' import { PublicKey } from '@solana/web3.js' import mangoStore from '@store/mangoStore' import { useViewport } from 'hooks/useViewport' import { useTranslation } from 'next-i18next' import { useCallback, useState } from 'react' import { notify } from 'utils/notifications' import { formatFixedDecimals, getDecimalCount } from 'utils/numbers' import { breakpoints } from 'utils/theme' import MarketLogos from './MarketLogos' const OpenOrders = () => { const { t } = useTranslation(['common', 'trade']) const { connected } = useWallet() const openOrders = mangoStore((s) => s.mangoAccount.openOrders) const [cancelId, setCancelId] = useState('') const { width } = useViewport() const showTableView = width ? width > breakpoints.md : false const handleCancelOrder = useCallback( async (o: Order) => { const client = mangoStore.getState().client const group = mangoStore.getState().group const mangoAccount = mangoStore.getState().mangoAccount.current const selectedMarket = mangoStore.getState().selectedMarket.current const actions = mangoStore.getState().actions if (!group || !mangoAccount) return setCancelId(o.orderId.toString()) try { if (selectedMarket instanceof Serum3Market) { const tx = await client.serum3CancelOrder( group, mangoAccount, selectedMarket!.serumMarketExternal, o.side === 'buy' ? Serum3Side.bid : Serum3Side.ask, o.orderId ) actions.fetchSerumOpenOrders() notify({ type: 'success', title: 'Transaction successful', txid: tx, }) } } catch (e: any) { console.error('Error canceling', e) notify({ title: t('trade:cancel-order-error'), description: e.message, txid: e.txid, type: 'error', }) } finally { setCancelId('') } }, [t] ) return connected ? ( Object.values(openOrders).flat().length ? ( showTableView ? ( {Object.entries(openOrders) .map(([marketPk, orders]) => { return orders.map((o) => { const group = mangoStore.getState().group const serumMarket = group?.getSerum3MarketByExternalMarket( new PublicKey(marketPk) ) const quoteSymbol = group?.getFirstBankByTokenIndex( serumMarket!.quoteTokenIndex ).name return ( ) }) }) .flat()}
{t('market')} {t('trade:side')} {t('trade:size')} {t('price')} {t('value')}
{serumMarket?.name}
{o.size.toLocaleString(undefined, { maximumFractionDigits: getDecimalCount(o.size), })} {o.price.toLocaleString(undefined, { maximumFractionDigits: getDecimalCount(o.price), })}{' '} {quoteSymbol} {formatFixedDecimals(o.size * o.price, true)}
handleCancelOrder(o)} size="small" > {cancelId === o.orderId.toString() ? ( ) : ( )}
) : (
{Object.entries(openOrders).map(([marketPk, orders]) => { return orders.map((o) => { const group = mangoStore.getState().group const serumMarket = group?.getSerum3MarketByExternalMarket( new PublicKey(marketPk) ) const quoteSymbol = group?.getFirstBankByTokenIndex( serumMarket!.quoteTokenIndex ).name return (

{serumMarket?.name}

{o.side} {' '} {o.size.toLocaleString(undefined, { maximumFractionDigits: getDecimalCount(o.size), })} {' '} at{' '} {o.price.toLocaleString(undefined, { maximumFractionDigits: getDecimalCount(o.price), })} {' '} {quoteSymbol}
{formatFixedDecimals(o.size * o.price, true)} handleCancelOrder(o)} > {cancelId === o.orderId.toString() ? ( ) : ( )}
) }) })}
) ) : (

{t('trade:no-orders')}

) ) : (

{t('trade:connect-orders')}

) } export default OpenOrders