import { useEffect } from 'react' import { useRouter } from 'next/router' import useMangoGroupConfig from '../hooks/useMangoGroupConfig' import useMangoStore, { serumProgramId } from '../stores/useMangoStore' import { getMarketByBaseSymbolAndKind, getMarketIndexBySymbol, } from '@blockworks-foundation/mango-client' import TopBar from '../components/TopBar' import TradePageGrid from '../components/TradePageGrid' import useLocalStorageState from '../hooks/useLocalStorageState' import AlphaModal, { ALPHA_MODAL_KEY } from '../components/AlphaModal' import { PageBodyWrapper } from '../components/styles' import { serverSideTranslations } from 'next-i18next/serverSideTranslations' import IntroTips, { SHOW_TOUR_KEY } from '../components/IntroTips' import { useViewport } from '../hooks/useViewport' import { breakpoints } from '../components/TradePageGrid' import { actionsSelector, mangoAccountSelector, marketConfigSelector, walletConnectedSelector, } from '../stores/selectors' import { PublicKey } from '@solana/web3.js' import FavoritesShortcutBar from '../components/FavoritesShortcutBar' export async function getStaticProps({ locale }) { return { props: { ...(await serverSideTranslations(locale, [ 'common', 'tv-chart', 'alerts', ])), // Will be passed to the page component as props }, } } const PerpMarket = () => { const [alphaAccepted] = useLocalStorageState(ALPHA_MODAL_KEY, false) const [showTour] = useLocalStorageState(SHOW_TOUR_KEY, false) const groupConfig = useMangoGroupConfig() const setMangoStore = useMangoStore((s) => s.set) const connected = useMangoStore(walletConnectedSelector) const mangoAccount = useMangoStore(mangoAccountSelector) const mangoClient = useMangoStore((s) => s.connection.client) const mangoGroup = useMangoStore((s) => s.selectedMangoGroup.current) const marketConfig = useMangoStore(marketConfigSelector) const actions = useMangoStore(actionsSelector) const router = useRouter() const { pubkey } = router.query const { width } = useViewport() const hideTips = width ? width < breakpoints.md : false useEffect(() => { async function loadUnownedMangoAccount() { try { const unownedMangoAccountPubkey = new PublicKey(pubkey) if (mangoGroup) { const unOwnedMangoAccount = await mangoClient.getMangoAccount( unownedMangoAccountPubkey, serumProgramId ) console.log('unOwnedMangoAccount: ', unOwnedMangoAccount) setMangoStore((state) => { state.selectedMangoAccount.current = unOwnedMangoAccount state.selectedMangoAccount.initialLoad = false state.wallet.connected = true }) actions.fetchTradeHistory() actions.reloadOrders() // setResetOnLeave(true) } } catch (error) { router.push('/account') } } if (pubkey) { loadUnownedMangoAccount() } }, [pubkey, mangoClient, mangoGroup]) useEffect(() => { const name = decodeURIComponent(router.asPath).split('name=')[1] const mangoGroup = useMangoStore.getState().selectedMangoGroup.current let marketQueryParam, marketBaseSymbol, marketType, newMarket, marketIndex if (name) { marketQueryParam = name.toString().split(/-|\//) marketBaseSymbol = marketQueryParam[0] marketType = marketQueryParam[1] === 'PERP' ? 'perp' : 'spot' newMarket = getMarketByBaseSymbolAndKind( groupConfig, marketBaseSymbol.toUpperCase(), marketType ) marketIndex = getMarketIndexBySymbol( groupConfig, marketBaseSymbol.toUpperCase() ) } if (name && mangoGroup) { const mangoCache = useMangoStore.getState().selectedMangoGroup.cache setMangoStore((state) => { state.selectedMarket.kind = marketType if (newMarket.name !== marketConfig.name) { // state.selectedMarket.current = null state.selectedMarket.config = newMarket state.tradeForm.price = state.tradeForm.tradeType === 'Limit' ? parseFloat( mangoGroup.getPrice(marketIndex, mangoCache).toFixed(2) ) : '' } }) } else if (name && marketConfig) { // if mangoGroup hasn't loaded yet, set the marketConfig to the query param if different if (newMarket.name !== marketConfig.name) { setMangoStore((state) => { state.selectedMarket.kind = marketType state.selectedMarket.config = newMarket }) } } }, [router, marketConfig]) return (