import {Fragment} from 'react'; import styled from '@emotion/styled'; import type {Location} from 'history'; import pick from 'lodash/pick'; import Badge from 'sentry/components/badge'; import {Breadcrumbs} from 'sentry/components/breadcrumbs'; import {CopyToClipboardButton} from 'sentry/components/copyToClipboardButton'; import IdBadge from 'sentry/components/idBadge'; import * as Layout from 'sentry/components/layouts/thirds'; import ExternalLink from 'sentry/components/links/externalLink'; import ListLink from 'sentry/components/links/listLink'; import NavTabs from 'sentry/components/navTabs'; import {Tooltip} from 'sentry/components/tooltip'; import Version from 'sentry/components/version'; import {URL_PARAM} from 'sentry/constants/pageFilters'; import {IconOpen} from 'sentry/icons'; import {t} from 'sentry/locale'; import type {Organization, Release, ReleaseMeta, ReleaseProject} from 'sentry/types'; import {formatAbbreviatedNumber} from 'sentry/utils/formatters'; import ReleaseActions from './releaseActions'; type Props = { location: Location; organization: Organization; project: Required; refetchData: () => void; release: Release; releaseMeta: ReleaseMeta; }; function ReleaseHeader({ location, organization, release, project, releaseMeta, refetchData, }: Props) { const {version, url} = release; const {commitCount, commitFilesChanged} = releaseMeta; const releasePath = `/organizations/${organization.slug}/releases/${encodeURIComponent( version )}/`; const tabs = [ {title: t('Overview'), to: ''}, { title: ( {t('Commits')} ), to: `commits/`, }, { title: ( {t('Files Changed')} ), to: `files-changed/`, }, ]; const getTabUrl = (path: string) => ({ pathname: releasePath + path, query: pick(location.query, Object.values(URL_PARAM)), }); const getActiveTabTo = () => { // We are not doing strict version check because there would be a tiny page shift when switching between releases with paginator const activeTab = tabs .filter(tab => tab.to.length) // remove home 'Overview' from consideration .find(tab => location.pathname.endsWith(tab.to)); if (activeTab) { return activeTab.to; } return tabs[0].to; // default to 'Overview' }; return ( {!!url && ( )} {tabs.map(tab => ( getActiveTabTo() === tab.to} > {tab.title} ))} ); } const IconWrapper = styled('span')` transition: color 0.3s ease-in-out; &, a { color: ${p => p.theme.gray300}; display: flex; &:hover { cursor: pointer; color: ${p => p.theme.textColor}; } } `; const StyledNavTabs = styled(NavTabs)` margin-bottom: 0; /* Makes sure the tabs are pushed into another row */ width: 100%; `; const NavTabsBadge = styled(Badge)` @media (max-width: ${p => p.theme.breakpoints.small}) { display: none; } `; export default ReleaseHeader;