import classNames from 'classnames'; import type { ReactNode } from 'react'; import { useEffect } from 'react'; import { 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 { 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 { GetStarted } from '../welcome-dialog'; import { useVegaWallet, useViewAsDialog } from '@vegaprotocol/wallet'; import { useGetCurrentRouteId } from '../../lib/hooks/use-get-current-route-id'; import { useT } from '../../lib/use-t'; import { ErrorBoundary } from '../error-boundary'; import { useScreenDimensions } from '@vegaprotocol/react-helpers'; export enum ViewType { Order = 'Order', Info = 'Info', Deposit = 'Deposit', Withdraw = 'Withdraw', Transfer = 'Transfer', Settings = 'Settings', ViewAs = 'ViewAs', Close = 'Close', } export type BarView = | { type: ViewType.Deposit; assetId?: string; } | { type: ViewType.Withdraw; assetId?: string; } | { type: ViewType.Transfer; assetId?: string; } | { type: ViewType.Order; } | { type: ViewType.Info; } | { type: ViewType.Settings; } | { type: ViewType.Close; }; export const Sidebar = ({ options }: { options?: ReactNode }) => { const t = useT(); const currentRouteId = useGetCurrentRouteId(); const navClasses = 'flex lg:flex-col items-center gap-2 lg:gap-4 p-1'; const setViewAsDialogOpen = useViewAsDialog((state) => state.setOpen); const { pubKeys } = useVegaWallet(); const { isMobile } = useScreenDimensions(); const { getView } = useSidebar((store) => ({ setViews: store.setViews, getView: store.getView, })); const currView = getView(currentRouteId); return (
{options && ( )}
); }; export const SidebarButton = ({ view, icon, tooltip, disabled = false, onClick, routeId, }: { view?: ViewType; icon: VegaIconNames; tooltip: string; disabled?: boolean; onClick?: () => void; routeId: string; }) => { const { setViews, getView } = useSidebar((store) => ({ setViews: store.setViews, getView: store.getView, })); const currView = getView(routeId); const onSelect = (view: BarView['type']) => { if (view === currView?.type) { setViews(null, routeId); } else { setViews({ type: view }, routeId); } }; const buttonClasses = classNames( 'flex items-center p-1 rounded', 'disabled:cursor-not-allowed disabled:text-vega-clight-500 dark:disabled:text-vega-cdark-500', { 'text-vega-clight-200 dark:text-vega-cdark-200 enabled:hover:bg-vega-clight-500 dark:enabled:hover:bg-vega-cdark-500': !view || view !== currView?.type, 'bg-vega-yellow enabled:hover:bg-vega-yellow-550 text-black': view && view === currView?.type, } ); return ( ); }; export const SidebarDivider = () => { return (
); }; export const SidebarContent = () => { const t = useT(); const params = useParams(); const currentRouteId = useGetCurrentRouteId(); const { setViews, getView } = useSidebar(); const view = getView(currentRouteId); if (!view) return null; if (view.type === ViewType.Order) { if (params.marketId) { return ( setViews({ type: ViewType.Deposit, assetId }, currentRouteId) } /> ); } else { return ; } } if (view.type === ViewType.Close) { 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 currentRouteId = useGetCurrentRouteId(); const setViews = useSidebar((store) => store.setViews); useEffect(() => { setViews(null, currentRouteId); }, [setViews, currentRouteId]); return null; }; export const useSidebar = create<{ views: { [key: string]: BarView | null }; setViews: (view: BarView | null, routeId: string) => void; getView: (routeId: string) => BarView | null | undefined; }>()((set, get) => ({ views: {}, setViews: (x, routeId) => set(({ views }) => ({ views: { ...views, [routeId]: x } })), getView: (routeId) => get().views[routeId], }));