diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f2cc1cec..2b4f8ef10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ changes. - Fix adding two link input fields when editing the dRep form when no links are present initially [Issue 3709](https://github.com/IntersectMBO/govtool/issues/3709) ### Changed +- Adjust top menu (navbar) layout when wallet is not connected [Issue-3682](https://github.com/IntersectMBO/govtool/issues/3682) ### Removed diff --git a/govtool/frontend/src/components/atoms/Link.tsx b/govtool/frontend/src/components/atoms/Link.tsx index 78fc8bccd..14b6862c4 100644 --- a/govtool/frontend/src/components/atoms/Link.tsx +++ b/govtool/frontend/src/components/atoms/Link.tsx @@ -1,4 +1,4 @@ -import { FC } from "react"; +import { forwardRef, MouseEvent } from "react"; import { NavLink } from "react-router-dom"; import { Typography } from "@mui/material"; import { useCardano } from "@context"; @@ -6,51 +6,54 @@ import { useCardano } from "@context"; type LinkProps = { dataTestId?: string; isConnectWallet?: boolean; - label: string; + label: React.ReactNode; navTo: string; - onClick?: () => void; + onClick?: (event: MouseEvent) => void; size?: "small" | "big"; }; -export const Link: FC = ({ ...props }) => { - const { - dataTestId, - isConnectWallet, - label, - navTo, - size = "small", - onClick, - } = props; - const { disconnectWallet } = useCardano(); +export const Link = forwardRef( + ({ ...props }, ref) => { + const { + dataTestId, + isConnectWallet, + label, + navTo, + size = "small", + onClick, + } = props; + const { disconnectWallet } = useCardano(); - const fontSize = { - small: 14, - big: 22, - }[size]; + const fontSize = { + small: 14, + big: 22, + }[size]; - return ( - { - if (!isConnectWallet) disconnectWallet(); - if (onClick) onClick(); - }} - > - {({ isActive }) => ( - - {label} - - )} - - ); -}; + return ( + { + if (!isConnectWallet) disconnectWallet(); + if (onClick) onClick(e); + }} + ref={ref} + > + {({ isActive }) => ( + + {label} + + )} + + ); + }, +); diff --git a/govtool/frontend/src/components/organisms/DrawerMobile.tsx b/govtool/frontend/src/components/organisms/DrawerMobile.tsx index ebdc1885e..12cb754a6 100644 --- a/govtool/frontend/src/components/organisms/DrawerMobile.tsx +++ b/govtool/frontend/src/components/organisms/DrawerMobile.tsx @@ -1,8 +1,9 @@ +import { FC } from "react"; import { NavLink } from "react-router-dom"; import { Box, Grid, IconButton, SwipeableDrawer } from "@mui/material"; import { Background, Button, Link, Typography } from "@atoms"; -import { ICONS, IMAGES, NAV_ITEMS, PATHS } from "@consts"; +import { ICONS, IMAGES, NAV_ITEMS, NavMenuItem, NavItem, PATHS } from "@consts"; import { useScreenDimension, useTranslation } from "@hooks"; import { useFeatureFlag, useModal } from "@context"; import { openInNewTab } from "@utils"; @@ -13,15 +14,14 @@ import { LINKS } from "@/consts/links"; const DRAWER_PADDING = 2; const CALCULATED_DRAWER_PADDING = DRAWER_PADDING * 8 * 2; +const isNavMenuItem = (item: NavItem | NavMenuItem): item is NavMenuItem => + "childNavItems" in item; + export const DrawerMobile = ({ isConnectButton, isDrawerOpen, setIsDrawerOpen, }: DrawerMobileProps) => { - const { - isProposalDiscussionForumEnabled, - isGovernanceOutcomesPillarEnabled, - } = useFeatureFlag(); const { screenWidth } = useScreenDimension(); const { openModal } = useModal(); const { t } = useTranslation(); @@ -85,18 +85,13 @@ export const DrawerMobile = ({ {NAV_ITEMS.map((navItem) => { - if ( - !isProposalDiscussionForumEnabled && - navItem.dataTestId === "proposed-governance-actions-link" - ) { - return null; - } - - if ( - !isGovernanceOutcomesPillarEnabled && - navItem.dataTestId === "governance-actions-outcomes-link" - ) { - return null; + if (isNavMenuItem(navItem)) { + return ( + setIsDrawerOpen(false)} + navItem={navItem} + /> + ); } return ( @@ -129,3 +124,60 @@ export const DrawerMobile = ({ ); }; + +const MenuNavItem: FC<{ + navItem: NavMenuItem; + closeDrawer: () => void; +}> = ({ closeDrawer, navItem }) => { + const { + isProposalDiscussionForumEnabled, + isGovernanceOutcomesPillarEnabled, + } = useFeatureFlag(); + + const filterChildNavItems = () => { + if (navItem.dataTestId === "governance-actions") { + return (navItem.childNavItems || []).filter((item) => { + if ( + !isProposalDiscussionForumEnabled && + item.dataTestId === "proposed-governance-actions-link" + ) + return false; + if ( + !isGovernanceOutcomesPillarEnabled && + item.dataTestId === "governance-actions-outcomes-link" + ) + return false; + return true; + }); + } + return navItem.childNavItems; + }; + return ( + <> + + + + {filterChildNavItems()?.map((childNavItem) => ( + + { + if (childNavItem.newTabLink) { + openInNewTab(childNavItem.newTabLink); + } + closeDrawer(); + }} + label={childNavItem.label} + size="big" + /> + + ))} + + ); +}; diff --git a/govtool/frontend/src/components/organisms/TopNav.tsx b/govtool/frontend/src/components/organisms/TopNav.tsx index 2d8da5cf0..2d3190884 100644 --- a/govtool/frontend/src/components/organisms/TopNav.tsx +++ b/govtool/frontend/src/components/organisms/TopNav.tsx @@ -1,9 +1,9 @@ -import { useEffect, useRef, useState } from "react"; +import { useEffect, useRef, useState, FC } from "react"; import { NavLink, useNavigate } from "react-router-dom"; -import { AppBar, Box, Grid, IconButton } from "@mui/material"; +import { AppBar, Box, Grid, IconButton, Menu, MenuItem } from "@mui/material"; import MenuIcon from "@mui/icons-material/Menu"; import { Button, Link } from "@atoms"; -import { ICONS, IMAGES, PATHS, NAV_ITEMS } from "@consts"; +import { ICONS, IMAGES, PATHS, NAV_ITEMS, NavMenuItem } from "@consts"; import { useCardano, useFeatureFlag, useModal } from "@context"; import { useScreenDimension, useTranslation } from "@hooks"; import { openInNewTab } from "@utils"; @@ -12,11 +12,10 @@ import { useMaintenanceEndingBannerContext } from "./MaintenanceEndingBanner"; const POSITION_TO_BLUR = 80; +const isNavMenuItem = (item: NavItem | NavMenuItem): item is NavMenuItem => + "childNavItems" in item; + export const TopNav = ({ isConnectButton = true }) => { - const { - isProposalDiscussionForumEnabled, - isGovernanceOutcomesPillarEnabled, - } = useFeatureFlag(); const containerRef = useRef(null); const [shouldBlur, setShouldBlur] = useState(false); const { openModal } = useModal(); @@ -49,20 +48,6 @@ export const TopNav = ({ isConnectButton = true }) => { openModal({ type: "chooseWallet" }); }; - const filteredNavItems = NAV_ITEMS.filter((navItem) => { - if ( - !isProposalDiscussionForumEnabled && - navItem.dataTestId === "proposed-governance-actions-link" - ) - return false; - if ( - !isGovernanceOutcomesPillarEnabled && - navItem.dataTestId === "governance-actions-outcomes-link" - ) - return false; - return true; - }); - const renderDesktopNav = () => (