import * as React from "react"; import { useLayoutEffect, useRef, useState } from "react"; import { Box, ListItemIcon, ListItemText, Menu, MenuItem, Typography, useMediaQuery, useTheme } from "@mui/material"; import { StyledTab, StyledTabs } from "./StyledComponents.tsx"; import CaretDown from "../Icons/CaretDown.tsx"; import { useTranslation } from "react-i18next"; import { bindMenu, bindTrigger, usePopupState } from "material-ui-popup-state/hooks"; export interface Tab { label: React.ReactNode; value: T; icon?: React.ReactElement; } export interface ResponsiveTabsProps { tabs: Tab[]; value: T; onChange: (event: React.SyntheticEvent, value: T) => void; } const ResponsiveTabs = ({ tabs, value, onChange }: ResponsiveTabsProps) => { const theme = useTheme(); const isMobile = useMediaQuery(theme.breakpoints.down("sm")); const [hideTabs, setHideTabs] = useState(false); const tabsRef = useRef(null); const { t } = useTranslation(); const moreOptionState = usePopupState({ variant: "popover", popupId: "tabMore", }); const { onClose, ...menuProps } = bindMenu(moreOptionState); useLayoutEffect(() => { const checkOverflow = () => { if (tabsRef.current?.children[0]?.children[0]) { setHideTabs((e) => e ? true : (tabsRef.current?.children[0]?.children[0]?.scrollWidth ?? 0) > (tabsRef.current?.children[0]?.children[0]?.clientWidth ?? 0), ); } }; checkOverflow(); window.addEventListener("resize", checkOverflow); return () => window.removeEventListener("resize", checkOverflow); }, []); return ( {tabs .filter((tab) => (isMobile || hideTabs ? tab.value == value : true)) .map((tab) => ( ))} {(isMobile || hideTabs) && tabs.length > 1 && ( <> {t("application:navbar.showMore")} } {...bindTrigger(moreOptionState)} /> {tabs .filter((tab) => tab.value != value) .map((option, index) => ( { onClose(); onChange(e, option.value); }} > {option.icon && {option.icon}} {option.label} ))} )} ); }; export default ResponsiveTabs;