import type {ReactElement} from 'react'; import {Fragment} from 'react'; import {Link as RouterLink} from 'react-router'; import {NavLink as Router6NavLink} from 'react-router-dom'; import styled from '@emotion/styled'; import type {LocationDescriptor} from 'history'; import Badge from 'sentry/components/badge/badge'; import FeatureBadge from 'sentry/components/badge/featureBadge'; import HookOrDefault from 'sentry/components/hookOrDefault'; import {Tooltip} from 'sentry/components/tooltip'; import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; import {locationDescriptorToTo} from 'sentry/utils/reactRouter6Compat/location'; type Props = { label: React.ReactNode; to: LocationDescriptor; badge?: string | number | null | ReactElement; id?: string; index?: boolean; onClick?: (e: React.MouseEvent) => void; }; function SettingsNavItem({badge, label, index, id, to, ...props}: Props) { const LabelHook = HookOrDefault({ hookName: 'sidebar:item-label', defaultComponent: ({children}) => {children}, }); let renderedBadge: React.ReactNode; if (badge === 'new') { renderedBadge = ; } else if (badge === 'beta') { renderedBadge = ; } else if (badge === 'warning') { renderedBadge = ( ); } else if (typeof badge === 'string' || typeof badge === 'number') { renderedBadge = ; } else { renderedBadge = badge; } if (window.__SENTRY_USING_REACT_ROUTER_SIX) { return ( {label} {badge ? renderedBadge : null} ); } return ( {label} {badge ? renderedBadge : null} ); } const StyledNavItem6 = styled(Router6NavLink)` display: block; color: ${p => p.theme.gray300}; font-size: 14px; line-height: 30px; position: relative; &.active { color: ${p => p.theme.textColor}; &:before { background: ${p => p.theme.active}; } } &:hover, &:focus, &:active { color: ${p => p.theme.textColor}; outline: none; } &:focus-visible { outline: none; background: ${p => p.theme.backgroundSecondary}; padding-left: 15px; margin-left: -15px; border-radius: 3px; &:before { left: -15px; } } &:before { position: absolute; content: ''; display: block; top: 4px; left: -30px; height: 20px; width: 4px; background: transparent; border-radius: 0 2px 2px 0; } `; const StyledNavItem = styled(RouterLink)` display: block; color: ${p => p.theme.gray300}; font-size: 14px; line-height: 30px; position: relative; &.active { color: ${p => p.theme.textColor}; &:before { background: ${p => p.theme.active}; } } &:hover, &:focus, &:active { color: ${p => p.theme.textColor}; outline: none; } &:focus-visible { outline: none; background: ${p => p.theme.backgroundSecondary}; padding-left: 15px; margin-left: -15px; border-radius: 3px; &:before { left: -15px; } } &:before { position: absolute; content: ''; display: block; top: 4px; left: -30px; height: 20px; width: 4px; background: transparent; border-radius: 0 2px 2px 0; } `; const StyledBadge = styled(Badge)` font-weight: ${p => p.theme.fontWeightNormal}; height: auto; line-height: 1; font-size: ${p => p.theme.fontSizeExtraSmall}; padding: 3px ${space(0.75)}; vertical-align: middle; `; export default SettingsNavItem;