import classNames from 'classnames'; import type { ReactNode } from 'react'; import { useEffect } from 'react'; import { Route, Routes, useParams } from 'react-router-dom'; import { create } from 'zustand'; import { TransferContainer } from '@vegaprotocol/accounts'; import { DealTicketContainer } from '@vegaprotocol/deal-ticket'; import { DepositContainer } from '@vegaprotocol/deposits'; import { t } from '@vegaprotocol/i18n'; import { MarketInfoAccordionContainer } from '@vegaprotocol/markets'; import { TinyScroll, VegaIcon, VegaIconNames } from '@vegaprotocol/ui-toolkit'; import { NodeHealthContainer } from '../node-health'; import { Settings } from '../settings'; import { Tooltip } from '../../components/tooltip'; import { WithdrawContainer } from '../withdraw-container'; import { Routes as AppRoutes } from '../../pages/client-router'; import { persist } from 'zustand/middleware'; import { GetStarted } from '../welcome-dialog'; import { useVegaWallet, useViewAsDialog } from '@vegaprotocol/wallet'; const STORAGE_KEY = 'vega_sidebar_store'; export enum ViewType { Order = 'Order', Info = 'Info', Deposit = 'Deposit', Withdraw = 'Withdraw', Transfer = 'Transfer', Settings = 'Settings', ViewAs = 'ViewAs', } type SidebarView = | { type: ViewType.Deposit; assetId?: string; } | { type: ViewType.Withdraw; assetId?: string; } | { type: ViewType.Transfer; assetId?: string; } | { type: ViewType.Order; } | { type: ViewType.Info; } | { type: ViewType.Settings; }; export const Sidebar = () => { const navClasses = 'flex lg:flex-col items-center gap-2 lg:gap-4 p-1'; const setViewAsDialogOpen = useViewAsDialog((state) => state.setOpen); const { pubKeys } = useVegaWallet(); return (
); }; export const SidebarButton = ({ view, icon, tooltip, disabled = false, onClick, }: { view?: ViewType; icon: VegaIconNames; tooltip: string; disabled?: boolean; onClick?: () => void; }) => { const { currView, setView } = useSidebar((store) => ({ currView: store.view, setView: store.setView, })); const onSelect = (view: SidebarView['type']) => { if (view === currView?.type) { setView(null); } else { setView({ type: view }); } }; const buttonClasses = classNames('flex items-center p-1 rounded', { 'text-vega-clight-200 dark:text-vega-cdark-200 hover:bg-vega-clight-500 dark:hover:bg-vega-cdark-500': !view || view !== currView?.type, 'bg-vega-yellow hover:bg-vega-yellow-550 text-black': view && view === currView?.type, 'cursor-not-allowed text-vega-clight-500 hover:bg-inherit dark:text-vega-cdark-500 dark:hover:bg-inherit': disabled, }); return ( ); }; const SidebarDivider = () => { return (
); }; export const SidebarContent = () => { const params = useParams(); const { view, setView } = useSidebar(); if (!view) return null; if (view.type === ViewType.Order) { if (params.marketId) { return ( setView({ type: ViewType.Deposit, assetId }) } /> ); } else { return ; } } if (view.type === ViewType.Info) { if (params.marketId) { return ( ); } else { return ; } } if (view.type === ViewType.Deposit) { return ( ); } if (view.type === ViewType.Withdraw) { return ( ); } if (view.type === ViewType.Transfer) { return ( ); } if (view.type === ViewType.Settings) { return ( ); } throw new Error('invalid sidebar'); }; const ContentWrapper = ({ children, title, }: { children: ReactNode; title?: string; }) => { return ( {title &&

{title}

} {children}
); }; /** If rendered will close sidebar */ const CloseSidebar = () => { const setView = useSidebar((store) => store.setView); useEffect(() => { setView(null); }, [setView]); return null; }; export const useSidebar = create<{ init: boolean; view: SidebarView | null; setView: (view: SidebarView | null) => void; }>()( persist( (set) => ({ init: true, view: null, setView: (x) => set(() => { if (x == null) { return { view: null, init: false }; } return { view: x, init: false }; }), }), { name: STORAGE_KEY, } ) );