import { DealTicketContainer } from '@vegaprotocol/deal-ticket'; import { MarketInfoAccordionContainer } from '@vegaprotocol/market-info'; import { OrderbookContainer } from '@vegaprotocol/market-depth'; import { OrderListContainer } from '@vegaprotocol/orders'; import { FillsContainer } from '@vegaprotocol/fills'; import { PositionsContainer } from '@vegaprotocol/positions'; import { TradesContainer } from '@vegaprotocol/trades'; import { LayoutPriority } from 'allotment'; import classNames from 'classnames'; import AutoSizer from 'react-virtualized-auto-sizer'; import { memo, useState } from 'react'; import type { ReactNode, ComponentProps } from 'react'; import { DepthChartContainer } from '@vegaprotocol/market-depth'; import { CandlesChartContainer } from '@vegaprotocol/candles-chart'; import { OracleBanner } from '../../components/banner'; import { Tab, LocalStoragePersistTabs as Tabs, Splash, } from '@vegaprotocol/ui-toolkit'; import { t } from '@vegaprotocol/i18n'; import { AccountsContainer } from '../../components/accounts-container'; import type { Market } from '@vegaprotocol/market-list'; import { VegaWalletContainer } from '../../components/vega-wallet-container'; import { TradeMarketHeader } from './trade-market-header'; import { NO_MARKET } from './constants'; import { LiquidityContainer } from '../liquidity/liquidity'; import { useNavigate } from 'react-router-dom'; import type { PinnedAsset } from '@vegaprotocol/accounts'; import { useScreenDimensions } from '@vegaprotocol/react-helpers'; import { useMarketClickHandler, useMarketLiquidityClickHandler, } from '../../lib/hooks/use-market-click-handler'; import { ResizableGrid, ResizableGridPanel, } from '../../components/resizable-grid'; type MarketDependantView = | typeof CandlesChartContainer | typeof DepthChartContainer | typeof DealTicketContainer | typeof MarketInfoAccordionContainer | typeof OrderbookContainer | typeof TradesContainer; type MarketDependantViewProps = ComponentProps; const requiresMarket = (View: MarketDependantView) => { const WrappedComponent = (props: MarketDependantViewProps) => props.marketId ? : {NO_MARKET}; WrappedComponent.displayName = `RequiresMarket(${View.name})`; return WrappedComponent; }; const TradingViews = { Candles: requiresMarket(CandlesChartContainer), Depth: requiresMarket(DepthChartContainer), Liquidity: requiresMarket(LiquidityContainer), Ticket: requiresMarket(DealTicketContainer), Info: requiresMarket(MarketInfoAccordionContainer), Orderbook: requiresMarket(OrderbookContainer), Trades: requiresMarket(TradesContainer), Positions: PositionsContainer, Orders: OrderListContainer, Collateral: AccountsContainer, Fills: FillsContainer, }; type TradingView = keyof typeof TradingViews; interface TradeGridProps { market: Market | null; onSelect: (marketId: string, metaKey?: boolean) => void; pinnedAsset?: PinnedAsset; } interface BottomPanelProps { marketId: string; pinnedAsset?: PinnedAsset; } const MarketBottomPanel = memo( ({ marketId, pinnedAsset }: BottomPanelProps) => { const { screenSize } = useScreenDimensions(); const onMarketClick = useMarketClickHandler(true); const onOrderTypeClick = useMarketLiquidityClickHandler(true); return 'xxxl' === screenSize ? ( ) : ( ); } ); MarketBottomPanel.displayName = 'MarketBottomPanel'; const MainGrid = memo( ({ marketId, onSelect, pinnedAsset, }: { marketId: string; onSelect: (marketId: string, metaKey?: boolean) => void; pinnedAsset?: PinnedAsset; }) => { const navigate = useNavigate(); return ( navigate('/portfolio')} /> ); } ); MainGrid.displayName = 'MainGrid'; export const TradeGrid = ({ market, onSelect, pinnedAsset, }: TradeGridProps) => { return (
); }; interface TradeGridChildProps { children: ReactNode; } const TradeGridChild = ({ children }: TradeGridChildProps) => { return (
{({ width, height }) =>
{children}
}
); }; interface TradePanelsProps { market: Market | null; onSelect: (marketId: string, metaKey?: boolean) => void; onMarketClick?: (marketId: string) => void; onOrderTypeClick?: (marketId: string) => void; onClickCollateral: () => void; pinnedAsset?: PinnedAsset; } export const TradePanels = ({ market, onSelect, onClickCollateral, pinnedAsset, }: TradePanelsProps) => { const onMarketClick = useMarketClickHandler(true); const onOrderTypeClick = useMarketLiquidityClickHandler(true); const [view, setView] = useState('Candles'); const renderView = () => { const Component = memo<{ marketId: string; onSelect: (marketId: string, metaKey?: boolean) => void; onMarketClick?: (marketId: string) => void; onOrderTypeClick?: (marketId: string) => void; onClickCollateral: () => void; pinnedAsset?: PinnedAsset; }>(TradingViews[view]); if (!Component) { throw new Error(`No component for view: ${view}`); } if (!market) return {NO_MARKET}; return ( ); }; return (
{({ width, height }) => (
{renderView()}
)}
{Object.keys(TradingViews).map((key) => { const isActive = view === key; const className = classNames('p-4 min-w-[100px] capitalize', { 'text-black dark:text-vega-yellow': isActive, 'bg-neutral-200 dark:bg-neutral-800': isActive, }); return ( ); })}
); };