diff --git a/src/layouts/CompetitionLayout/CompetitionLayout.tsx b/src/layouts/CompetitionLayout/CompetitionLayout.tsx index cd496bb..be154e1 100644 --- a/src/layouts/CompetitionLayout/CompetitionLayout.tsx +++ b/src/layouts/CompetitionLayout/CompetitionLayout.tsx @@ -1,5 +1,5 @@ import classNames from 'classnames'; -import { useEffect, useRef } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; import { ErrorBoundary } from 'react-error-boundary'; import { Outlet, useLocation, useParams } from 'react-router-dom'; import { BarLoader } from 'react-spinners'; @@ -17,6 +17,7 @@ export function CompetitionLayout() { const { pathname } = useLocation(); const ref = useRef(null); + const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const { data: wcif, dataUpdatedAt, isFetching } = useWcif(competitionId!); @@ -24,15 +25,88 @@ export function CompetitionLayout() { competitionId: competitionId!, wcif: wcif, }); + const mobileTabs = useMemo(() => tabs.filter((tab) => !tab.hiddenOnMobile), [tabs]); + + const currentTab = useMemo( + () => + mobileTabs.find((tab) => pathname === tab.href) || + mobileTabs.find((tab) => pathname.startsWith(tab.href)), + [mobileTabs, pathname], + ); + const primaryMobileTabs = useMemo(() => { + const primary = mobileTabs.slice(0, 4); + if (currentTab && !primary.some((tab) => tab.href === currentTab.href)) { + return [...primary.slice(0, 3), currentTab]; + } + return primary; + }, [mobileTabs, currentTab]); + const overflowMobileTabs = useMemo( + () => + mobileTabs.filter( + (tab) => !primaryMobileTabs.some((primaryTab) => primaryTab.href === tab.href), + ), + [mobileTabs, primaryMobileTabs], + ); useEffect(() => { ref.current?.scrollTo(0, 0); + setIsMobileMenuOpen(false); }, [pathname]); const Header = (