diff --git a/src/components/Menu/Menu.style.ts b/src/components/Menu/Menu.style.ts index f23aee6bd..412b58e82 100644 --- a/src/components/Menu/Menu.style.ts +++ b/src/components/Menu/Menu.style.ts @@ -46,13 +46,13 @@ export const MenuList = styled(MuiMenuList, { justifyContent: cardsLayout ? 'center' : 'unset', flexWrap: cardsLayout ? 'wrap' : 'inherit', padding: cardsLayout ? theme.spacing(0, 3) : 0, + outline: 'unset', gap: cardsLayout ? '12px' : 'inherit', '& > :first-of-type': { marginTop: isOpenSubMenu || hasLabel || cardsLayout ? 'inherit' : theme.spacing(1.5), - paddingTop: isOpenSubMenu ? theme.spacing(1.5) : 'inherit', }, - '& > :last-child': { + '& > li:last-of-type': { marginBottom: isOpenSubMenu ? 'inherit' : theme.spacing(3), paddingBottom: isOpenSubMenu ? theme.spacing(1.5) : 'inherit', paddingTop: hasLabel ? 0 : 'inherit', @@ -68,7 +68,7 @@ export const MenuHeaderLabel = styled(Typography)(({ theme }) => ({ display: 'flex', marginRight: theme.spacing(4.75), flexWrap: 'nowrap', - [theme.breakpoints.up('sm' as Breakpoint)]: { + [theme.breakpoints.up('md' as Breakpoint)]: { maxWidth: 174, marginRight: 0, marginLeft: theme.spacing(0.75), @@ -78,14 +78,16 @@ export const MenuHeaderLabel = styled(Typography)(({ theme }) => ({ export interface MenuPaperProps extends Omit { isMobile?: boolean; + show: boolean; width?: string; component?: ElementType; } export const MenuPaper = styled(Paper, { shouldForwardProp: (prop) => - prop !== 'isMobile' && prop !== 'isWide' && prop !== 'isSubMenu', -})(({ theme, isMobile, width }) => ({ + prop !== 'isMobile' && prop !== 'isWide' && prop !== 'show', +})(({ theme, isMobile, width, show }) => ({ + display: !show ? 'none' : 'block', background: theme.palette.surface1.main, padding: 0, marginTop: 0, @@ -99,11 +101,13 @@ export const MenuPaper = styled(Paper, { }8px 16px rgba(0, 0, 0, 0.16)`, borderRadius: '12px 12px 0 0', marginBottom: 0, + maxHeight: `calc( 100vh - ${MENU_LABEL_HEIGHT}px - 12px )`, // viewHeight - navbarHeight - offset overflowY: 'auto', overflowX: 'hidden', width: '100%', transformOrigin: 'bottom', + height: '100% !important', transition: 'opacity 307ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, transform 204ms cubic-bezier(0.4, 0, 0.2, 1) 0ms', @@ -112,6 +116,8 @@ export const MenuPaper = styled(Paper, { height: 32, }, + '.submenu': { paddingBottom: theme.spacing(1.5) }, + [theme.breakpoints.up('sm' as Breakpoint)]: { maxHeight: 'calc( 100vh - 72px - 12px )', }, @@ -138,7 +144,6 @@ export const MenuItemLink = styled(Link, { })(({ theme }) => ({ display: 'flex', justifyContent: 'space-between', - padding: theme.spacing(0, 1.5), height: 48, textDecoration: 'none', color: 'inherit', diff --git a/src/components/Menu/Menu.tsx b/src/components/Menu/Menu.tsx index a8f30567a..c7746f272 100644 --- a/src/components/Menu/Menu.tsx +++ b/src/components/Menu/Menu.tsx @@ -8,6 +8,7 @@ interface MenuProps { setOpen: (open: boolean, anchorRef: any) => void; cardsLayout?: boolean; styles?: SxProps; + keepMounted?: boolean; open: boolean; children: any; width?: string; @@ -19,6 +20,7 @@ export const Menu = ({ setOpen, cardsLayout, styles, + keepMounted, width, label, isOpenSubMenu, @@ -32,6 +34,7 @@ export const Menu = ({ label={label} open={open} styles={styles} + keepMounted={keepMounted} width={width} cardsLayout={cardsLayout} setOpen={setOpen} @@ -45,8 +48,8 @@ export const Menu = ({ label={label} open={open} styles={styles} + keepMounted={keepMounted} cardsLayout={cardsLayout} - setOpen={setOpen} isOpenSubMenu={isOpenSubMenu || false} > {children} diff --git a/src/components/Menu/MenuDesktop.tsx b/src/components/Menu/MenuDesktop.tsx index 17f77daa3..b009334e1 100644 --- a/src/components/Menu/MenuDesktop.tsx +++ b/src/components/Menu/MenuDesktop.tsx @@ -1,8 +1,7 @@ import { MenuKeysEnum, MenuMain } from '@/const/menuKeys'; import { useMenuStore } from '@/stores/menu/MenuStore'; import type { SxProps, Theme } from '@mui/material'; -import { Fade, Typography } from '@mui/material'; -import ClickAwayListener from '@mui/material/ClickAwayListener'; +import { ClickAwayListener, Fade, Typography } from '@mui/material'; import type { KeyboardEvent } from 'react'; import { MenuHeaderAppBar, @@ -17,6 +16,7 @@ interface MenuProps { transformOrigin?: string; cardsLayout?: boolean; styles?: SxProps; + keepMounted?: boolean; setOpen: (open: boolean, anchorRef: any) => void; open: boolean; children: any; @@ -28,6 +28,7 @@ export const MenuDesktop = ({ isOpenSubMenu, setOpen, styles, + keepMounted, transformOrigin, cardsLayout, width, @@ -36,7 +37,9 @@ export const MenuDesktop = ({ children, anchorEl, }: MenuProps) => { - const { openSubMenu, closeAllMenus } = useMenuStore((state) => state); + const { openedMenu, openSubMenu, closeAllMenus } = useMenuStore( + (state) => state, + ); function handleListKeyDown(event: KeyboardEvent) { if (event.key === 'Tab' || event.key === 'Escape') { @@ -45,67 +48,72 @@ export const MenuDesktop = ({ } } - return open ? ( - <> + return ( + { + console.log('Click Away Listener'); + setTimeout(() => { + event.stopPropagation(); + event.preventDefault(); + open && closeAllMenus(); + }, 150); + }} + > {({ TransitionProps }) => ( - - { - event.preventDefault(); - closeAllMenus(); - }} + + - - {!!label ? ( - - - - {label} - - - - ) : null} - {children} - - + {!!label ? ( + + + + {label} + + + + ) : null} + {children} + )} - - ) : null; + + ); }; diff --git a/src/components/Menu/MenuItem.style.ts b/src/components/Menu/MenuItem.style.ts index 7d91a0f6e..a9cc1029d 100644 --- a/src/components/Menu/MenuItem.style.ts +++ b/src/components/Menu/MenuItem.style.ts @@ -1,4 +1,3 @@ -'use client'; import type { ListItemProps, MenuItemProps as MUIMenuItemProps, diff --git a/src/components/Menu/MenuItem.tsx b/src/components/Menu/MenuItem.tsx index a1d1a48fb..6b62b44db 100644 --- a/src/components/Menu/MenuItem.tsx +++ b/src/components/Menu/MenuItem.tsx @@ -1,19 +1,15 @@ import { ButtonSecondary } from '@/components/Button/Button.style'; import type { MenuKeysEnum } from '@/const/menuKeys'; -import { - TrackingAction, - TrackingCategory, - TrackingEventParameter, -} from '@/const/trackingKeys'; -import { useUserTracking } from '@/hooks/userTracking/useUserTracking'; -import { useMenuStore } from '@/stores/menu/MenuStore'; -import { EventTrackingTool } from '@/types/userTracking'; -import ChevronRightIcon from '@mui/icons-material/ChevronRight'; import type { Breakpoint, SxProps, Theme } from '@mui/material'; import { Typography, useTheme } from '@mui/material'; import type { JsxElement } from 'typescript'; -import { MenuItemContainer, MenuLabel } from '.'; +import { MenuItemContainer, MenuItemLink } from '.'; +import { MenuItemLabel } from './MenuItemLabel'; +export interface MenuItemLinkType { + url: string; + external?: boolean; +} interface MenuItemProps { open: boolean; showButton: boolean | undefined; @@ -22,12 +18,12 @@ interface MenuItemProps { autoFocus?: boolean; showMoreIcon?: boolean; styles?: SxProps; + link?: MenuItemLinkType; label?: string; onClick?: any; triggerSubMenu?: MenuKeysEnum; prefixIcon?: JSX.Element | string; suffixIcon?: JSX.Element | string; - checkIcon?: boolean; } export const MenuItem = ({ @@ -37,6 +33,7 @@ export const MenuItem = ({ disableRipple, children, showMoreIcon = true, + link, styles, onClick, label, @@ -45,22 +42,9 @@ export const MenuItem = ({ suffixIcon, }: MenuItemProps) => { const theme = useTheme(); - const { trackEvent } = useUserTracking(); - const { setSubMenuState } = useMenuStore((state) => state); - const handleClick = () => { - triggerSubMenu && setSubMenuState(triggerSubMenu); - triggerSubMenu && - trackEvent({ - category: TrackingCategory.MainMenu, - action: TrackingAction.OpenMenu, - label: `open_submenu_${triggerSubMenu.toLowerCase()}`, - data: { [TrackingEventParameter.Menu]: triggerSubMenu }, - disableTrackingTool: [ - EventTrackingTool.ARCx, - EventTrackingTool.Cookie3, - ], - }); + const handleClick = (event: any) => { + event?.stopPropagation(); onClick && onClick(); }; @@ -70,8 +54,9 @@ export const MenuItem = ({ showButton={showButton || false} sx={styles} autoFocus={autoFocus} - onClick={() => { - !children && handleClick(); + onClick={(event) => { + event.stopPropagation(); + !children && handleClick(event); }} > <> @@ -102,48 +87,26 @@ export const MenuItem = ({ {suffixIcon ?? null} )} - {!showButton && ( - <> - - {prefixIcon ?? null} - {label ? ( - - {label} - - ) : null} - - {suffixIcon || showMoreIcon ? ( -
- {suffixIcon ?? null} - {showMoreIcon ? ( - - ) : null} -
- ) : null} - + {!showButton && link?.url && ( + + + + )} + {!showButton && !link?.url && ( + )} diff --git a/src/components/Menu/MenuItemLabel.tsx b/src/components/Menu/MenuItemLabel.tsx new file mode 100644 index 000000000..48cce0455 --- /dev/null +++ b/src/components/Menu/MenuItemLabel.tsx @@ -0,0 +1,64 @@ +import ChevronRightIcon from '@mui/icons-material/ChevronRight'; +import type { Breakpoint } from '@mui/material'; +import { Typography, useTheme } from '@mui/material'; +import { MenuLabel } from '.'; + +interface MenuItemLabelProps { + showMoreIcon?: boolean; + label?: string; + prefixIcon?: JSX.Element | string; + suffixIcon?: JSX.Element | string; +} + +export const MenuItemLabel = ({ + showMoreIcon = true, + label, + prefixIcon, + suffixIcon, +}: MenuItemLabelProps) => { + const theme = useTheme(); + + return ( + <> + + {prefixIcon ?? null} + {label ? ( + + {label} + + ) : null} + + {suffixIcon || showMoreIcon ? ( +
+ {suffixIcon ?? null} + {showMoreIcon ? ( + + ) : null} +
+ ) : null} + + ); +}; diff --git a/src/components/Menu/MenuMobile.tsx b/src/components/Menu/MenuMobile.tsx index 158cc8f87..9abd7959f 100644 --- a/src/components/Menu/MenuMobile.tsx +++ b/src/components/Menu/MenuMobile.tsx @@ -2,7 +2,6 @@ import { MenuKeysEnum } from '@/const/menuKeys'; import { useMenuStore } from '@/stores/menu'; import type { SxProps, Theme } from '@mui/material'; import { Typography } from '@mui/material'; -import ClickAwayListener from '@mui/material/ClickAwayListener'; import { MenuHeaderAppBar, MenuHeaderAppWrapper, @@ -22,7 +21,7 @@ const paperProps = { interface MenuProps { isOpenSubMenu: boolean; - setOpen: (open: boolean, anchorRef: any) => void; + keepMounted?: boolean; cardsLayout?: boolean; styles?: SxProps; label?: string; @@ -34,54 +33,56 @@ export const MenuMobile = ({ open, cardsLayout, label, + keepMounted, styles, isOpenSubMenu, children, }: MenuProps) => { const { openSubMenu, closeAllMenus } = useMenuStore((state) => state); - return ( - - - { - event.preventDefault(); - closeAllMenus(); - }} + { + reason === 'backdropClick' && closeAllMenus(); + }} + PaperProps={paperProps} + keepMounted={keepMounted} + disableScrollLock + > + + - - {!!label ? ( - - - - {label} - - - - ) : null} - {children} - - + {!!label ? ( + + + + {label} + + + + ) : null} + {children} + ); diff --git a/src/components/Menu/SubMenu.tsx b/src/components/Menu/SubMenu.tsx index abd1819ce..5e44b705d 100644 --- a/src/components/Menu/SubMenu.tsx +++ b/src/components/Menu/SubMenu.tsx @@ -1,14 +1,7 @@ 'use client'; import type { MenuKeysEnum } from '@/const/menuKeys'; -import { - TrackingAction, - TrackingCategory, - TrackingEventParameter, -} from '@/const/trackingKeys'; -import { useUserTracking } from '@/hooks/userTracking/useUserTracking'; import { useMenuStore } from '@/stores/menu'; import type { MenuListItem } from '@/types/internal'; -import { EventTrackingTool } from '@/types/userTracking'; import { getContrastAlphaColor } from '@/utils/colors'; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import CheckIcon from '@mui/icons-material/Check'; @@ -31,10 +24,6 @@ import { interface SubMenuProps { open: boolean; label: string; - suffixIcon?: JSX.Element | string; - prefixIcon?: JSX.Element | string; - checkIcon?: boolean; - url?: string; prevMenu: MenuKeysEnum; subMenuList: MenuListItem[]; triggerSubMenu: MenuKeysEnum; @@ -48,7 +37,6 @@ export const SubMenu = ({ subMenuList, }: SubMenuProps) => { const theme = useTheme(); - const { trackEvent } = useUserTracking(); const menuListRef = useRef(null); const { openSubMenu, setSubMenuState } = useMenuStore((state) => state); @@ -59,24 +47,7 @@ export const SubMenu = ({ } const handleClick = (el: MenuListItem) => { - if (el.triggerSubMenu) { - setSubMenuState(el.triggerSubMenu); - trackEvent({ - category: TrackingCategory.SubMenu, - action: TrackingAction.OpenMenu, - label: `open_submenu_${el.triggerSubMenu.toLowerCase()}`, - data: { - [TrackingEventParameter.Menu]: el.triggerSubMenu, - [TrackingEventParameter.PrevMenu]: prevMenu, - }, - disableTrackingTool: [ - EventTrackingTool.ARCx, - EventTrackingTool.Cookie3, - ], - }); - } else { - typeof el.onClick === 'function' && el.onClick(); - } + el.onClick(); }; const handleBackNavigation = () => { @@ -90,8 +61,9 @@ export const SubMenu = ({ } }, [open, openSubMenu, triggerSubMenu]); - return openSubMenu === triggerSubMenu ? ( + return ( { + onClick={(event) => { + event.stopPropagation(); handleBackNavigation(); }} > @@ -122,42 +95,49 @@ export const SubMenu = ({ {!!subMenuList.length ? ( subMenuList.map((el, index) => - !!el.url ? ( - 0 ? true : false} - onClick={() => { - el.triggerSubMenu - ? setSubMenuState(el.triggerSubMenu) - : el.onClick(); - }} - component="li" + onClick={() => handleClick(el)} key={`${el.label}-${index}`} > - 0 ? true : false} + href={el.link.url} + target={el.link.external ? '_blank' : '_self'} + onClick={(event) => { + event.stopPropagation(); + el.onClick(); + }} + component="li" + key={`${el.label}-${index}`} > - {el.prefixIcon} - - {`${el.label || ' '}`} - - {el.suffixIcon} - - + {el.prefixIcon} + + {`${el.label || ' '}`} + + {el.suffixIcon} + + + ) : ( 0 ? true : false} @@ -202,5 +182,5 @@ export const SubMenu = ({ )} - ) : null; + ); }; diff --git a/src/components/Menus/DevelopersSubMenu/useDevelopersContent.tsx b/src/components/Menus/DevelopersSubMenu/useDevelopersContent.tsx index eb9da5928..d00a45c60 100644 --- a/src/components/Menus/DevelopersSubMenu/useDevelopersContent.tsx +++ b/src/components/Menus/DevelopersSubMenu/useDevelopersContent.tsx @@ -12,7 +12,6 @@ import { import { DOCS_URL, GITHUB_URL } from '@/const/urls'; import { useUserTracking } from '@/hooks/userTracking/useUserTracking'; -import { openInNewTab } from '@/utils/openInNewTab'; import { useTranslation } from 'react-i18next'; export const useDevelopersContent = () => { const { t } = useTranslation(); @@ -51,9 +50,9 @@ export const useDevelopersContent = () => { pageload: true, disableTrackingTool: [EventTrackingTool.Cookie3], }); - openInNewTab(GITHUB_URL); closeAllMenus(); }, + link: { url: GITHUB_URL, external: true }, }, { label: t('navbar.developers.documentation'), @@ -76,9 +75,9 @@ export const useDevelopersContent = () => { pageload: true, disableTrackingTool: [EventTrackingTool.Cookie3], }); - openInNewTab(DOCS_URL); closeAllMenus(); }, + link: { url: DOCS_URL, external: true }, }, { label: t('navbar.navbarMenu.brandAssets'), @@ -95,8 +94,9 @@ export const useDevelopersContent = () => { EventTrackingTool.Cookie3, ], }); - openInNewTab('/jumper_brand_assets.zip'); + closeAllMenus(); }, + link: { url: '/jumper_brand_assets.zip', external: true }, }, ]; }; diff --git a/src/components/Menus/LanguagesSubMenu/useLanguagesContent.tsx b/src/components/Menus/LanguagesSubMenu/useLanguagesContent.tsx index ffbae3db5..3cbb51d2a 100644 --- a/src/components/Menus/LanguagesSubMenu/useLanguagesContent.tsx +++ b/src/components/Menus/LanguagesSubMenu/useLanguagesContent.tsx @@ -38,7 +38,9 @@ export const useLanguagesContent = () => { .map(([language, languageValue]) => ({ label: languageValue.language.value, checkIcon: i18n.language === language, - onClick: () => handleSwitchLanguage(language as LanguageKey), + onClick: () => { + handleSwitchLanguage(language as LanguageKey); + }, })); return languages; diff --git a/src/components/Menus/MainMenu/MainMenu.tsx b/src/components/Menus/MainMenu/MainMenu.tsx index 5fd55fe17..621d8047e 100644 --- a/src/components/Menus/MainMenu/MainMenu.tsx +++ b/src/components/Menus/MainMenu/MainMenu.tsx @@ -17,6 +17,7 @@ export const MainMenu = ({ anchorEl }: MenuProps) => { return ( { autoFocus={index > 0 ? true : false} label={el.label} prefixIcon={el.prefixIcon} + link={el.link} styles={el.styles} children={el.children as unknown as JsxElement} triggerSubMenu={el.triggerSubMenu} @@ -40,7 +42,6 @@ export const MainMenu = ({ anchorEl }: MenuProps) => { open /> ))} - diff --git a/src/components/Menus/MainMenu/useMainMenuContent.tsx b/src/components/Menus/MainMenu/useMainMenuContent.tsx index 9a0668529..a8f49cd6b 100644 --- a/src/components/Menus/MainMenu/useMainMenuContent.tsx +++ b/src/components/Menus/MainMenu/useMainMenuContent.tsx @@ -19,7 +19,6 @@ import { useSettingsStore } from '@/stores/settings'; import { EventTrackingTool } from '@/types/userTracking'; import { appendUTMParametersToLink } from '@/utils/append-utm-params-to-link'; import { getContrastAlphaColor } from '@/utils/colors'; -import { openInNewTab } from '@/utils/openInNewTab'; import AccountCircleIcon from '@mui/icons-material/AccountCircle'; import DeveloperModeIcon from '@mui/icons-material/DeveloperMode'; import LanguageIcon from '@mui/icons-material/Language'; @@ -37,8 +36,9 @@ export const useMainMenuContent = () => { const { trackPageload, trackEvent } = useUserTracking(); const router = useRouter(); const theme = useTheme(); - const { closeAllMenus } = useMenuStore((state) => state); - const { setSupportModalState } = useMenuStore((state) => state); + const { setSupportModalState, setSubMenuState, closeAllMenus } = useMenuStore( + (state) => state, + ); const themeMode = useSettingsStore((state) => state.themeMode); const explorerUrl = appendUTMParametersToLink(EXPLORER_URL, { utm_campaign: 'jumper_to_explorer', @@ -121,16 +121,43 @@ export const useMainMenuContent = () => { ), showMoreIcon: true, triggerSubMenu: MenuKeysEnum.Language, + onClick: () => { + setSubMenuState(MenuKeysEnum.Language); + trackEvent({ + category: TrackingCategory.MainMenu, + action: TrackingAction.OpenMenu, + label: `open_submenu_${MenuKeysEnum.Language.toLowerCase()}`, + data: { [TrackingEventParameter.Menu]: MenuKeysEnum.Language }, + disableTrackingTool: [ + EventTrackingTool.ARCx, + EventTrackingTool.Cookie3, + ], + }); + }, }, { label: t('navbar.navbarMenu.developers'), prefixIcon: , triggerSubMenu: MenuKeysEnum.Devs, + onClick: () => { + setSubMenuState(MenuKeysEnum.Devs); + trackEvent({ + category: TrackingCategory.MainMenu, + action: TrackingAction.OpenMenu, + label: `open_submenu_${MenuKeysEnum.Devs.toLowerCase()}`, + data: { [TrackingEventParameter.Menu]: MenuKeysEnum.Devs }, + disableTrackingTool: [ + EventTrackingTool.ARCx, + EventTrackingTool.Cookie3, + ], + }); + }, }, { label: t('navbar.navbarMenu.profile'), prefixIcon: , showMoreIcon: false, + link: { url: '/profile' }, onClick: () => { trackEvent({ category: TrackingCategory.Menu, @@ -150,6 +177,7 @@ export const useMainMenuContent = () => { label: 'Jumper Learn', prefixIcon: , showMoreIcon: false, + link: { url: '/learn' }, onClick: () => { trackEvent({ category: TrackingCategory.Menu, @@ -169,6 +197,7 @@ export const useMainMenuContent = () => { label: t('navbar.navbarMenu.lifiExplorer'), prefixIcon: , showMoreIcon: false, + link: { url: explorerUrl, external: true }, onClick: () => { trackEvent({ category: TrackingCategory.Menu, @@ -187,7 +216,6 @@ export const useMainMenuContent = () => { pageload: true, disableTrackingTool: [EventTrackingTool.Cookie3], }); - openInNewTab(explorerUrl); }, }, { @@ -212,8 +240,8 @@ export const useMainMenuContent = () => { pageload: true, disableTrackingTool: [EventTrackingTool.Cookie3], }); - openInNewTab(X_URL); }, + link: { url: X_URL, external: true }, }, { label: 'Discord', @@ -245,8 +273,8 @@ export const useMainMenuContent = () => { pageload: true, disableTrackingTool: [EventTrackingTool.Cookie3], }); - openInNewTab(DISCORD_URL); }, + link: { url: DISCORD_URL, external: true }, }, { label: t('navbar.navbarMenu.support'), diff --git a/src/components/Menus/WalletMenu/WalletMenu.tsx b/src/components/Menus/WalletMenu/WalletMenu.tsx index 505783600..c22cd85a1 100644 --- a/src/components/Menus/WalletMenu/WalletMenu.tsx +++ b/src/components/Menus/WalletMenu/WalletMenu.tsx @@ -24,7 +24,6 @@ export const WalletMenu = ({ anchorEl }: WalletMenuProps) => { setWalletMenuState, setSnackbarState, openSubMenu, - closeAllMenus, setWalletSelectMenuState, } = useMenuStore((state) => state); @@ -64,8 +63,8 @@ export const WalletMenu = ({ anchorEl }: WalletMenuProps) => { )} { - closeAllMenus(); + onClick={(event) => { + event.stopPropagation(); setWalletSelectMenuState(true); }} > diff --git a/src/components/Menus/WalletSelectMenu/WalletSelectMenu.tsx b/src/components/Menus/WalletSelectMenu/WalletSelectMenu.tsx index c3af67db5..3ed8b21a3 100644 --- a/src/components/Menus/WalletSelectMenu/WalletSelectMenu.tsx +++ b/src/components/Menus/WalletSelectMenu/WalletSelectMenu.tsx @@ -29,8 +29,12 @@ export const WalletSelectMenu = ({ anchorEl }: MenuProps) => { 0, NUMBER_OF_WALLETS_DISPLAYED, ); - const { openWalletSelectMenu, setWalletSelectMenuState, openSubMenu } = - useMenuStore((state) => state); + const { + openWalletSelectMenu, + setWalletSelectMenuState, + openSubMenu, + setSubMenuState, + } = useMenuStore((state) => state); const menuItemStyles: SxProps = { margin: 0, @@ -128,10 +132,14 @@ export const WalletSelectMenu = ({ anchorEl }: MenuProps) => { openSubMenu === MenuKeysEnum.None && ( + openSubMenu === MenuKeysEnum.None && + setSubMenuState(MenuKeysEnum.WalletSelectMore) + } styles={{ ...menuItemStyles, gridColumn: 'span 3', diff --git a/src/components/Navbar/Navbar.style.tsx b/src/components/Navbar/Navbar.style.tsx index 8c7dd0cd9..639787b58 100644 --- a/src/components/Navbar/Navbar.style.tsx +++ b/src/components/Navbar/Navbar.style.tsx @@ -15,6 +15,7 @@ export const NavbarContainer = styled(AppBar)<{ sticky?: boolean }>( justifyContent: 'space-between', position: 'sticky', top: 0, + minWidth: 416, backdropFilter: 'blur(12px)', boxShadow: 'unset', background: 'transparent', diff --git a/src/components/Navbar/NavbarButtons/NavbarButtons.tsx b/src/components/Navbar/NavbarButtons/NavbarButtons.tsx index 572104f47..5b1d3094e 100644 --- a/src/components/Navbar/NavbarButtons/NavbarButtons.tsx +++ b/src/components/Navbar/NavbarButtons/NavbarButtons.tsx @@ -20,7 +20,8 @@ export const NavbarButtons = ({ redirectToLearn }: NavbarButtonsProps) => { const mainMenuAnchor = useRef(null); const { trackEvent } = useUserTracking(); - const [openMainMenu, setMainMenuState] = useMenuStore((state) => [ + const [openedMenu, openMainMenu, setMainMenuState] = useMenuStore((state) => [ + state.openedMenu, state.openMainMenu, state.setMainMenuState, ]); @@ -38,7 +39,13 @@ export const NavbarButtons = ({ redirectToLearn }: NavbarButtonsProps) => { event: React.MouseEvent, ) => { event.preventDefault(); - setMainMenuState(!openMainMenu); + event.stopPropagation(); + const menuOpen = openedMenu(); + if (menuOpen) { + setMainMenuState(false); + } else { + setMainMenuState(true); + } trackEvent({ category: TrackingCategory.Menu, action: TrackingAction.OpenMenu, @@ -49,25 +56,26 @@ export const NavbarButtons = ({ redirectToLearn }: NavbarButtonsProps) => { }; return ( - - - - handleOnOpenNavbarMainMenu(e)} - > - - + <> + + + handleOnOpenNavbarMainMenu(e)} + > + + + - + ); }; diff --git a/src/components/Navbar/WalletButton.tsx b/src/components/Navbar/WalletButton.tsx index b0150830f..4dbc6a945 100644 --- a/src/components/Navbar/WalletButton.tsx +++ b/src/components/Navbar/WalletButton.tsx @@ -82,7 +82,10 @@ export const WallettButtons = () => { { + event.stopPropagation(); + handleWalletSelectClick(); + }} > ( return updatedState; }), + openedMenu: () => { + const menuState = get(); + return ( + menuState.openMainMenu || + menuState.openEcosystemSelect.open || + menuState.openSubMenu !== MenuKeys.None || + menuState.openSupportModal || + menuState.openWalletSelectMenu || + menuState.openWalletMenu + ); + // Add your desired functionality here + }, + // Close ALL Navbar Menus closeAllMenus: () => { set({ @@ -64,6 +76,9 @@ export const useMenuStore = createWithEqualityFn( set({ openMainMenu: open, openSubMenu: MenuKeysEnum.None, + openWalletSelectMenu: false, + openWalletMenu: false, + openSupportModal: false, }); }, @@ -72,6 +87,9 @@ export const useMenuStore = createWithEqualityFn( set({ openWalletSelectMenu: open, openSubMenu: MenuKeysEnum.None, + openMainMenu: false, + openWalletMenu: false, + openSupportModal: false, }); }, @@ -80,6 +98,9 @@ export const useMenuStore = createWithEqualityFn( set({ openWalletMenu: open, openSubMenu: MenuKeysEnum.None, + openMainMenu: false, + openWalletSelectMenu: false, + openSupportModal: false, }); }, @@ -89,6 +110,9 @@ export const useMenuStore = createWithEqualityFn( openEcosystemSelect: { open, combinedWallet }, openWalletSelectMenu: false, openSubMenu: MenuKeysEnum.None, + openMainMenu: false, + openWalletMenu: false, + openSupportModal: false, }); }, @@ -114,10 +138,10 @@ export const useMenuStore = createWithEqualityFn( // Toggle support modal setSupportModalState: (open) => { set({ + openSupportModal: open, openMainMenu: false, openWalletSelectMenu: false, openWalletMenu: false, - openSupportModal: open, openSubMenu: MenuKeysEnum.None, }); }, diff --git a/src/types/internal.ts b/src/types/internal.ts index c9fa08863..a9ea48f65 100644 --- a/src/types/internal.ts +++ b/src/types/internal.ts @@ -1,6 +1,7 @@ import type { ChainId } from '@lifi/sdk'; import type { WidgetConfig, WidgetSubvariant } from '@lifi/widget'; import type { SxProps, Theme } from '@mui/material'; +import type { MenuItemLinkType } from 'src/components/Menu'; import type { Gtag } from './gtag'; declare global { interface Window { @@ -20,7 +21,7 @@ export interface MenuListItem { showMoreIcon?: boolean; styles?: SxProps; checkIcon?: boolean; - url?: string; + link?: MenuItemLinkType; onClick?: any; showButton?: boolean; } diff --git a/src/types/menu.ts b/src/types/menu.ts index 7baace39c..43ed9c6b6 100644 --- a/src/types/menu.ts +++ b/src/types/menu.ts @@ -17,6 +17,7 @@ export interface EcosystemSelectMenuProps { } export type MenuProps = { + openedMenu: () => boolean; openMainMenu: boolean; openWalletSelectMenu: boolean; openWalletMenu: boolean;