123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- import {Fragment} from 'react';
- import styled from '@emotion/styled';
- import {Breadcrumbs, type Crumb} from 'sentry/components/breadcrumbs';
- import ButtonBar from 'sentry/components/buttonBar';
- import FeedbackWidgetButton from 'sentry/components/feedback/widget/feedbackWidgetButton';
- import * as Layout from 'sentry/components/layouts/thirds';
- import {TabList} from 'sentry/components/tabs';
- import type {TabListItemProps} from 'sentry/components/tabs/item';
- import {IconBusiness} from 'sentry/icons';
- import {space} from 'sentry/styles/space';
- import useOrganization from 'sentry/utils/useOrganization';
- import {useModuleTitles} from 'sentry/views/insights/common/utils/useModuleTitle';
- import {
- type RoutableModuleNames,
- useModuleURLBuilder,
- } from 'sentry/views/insights/common/utils/useModuleURL';
- import {OVERVIEW_PAGE_TITLE} from 'sentry/views/insights/pages/settings';
- import {isModuleEnabled, isModuleVisible} from 'sentry/views/insights/pages/utils';
- import type {ModuleName} from 'sentry/views/insights/types';
- export type Props = {
- domainBaseUrl: string;
- domainTitle: string;
- modules: ModuleName[];
- selectedModule: ModuleName | undefined;
- additionalBreadCrumbs?: Crumb[];
- additonalHeaderActions?: React.ReactNode;
- headerTitle?: React.ReactNode;
- hideDefaultTabs?: boolean;
- tabs?: {onTabChange: (key: string) => void; tabList: React.ReactNode; value: string};
- };
- export function DomainViewHeader({
- modules,
- headerTitle,
- domainTitle,
- selectedModule,
- hideDefaultTabs,
- additonalHeaderActions,
- additionalBreadCrumbs = [],
- domainBaseUrl,
- tabs,
- }: Props) {
- const organization = useOrganization();
- const moduleURLBuilder = useModuleURLBuilder();
- const crumbs: Crumb[] = [
- {
- label: domainTitle,
- to: domainBaseUrl,
- preservePageFilters: true,
- },
- ...additionalBreadCrumbs,
- ];
- const tabValue =
- hideDefaultTabs && tabs?.value ? tabs.value : selectedModule ?? OVERVIEW_PAGE_TITLE;
- const tabList: TabListItemProps[] = [
- {
- key: OVERVIEW_PAGE_TITLE,
- children: OVERVIEW_PAGE_TITLE,
- to: domainBaseUrl,
- },
- ...modules
- .filter(moduleName => isModuleVisible(moduleName, organization))
- .map(moduleName => ({
- key: moduleName,
- children: <TabLabel moduleName={moduleName} />,
- to: `${moduleURLBuilder(moduleName as RoutableModuleNames)}/`,
- })),
- ];
- return (
- <Fragment>
- <Layout.Header>
- <Layout.HeaderContent>
- {crumbs.length > 1 && <Breadcrumbs crumbs={crumbs} />}
- <Layout.Title>{headerTitle || domainTitle}</Layout.Title>
- </Layout.HeaderContent>
- <Layout.HeaderActions>
- <ButtonBar gap={1}>
- <FeedbackWidgetButton />
- {additonalHeaderActions}
- </ButtonBar>
- </Layout.HeaderActions>
- <Layout.HeaderTabs value={tabValue} onChange={tabs?.onTabChange}>
- {!hideDefaultTabs && (
- <TabList hideBorder>
- {tabList.map(tab => (
- <TabList.Item {...tab} key={tab.key} />
- ))}
- </TabList>
- )}
- {hideDefaultTabs && tabs && tabs.tabList}
- </Layout.HeaderTabs>
- </Layout.Header>
- </Fragment>
- );
- }
- function TabLabel({moduleName}: {moduleName: ModuleName}) {
- const moduleTitles = useModuleTitles();
- const organization = useOrganization();
- const showBusinessIcon = !isModuleEnabled(moduleName, organization);
- if (showBusinessIcon) {
- return (
- <TabWithIconContainer>
- {moduleTitles[moduleName]}
- <IconBusiness />
- </TabWithIconContainer>
- );
- }
- return <Fragment>{moduleTitles[moduleName]}</Fragment>;
- }
- const TabWithIconContainer = styled('div')`
- display: inline-flex;
- align-items: center;
- text-align: left;
- gap: ${space(0.5)};
- `;
|