trialAlert.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import styled from '@emotion/styled';
  2. import {Button} from 'sentry/components/button';
  3. import Panel from 'sentry/components/panels/panel';
  4. import {t, tct} from 'sentry/locale';
  5. import {space} from 'sentry/styles/space';
  6. import type {Organization} from 'sentry/types/organization';
  7. import TextBlock from 'sentry/views/settings/components/text/textBlock';
  8. import {openUpsellModal} from 'getsentry/actionCreators/modal';
  9. import type {Subscription} from 'getsentry/types';
  10. import {getTrialDaysLeft} from 'getsentry/utils/billing';
  11. import {listDisplayNames} from 'getsentry/utils/dataCategory';
  12. import TrialBadge from './trial/badge';
  13. import {ButtonWrapper, SubscriptionBody} from './styles';
  14. type Props = {
  15. organization: Organization;
  16. subscription: Subscription;
  17. };
  18. function TrialAlert({organization, subscription}: Props) {
  19. if (!subscription.isTrial) {
  20. return null;
  21. }
  22. const daysLeft = getTrialDaysLeft(subscription);
  23. if (daysLeft < 0) {
  24. return null;
  25. }
  26. const trialName = subscription.isEnterpriseTrial
  27. ? t('Enterprise Trial')
  28. : subscription.isPerformancePlanTrial
  29. ? t('Performance Trial')
  30. : t('Business Plan Trial');
  31. const featuresName = subscription.isPerformancePlanTrial
  32. ? 'performance'
  33. : 'business plan';
  34. const oxfordCategories = listDisplayNames({
  35. plan: subscription.planDetails,
  36. categories: subscription.planDetails.checkoutCategories,
  37. hadCustomDynamicSampling: subscription.hadCustomDynamicSampling,
  38. });
  39. return (
  40. <Panel data-test-id="trial-alert">
  41. <SubscriptionBody withPadding>
  42. <TrialInfo>
  43. <TrialHeader>
  44. <StyledHeading>{trialName}</StyledHeading>
  45. <TrialBadge subscription={subscription} organization={organization} />
  46. </TrialHeader>
  47. <StyledSubText>
  48. {subscription.isEnterpriseTrial || subscription.isPerformancePlanTrial
  49. ? tct(
  50. "With your trial you have access to Sentry's [featuresName] features, and [additionalData].",
  51. {
  52. featuresName,
  53. additionalData: subscription.isEnterpriseTrial
  54. ? t('unlimited %s', oxfordCategories)
  55. : t('unlimited transactions and attachments'),
  56. }
  57. )
  58. : tct(
  59. "With your trial you have access to Sentry's [featuresName] features.",
  60. {featuresName}
  61. )}
  62. </StyledSubText>
  63. </TrialInfo>
  64. {subscription.canSelfServe && (
  65. <ButtonWrapper>
  66. <Button
  67. size="sm"
  68. data-test-id="trial-details-button"
  69. onClick={() => openUpsellModal({organization, source: 'active_trial'})}
  70. >
  71. {t('Learn more')}
  72. </Button>
  73. </ButtonWrapper>
  74. )}
  75. </SubscriptionBody>
  76. </Panel>
  77. );
  78. }
  79. const TrialInfo = styled('div')`
  80. display: grid;
  81. grid-auto-rows: auto;
  82. gap: ${space(1)};
  83. `;
  84. const TrialHeader = styled('div')`
  85. display: flex;
  86. gap: ${space(1)};
  87. align-items: center;
  88. `;
  89. const StyledHeading = styled('span')`
  90. font-weight: 400;
  91. font-size: ${p => p.theme.fontSizeExtraLarge};
  92. `;
  93. const StyledSubText = styled(TextBlock)`
  94. color: ${p => p.theme.subText};
  95. margin: 0;
  96. `;
  97. export default TrialAlert;