Files
2024-02-15 17:01:50 +00:00

87 lines
2.5 KiB
TypeScript

import {Link as RouterLink} from 'react-router';
import styled from '@emotion/styled';
import {t} from 'sentry/locale';
import getRouteStringFromRoutes from 'sentry/utils/getRouteStringFromRoutes';
import recreateRoute from 'sentry/utils/recreateRoute';
import Crumb from 'sentry/views/settings/components/settingsBreadcrumb/crumb';
import Divider from 'sentry/views/settings/components/settingsBreadcrumb/divider';
import {OrganizationCrumb} from 'sentry/views/settings/components/settingsBreadcrumb/organizationCrumb';
import ProjectCrumb from 'sentry/views/settings/components/settingsBreadcrumb/projectCrumb';
import TeamCrumb from 'sentry/views/settings/components/settingsBreadcrumb/teamCrumb';
import {useBreadcrumbsPathmap} from './context';
import type {RouteWithName} from './types';
const MENUS = {
Organization: OrganizationCrumb,
Project: ProjectCrumb,
Team: TeamCrumb,
} as const;
type Props = {
params: {[param: string]: string | undefined};
route: any;
routes: RouteWithName[];
className?: string;
};
function SettingsBreadcrumb({className, routes, params}: Props) {
const pathMap = useBreadcrumbsPathmap();
const lastRouteIndex = routes.map(r => !!r.name).lastIndexOf(true);
return (
<Breadcrumbs aria-label={t('Settings Breadcrumbs')} className={className}>
{routes.map((route, i) => {
if (!route.name) {
return null;
}
const pathTitle = pathMap[getRouteStringFromRoutes(routes.slice(0, i + 1))];
const isLast = i === lastRouteIndex;
const createMenu = MENUS[route.name];
const Menu = typeof createMenu === 'function' && createMenu;
const hasMenu = !!Menu;
if (hasMenu) {
return (
<Menu
key={`${route.name}:${route.path}`}
routes={routes}
params={params}
route={route}
isLast={isLast}
/>
);
}
return (
<Crumb key={`${route.name}:${route.path}`}>
<CrumbLink to={recreateRoute(route, {routes, params})}>
{pathTitle || route.name}
</CrumbLink>
<Divider isLast={isLast} />
</Crumb>
);
})}
</Breadcrumbs>
);
}
export default SettingsBreadcrumb;
const CrumbLink = styled(RouterLink)`
display: block;
color: ${p => p.theme.subText};
&:hover {
color: ${p => p.theme.textColor};
}
`;
export {CrumbLink};
const Breadcrumbs = styled('nav')`
display: flex;
align-items: center;
`;