123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- import {useState} from 'react';
- import type {InjectedRouter} from 'react-router';
- import styled from '@emotion/styled';
- import * as qs from 'query-string';
- import FeatureBadge from 'sentry/components/badge/featureBadge';
- import * as Layout from 'sentry/components/layouts/thirds';
- import {PageHeadingQuestionTooltip} from 'sentry/components/pageHeadingQuestionTooltip';
- import {TabList, Tabs} from 'sentry/components/tabs';
- import {Tooltip} from 'sentry/components/tooltip';
- import {SLOW_TOOLTIP_DELAY} from 'sentry/constants';
- import {t} from 'sentry/locale';
- import type {Organization} from 'sentry/types/organization';
- import {normalizeUrl} from 'sentry/utils/withDomainRequired';
- type Props = {
- organization: Organization;
- router: InjectedRouter;
- hasV2ReleaseUIEnabled?: boolean;
- };
- const enum ReleaseTab {
- RELEASES = 'releases',
- RELEASE_THRESHOLDS = 'release-thresholds',
- }
- function Header({router, hasV2ReleaseUIEnabled = false, organization}: Props) {
- const [selected, setSelected] = useState<ReleaseTab>(
- router.location.pathname.includes('release-thresholds')
- ? ReleaseTab.RELEASE_THRESHOLDS
- : ReleaseTab.RELEASES
- );
- const location = router.location;
- const {
- cursor: _cursor,
- page: _page,
- view: _view,
- ...queryParams
- } = location?.query ?? {};
- const tabs = hasV2ReleaseUIEnabled
- ? [
- {
- key: ReleaseTab.RELEASES,
- label: t('Monitor'),
- description: '',
- to: normalizeUrl(
- `/organizations/${organization.slug}/releases/?${qs.stringify(queryParams)}`
- ),
- },
- {
- key: ReleaseTab.RELEASE_THRESHOLDS,
- label: t('Thresholds'),
- description:
- 'thresholds represent action alerts that will trigger once a threshold has been breached',
- to: normalizeUrl(
- `/organizations/${organization.slug}/release-thresholds/?${qs.stringify(queryParams)}`
- ),
- badge: <FeatureBadge type="alpha" />,
- },
- ]
- : [];
- const onTabSelect = (key: ReleaseTab) => {
- setSelected(key);
- };
- return (
- <Layout.Header noActionWrap>
- <Layout.HeaderContent>
- <Layout.Title>
- {t('Releases')}
- <PageHeadingQuestionTooltip
- docsUrl="https://docs.sentry.io/product/releases/"
- title={t(
- 'A visualization of your release adoption from the past 24 hours, providing a high-level view of the adoption stage, percentage of crash-free users and sessions, and more.'
- )}
- />
- </Layout.Title>
- </Layout.HeaderContent>
- {hasV2ReleaseUIEnabled && (
- <StyledTabs value={selected} onChange={onTabSelect}>
- <TabList hideBorder>
- {tabs.map(({label, description, key, to, badge}) => {
- return (
- <TabList.Item key={key} to={to} textValue={label}>
- <Tooltip
- title={description}
- position="bottom"
- isHoverable
- delay={SLOW_TOOLTIP_DELAY}
- >
- {label}
- {badge}
- </Tooltip>
- </TabList.Item>
- );
- })}
- </TabList>
- </StyledTabs>
- )}
- </Layout.Header>
- );
- }
- export default Header;
- const StyledTabs = styled(Tabs<ReleaseTab>)`
- grid-column: 1/-1;
- `;
|