import { useEffect } from 'react'; import type { ReactNode } from 'react'; import { LayoutPriority } from 'allotment'; import { titlefy } from '@vegaprotocol/utils'; import { useIncompleteWithdrawals } from '@vegaprotocol/withdraws'; import { Tab, LocalStoragePersistTabs as Tabs } from '@vegaprotocol/ui-toolkit'; import { usePageTitleStore } from '../../stores'; import { AccountsContainer, AccountsSettings, } from '../../components/accounts-container'; import { DepositsContainer } from '../../components/deposits-container'; import { FillsContainer, FillsSettings, } from '../../components/fills-container'; import { FundingPaymentsContainer, FundingPaymentsSettings, } from '../../components/funding-payments-container'; import { PositionsContainer, PositionsSettings, } from '../../components/positions-container'; import { PositionsMenu } from '../../components/positions-menu'; import { WithdrawalsContainer } from '../../components/withdrawals-container'; import { OrdersContainer, OrdersSettings, } from '../../components/orders-container'; import { LedgerContainer } from '../../components/ledger-container'; import { ResizableGrid, ResizableGridPanel, usePaneLayout, } from '../../components/resizable-grid'; import { ViewType, useSidebar } from '../../components/sidebar'; import { AccountsMenu } from '../../components/accounts-menu'; import { DepositsMenu } from '../../components/deposits-menu'; import { WithdrawalsMenu } from '../../components/withdrawals-menu'; import { useGetCurrentRouteId } from '../../lib/hooks/use-get-current-route-id'; import { useT } from '../../lib/use-t'; import { ErrorBoundary } from '../../components/error-boundary'; const WithdrawalsIndicator = () => { const { ready } = useIncompleteWithdrawals(); if (!ready || ready.length === 0) { return null; } return ( <span className="p-1 leading-none rounded bg-vega-clight-500 dark:bg-vega-cdark-500 text-default"> {ready.length} </span> ); }; const SidebarViewInitializer = () => { const currentRouteId = useGetCurrentRouteId(); const { getView, setViews } = useSidebar(); const view = getView(currentRouteId); // Make transfer sidebar open by default useEffect(() => { if (view === undefined) { setViews({ type: ViewType.Transfer }, currentRouteId); } }, [view, setViews, currentRouteId]); return null; }; export const Portfolio = () => { const t = useT(); const { updateTitle } = usePageTitleStore((store) => ({ updateTitle: store.updateTitle, })); useEffect(() => { updateTitle(titlefy([t('Portfolio')])); }, [updateTitle, t]); const [sizes, handleOnLayoutChange] = usePaneLayout({ id: 'portfolio' }); const wrapperClasses = 'p-0.5 h-full max-h-full flex flex-col'; return ( <div className={wrapperClasses}> <SidebarViewInitializer /> <ResizableGrid vertical onChange={handleOnLayoutChange}> <ResizableGridPanel minSize={75}> <PortfolioGridChild> <Tabs storageKey="console-portfolio-top-1"> <Tab id="positions" name={t('Positions')} menu={<PositionsMenu />} settings={<PositionsSettings />} > <ErrorBoundary feature="portfolio-positions"> <PositionsContainer allKeys /> </ErrorBoundary> </Tab> <Tab id="orders" name={t('Orders')} settings={<OrdersSettings />}> <ErrorBoundary feature="portfolio-orders"> <OrdersContainer /> </ErrorBoundary> </Tab> <Tab id="fills" name={t('Fills')} settings={<FillsSettings />}> <ErrorBoundary feature="portfolio-fills"> <FillsContainer /> </ErrorBoundary> </Tab> <Tab id="funding-payments" name={t('Funding payments')} settings={<FundingPaymentsSettings />} > <ErrorBoundary feature="portfolio-funding-payments"> <FundingPaymentsContainer /> </ErrorBoundary> </Tab> <Tab id="ledger-entries" name={t('Ledger entries')}> <ErrorBoundary feature="portfolio-ledger"> <LedgerContainer /> </ErrorBoundary> </Tab> </Tabs> </PortfolioGridChild> </ResizableGridPanel> <ResizableGridPanel priority={LayoutPriority.Low} preferredSize={sizes[1] || 300} minSize={50} > <PortfolioGridChild> <Tabs storageKey="console-portfolio-bottom"> <Tab id="collateral" name={t('Collateral')} settings={<AccountsSettings />} menu={<AccountsMenu />} > <ErrorBoundary feature="portfolio-accounts"> <AccountsContainer /> </ErrorBoundary> </Tab> <Tab id="deposits" name={t('Deposits')} menu={<DepositsMenu />}> <ErrorBoundary feature="portfolio-deposit"> <DepositsContainer /> </ErrorBoundary> </Tab> <Tab id="withdrawals" name={t('Withdrawals')} indicator={<WithdrawalsIndicator />} menu={<WithdrawalsMenu />} > <ErrorBoundary feature="portfolio-deposit"> <WithdrawalsContainer /> </ErrorBoundary> </Tab> </Tabs> </PortfolioGridChild> </ResizableGridPanel> </ResizableGrid> </div> ); }; interface PortfolioGridChildProps { children: ReactNode; } const PortfolioGridChild = ({ children }: PortfolioGridChildProps) => { return ( <section className="h-full p-1"> <div className="h-full border rounded-sm border-default">{children}</div> </section> ); };