diff --git a/apps/console-lite/src/app/components/portfolio/accounts/accounts.tsx b/apps/console-lite/src/app/components/portfolio/accounts/accounts.tsx index cd4770497..fa4422a22 100644 --- a/apps/console-lite/src/app/components/portfolio/accounts/accounts.tsx +++ b/apps/console-lite/src/app/components/portfolio/accounts/accounts.tsx @@ -1,4 +1,5 @@ import { useMemo, useRef } from 'react'; +import { useOutletContext } from 'react-router-dom'; import type { AgGridReact } from 'ag-grid-react'; import { PriceCell, useDataProvider } from '@vegaprotocol/react-helpers'; import type { @@ -23,11 +24,8 @@ interface AccountObj extends AccountFieldsFragment { id: string; } -interface Props { - partyId: string; -} - -const AccountsManager = ({ partyId }: Props) => { +const AccountsManager = () => { + const { partyId = '' } = useOutletContext<{ partyId: string }>(); const { isOpen, symbol, setOpen } = useAssetDetailsDialogStore(); const gridRef = useRef(null); const variables = useMemo(() => ({ partyId }), [partyId]); diff --git a/apps/console-lite/src/app/components/portfolio/fills/fills.tsx b/apps/console-lite/src/app/components/portfolio/fills/fills.tsx index 7a4c62fa5..10931d802 100644 --- a/apps/console-lite/src/app/components/portfolio/fills/fills.tsx +++ b/apps/console-lite/src/app/components/portfolio/fills/fills.tsx @@ -1,4 +1,5 @@ import { useRef } from 'react'; +import { useOutletContext } from 'react-router-dom'; import type { AgGridReact } from 'ag-grid-react'; import type { TradeWithMarket } from '@vegaprotocol/fills'; import { useFillsList } from '@vegaprotocol/fills'; @@ -8,11 +9,8 @@ import { ConsoleLiteGrid } from '../../console-lite-grid'; import { NO_DATA_MESSAGE } from '../../../constants'; import useColumnDefinitions from './use-column-definitions'; -interface Props { - partyId: string; -} - -const FillsManager = ({ partyId }: Props) => { +const FillsManager = () => { + const { partyId } = useOutletContext<{ partyId: string }>(); const { columnDefs, defaultColDef } = useColumnDefinitions({ partyId }); const gridRef = useRef(null); const scrolledToTop = useRef(true); diff --git a/apps/console-lite/src/app/components/portfolio/index.ts b/apps/console-lite/src/app/components/portfolio/index.ts index 84f35499f..f9aefba44 100644 --- a/apps/console-lite/src/app/components/portfolio/index.ts +++ b/apps/console-lite/src/app/components/portfolio/index.ts @@ -1 +1,6 @@ export * from './portfolio'; +export * from './accounts'; +export * from './fills'; +export * from './orders'; +export * from './positions'; +export * as constants from './constants'; diff --git a/apps/console-lite/src/app/components/portfolio/orders/orders.tsx b/apps/console-lite/src/app/components/portfolio/orders/orders.tsx index 3a7289f14..a94887851 100644 --- a/apps/console-lite/src/app/components/portfolio/orders/orders.tsx +++ b/apps/console-lite/src/app/components/portfolio/orders/orders.tsx @@ -1,6 +1,7 @@ import { useRef, useState } from 'react'; import type { AgGridReact } from 'ag-grid-react'; import type { BodyScrollEndEvent, BodyScrollEvent } from 'ag-grid-community'; +import { useOutletContext } from 'react-router-dom'; import type { OrderWithMarket } from '@vegaprotocol/orders'; import { useOrderCancel, @@ -17,11 +18,8 @@ import { ConsoleLiteGrid } from '../../console-lite-grid'; import { NO_DATA_MESSAGE } from '../../../constants'; import useColumnDefinitions from './use-column-definitions'; -interface Props { - partyId: string; -} - -const OrdersManager = ({ partyId }: Props) => { +const OrdersManager = () => { + const { partyId } = useOutletContext<{ partyId: string }>(); const [editOrder, setEditOrder] = useState(null); const orderCancel = useOrderCancel(); const orderEdit = useOrderEdit(editOrder); diff --git a/apps/console-lite/src/app/components/portfolio/portfolio.tsx b/apps/console-lite/src/app/components/portfolio/portfolio.tsx index f93133759..0d285b03b 100644 --- a/apps/console-lite/src/app/components/portfolio/portfolio.tsx +++ b/apps/console-lite/src/app/components/portfolio/portfolio.tsx @@ -1,54 +1,27 @@ -import React, { useMemo } from 'react'; -import { AccountManager } from './accounts'; +import React from 'react'; import { useVegaWallet } from '@vegaprotocol/wallet'; import ConnectWallet from '../wallet-connector'; -import { DepositContainer } from '../deposits'; -import { useParams } from 'react-router-dom'; +import { useOutlet, useLocation } from 'react-router-dom'; import { HorizontalMenu } from '../horizontal-menu'; import * as constants from './constants'; -import { PositionsManager } from './positions'; -import { OrdersManager } from './orders'; -import { FillsManager } from './fills'; - -type RouterParams = { - module?: string; -}; export const Portfolio = () => { const { keypair } = useVegaWallet(); - const params = useParams(); - - const module = useMemo(() => { - if (!keypair) { - return ( -
- -
- ); - } - - switch (params?.module) { - case constants.PORTFOLIO_ASSETS: - default: - return ; - case constants.PORTFOLIO_POSITIONS: - return ; - case constants.PORTFOLIO_ORDERS: - return ; - case constants.PORTFOLIO_FILLS: - return ; - case constants.PORTFOLIO_DEPOSITS: - return ; - } - }, [params?.module, keypair]); + const { pathname } = useLocation(); + const module = pathname.split('/portfolio/')?.[1] ?? ''; + const outlet = useOutlet({ partyId: keypair?.pub || '' }); + if (!keypair) { + return ( +
+ +
+ ); + } return (
- - {module} + + {outlet}
); }; diff --git a/apps/console-lite/src/app/components/portfolio/positions/positions.tsx b/apps/console-lite/src/app/components/portfolio/positions/positions.tsx index a4b2ccc77..71b592b80 100644 --- a/apps/console-lite/src/app/components/portfolio/positions/positions.tsx +++ b/apps/console-lite/src/app/components/portfolio/positions/positions.tsx @@ -1,13 +1,11 @@ +import { useOutletContext } from 'react-router-dom'; import { t } from '@vegaprotocol/react-helpers'; import { usePositionsAssets } from '@vegaprotocol/positions'; import { AsyncRenderer, Splash } from '@vegaprotocol/ui-toolkit'; import PositionsAsset from './positions-asset'; -interface Props { - partyId: string; -} - -const Positions = ({ partyId }: Props) => { +const Positions = () => { + const { partyId } = useOutletContext<{ partyId: string }>(); const { data, error, loading, assetSymbols } = usePositionsAssets({ partyId, }); diff --git a/apps/console-lite/src/app/routes/router-config.tsx b/apps/console-lite/src/app/routes/router-config.tsx index 934fd9a93..10df78951 100644 --- a/apps/console-lite/src/app/routes/router-config.tsx +++ b/apps/console-lite/src/app/routes/router-config.tsx @@ -1,7 +1,15 @@ import { t } from '@vegaprotocol/react-helpers'; import { DealTicketContainer } from '../components/deal-ticket'; import { SimpleMarketList } from '../components/simple-market-list'; -import { Portfolio } from '../components/portfolio'; +import { + Portfolio, + AccountManager, + PositionsManager, + OrdersManager, + FillsManager, + constants, +} from '../components/portfolio'; +import { DepositContainer } from '../components/deposits'; export const ROUTES = { MARKETS: 'markets', @@ -51,13 +59,33 @@ export const routerConfig = [ name: 'Portfolio', text: t('Portfolio'), element: , - children: [ - { - path: ':module', - element: , - }, - ], icon: 'portfolio', isNavItem: true, + children: [ + { + path: '', + element: , + }, + { + path: constants.PORTFOLIO_ASSETS, + element: , + }, + { + path: constants.PORTFOLIO_POSITIONS, + element: , + }, + { + path: constants.PORTFOLIO_ORDERS, + element: , + }, + { + path: constants.PORTFOLIO_FILLS, + element: , + }, + { + path: constants.PORTFOLIO_DEPOSITS, + element: , + }, + ], }, ];