import { type PinnedAsset } from '@vegaprotocol/accounts'; import { type Market } from '@vegaprotocol/markets'; // TODO: handle oracle banner // import { OracleBanner } from '@vegaprotocol/markets'; import { useState } from 'react'; import classNames from 'classnames'; import { Popover, Splash, VegaIcon, VegaIconNames, } from '@vegaprotocol/ui-toolkit'; import { useT } from '../../lib/use-t'; import { ErrorBoundary } from '../../components/error-boundary'; import { type TradingView } from './trade-views'; import { TradingViews } from './trade-views'; interface TradePanelsProps { market: Market; pinnedAsset?: PinnedAsset; } export const TradePanels = ({ market, pinnedAsset }: TradePanelsProps) => { const [topView, setTopView] = useState('chart'); const topViewCfg = TradingViews[topView]; const [bottomView, setBottomView] = useState('positions'); const bottomViewCfg = TradingViews[bottomView]; const renderView = (view: TradingView) => { const Component = TradingViews[view].component; if (!Component) { throw new Error(`No component for view: ${view}`); } if (!market) return ; // Watch out here, we don't know what component is being rendered // so watch out for clashes in props return ( ); }; // eslint-disable-next-line @typescript-eslint/no-explicit-any const renderMenu = (viewCfg: any) => { if ('menu' in viewCfg || 'settings' in viewCfg) { return (
{'menu' in viewCfg ? : null} {'settings' in viewCfg ? ( } >
) : null}
); } }; return (
{[ 'chart', 'orderbook', 'depth', 'trades', 'liquidity', 'fundingPayments', 'funding', ] // filter to control available views for the current market // e.g. only perpetuals should get the funding views .filter((_key) => { const key = _key as TradingView; const perpOnlyViews = ['funding', 'fundingPayments']; if ( market?.tradableInstrument.instrument.product.__typename === 'Perpetual' ) { return true; } if (perpOnlyViews.includes(key)) { return false; } return true; }) .map((_key) => { const key = _key as TradingView; const isActive = topView === key; return ( { setTopView(key); }} /> ); })}
{renderMenu(topViewCfg)}
{renderView(topView)}
{[ 'positions', 'activeOrders', 'closedOrders', 'rejectedOrders', 'orders', 'stopOrders', 'collateral', 'fills', ].map((_key) => { const key = _key as TradingView; const isActive = bottomView === key; return ( { setBottomView(key); }} /> ); })}
{renderMenu(bottomViewCfg)}
{renderView(bottomView)}
); }; export const NoMarketSplash = () => { const t = useT(); return {t('No market')}; }; const ViewButton = ({ view, isActive, onClick, }: { view: TradingView; isActive: boolean; onClick: () => void; }) => { const label = useViewLabel(view); const className = classNames( 'py-2 px-4 capitalize text-sm whitespace-nowrap', { 'bg-vega-clight-500 dark:bg-vega-cdark-500': isActive, } ); return ( ); }; const useViewLabel = (view: TradingView) => { const t = useT(); const labels = { chart: t('Chart'), depth: t('Depth'), liquidity: t('Liquidity'), funding: t('Funding history'), fundingPayments: t('Funding payments'), orderbook: t('Orderbook'), trades: t('Trades'), positions: t('Positions'), activeOrders: t('Active'), closedOrders: t('Closed'), rejectedOrders: t('Rejected'), orders: t('All'), stopOrders: t('Stop'), collateral: t('Collateral'), fills: t('Fills'), }; return labels[view]; };