import ListItemButton, { ListItemButtonBaseProps } from '@mui/material/ListItemButton'; import React, { FC } from 'react'; import { Link, useLocation, useSearchParams } from 'react-router-dom'; interface ListItemLinkProps extends ListItemButtonBaseProps { to: string includePaths?: string[] excludePaths?: string[] } const isMatchingParams = (routeParams: URLSearchParams, currentParams: URLSearchParams) => { for (const param of routeParams) { if (currentParams.get(param[0]) !== param[1]) { return false; } } return true; }; const ListItemLink: FC = ({ children, to, includePaths = [], excludePaths = [], ...params }) => { const location = useLocation(); const [ searchParams ] = useSearchParams(); const [ toPath, toParams ] = to.split('?'); // eslint-disable-next-line compat/compat const toSearchParams = new URLSearchParams(`?${toParams}`); const selectedPaths = [ toPath, ...includePaths ]; const selected = selectedPaths.includes(location.pathname) && !excludePaths.includes(location.pathname + location.search) && (!toParams || isMatchingParams(toSearchParams, searchParams)); return ( {children} ); }; export default ListItemLink;