@stigg/react-sdk 7.7.1-beta.0 → 7.7.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. package/dist/index.d.ts +5 -2
  2. package/dist/react-sdk.cjs.js +298 -238
  3. package/dist/react-sdk.esm.js +5223 -3827
  4. package/package.json +2 -3
  5. package/src/assets/add.svg +0 -3
  6. package/src/assets/addons.svg +0 -12
  7. package/src/assets/arrow-forward.svg +0 -3
  8. package/src/assets/arrow-right.svg +0 -6
  9. package/src/assets/billing-info-customer.svg +0 -11
  10. package/src/assets/check-stigg.svg +0 -3
  11. package/src/assets/check.svg +0 -5
  12. package/src/assets/close.svg +0 -3
  13. package/src/assets/contact-support.svg +0 -13
  14. package/src/assets/coupon.svg +0 -6
  15. package/src/assets/credit-card.svg +0 -10
  16. package/src/assets/dollar-coin.svg +0 -13
  17. package/src/assets/edit-icon.svg +0 -3
  18. package/src/assets/entitlement-check.svg +0 -3
  19. package/src/assets/lottie/checkout-success.json +0 -1
  20. package/src/assets/mini-schedule.svg +0 -3
  21. package/src/assets/outlined-checked-circle-disabled.svg +0 -6
  22. package/src/assets/outlined-checked-circle.svg +0 -6
  23. package/src/assets/outlined-circle.svg +0 -3
  24. package/src/assets/pay-as-you-go-charge.svg +0 -11
  25. package/src/assets/payment-method.svg +0 -4
  26. package/src/assets/plus-icon.svg +0 -6
  27. package/src/assets/powered-by-stigg.svg +0 -13
  28. package/src/assets/promotions.svg +0 -13
  29. package/src/assets/remove.svg +0 -3
  30. package/src/assets/restore.svg +0 -3
  31. package/src/assets/sand-clock.svg +0 -4
  32. package/src/assets/schedule-box.svg +0 -9
  33. package/src/assets/schedule.svg +0 -3
  34. package/src/assets/subscription-renews-icon.svg +0 -14
  35. package/src/assets/trash.svg +0 -8
  36. package/src/components/StiggProvider.tsx +0 -170
  37. package/src/components/checkout/Checkout.tsx +0 -37
  38. package/src/components/checkout/CheckoutContainer.style.ts +0 -51
  39. package/src/components/checkout/CheckoutContainer.tsx +0 -193
  40. package/src/components/checkout/CheckoutProvider.tsx +0 -181
  41. package/src/components/checkout/components/Button.tsx +0 -35
  42. package/src/components/checkout/components/ChangePlanButton.tsx +0 -30
  43. package/src/components/checkout/components/ContentLoadingSkeleton.tsx +0 -41
  44. package/src/components/checkout/components/DowngradeToFreeContainer.tsx +0 -115
  45. package/src/components/checkout/components/InputField.tsx +0 -26
  46. package/src/components/checkout/components/Skeletons.style.ts +0 -30
  47. package/src/components/checkout/components/StyledArrow.tsx +0 -9
  48. package/src/components/checkout/components/index.ts +0 -3
  49. package/src/components/checkout/configurations/steps.ts +0 -1
  50. package/src/components/checkout/configurations/textOverrides.ts +0 -150
  51. package/src/components/checkout/configurations/theme.ts +0 -46
  52. package/src/components/checkout/configurations/typography.ts +0 -30
  53. package/src/components/checkout/formatting.ts +0 -12
  54. package/src/components/checkout/hooks/index.ts +0 -8
  55. package/src/components/checkout/hooks/useAddonsStepModel.ts +0 -92
  56. package/src/components/checkout/hooks/useCheckoutModel.ts +0 -53
  57. package/src/components/checkout/hooks/useCouponModel.ts +0 -28
  58. package/src/components/checkout/hooks/useLoadCheckout.ts +0 -48
  59. package/src/components/checkout/hooks/usePaymentStepModel.ts +0 -68
  60. package/src/components/checkout/hooks/usePlanStepModel.ts +0 -184
  61. package/src/components/checkout/hooks/usePreviewSubscription.ts +0 -165
  62. package/src/components/checkout/hooks/useProgressBarModel.ts +0 -211
  63. package/src/components/checkout/hooks/useSubscriptionModel.ts +0 -22
  64. package/src/components/checkout/hooks/useSubscriptionState.ts +0 -26
  65. package/src/components/checkout/index.ts +0 -8
  66. package/src/components/checkout/planHeader/PlanHeader.tsx +0 -41
  67. package/src/components/checkout/planHeader/index.ts +0 -1
  68. package/src/components/checkout/progressBar/CheckoutProgressBar.style.ts +0 -35
  69. package/src/components/checkout/progressBar/CheckoutProgressBar.tsx +0 -82
  70. package/src/components/checkout/promotionCode/AddPromotionCode.tsx +0 -107
  71. package/src/components/checkout/promotionCode/AddPromotionCodeButton.tsx +0 -43
  72. package/src/components/checkout/promotionCode/AppliedPromotionCode.tsx +0 -49
  73. package/src/components/checkout/promotionCode/PromotionCodeSection.tsx +0 -40
  74. package/src/components/checkout/promotionCode/index.ts +0 -1
  75. package/src/components/checkout/steps/addons/CheckoutAddonsStep.style.tsx +0 -34
  76. package/src/components/checkout/steps/addons/CheckoutAddonsStep.tsx +0 -144
  77. package/src/components/checkout/steps/addons/addon.utils.ts +0 -67
  78. package/src/components/checkout/steps/addons/components/AddonInputContainer.tsx +0 -84
  79. package/src/components/checkout/steps/addons/components/AddonTextContainer.tsx +0 -45
  80. package/src/components/checkout/steps/addons/index.ts +0 -1
  81. package/src/components/checkout/steps/payment/PaymentMethods.style.ts +0 -36
  82. package/src/components/checkout/steps/payment/PaymentMethods.tsx +0 -106
  83. package/src/components/checkout/steps/payment/PaymentStep.tsx +0 -63
  84. package/src/components/checkout/steps/payment/index.ts +0 -1
  85. package/src/components/checkout/steps/payment/stripe/StripePaymentForm.tsx +0 -79
  86. package/src/components/checkout/steps/payment/stripe/index.ts +0 -3
  87. package/src/components/checkout/steps/payment/stripe/stripe.utils.ts +0 -122
  88. package/src/components/checkout/steps/payment/stripe/useStripeIntegration.ts +0 -33
  89. package/src/components/checkout/steps/payment/stripe/useSubmit.ts +0 -135
  90. package/src/components/checkout/steps/payment/zuora/ZuoraPaymentForm.tsx +0 -128
  91. package/src/components/checkout/steps/payment/zuora/index.ts +0 -9
  92. package/src/components/checkout/steps/payment/zuora/useZuoraIntegration.ts +0 -57
  93. package/src/components/checkout/steps/payment/zuora/useZuoraSubmit.ts +0 -125
  94. package/src/components/checkout/steps/payment/zuora/zuora.utils.ts +0 -72
  95. package/src/components/checkout/steps/plan/BillingPeriodPicker.style.tsx +0 -69
  96. package/src/components/checkout/steps/plan/BillingPeriodPicker.tsx +0 -86
  97. package/src/components/checkout/steps/plan/CheckoutChargeList.tsx +0 -223
  98. package/src/components/checkout/steps/plan/CheckoutPlanStep.style.tsx +0 -6
  99. package/src/components/checkout/steps/plan/CheckoutPlanStep.tsx +0 -31
  100. package/src/components/checkout/steps/plan/index.ts +0 -1
  101. package/src/components/checkout/summary/CheckoutSuccess.tsx +0 -82
  102. package/src/components/checkout/summary/CheckoutSummary.tsx +0 -458
  103. package/src/components/checkout/summary/CheckoutSummarySkeleton.tsx +0 -38
  104. package/src/components/checkout/summary/components/CheckoutCaptions.tsx +0 -145
  105. package/src/components/checkout/summary/components/GraduatedPriceBreakdown.tsx +0 -70
  106. package/src/components/checkout/summary/components/LineItems.tsx +0 -275
  107. package/src/components/checkout/summary/components/WithSkeleton.tsx +0 -16
  108. package/src/components/checkout/summary/components/getPriceBreakdownString.ts +0 -66
  109. package/src/components/checkout/summary/index.ts +0 -2
  110. package/src/components/checkout/types.ts +0 -82
  111. package/src/components/common/CollapsableSectionIcon.tsx +0 -9
  112. package/src/components/common/Icon.tsx +0 -61
  113. package/src/components/common/InformationTooltip.tsx +0 -28
  114. package/src/components/common/LongText.tsx +0 -100
  115. package/src/components/common/PoweredByStigg.tsx +0 -59
  116. package/src/components/common/ProgressBar.tsx +0 -41
  117. package/src/components/common/StatusChip.tsx +0 -29
  118. package/src/components/common/TiersSelectContainer.tsx +0 -39
  119. package/src/components/common/Typography.tsx +0 -117
  120. package/src/components/common/VolumeBulkSelect.tsx +0 -74
  121. package/src/components/common/VolumePerUnitInput.tsx +0 -42
  122. package/src/components/common/chart/chartjs.helpers.ts +0 -17
  123. package/src/components/common/chart/chartjs.plugins.ts +0 -34
  124. package/src/components/common/chart/chartjs.theme.ts +0 -41
  125. package/src/components/common/chart/chartjs.tooltip.plugin.tsx +0 -224
  126. package/src/components/common/customIcons.ts +0 -24
  127. package/src/components/common/iconColor.ts +0 -15
  128. package/src/components/common/mapExternalTheme.ts +0 -147
  129. package/src/components/common/mediaQuery.ts +0 -19
  130. package/src/components/common/table/DataRows.tsx +0 -33
  131. package/src/components/common/table/EmptyState.tsx +0 -19
  132. package/src/components/common/table/ErrorState.tsx +0 -19
  133. package/src/components/common/table/GenericTable.tsx +0 -155
  134. package/src/components/common/table/LoadingRows.tsx +0 -33
  135. package/src/components/common/table/index.ts +0 -6
  136. package/src/components/common/table/types.ts +0 -30
  137. package/src/components/credits/balance/CreditBalance.tsx +0 -70
  138. package/src/components/credits/balance/CreditBalanceValue.tsx +0 -60
  139. package/src/components/credits/creditUsageChart/CreditUsage.chartjs.ts +0 -223
  140. package/src/components/credits/creditUsageChart/CreditUsageChart.tsx +0 -128
  141. package/src/components/credits/creditUsageChart/CreditUsageChartEmptyState.tsx +0 -29
  142. package/src/components/credits/creditUsageChart/CreditUsageChartErrorState.tsx +0 -19
  143. package/src/components/credits/creditUsageChart/CreditUsageChartHeader.tsx +0 -104
  144. package/src/components/credits/creditUsageChart/CreditUsageChartTooltip.tsx +0 -93
  145. package/src/components/credits/creditUsageChart/CreditUsageLegend.tsx +0 -141
  146. package/src/components/credits/creditUsageChart/types.ts +0 -4
  147. package/src/components/credits/grants/CreditGrants.tsx +0 -64
  148. package/src/components/credits/grants/CreditGrantsTable.tsx +0 -101
  149. package/src/components/credits/grants/types.ts +0 -38
  150. package/src/components/credits/grants/utils.ts +0 -25
  151. package/src/components/credits/hooks/useCreditBalance.ts +0 -75
  152. package/src/components/credits/hooks/useCreditGrants.ts +0 -40
  153. package/src/components/credits/hooks/useCreditUsage.ts +0 -50
  154. package/src/components/credits/index.ts +0 -15
  155. package/src/components/credits/localization.ts +0 -25
  156. package/src/components/credits/utilization/CreditUtilization.tsx +0 -74
  157. package/src/components/credits/utilization/CreditUtilizationValue.tsx +0 -113
  158. package/src/components/credits/utils/creditBalanceUtils.ts +0 -31
  159. package/src/components/credits/utils/creditGrantUtils.ts +0 -27
  160. package/src/components/customerPortal/CustomerPortal.style.ts +0 -20
  161. package/src/components/customerPortal/CustomerPortal.tsx +0 -37
  162. package/src/components/customerPortal/CustomerPortalContainer.tsx +0 -77
  163. package/src/components/customerPortal/CustomerPortalContext.ts +0 -32
  164. package/src/components/customerPortal/CustomerPortalHeader.tsx +0 -18
  165. package/src/components/customerPortal/CustomerPortalProvider.tsx +0 -49
  166. package/src/components/customerPortal/billing/InformationGrid.tsx +0 -54
  167. package/src/components/customerPortal/billing/InvoicesSection.tsx +0 -41
  168. package/src/components/customerPortal/billing/PaymentDetailsSection.tsx +0 -140
  169. package/src/components/customerPortal/common/ExternalLinkButton.tsx +0 -34
  170. package/src/components/customerPortal/common/SectionContainer.tsx +0 -22
  171. package/src/components/customerPortal/common/SectionHeader.ts +0 -15
  172. package/src/components/customerPortal/common/SectionTitle.tsx +0 -23
  173. package/src/components/customerPortal/common/SkeletonButton.tsx +0 -5
  174. package/src/components/customerPortal/common/StyledButton.tsx +0 -13
  175. package/src/components/customerPortal/customerPortalTextOverrides.ts +0 -39
  176. package/src/components/customerPortal/customerPortalTheme.ts +0 -35
  177. package/src/components/customerPortal/hooks/useCustomerPortal.ts +0 -39
  178. package/src/components/customerPortal/index.ts +0 -16
  179. package/src/components/customerPortal/paywall/CustomerPortalPaywall.style.ts +0 -33
  180. package/src/components/customerPortal/paywall/CustomerPortalPaywall.tsx +0 -36
  181. package/src/components/customerPortal/subscriptionOverview/ContactCustomerSupport.tsx +0 -50
  182. package/src/components/customerPortal/subscriptionOverview/SubscriptionOverviewLoader.tsx +0 -28
  183. package/src/components/customerPortal/subscriptionOverview/SubscriptionsOverview.tsx +0 -106
  184. package/src/components/customerPortal/subscriptionOverview/SubscriptionsOverviewHeader.tsx +0 -48
  185. package/src/components/customerPortal/subscriptionOverview/charges/ChargeItem.tsx +0 -74
  186. package/src/components/customerPortal/subscriptionOverview/charges/ChargeList.tsx +0 -65
  187. package/src/components/customerPortal/subscriptionOverview/subscriptionScheduledUpdates/SubscriptionScheduledUpdateRow.tsx +0 -110
  188. package/src/components/customerPortal/subscriptionOverview/subscriptionScheduledUpdates/SubscriptionScheduledUpdatesAlert.tsx +0 -158
  189. package/src/components/customerPortal/subscriptionOverview/subscriptionView/SubscriptionView.style.ts +0 -6
  190. package/src/components/customerPortal/subscriptionOverview/subscriptionView/SubscriptionView.tsx +0 -37
  191. package/src/components/customerPortal/subscriptionOverview/subscriptionView/TrialPanel.tsx +0 -58
  192. package/src/components/customerPortal/subscriptionOverview/tabs/AddonsList.tsx +0 -28
  193. package/src/components/customerPortal/subscriptionOverview/tabs/Promotions.tsx +0 -62
  194. package/src/components/customerPortal/subscriptionOverview/tabs/SubscriptionTabs.style.tsx +0 -32
  195. package/src/components/customerPortal/subscriptionOverview/tabs/SubscriptionTabs.tsx +0 -100
  196. package/src/components/customerPortal/subscriptionOverview/types/customerPortal.types.ts +0 -4
  197. package/src/components/customerPortal/subscriptionOverview/upcomingBilling/NextEstimatedBill.tsx +0 -29
  198. package/src/components/customerPortal/subscriptionOverview/upcomingBilling/NoUpcomingBilling.tsx +0 -18
  199. package/src/components/customerPortal/subscriptionOverview/upcomingBilling/UpcomingBilling.tsx +0 -89
  200. package/src/components/customerPortal/types.ts +0 -20
  201. package/src/components/customerPortal/usage/CustomerUsageData.style.tsx +0 -22
  202. package/src/components/customerPortal/usage/CustomerUsageData.tsx +0 -124
  203. package/src/components/customerPortal/usage/featureUsage/EntitlementCTAButton.tsx +0 -62
  204. package/src/components/customerPortal/usage/featureUsage/FeatureUsage.helper.ts +0 -45
  205. package/src/components/customerPortal/usage/featureUsage/FeatureUsage.style.ts +0 -13
  206. package/src/components/customerPortal/usage/featureUsage/FeatureUsage.tsx +0 -96
  207. package/src/components/customerPortal/usage/featureUsage/FeatureUsageProgressBar.tsx +0 -56
  208. package/src/components/guards/BooleanEntitlementGuard.tsx +0 -21
  209. package/src/components/guards/EnumEntitlementGuard.tsx +0 -17
  210. package/src/components/guards/MeteredEntitlementGuard.tsx +0 -21
  211. package/src/components/guards/NumericEntitlementGuard.tsx +0 -21
  212. package/src/components/hooks/index.ts +0 -1
  213. package/src/components/hooks/useChargeSort.ts +0 -17
  214. package/src/components/hooks/useIsScreenWiderThan.ts +0 -6
  215. package/src/components/hooks/useWaitForCheckoutCompleted.ts +0 -65
  216. package/src/components/paywall/BillingPeriodPicker.tsx +0 -90
  217. package/src/components/paywall/EntitlementRow.tsx +0 -127
  218. package/src/components/paywall/Paywall.tsx +0 -189
  219. package/src/components/paywall/PaywallContainer.tsx +0 -119
  220. package/src/components/paywall/PaywallLoader.tsx +0 -96
  221. package/src/components/paywall/PlanCompatibleAddons.tsx +0 -127
  222. package/src/components/paywall/PlanEntitlements.tsx +0 -75
  223. package/src/components/paywall/PlanOffering.tsx +0 -256
  224. package/src/components/paywall/PlanOfferingButton.tsx +0 -232
  225. package/src/components/paywall/PlanPrice.tsx +0 -154
  226. package/src/components/paywall/hooks/useLoadPaywallData.ts +0 -75
  227. package/src/components/paywall/index.ts +0 -5
  228. package/src/components/paywall/paywallTextOverrides.ts +0 -79
  229. package/src/components/paywall/types.ts +0 -80
  230. package/src/components/paywall/utils/calculateTrialDaysLeft.ts +0 -5
  231. package/src/components/paywall/utils/calculateUnitQuantityText.ts +0 -23
  232. package/src/components/paywall/utils/computeDefaultBillingPeriod.ts +0 -36
  233. package/src/components/paywall/utils/getPlansToDisplay.ts +0 -13
  234. package/src/components/paywall/utils/hasPricePoints.ts +0 -10
  235. package/src/components/paywall/utils/mapPaywallData.ts +0 -126
  236. package/src/components/utils/calculateDiscountRate.ts +0 -49
  237. package/src/components/utils/currencyUtils.ts +0 -38
  238. package/src/components/utils/dateUtils.ts +0 -17
  239. package/src/components/utils/fixtures/price.fixtures.ts +0 -42
  240. package/src/components/utils/formatNumber.ts +0 -5
  241. package/src/components/utils/getFeatureName.ts +0 -26
  242. package/src/components/utils/getPaidPriceText.ts +0 -77
  243. package/src/components/utils/getPlanPrice.ts +0 -62
  244. package/src/components/utils/getSubscriptionScheduleUpdateTexts.tsx +0 -88
  245. package/src/components/utils/numberUtils.ts +0 -6
  246. package/src/components/utils/onWheelBlur.ts +0 -3
  247. package/src/components/utils/planPrices.ts +0 -10
  248. package/src/components/utils/priceTierUtils.spec.ts +0 -84
  249. package/src/components/utils/priceTierUtils.ts +0 -250
  250. package/src/components/utils/priceUtils.ts +0 -11
  251. package/src/custom.d.ts +0 -6
  252. package/src/hooks/index.ts +0 -8
  253. package/src/hooks/useActiveSubscriptions.ts +0 -21
  254. package/src/hooks/useBooleanEntitlement.ts +0 -20
  255. package/src/hooks/useCustomerPortal.ts +0 -21
  256. package/src/hooks/useEnumEntitlement.ts +0 -20
  257. package/src/hooks/useFetch.ts +0 -32
  258. package/src/hooks/useMeteredEntitlement.ts +0 -20
  259. package/src/hooks/useNumericEntitlement.ts +0 -20
  260. package/src/hooks/usePaywall.ts +0 -21
  261. package/src/hooks/useStiggContext.ts +0 -13
  262. package/src/index.ts +0 -103
  263. package/src/services/logger.ts +0 -22
  264. package/src/stories/Checkout.stories.tsx +0 -123
  265. package/src/stories/CreditBalance.stories.tsx +0 -248
  266. package/src/stories/CreditGrants.stories.tsx +0 -210
  267. package/src/stories/CreditUsageChart.stories.tsx +0 -347
  268. package/src/stories/CreditUtilization.stories.tsx +0 -287
  269. package/src/stories/CustomTheme.ts +0 -57
  270. package/src/stories/CustomerPortal.stories.tsx +0 -265
  271. package/src/stories/GenericTable.stories.tsx +0 -263
  272. package/src/stories/Paywall.stories.tsx +0 -147
  273. package/src/stories/ProgressBar.stories.tsx +0 -103
  274. package/src/stories/StatusChip.stories.tsx +0 -154
  275. package/src/stories/baseArgs.ts +0 -10
  276. package/src/stories/mocks/checkout/consts.ts +0 -15
  277. package/src/stories/mocks/checkout/mockCheckoutPreview.ts +0 -152
  278. package/src/stories/mocks/checkout/mockCheckoutState.ts +0 -212
  279. package/src/styles.css +0 -46
  280. package/src/theme/Fonts.tsx +0 -80
  281. package/src/theme/Theme.tsx +0 -64
  282. package/src/theme/emotion.d.ts +0 -17
  283. package/src/theme/getResolvedTheme.ts +0 -135
  284. package/src/theme/types.ts +0 -85
  285. package/src/types.ts +0 -22
  286. package/src/utils/styledUtils.ts +0 -64
