From f5406941e7dd12472fa201a66c332d27ca14eade Mon Sep 17 00:00:00 2001 From: Madalina Raicu Date: Thu, 1 Feb 2024 16:11:04 +0000 Subject: [PATCH] feat(trading): update layout on mobile --- .../client-pages/market/trade-panels.tsx | 132 +++++++++++------- .../layouts/layout-with-sidebar.tsx | 11 +- apps/trading/components/navbar/nav-header.tsx | 87 ++++++++---- 3 files changed, 149 insertions(+), 81 deletions(-) diff --git a/apps/trading/client-pages/market/trade-panels.tsx b/apps/trading/client-pages/market/trade-panels.tsx index 870a87509..0d3c4a012 100644 --- a/apps/trading/client-pages/market/trade-panels.tsx +++ b/apps/trading/client-pages/market/trade-panels.tsx @@ -3,7 +3,6 @@ import { type Market } from '@vegaprotocol/markets'; // TODO: handle oracle banner // import { OracleBanner } from '@vegaprotocol/markets'; import { useState } from 'react'; -import AutoSizer from 'react-virtualized-auto-sizer'; import classNames from 'classnames'; import { Popover, @@ -23,10 +22,12 @@ interface TradePanelsProps { } export const TradePanels = ({ market, pinnedAsset }: TradePanelsProps) => { - const [view, setView] = useState('chart'); - const viewCfg = TradingViews[view]; + const [view1, setView1] = useState('chart'); + const viewCfg1 = TradingViews[view1]; + const [view2, setView2] = useState('positions'); + const viewCfg2 = TradingViews[view2]; - const renderView = () => { + const renderView = (view: TradingView) => { const Component = TradingViews[view].component; if (!Component) { @@ -44,7 +45,8 @@ export const TradePanels = ({ market, pinnedAsset }: TradePanelsProps) => { ); }; - const renderMenu = () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const renderMenu = (viewCfg: any) => { if ('menu' in viewCfg || 'settings' in viewCfg) { return (
@@ -69,56 +71,86 @@ export const TradePanels = ({ market, pinnedAsset }: TradePanelsProps) => { }; return ( -
+
-
{renderMenu()}
-
- - {({ width, height }) => ( -
- {renderView()} -
- )} -
-
-
- {Object.keys(TradingViews) - // filter to control available views for the current market - // eg only perps should get the funding views - .filter((_key) => { - const key = _key as TradingView; - const perpOnlyViews = ['funding', 'fundingPayments']; +
+
+ {['chart', 'orderbook', 'trades', 'liquidity', 'fundingPayments'] + // 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; + } - 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 = view === key; - return ( - { - setView(key); - }} - /> - ); - })} + }) + .map((_key) => { + const key = _key as TradingView; + const isActive = view1 === key; + return ( + { + setView1(key); + }} + /> + ); + })} +
+
+
{renderMenu(viewCfg1)}
+
{renderView(view1)}
+
+ + { +
+
+ {[ + 'positions', + 'activeOrders', + 'closedOrders', + 'rejectedOrders', + 'orders', + 'stopOrders', + 'collateral', + 'fills', + ].map((_key) => { + const key = _key as TradingView; + const isActive = view2 === key; + return ( + { + setView2(key); + }} + /> + ); + })} +
+
+
{renderMenu(viewCfg2)}
+
{renderView(view2)}
+
+
+ }
); }; @@ -157,7 +189,7 @@ const useViewLabel = (view: TradingView) => { depth: t('Depth'), liquidity: t('Liquidity'), funding: t('Funding'), - fundingPayments: t('Funding Payments'), + fundingPayments: t('Funding'), orderbook: t('Orderbook'), trades: t('Trades'), positions: t('Positions'), diff --git a/apps/trading/components/layouts/layout-with-sidebar.tsx b/apps/trading/components/layouts/layout-with-sidebar.tsx index eec996706..378b0d5dd 100644 --- a/apps/trading/components/layouts/layout-with-sidebar.tsx +++ b/apps/trading/components/layouts/layout-with-sidebar.tsx @@ -27,10 +27,13 @@ export const LayoutWithSidebar = ({
{header}
diff --git a/apps/trading/components/navbar/nav-header.tsx b/apps/trading/components/navbar/nav-header.tsx index 0715900a7..11a36fb2a 100644 --- a/apps/trading/components/navbar/nav-header.tsx +++ b/apps/trading/components/navbar/nav-header.tsx @@ -14,7 +14,8 @@ export const NavHeader = () => { const t = useT(); const { marketId } = useParams(); const { data } = useMarket(marketId); - const [open, setOpen] = useState(false); + const [openMarket, setOpenMarket] = useState(false); + const [openPrice, setOpenPrice] = useState(false); // Ensure that markets are kept cached so opening the list // shows all markets instantly @@ -23,32 +24,64 @@ export const NavHeader = () => { if (!marketId) return null; return ( - { - setOpen(x); - }} - trigger={ -

- {data ? data.tradableInstrument.instrument.code : t('Select market')} - - - -

- } - > - setOpen(false)} - /> -
+
+ { + setOpenMarket(x); + }} + trigger={ +

+ {data + ? data.tradableInstrument.instrument.code + : t('Select market')} + + + +

+ } + > + setOpenMarket(false)} + /> +
+ {/* // TODO MOBILE - price popover with market header content */} + { + setOpenPrice(x); + }} + trigger={ +

+ 44,500 + + + +

+ } + > + setOpenMarket(false)} + /> + {/* */} +
+
); };