import {ClassNames} from '@emotion/react'; import styled from '@emotion/styled'; import Feature from 'sentry/components/acl/feature'; import {IconBusiness} from 'sentry/icons'; import {space} from 'sentry/styles/space'; import PowerFeatureHovercard from 'getsentry/components/powerFeatureHovercard'; import withSubscription from 'getsentry/components/withSubscription'; import type {Subscription} from 'getsentry/types'; import {isEnterprise} from 'getsentry/utils/billing'; const SSO = 'sso'; const RELAY = 'relay'; const ALLOCATIONS = 'allocations-upsell'; const TEAM_ROLES = 'team-roles-upsell'; const TABLE_ITEMS = [TEAM_ROLES]; /** * This maps the IDs of the labels over to a configuration determining how the * tooltip should be represented. * * { * # partial indicates that this item does not strictly require a the * # features to function, but will work in some way *better* with the * # features. Thus "partial" support. * partial: false, * * # The list of plan features required for this functionality. * features: [...] * } */ const POWER_FEATURE_CONFIG = [ { id: SSO, features: ['sso-saml2'], partial: true, }, { id: RELAY, features: ['relay'], partial: false, }, { id: ALLOCATIONS, features: ['spend-allocations'], partial: false, }, { id: TEAM_ROLES, features: ['team-roles'], partial: false, }, ]; type Props = { children: React.ReactNode; subscription: Subscription; id?: string; }; function LabelWithPowerIcon({children, id, subscription}: Props) { // Must return React Elements // @see https://github.com/DefinitelyTyped/DefinitelyTyped/issues/20544 if (id === undefined) { return children as React.ReactElement; } const config = POWER_FEATURE_CONFIG.find(c => c.id === id)!; if (config === undefined) { return children as React.ReactElement; } if (!subscription || isEnterprise(subscription)) { return children as React.ReactElement; } const {partial, features} = config; const leftAligned = TABLE_ITEMS.includes(id); const renderDisabled = () => ( {children} {({css}) => ( )} ); return ( {children} ); } const StyledLabel = styled('div')<{leftAligned?: boolean}>` display: flex; align-items: center; justify-content: ${p => (p.leftAligned ? 'flex-start' : 'space-between')}; width: 100%; > :last-child { margin-left: ${space(1)}; } `; export default withSubscription(LabelWithPowerIcon, {noLoader: true});