import type {ReactNode} from 'react'; import {Fragment} from 'react'; import styled from '@emotion/styled'; import FeatureBadge from 'sentry/components/badge/featureBadge'; import ExternalLink from 'sentry/components/links/externalLink'; import ListLink from 'sentry/components/links/listLink'; import ScrollableTabs from 'sentry/components/replays/scrollableTabs'; import {Tooltip} from 'sentry/components/tooltip'; import {t} from 'sentry/locale'; import type {Organization} from 'sentry/types/organization'; import {trackAnalytics} from 'sentry/utils/analytics'; import useActiveReplayTab, {TabKey} from 'sentry/utils/replays/hooks/useActiveReplayTab'; import {useLocation} from 'sentry/utils/useLocation'; import useOrganization from 'sentry/utils/useOrganization'; function getReplayTabs({ isVideoReplay, organization, }: { isVideoReplay: boolean; organization: Organization; }): Record { // For video replays, we hide the console, a11y, trace, and memory tabs // The console tab isn't useful for video replays (for now); most of the // useful logging context will come from breadcrumbs // A11y, trace, and memory aren't applicable for mobile // Show the console tab if 1) it's a video replay and we have the FF enabled // or 2) it's not a video replay const showConsoleTab = isVideoReplay ? organization.features.includes('session-replay-mobile-network-tab') : true; return { [TabKey.BREADCRUMBS]: t('Breadcrumbs'), [TabKey.CONSOLE]: showConsoleTab ? t('Console') : null, [TabKey.NETWORK]: t('Network'), [TabKey.ERRORS]: t('Errors'), [TabKey.TRACE]: isVideoReplay ? null : t('Trace'), [TabKey.A11Y]: isVideoReplay ? null : ( { e.stopPropagation(); }} > {t('What is accessibility?')} } > {t('Accessibility')} ), [TabKey.MEMORY]: isVideoReplay ? null : t('Memory'), [TabKey.TAGS]: t('Tags'), }; } type Props = { isVideoReplay: boolean; className?: string; }; function FocusTabs({className, isVideoReplay}: Props) { const organization = useOrganization(); const {pathname, query} = useLocation(); const {getActiveTab, setActiveTab} = useActiveReplayTab({isVideoReplay}); const activeTab = getActiveTab(); const isTabDisabled = (tab: string) => { return ( tab === TabKey.NETWORK && isVideoReplay && !organization.features.includes('session-replay-mobile-network-tab') ); }; return ( {Object.entries(getReplayTabs({organization, isVideoReplay})).map(([tab, label]) => label ? ( tab === activeTab} to={{pathname, query: {...query, t_main: tab}}} onClick={e => { e.preventDefault(); setActiveTab(tab); trackAnalytics('replay.details-tab-changed', { tab, organization, }); }} > {label} ) : null )} ); } const FlexFeatureBadge = styled(FeatureBadge)` & > span { display: flex; } `; export default FocusTabs;