@@ -1,100 +0,0 @@
1
- import React, { useState } from 'react';
2
- import { CustomerPortal, CustomerPortalSubscription, CustomerPortalSubscriptionAddon } from '@stigg/js-client-sdk';
3
- import flatMap from 'lodash/flatMap';
4
- import Box from '@mui/material/Box';
5
- import Tab from '@mui/material/Tab';
6
- import { Typography } from '../../../common/Typography';
7
- import { AddonsList } from './AddonsList';
8
- import { Promotions } from './Promotions';
9
- import { CustomerPortalSection } from '../../CustomerPortal';
10
- import { CustomerPortalLocalization } from '../../customerPortalTextOverrides';
11
- import { StyledTabs, TabContent, TabsLayout } from './SubscriptionTabs.style';
12
- import { CustomerPortalTheme } from '../../customerPortalTheme';
13
- import { Icon, Icons } from '../../../common/Icon';
14
-
15
- type TabPanelProps = {
16
- children?: React.ReactNode;
17
- index: number;
18
- value: number;
19
- maxHeight: string;
20
- };
21
-
22
- function TabPanel(props: TabPanelProps) {
23
- const { children, value, index, maxHeight, ...other } = props;
24
-
25
- return (
26
- <div role="tabpanel" hidden={value !== index} {...other}>
27
- {value === index && <TabContent $maxHeight={maxHeight}>{children}</TabContent>}
28
- </div>
29
- );
30
- }
31
-
32
- export type SubscriptionTabsProps = {
33
- customerPortal: CustomerPortal;
34
- hiddenSections?: CustomerPortalSection[];
35
- textOverrides: CustomerPortalLocalization;
36
- theme: CustomerPortalTheme;
37
- };
38
-
39
- function TabTitle({ isSelected, label, icon }: { isSelected: boolean; label: string; icon: Icons }) {
40
- const color = isSelected ? 'primary' : 'secondary';
41
- return (
42
- <div style={{ display: 'flex', gap: 8, alignItems: 'center' }}>
43
- <Icon icon={icon} svgStrokeColor={color} />
44
- <Typography variant="h6" bold={isSelected} color={color}>
45
- {label}
46
- </Typography>
47
- </div>
48
- );
49
- }
50
-
51
- export function SubscriptionTabs({ customerPortal, hiddenSections, textOverrides, theme }: SubscriptionTabsProps) {
52
- const allAddons: CustomerPortalSubscriptionAddon[] = flatMap(
53
- customerPortal.subscriptions,
54
- (subscription: CustomerPortalSubscription) => subscription.addons,
55
- );
56
- const isSectionHidden = (sectionName: CustomerPortalSection) =>
57
- hiddenSections?.some((section) => section === sectionName);
58
- const showAddons = allAddons.length > 0 && !isSectionHidden('addons');
59
- const showPromotions =
60
- customerPortal.promotionalEntitlements.length > 0 && !isSectionHidden('promotionalEntitlements');
61
- const [value, setValue] = useState(showAddons ? 1 : 2);
62
-
63
- const handleChange = (_: React.SyntheticEvent, newValue: number) => {
64
- setValue(newValue);
65
- };
66
- const shouldShowTabs = showAddons || showPromotions;
67
-
68
- if (!shouldShowTabs) {
69
- return null;
70
- }
71
-
72
- return (
73
- <TabsLayout>
74
- <Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
75
- <StyledTabs value={value} onChange={handleChange}>
76
- {showAddons ? (
77
- <Tab
78
- sx={{ textTransform: 'none' }}
79
- value={1}
80
- label={<TabTitle isSelected={value === 1} label={textOverrides.addonsTabTitle} icon="Addons" />}
81
- />
82
- ) : null}
83
- {showPromotions ? (
84
- <Tab
85
- sx={{ textTransform: 'none' }}
86
- value={2}
87
- label={<TabTitle isSelected={value === 2} label={textOverrides.promotionsTabTitle} icon="Promotions" />}
88
- />
89
- ) : null}
90
- </StyledTabs>
91
- </Box>
92
- <TabPanel value={value} index={1} maxHeight={theme.tabMaxHeight}>
93
- <AddonsList />
94
- </TabPanel>
95
- <TabPanel value={value} index={2} maxHeight={theme.tabMaxHeight}>
96
- <Promotions />
97
- </TabPanel>
98
- </TabsLayout>
99
- );
100
- }
@@ -1,4 +0,0 @@
1
- import { CustomerPortalSubscription } from '@stigg/js-client-sdk';
2
-
3
- export type SubscriptionPrice = CustomerPortalSubscription['prices'][number];
4
- export type FeatureType = NonNullable<SubscriptionPrice['feature']>;
@@ -1,29 +0,0 @@
1
- import { BillingPeriod, Currency } from '@stigg/js-client-sdk';
2
- import moment from 'moment';
3
- import { currencyPriceFormatter } from '../../../utils/currencyUtils';
4
- import { Typography } from '../../../common/Typography';
5
-
6
- export type NextEstimatedBillProps = {
7
- billingPeriod: BillingPeriod;
8
- rangeEnd: string;
9
- amount: number;
10
- currency: Currency;
11
- };
12
-
13
- export function NextEstimatedBill({ billingPeriod, rangeEnd, amount, currency }: NextEstimatedBillProps) {
14
- return (
15
- <>
16
- <Typography variant="h6">Next estimated bill</Typography>
17
- <Typography variant="h1">{currencyPriceFormatter({ amount, currency, maximumFractionDigits: 2 })}</Typography>
18
- <Typography as="div" variant="body1" color="secondary">
19
- Billed {billingPeriod === BillingPeriod.Monthly ? 'monthly' : 'annually'} on{' '}
20
- <Typography variant="body1" as="span" color="primary">
21
- {moment.utc(rangeEnd).format('MMM Do, YYYY')}
22
- </Typography>
23
- </Typography>
24
- <Typography variant="body1" color="secondary">
25
- * Additional tax rates may apply
26
- </Typography>
27
- </>
28
- );
29
- }
@@ -1,18 +0,0 @@
1
- import { Typography } from '../../../common/Typography';
2
-
3
- type NoUpcomingBillingProps = {
4
- description: string;
5
- };
6
-
7
- export function NoUpcomingBilling({ description }: NoUpcomingBillingProps) {
8
- return (
9
- <>
10
- <Typography variant="h6" color="secondary">
11
- No upcoming bill
12
- </Typography>
13
- <Typography variant="body1" color="secondary">
14
- {description}
15
- </Typography>
16
- </>
17
- );
18
- }
@@ -1,89 +0,0 @@
1
- import styled from '@utils/style';
2
- import { ReactNode } from 'react';
3
- import {
4
- BillingModel,
5
- CustomerPortalSubscription,
6
- PricingType,
7
- SubscriptionScheduleType,
8
- SubscriptionStatus,
9
- } from '@stigg/js-client-sdk';
10
- import { CustomerPortalTheme } from '../../customerPortalTheme';
11
- import { NextEstimatedBill } from './NextEstimatedBill';
12
- import { NoUpcomingBilling } from './NoUpcomingBilling';
13
- import { ContactCustomerSupport } from '../ContactCustomerSupport';
14
- import { CustomerPortalLocalization } from '../../customerPortalTextOverrides';
15
-
16
- const Container = styled.div<{ $borderColor: string }>`
17
- max-height: 278px;
18
- display: flex;
19
- flex-direction: column;
20
- border-radius: 10px;
21
- background-color: ${({ theme }) => theme.stigg.palette.backgroundSection};
22
- border: ${({ $borderColor }) => `1px solid ${$borderColor}`};
23
- padding: 32px;
24
- gap: 16px;
25
- `;
26
-
27
- export type UpcomingBillingProps = {
28
- subscription: CustomerPortalSubscription;
29
- theme: CustomerPortalTheme;
30
- textOverrides: CustomerPortalLocalization;
31
- onContactSupport?: () => Promise<void> | void;
32
- };
33
-
34
- export function UpcomingBilling({ subscription, theme, textOverrides, onContactSupport }: UpcomingBillingProps) {
35
- const { pricingType } = subscription;
36
- let content: ReactNode;
37
- const noUsageBasedPrices =
38
- subscription.prices?.every((price) => price.billingModel !== BillingModel.UsageBased) ?? true;
39
- const scheduledDowngradeToFree = subscription.scheduledUpdates?.find(
40
- ({ subscriptionScheduleType, targetPackage }) =>
41
- subscriptionScheduleType === SubscriptionScheduleType.Downgrade &&
42
- targetPackage?.pricingType === PricingType.Free,
43
- );
44
-
45
- if (pricingType === PricingType.Free) {
46
- content = <NoUpcomingBilling description="You're on a free plan, so you don’t have any upcoming charges" />;
47
- } else if (pricingType === PricingType.Paid) {
48
- if (scheduledDowngradeToFree && noUsageBasedPrices) {
49
- content = (
50
- <NoUpcomingBilling description="Your plan will be downgraded to a free plan, so you don’t have any upcoming charges" />
51
- );
52
- } else if (subscription.status === SubscriptionStatus.InTrial) {
53
- content = (
54
- <NoUpcomingBilling
55
- description={`You’re on a free trial of the ${subscription.planName} plan, so you don’t have any upcoming charges`}
56
- />
57
- );
58
- } else {
59
- const billingPeriod = subscription.prices?.[0]?.billingPeriod;
60
- const rangeEnd = subscription.billingPeriodRange?.end as string;
61
- const total = subscription.totalPrice?.total;
62
-
63
- if (billingPeriod && rangeEnd && total) {
64
- content = (
65
- <NextEstimatedBill
66
- billingPeriod={billingPeriod}
67
- rangeEnd={rangeEnd}
68
- amount={total.amount}
69
- currency={total.currency}
70
- />
71
- );
72
- }
73
- }
74
- } else if (pricingType === PricingType.Custom) {
75
- content = (
76
- <ContactCustomerSupport
77
- onContactSupport={onContactSupport}
78
- label={textOverrides.contactSupportTitle}
79
- linkLabel={textOverrides.contactSupportLink}
80
- />
81
- );
82
- }
83
-
84
- return (
85
- <Container className="stigg-subscription-total-price-layout" $borderColor={theme.borderColor}>
86
- {content}
87
- </Container>
88
- );
89
- }
@@ -1,20 +0,0 @@
1
- import { CustomerPortalEntitlement, CustomerPortalSubscription } from '@stigg/js-client-sdk';
2
- import { FeatureFragment } from '@stigg/api-client-js/src/generated/sdk';
3
-
4
- export type OnBuyMoreCallbackFn = (feature: FeatureFragment, entitlement: CustomerPortalEntitlement) => void;
5
-
6
- export type FilterEntitlementsFn = (entitlements: CustomerPortalEntitlement[]) => CustomerPortalEntitlement[];
7
-
8
- export enum CustomerPortalIntentionType {
9
- MANAGE_SUBSCRIPTION = 'MANAGE_SUBSCRIPTION',
10
- UPGRADE_PLAN = 'UPGRADE_PLAN',
11
- UPGRADE_TRIAL_PLAN = 'UPGRADE_TRIAL_PLAN',
12
- }
13
-
14
- export type OnManageSubscriptionFn = ({
15
- intentionType,
16
- customerSubscriptions,
17
- }: {
18
- intentionType: CustomerPortalIntentionType;
19
- customerSubscriptions: CustomerPortalSubscription[];
20
- }) => Promise<void> | void;
@@ -1,22 +0,0 @@
1
- import styled from '@utils/style';
2
- import Grid from '@mui/material/Grid';
3
- import { range } from 'lodash';
4
- import Skeleton from 'react-loading-skeleton';
5
- import { useIsScreenWiderThan } from '../../hooks/useIsScreenWiderThan';
6
-
7
- export const Footer = styled.div`
8
- margin-top: 32px;
9
- `;
10
-
11
- export function CustomerUsageLoader() {
12
- const isMdScreen = useIsScreenWiderThan('md');
13
- return (
14
- <Grid container spacing={4} className="stigg-subscription-usage-skeleton-layout" sx={{ flexWrap: 'wrap' }}>
15
- {range(6).map((item) => (
16
- <Grid key={item} item xs={isMdScreen ? 4 : 12}>
17
- <Skeleton width={280} height={120} />
18
- </Grid>
19
- ))}
20
- </Grid>
21
- );
22
- }
@@ -1,124 +0,0 @@
1
- import { CustomerPortalEntitlement, MeterType, PricingType, SubscriptionStatus } from '@stigg/js-client-sdk';
2
- import { useState } from 'react';
3
- import { compact, keyBy } from 'lodash';
4
- import { Minus, Plus } from 'react-feather';
5
- import Grid from '@mui/material/Grid';
6
- import { useCustomerPortalContext } from '../CustomerPortalContext';
7
- import { FeatureUsage } from './featureUsage/FeatureUsage';
8
- import { Footer, CustomerUsageLoader } from './CustomerUsageData.style';
9
- import { SectionContainer } from '../common/SectionContainer';
10
- import { SectionHeader } from '../common/SectionHeader';
11
- import { SectionTitle } from '../common/SectionTitle';
12
- import { StyledButton } from '../common/StyledButton';
13
- import { FilterEntitlementsFn, OnBuyMoreCallbackFn } from '../types';
14
- import { OnManageClick } from '../CustomerPortalContainer';
15
- import { useIsScreenWiderThan } from '../../hooks/useIsScreenWiderThan';
16
-
17
- const MAX_BOXES = 6;
18
-
19
- export type CustomerUsageDataProps = {
20
- onManageSubscription?: OnManageClick;
21
- onBuyMore?: OnBuyMoreCallbackFn;
22
- filterEntitlements?: FilterEntitlementsFn;
23
- };
24
-
25
- export function CustomerUsageData({ onManageSubscription, onBuyMore, filterEntitlements }: CustomerUsageDataProps) {
26
- const [showAll, setShowAll] = useState(false);
27
- const isMdScreen = useIsScreenWiderThan('md');
28
-
29
- const { customerPortal, isLoading, textOverrides, theme } = useCustomerPortalContext();
30
- const isLoadingData = isLoading || !customerPortal;
31
- const { entitlements, subscriptions } = customerPortal || {};
32
- const meteredEntitlements = entitlements?.filter(
33
- (entitlement) =>
34
- entitlement.feature?.meterType === MeterType.Fluctuating ||
35
- entitlement.feature?.meterType === MeterType.Incremental,
36
- );
37
- const activeSubscription = subscriptions?.find(({ status }) => status === SubscriptionStatus.Active);
38
- const hasCustomSubscription = activeSubscription?.pricingType === PricingType.Custom;
39
- const canUpgradeSubscription = !!customerPortal?.canUpgradeSubscription;
40
-
41
- const subscriptionPriceByFeature = keyBy(activeSubscription?.prices ?? [], 'feature.refId');
42
- const entitlementByFeature = keyBy(meteredEntitlements ?? [], 'feature.refId');
43
-
44
- // sort features by prices first, then other entitlements
45
- const priceEntitlements: CustomerPortalEntitlement[] = compact(
46
- (activeSubscription?.prices ?? []).map(
47
- (subscriptionPrice) =>
48
- (subscriptionPrice.feature && entitlementByFeature[subscriptionPrice.feature.refId]) || undefined,
49
- ),
50
- );
51
- const otherEntitlements: CustomerPortalEntitlement[] = compact(
52
- (meteredEntitlements ?? []).filter((entitlement) => !subscriptionPriceByFeature[entitlement.feature!.refId]),
53
- );
54
-
55
- const sortedEntitlements: CustomerPortalEntitlement[] = [...priceEntitlements, ...otherEntitlements].filter(
56
- (entitlement) => entitlement.usageLimit !== 0,
57
- );
58
-
59
- const filteredEntitlements = filterEntitlements ? filterEntitlements(sortedEntitlements) : sortedEntitlements;
60
-
61
- // 4 -> 3 per row, 6 -> 2 per row
62
- const xs = isMdScreen ? (filteredEntitlements.length > 2 ? 4 : 6) : 12;
63
-
64
- const entitlementsToShow = showAll ? filteredEntitlements : filteredEntitlements.slice(0, MAX_BOXES);
65
-
66
- const toggleShowAll = () => setShowAll((prevState) => !prevState);
67
-
68
- if (!isLoadingData && !meteredEntitlements?.length) {
69
- return null;
70
- }
71
-
72
- return (
73
- <SectionContainer
74
- className="stigg-subscription-usage-layout"
75
- $backgroundColor={theme.backgroundColor}
76
- $borderColor={theme.borderColor}>
77
- <SectionHeader>
78
- <SectionTitle
79
- title={textOverrides.usageTabTitle}
80
- className="stigg-customer-portal-usage-section-title"
81
- isLoading={isLoadingData}
82
- />
83
- </SectionHeader>
84
-
85
- {isLoadingData ? (
86
- <CustomerUsageLoader />
87
- ) : (
88
- <>
89
- <Grid container spacing={4}>
90
- {entitlementsToShow.map((entitlement) => (
91
- <Grid
92
- className={`stigg-entitlement-usage-${entitlement.feature!.refId}`}
93
- key={entitlement.feature!.refId}
94
- item
95
- xs={xs}>
96
- <FeatureUsage
97
- key={entitlement.feature!.refId}
98
- subscriptionPrice={subscriptionPriceByFeature[entitlement.feature!.refId]}
99
- entitlement={entitlement}
100
- onManageSubscription={onManageSubscription}
101
- onBuyMore={onBuyMore}
102
- hasCustomSubscription={hasCustomSubscription}
103
- canUpgradeSubscription={canUpgradeSubscription}
104
- />
105
- </Grid>
106
- ))}
107
- </Grid>
108
-
109
- {filteredEntitlements.length > MAX_BOXES && (
110
- <Footer>
111
- <StyledButton
112
- className="stigg-usage-toggle-many-button"
113
- variant="text"
114
- startIcon={showAll ? <Minus /> : <Plus />}
115
- onClick={toggleShowAll}>
116
- {showAll ? 'Show less' : 'Show more'}
117
- </StyledButton>
118
- </Footer>
119
- )}
120
- </>
121
- )}
122
- </SectionContainer>
123
- );
124
- }
@@ -1,62 +0,0 @@
1
- import { CustomerPortalEntitlement } from '@stigg/js-client-sdk';
2
- import { FeatureFragment } from '@stigg/api-client-js/src/generated/sdk';
3
- import Button from '@mui/material/Button';
4
- import styled from '@utils/style';
5
- import { getUsagePercentage, USAGE_PERCENTAGE_WARNING_THRESHOLD } from './FeatureUsage.helper';
6
- import { Typography } from '../../../common/Typography';
7
- import { CustomerPortalIntentionType, OnBuyMoreCallbackFn } from '../../types';
8
- import { OnManageClick } from '../../CustomerPortalContainer';
9
-
10
- const StyledButton = styled(Button)`
11
- text-transform: none;
12
- padding: 0;
13
- white-space: nowrap;
14
- `;
15
-
16
- export type EntitlementCtaButtonProps = {
17
- entitlement: Exclude<CustomerPortalEntitlement, 'feature'>;
18
- feature: FeatureFragment;
19
- onManageSubscription: OnManageClick | undefined;
20
- onBuyMore?: OnBuyMoreCallbackFn;
21
- canBuyMore: boolean;
22
- canUpgradeSubscription: boolean;
23
- hasCustomSubscription: boolean;
24
- };
25
-
26
- export function EntitlementCtaButton({
27
- entitlement,
28
- feature,
29
- onManageSubscription,
30
- onBuyMore,
31
- canBuyMore,
32
- canUpgradeSubscription,
33
- hasCustomSubscription,
34
- }: EntitlementCtaButtonProps) {
35
- if (hasCustomSubscription || entitlement.hasUnlimitedUsage) {
36
- return null;
37
- }
38
-
39
- if (getUsagePercentage(entitlement.currentUsage || 0, entitlement.usageLimit!) < USAGE_PERCENTAGE_WARNING_THRESHOLD) {
40
- return null;
41
- }
42
-
43
- if (canBuyMore) {
44
- return onBuyMore ? (
45
- <StyledButton variant="text" onClick={() => onBuyMore(feature, entitlement)}>
46
- <Typography color="primary.main">Buy more</Typography>
47
- </StyledButton>
48
- ) : null;
49
- }
50
-
51
- if (canUpgradeSubscription) {
52
- return onManageSubscription ? (
53
- <StyledButton
54
- variant="text"
55
- onClick={() => onManageSubscription({ intentionType: CustomerPortalIntentionType.UPGRADE_PLAN })}>
56
- <Typography color="primary.main">Upgrade</Typography>
57
- </StyledButton>
58
- ) : null;
59
- }
60
-
61
- return null;
62
- }
@@ -1,45 +0,0 @@
1
- import { CustomerPortalEntitlement, EntitlementResetPeriod } from '@stigg/js-client-sdk';
2
- import moment, { MomentInput } from 'moment';
3
-
4
- export const USAGE_PERCENTAGE_WARNING_THRESHOLD = 70;
5
-
6
- export function getUsagePercentage(currentUsage: number, limit: number) {
7
- return Math.min(Math.floor((currentUsage / limit) * 100), 100);
8
- }
9
-
10
- export function getUsageProgressStatus(currentUsage: number) {
11
- let status: 'standard' | 'warning' | 'error';
12
-
13
- if (currentUsage < USAGE_PERCENTAGE_WARNING_THRESHOLD) {
14
- status = 'standard';
15
- } else if (currentUsage < 100) {
16
- status = 'warning';
17
- } else {
18
- status = 'error';
19
- }
20
-
21
- return status;
22
- }
23
-
24
- export function getResetUsageText(entitlement: CustomerPortalEntitlement) {
25
- if (!entitlement.resetPeriod || !entitlement.usagePeriodEnd) {
26
- return null;
27
- }
28
-
29
- const calculateResetDiff = (unit: 'days' | 'hours' | 'minutes') => {
30
- return moment.utc(entitlement.usagePeriodEnd as MomentInput).diff(moment.utc(), unit);
31
- };
32
-
33
- switch (entitlement.resetPeriod) {
34
- case EntitlementResetPeriod.Month:
35
- return `Resets monthly - in ${calculateResetDiff('days')} days`;
36
- case EntitlementResetPeriod.Week:
37
- return `Resets weekly - in ${calculateResetDiff('days')} days`;
38
- case EntitlementResetPeriod.Day:
39
- return `Resets daily - in ${calculateResetDiff('hours')} hours`;
40
- case EntitlementResetPeriod.Hour:
41
- return `Resets hourly - in ${calculateResetDiff('minutes')} minutes`;
42
- default:
43
- return null;
44
- }
45
- }
@@ -1,13 +0,0 @@
1
- import styled from '@utils/style';
2
-
3
- export const FeatureUsageContainer = styled.div<{ $highlight: boolean; $borderColor: string }>`
4
- display: flex;
5
- flex-direction: column;
6
- padding: 24px;
7
- border: ${({ $borderColor }) => `1px solid ${$borderColor}`};
8
- border-radius: 10px;
9
- row-gap: 16px;
10
- height: 100%;
11
-
12
- ${({ theme, $highlight }) => $highlight && `background-color: ${theme.stigg.palette.backgroundSection}`};
13
- `;
@@ -1,96 +0,0 @@
1
- import isUndefined from 'lodash/isUndefined';
2
- import { BillingModel, CustomerPortalEntitlement } from '@stigg/js-client-sdk';
3
- import { CustomerPortalSubscriptionPriceFragment } from '@stigg/api-client-js/src/generated/sdk';
4
- import { Typography } from '../../../common/Typography';
5
- import { useCustomerPortalContext } from '../../CustomerPortalContext';
6
- import { getResetUsageText, getUsagePercentage } from './FeatureUsage.helper';
7
- import { getFeatureDisplayName } from '../../../utils/getFeatureName';
8
- import { FeatureUsageContainer } from './FeatureUsage.style';
9
- import { FeatureUsageProgressBar } from './FeatureUsageProgressBar';
10
- import { Icon } from '../../../common/Icon';
11
- import { InformationTooltip } from '../../../common/InformationTooltip';
12
- import { LongText } from '../../../common/LongText';
13
- import { EntitlementCtaButton } from './EntitlementCTAButton';
14
- import { OnBuyMoreCallbackFn } from '../../types';
15
- import { OnManageClick } from '../../CustomerPortalContainer';
16
-
17
- export type UsageBoxProps = {
18
- entitlement: CustomerPortalEntitlement;
19
- subscriptionPrice: CustomerPortalSubscriptionPriceFragment | undefined;
20
- onManageSubscription: OnManageClick | undefined;
21
- onBuyMore?: OnBuyMoreCallbackFn;
22
- hasCustomSubscription: boolean;
23
- canUpgradeSubscription: boolean;
24
- };
25
-
26
- export function FeatureUsage({
27
- entitlement,
28
- subscriptionPrice,
29
- onManageSubscription,
30
- onBuyMore,
31
- hasCustomSubscription,
32
- canUpgradeSubscription,
33
- }: UsageBoxProps) {
34
- const { theme } = useCustomerPortalContext();
35
-
36
- const hasOverageUsage = !entitlement.hasUnlimitedUsage && entitlement.currentUsage! > entitlement.usageLimit!;
37
-
38
- if (!entitlement.feature) {
39
- return null;
40
- }
41
-
42
- return (
43
- <FeatureUsageContainer $highlight={!!subscriptionPrice} $borderColor={theme.borderColor}>
44
- <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 16 }}>
45
- <LongText variant="body1">{entitlement.feature && getFeatureDisplayName(entitlement.feature)}</LongText>
46
- {subscriptionPrice && (
47
- <InformationTooltip
48
- title={
49
- <Typography variant="body1">
50
- {subscriptionPrice.billingModel === BillingModel.PerUnit
51
- ? 'Billed for committed usage'
52
- : 'Billed for actual usage'}
53
- </Typography>
54
- }>
55
- <Icon icon="DollarCoin" svgStrokeColor={theme.iconsColor} />
56
- </InformationTooltip>
57
- )}
58
- </div>
59
-
60
- <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', gap: 8 }}>
61
- <LongText
62
- variant="body1"
63
- color={hasOverageUsage ? 'error' : 'primary'}
64
- data-testid={`usage-data-${entitlement.feature?.refId}`}>
65
- {entitlement.currentUsage?.toLocaleString()}
66
- {!entitlement.hasUnlimitedUsage &&
67
- ` / ${entitlement.usageLimit?.toLocaleString()} (${getUsagePercentage(
68
- entitlement.currentUsage || 0,
69
- entitlement.usageLimit!,
70
- )}%)`}
71
- </LongText>
72
-
73
- <EntitlementCtaButton
74
- entitlement={entitlement}
75
- feature={entitlement.feature}
76
- onBuyMore={onBuyMore}
77
- canBuyMore={!!subscriptionPrice}
78
- onManageSubscription={onManageSubscription}
79
- canUpgradeSubscription={canUpgradeSubscription}
80
- hasCustomSubscription={hasCustomSubscription}
81
- />
82
- </div>
83
-
84
- <FeatureUsageProgressBar entitlement={entitlement} />
85
-
86
- {!entitlement.hasUnlimitedUsage &&
87
- !isUndefined(entitlement.usageLimit) &&
88
- !isUndefined(entitlement.currentUsage) &&
89
- entitlement.resetPeriod &&
90
- entitlement.usagePeriodEnd ? (
91
- <Typography color="secondary">{getResetUsageText(entitlement)}</Typography>
92
- ) : null}
93
- {entitlement.hasUnlimitedUsage && <Typography color="secondary">In current billing period</Typography>}
94
- </FeatureUsageContainer>
95
- );
96
- }