@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,184 +0,0 @@
1
- import keyBy from 'lodash/keyBy';
2
- import compact from 'lodash/compact';
3
- import { BillableFeatureInput, BillingPeriod } from '@stigg/api-client-js/src/generated/sdk';
4
- import { BillableFeature, BillingModel, Plan, Price, Subscription } from '@stigg/js-client-sdk';
5
- import { useCheckoutContext } from '../CheckoutProvider';
6
- import { getTierByQuantity, hasTierWithUnitPrice } from '../../utils/priceTierUtils';
7
- import { getValidPriceQuantity } from '../../utils/priceUtils';
8
- import { hasAnnualPrices, hasMonthlyPrices } from '../../utils/planPrices';
9
-
10
- export type PlanStepState = {
11
- billingPeriod: BillingPeriod;
12
- billableFeatures: BillableFeatureInput[];
13
- billingCountryCode?: string;
14
- };
15
-
16
- type GetPlanStepInitialStateProps = {
17
- preferredBillingPeriod?: BillingPeriod;
18
- plan?: Plan;
19
- activeSubscription?: Subscription | null;
20
- billingCountryCode?: string;
21
- preconfiguredBillableFeatures: BillableFeature[];
22
- };
23
-
24
- const getBillingPeriod = (billingPeriod: BillingPeriod, hasMonthlyPrices?: boolean, hasAnnualPrices?: boolean) => {
25
- if (billingPeriod === BillingPeriod.Monthly && hasMonthlyPrices) {
26
- return billingPeriod;
27
- }
28
- if (billingPeriod === BillingPeriod.Annually && hasAnnualPrices) {
29
- return billingPeriod;
30
- }
31
- return null;
32
- };
33
-
34
- const isInAdvanceCommitmentCharge = ({ pricingModel }: Price) => {
35
- return pricingModel === BillingModel.PerUnit;
36
- };
37
-
38
- function getBillableFeatures(
39
- preconfiguredBillableFeatures: BillableFeature[],
40
- planPrices?: Price[],
41
- activeSubscription?: Subscription | null,
42
- ): BillableFeature[] {
43
- if (!planPrices) return [];
44
-
45
- const preconfBillableFeaturesByFeatureId = keyBy(preconfiguredBillableFeatures, 'featureId');
46
-
47
- const quantityByFeatureId = keyBy(
48
- compact(
49
- activeSubscription?.prices?.map((charge) => {
50
- const { feature } = charge;
51
- if (!feature || !isInAdvanceCommitmentCharge(charge)) {
52
- return null;
53
- }
54
-
55
- return {
56
- featureId: feature.featureId,
57
- quantity: feature.unitQuantity || null,
58
- };
59
- }),
60
- ),
61
- 'featureId',
62
- );
63
-
64
- return compact(
65
- planPrices?.map((price) => {
66
- const featureId = price.feature?.featureId;
67
- if (!featureId || !isInAdvanceCommitmentCharge(price)) {
68
- return null;
69
- }
70
-
71
- let quantity;
72
- const preconfiguredQuantity =
73
- preconfBillableFeaturesByFeatureId[featureId]?.quantity || quantityByFeatureId[featureId]?.quantity;
74
-
75
- quantity = getValidPriceQuantity(price, preconfiguredQuantity || 1);
76
-
77
- if (price.isTieredPrice && !hasTierWithUnitPrice(price.tiers)) {
78
- const tier = getTierByQuantity(price.tiers!, quantity);
79
- quantity = tier.upTo!;
80
- }
81
-
82
- return {
83
- featureId,
84
- quantity,
85
- };
86
- }),
87
- );
88
- }
89
-
90
- function resolveBillingPeriod({
91
- plan,
92
- activeSubscription,
93
- preferredBillingPeriod,
94
- }: {
95
- plan?: Plan;
96
- activeSubscription?: Subscription | null;
97
- preferredBillingPeriod?: BillingPeriod;
98
- }) {
99
- const hasMonthlyPlan = hasMonthlyPrices(plan);
100
- const hasAnnualPlan = hasAnnualPrices(plan);
101
-
102
- if (preferredBillingPeriod) {
103
- const billingPeriod = getBillingPeriod(preferredBillingPeriod, hasMonthlyPlan, hasAnnualPlan);
104
- if (billingPeriod) {
105
- return billingPeriod;
106
- }
107
- }
108
-
109
- const isUpdate = activeSubscription?.plan?.id === plan?.id;
110
- if (isUpdate) {
111
- return activeSubscription?.price?.billingPeriod || BillingPeriod.Monthly;
112
- }
113
-
114
- if (activeSubscription?.prices && activeSubscription?.prices.length > 0) {
115
- const billingPeriod = getBillingPeriod(activeSubscription?.prices[0].billingPeriod, hasMonthlyPlan, hasAnnualPlan);
116
- if (billingPeriod) {
117
- return billingPeriod;
118
- }
119
- }
120
-
121
- return hasAnnualPlan ? BillingPeriod.Annually : BillingPeriod.Monthly;
122
- }
123
-
124
- export function getPlanStepInitialState({
125
- preferredBillingPeriod,
126
- plan,
127
- activeSubscription,
128
- billingCountryCode,
129
- preconfiguredBillableFeatures,
130
- }: GetPlanStepInitialStateProps): PlanStepState {
131
- const billingPeriod = resolveBillingPeriod({ plan, activeSubscription, preferredBillingPeriod });
132
- const planPrices = plan?.pricePoints.filter((pricePoint) => pricePoint.billingPeriod === billingPeriod);
133
- const billableFeatures = getBillableFeatures(preconfiguredBillableFeatures, planPrices, activeSubscription);
134
-
135
- return {
136
- billingPeriod,
137
- billableFeatures,
138
- billingCountryCode,
139
- };
140
- }
141
-
142
- function usePlanState() {
143
- const [{ planStep }] = useCheckoutContext();
144
- return planStep;
145
- }
146
-
147
- function useSetBillableFeature() {
148
- const [, setState] = useCheckoutContext();
149
-
150
- return (featureId: string, quantity: number) =>
151
- setState((draft) => {
152
- const billableFeature = draft.planStep.billableFeatures.find(
153
- (billableFeature) => billableFeature.featureId === featureId,
154
- );
155
-
156
- if (billableFeature) {
157
- billableFeature.quantity = quantity;
158
- } else {
159
- draft.planStep.billableFeatures.push({ featureId, quantity });
160
- }
161
- });
162
- }
163
-
164
- function useSetBillingPeriod() {
165
- const [, setState] = useCheckoutContext();
166
-
167
- return (billingPeriod: BillingPeriod) =>
168
- setState((draft) => {
169
- draft.planStep.billingPeriod = billingPeriod;
170
- draft.addonsStep.addons = draft.addonsStep.addons.filter((addon) =>
171
- addon.addon.pricePoints.some((pricePoint) => pricePoint.billingPeriod === billingPeriod),
172
- );
173
- });
174
- }
175
-
176
- export function usePlanStepModel() {
177
- const state = usePlanState();
178
-
179
- return {
180
- ...state,
181
- setBillingPeriod: useSetBillingPeriod(),
182
- setBillableFeature: useSetBillableFeature(),
183
- };
184
- }
@@ -1,165 +0,0 @@
1
- import { useCallback, useEffect, useState } from 'react';
2
- import isEmpty from 'lodash/isEmpty';
3
- import { BillingAddress, PreviewSubscription, StiggClient, SubscriptionPreviewV2 } from '@stigg/js-client-sdk';
4
- import { useCheckoutContext } from '../CheckoutProvider';
5
- import { useCheckoutModel } from './useCheckoutModel';
6
- import { SubscriptionState, useSubscriptionModel } from './useSubscriptionModel';
7
- import { MockCheckoutPreviewCallback } from '../types';
8
- import { useStiggContext } from '../../../hooks/useStiggContext';
9
-
10
- function mapBillingInformation({
11
- billingAddress,
12
- taxPercentage,
13
- }: {
14
- billingAddress?: BillingAddress;
15
- taxPercentage?: number;
16
- }): Pick<PreviewSubscription, 'billingInformation'> {
17
- if (!billingAddress && !taxPercentage) {
18
- return {};
19
- }
20
-
21
- return {
22
- billingInformation: {
23
- ...(billingAddress ? { billingAddress } : {}),
24
- ...(taxPercentage ? { taxPercentage } : {}),
25
- },
26
- };
27
- }
28
-
29
- type UsePreviewSubscriptionProps = {
30
- onMockCheckoutPreview?: MockCheckoutPreviewCallback;
31
- };
32
-
33
- export type PreviewSubscriptionProps = {
34
- customerId?: string;
35
- planId?: string;
36
- resourceId?: string;
37
- stigg: StiggClient;
38
- } & SubscriptionState &
39
- UsePreviewSubscriptionProps;
40
-
41
- const previewSubscription = async ({
42
- stigg,
43
- customerId,
44
- planId,
45
- resourceId,
46
- promotionCode,
47
- addons,
48
- billableFeatures,
49
- billingCountryCode,
50
- billingPeriod,
51
- billingAddress,
52
- taxPercentage,
53
- onMockCheckoutPreview,
54
- }: PreviewSubscriptionProps) => {
55
- const estimateAddons = addons.map(({ addon, quantity }) => ({ addonId: addon.id, quantity }));
56
- let subscriptionPreview: SubscriptionPreviewV2 | null = null;
57
- let errorMessage: string | null = null;
58
-
59
- try {
60
- if (customerId && planId) {
61
- const previewSubscriptionProps: PreviewSubscription = {
62
- customerId,
63
- planId,
64
- resourceId,
65
- billingCountryCode,
66
- addons: estimateAddons,
67
- billingPeriod,
68
- promotionCode,
69
- billableFeatures: isEmpty(billableFeatures) ? undefined : billableFeatures,
70
- ...mapBillingInformation({ billingAddress, taxPercentage }),
71
- };
72
-
73
- subscriptionPreview = onMockCheckoutPreview
74
- ? onMockCheckoutPreview(previewSubscriptionProps)
75
- : await stigg.previewSubscription(previewSubscriptionProps);
76
- }
77
- } catch (error) {
78
- const [, errorMsg] = (error as Error)?.message?.split('Error:') || [];
79
-
80
- errorMessage = errorMsg?.trim();
81
- }
82
-
83
- return { subscriptionPreview, errorMessage };
84
- };
85
-
86
- export const usePreviewSubscriptionAction = ({ onMockCheckoutPreview }: UsePreviewSubscriptionProps = {}) => {
87
- const { stigg } = useStiggContext();
88
- const subscription = useSubscriptionModel();
89
- const [{ resourceId }] = useCheckoutContext();
90
- const { checkoutState, widgetState } = useCheckoutModel();
91
- const { plan, customer } = checkoutState || {};
92
-
93
- const previewSubscriptionAction = useCallback(
94
- async ({ promotionCode }: { promotionCode?: string | null } = {}) => {
95
- if (!widgetState.isValid) {
96
- return { subscriptionPreview: null, errorMessage: null };
97
- }
98
-
99
- return previewSubscription({
100
- stigg,
101
- customerId: customer?.id,
102
- planId: plan?.id,
103
- resourceId,
104
- addons: subscription.addons,
105
- billableFeatures: subscription.billableFeatures,
106
- billingCountryCode: subscription.billingCountryCode,
107
- billingPeriod: subscription.billingPeriod,
108
- billingAddress: subscription.billingAddress,
109
- taxPercentage: subscription.taxPercentage,
110
- promotionCode: promotionCode ?? subscription.promotionCode,
111
- onMockCheckoutPreview,
112
- });
113
- },
114
- [
115
- stigg,
116
- customer?.id,
117
- plan?.id,
118
- resourceId,
119
- subscription.addons,
120
- subscription.billableFeatures,
121
- subscription.billingCountryCode,
122
- subscription.billingPeriod,
123
- subscription.billingAddress,
124
- subscription.taxPercentage,
125
- subscription.promotionCode,
126
- widgetState.isValid,
127
- onMockCheckoutPreview,
128
- ],
129
- );
130
-
131
- return { previewSubscriptionAction };
132
- };
133
-
134
- const SUBSCRIPTION_PREVIEW_DEBOUNCE_TIME = 500;
135
-
136
- export const usePreviewSubscription = ({ onMockCheckoutPreview }: UsePreviewSubscriptionProps = {}) => {
137
- const [subscriptionPreview, setSubscriptionPreview] = useState<SubscriptionPreviewV2 | null>(null);
138
- const [isFetchingSubscriptionPreview, setIsFetchingSubscriptionPreview] = useState(false);
139
-
140
- const { previewSubscriptionAction } = usePreviewSubscriptionAction({ onMockCheckoutPreview });
141
-
142
- useEffect(() => {
143
- const estimateSubscription = async () => {
144
- const { subscriptionPreview } = await previewSubscriptionAction();
145
- if (subscriptionPreview) {
146
- setSubscriptionPreview(subscriptionPreview);
147
- }
148
-
149
- setIsFetchingSubscriptionPreview(false);
150
- };
151
-
152
- setIsFetchingSubscriptionPreview(true);
153
-
154
- const timer = setTimeout(() => {
155
- setIsFetchingSubscriptionPreview(true);
156
- void estimateSubscription();
157
- }, SUBSCRIPTION_PREVIEW_DEBOUNCE_TIME);
158
-
159
- return () => {
160
- clearTimeout(timer);
161
- };
162
- }, [previewSubscriptionAction]);
163
-
164
- return { subscriptionPreview, isFetchingSubscriptionPreview };
165
- };
@@ -1,211 +0,0 @@
1
- import { BillableFeatureInput } from '@stigg/api-client-js/src/generated/sdk';
2
- import { Addon, BillableFeature, BillingPeriod, CheckoutStatePlan } from '@stigg/js-client-sdk';
3
- import { useCheckoutContext } from '../CheckoutProvider';
4
- import { CheckoutSteps } from '../configurations/steps';
5
- import { hasMultipleBillingPeriods } from '../../utils/planPrices';
6
- import { CheckoutStepKey } from '../types';
7
-
8
- export type CheckoutStep = {
9
- key: CheckoutStepKey;
10
- label: string;
11
- };
12
-
13
- const CHECKOUT_STEPS: CheckoutStep[] = [
14
- { key: CheckoutStepKey.PLAN, label: 'Plan' },
15
- { key: CheckoutStepKey.ADDONS, label: 'Add-ons' },
16
- { key: CheckoutStepKey.PAYMENT, label: 'Payment details' },
17
- ];
18
-
19
- export type ProgressBarState = {
20
- activeStep: number;
21
- completedSteps: number[];
22
- steps: CheckoutStep[];
23
- isDisabled: boolean;
24
- };
25
-
26
- const INITIAL_STATE: ProgressBarState = {
27
- activeStep: 0,
28
- completedSteps: [],
29
- steps: CHECKOUT_STEPS,
30
- isDisabled: false,
31
- };
32
-
33
- type GetProgressBarInitialStateProps = {
34
- isLoading: boolean;
35
- skipCheckoutSteps: CheckoutSteps[];
36
- plan?: CheckoutStatePlan;
37
- availableAddons?: Addon[];
38
- availableCharges: BillableFeatureInput[];
39
- preferredBillingPeriod?: BillingPeriod;
40
- preconfiguredBillableFeatures: BillableFeature[];
41
- };
42
-
43
- const canSkipPlanStep = (
44
- plan: CheckoutStatePlan,
45
- availableCharges: BillableFeatureInput[],
46
- preconfiguredBillableFeatures: BillableFeature[],
47
- preferredBillingPeriod?: BillingPeriod,
48
- ) => {
49
- // if multiple billing periods are available, a preferred billing period must be selected
50
- if (hasMultipleBillingPeriods(plan) && !preferredBillingPeriod) {
51
- return false;
52
- }
53
-
54
- const availableChargesIds = availableCharges.map((charge) => charge.featureId);
55
- const preconfiguredChargesIds = preconfiguredBillableFeatures.map((charge) => charge.featureId);
56
-
57
- // if there are available charges, they must be preconfigured
58
- if (
59
- availableChargesIds.length !== preconfiguredChargesIds.length ||
60
- !availableChargesIds.every((charge) => preconfiguredChargesIds.includes(charge))
61
- ) {
62
- return false;
63
- }
64
-
65
- return true;
66
- };
67
-
68
- export function getProgressBarInitialState({
69
- isLoading,
70
- skipCheckoutSteps,
71
- plan,
72
- availableAddons,
73
- availableCharges,
74
- preferredBillingPeriod,
75
- preconfiguredBillableFeatures,
76
- }: GetProgressBarInitialStateProps) {
77
- if (isLoading || !plan) {
78
- return INITIAL_STATE;
79
- }
80
-
81
- const stepsToFilter: CheckoutStepKey[] = [];
82
-
83
- if (
84
- skipCheckoutSteps.includes('PLAN') &&
85
- canSkipPlanStep(plan, availableCharges, preconfiguredBillableFeatures, preferredBillingPeriod)
86
- ) {
87
- stepsToFilter.push(CheckoutStepKey.PLAN);
88
- }
89
-
90
- if (availableAddons?.length === 0 || skipCheckoutSteps.includes('ADDONS')) {
91
- stepsToFilter.push(CheckoutStepKey.ADDONS);
92
- }
93
-
94
- return { ...INITIAL_STATE, steps: CHECKOUT_STEPS.filter((step) => !stepsToFilter.includes(step.key)) };
95
- }
96
-
97
- function useProgressBarState() {
98
- const [{ progressBar }] = useCheckoutContext();
99
- return progressBar;
100
- }
101
-
102
- function useSetActiveStep() {
103
- const [state, setState] = useCheckoutContext();
104
- return async (stepNumber: number) => {
105
- const { progressBar, planStep, addonsStep, paymentStep, onBeforeStepChange } = state;
106
-
107
- if (stepNumber !== progressBar.activeStep && onBeforeStepChange) {
108
- const currentStep = progressBar.steps[progressBar.activeStep];
109
- const targetStep = progressBar.steps[stepNumber];
110
-
111
- if (currentStep && targetStep) {
112
- const currentState = {
113
- planStep,
114
- addonsStep,
115
- paymentStep,
116
- };
117
-
118
- const canProceed = await onBeforeStepChange({
119
- from: currentStep.key,
120
- to: targetStep.key,
121
- state: currentState,
122
- });
123
-
124
- if (!canProceed) {
125
- return;
126
- }
127
- }
128
- }
129
-
130
- setState(({ progressBar }) => {
131
- progressBar.activeStep = stepNumber;
132
- });
133
- };
134
- }
135
- function useMarkStepAsCompleted() {
136
- const [, setState] = useCheckoutContext();
137
- return (stepNumber: number) =>
138
- setState(({ progressBar }) => {
139
- progressBar.completedSteps.push(stepNumber);
140
- });
141
- }
142
-
143
- function isCheckoutComplete(progressBar: ProgressBarState) {
144
- return progressBar.completedSteps.length >= progressBar.steps.length - 1;
145
- }
146
-
147
- function useGoNext() {
148
- const [state, setState] = useCheckoutContext();
149
- return async () => {
150
- const { progressBar, planStep, addonsStep, paymentStep, onBeforeStepChange } = state;
151
-
152
- if (progressBar.isDisabled) {
153
- return;
154
- }
155
-
156
- const currentStep = progressBar.steps[progressBar.activeStep];
157
- const nextStep = progressBar.steps[progressBar.activeStep + 1];
158
-
159
- if (nextStep && onBeforeStepChange) {
160
- const currentState = {
161
- planStep,
162
- addonsStep,
163
- paymentStep,
164
- };
165
-
166
- const canProceed = await onBeforeStepChange({
167
- from: currentStep.key,
168
- to: nextStep.key,
169
- state: currentState,
170
- });
171
-
172
- if (!canProceed) {
173
- return;
174
- }
175
- }
176
-
177
- setState(({ progressBar }) => {
178
- if (!progressBar.completedSteps.includes(progressBar.activeStep)) {
179
- progressBar.completedSteps.push(progressBar.activeStep);
180
- }
181
-
182
- if (progressBar.activeStep < progressBar.steps.length - 1) {
183
- progressBar.activeStep += 1;
184
- }
185
- });
186
- };
187
- }
188
-
189
- function useSetIsDisabled() {
190
- const [, setState] = useCheckoutContext();
191
- return (isDisabled?: boolean) =>
192
- setState(({ progressBar }) => {
193
- progressBar.isDisabled = !!isDisabled;
194
- });
195
- }
196
-
197
- export function useProgressBarModel() {
198
- const progressBarState = useProgressBarState();
199
- const currentStep = progressBarState.steps[progressBarState.activeStep];
200
-
201
- return {
202
- currentStep,
203
- progressBarState,
204
- isLastStep: progressBarState.activeStep === progressBarState.steps.length - 1,
205
- isCheckoutComplete: isCheckoutComplete(progressBarState),
206
- setActiveStep: useSetActiveStep(),
207
- markStepAsCompleted: useMarkStepAsCompleted(),
208
- goNext: useGoNext(),
209
- setIsDisabled: useSetIsDisabled(),
210
- };
211
- }
@@ -1,22 +0,0 @@
1
- import { useCheckoutContext } from '../CheckoutProvider';
2
- import { AddonsStepState } from './useAddonsStepModel';
3
- import { PromotionCodeState } from './useCouponModel';
4
- import { PaymentStepState } from './usePaymentStepModel';
5
- import { PlanStepState } from './usePlanStepModel';
6
-
7
- export type SubscriptionState = PlanStepState &
8
- PromotionCodeState &
9
- Pick<AddonsStepState, 'addons'> &
10
- Pick<PaymentStepState, 'billingAddress' | 'taxPercentage'>;
11
-
12
- export function useSubscriptionModel(): SubscriptionState {
13
- const [{ planStep, addonsStep, promotionCode, paymentStep }] = useCheckoutContext();
14
-
15
- return {
16
- ...planStep,
17
- addons: addonsStep.addons,
18
- promotionCode,
19
- billingAddress: paymentStep.billingAddress,
20
- taxPercentage: paymentStep.taxPercentage,
21
- };
22
- }
@@ -1,26 +0,0 @@
1
- import { ApplySubscription, PreviewSubscription } from '@stigg/js-client-sdk';
2
- import { useCheckoutContext } from '../CheckoutProvider';
3
- import { useCheckoutModel } from './useCheckoutModel';
4
- import { useSubscriptionModel } from './useSubscriptionModel';
5
-
6
- export function useSubscriptionState(): ApplySubscription | PreviewSubscription | undefined {
7
- const subscription = useSubscriptionModel();
8
- const [{ resourceId }] = useCheckoutContext();
9
- const { checkoutState } = useCheckoutModel();
10
- const { plan } = checkoutState || {};
11
- const addons = subscription.addons.map(({ addon, quantity }) => ({ addonId: addon.id, quantity }));
12
-
13
- if (!plan?.id) {
14
- return undefined;
15
- }
16
-
17
- return {
18
- resourceId,
19
- planId: plan.id,
20
- billingPeriod: subscription.billingPeriod,
21
- billableFeatures: subscription.billableFeatures,
22
- addons,
23
- promotionCode: subscription.promotionCode,
24
- billingCountryCode: subscription.billingCountryCode,
25
- };
26
- }
@@ -1,8 +0,0 @@
1
- export { Checkout } from './Checkout';
2
- export * from './types';
3
- export type { CheckoutTheme } from './configurations/theme';
4
- export type { CheckoutContainerProps } from './CheckoutContainer';
5
- export type { CheckoutProviderProps } from './CheckoutProvider';
6
- export type { CheckoutLocalization } from './configurations/textOverrides';
7
- export type { CheckoutProps } from './Checkout';
8
- export type { CheckoutSteps } from './configurations/steps';
@@ -1,41 +0,0 @@
1
- import Box from '@mui/material/Box';
2
- import Divider from '@mui/material/Divider';
3
-
4
- import { Typography } from '../../common/Typography';
5
- import { useCheckoutModel } from '../hooks/useCheckoutModel';
6
- import { CheckoutContainerProps } from '../CheckoutContainer';
7
- import { ChangePlanButton } from '../components/ChangePlanButton';
8
-
9
- type PlanHeaderProps = {
10
- allowChangePlan?: boolean;
11
- } & Pick<CheckoutContainerProps, 'onChangePlan'>;
12
-
13
- export function PlanHeader({ allowChangePlan = false, onChangePlan }: PlanHeaderProps) {
14
- const { checkoutState, checkoutLocalization } = useCheckoutModel();
15
- const { plan } = checkoutState || {};
16
-
17
- return (
18
- <>
19
- <Box sx={{ marginBottom: '16px' }}>
20
- <Typography variant="body1" color="disabled" style={{ opacity: 0.6, marginBottom: '8px' }}>
21
- Selected plan
22
- </Typography>
23
-
24
- <Box sx={{ display: 'flex', justifyContent: 'space-between' }}>
25
- <Typography variant="h1">{plan?.displayName}</Typography>
26
-
27
- {allowChangePlan && onChangePlan && (
28
- <ChangePlanButton
29
- onClick={() => {
30
- onChangePlan({ currentPlan: plan });
31
- }}
32
- checkoutLocalization={checkoutLocalization}
33
- size="medium"
34
- />
35
- )}
36
- </Box>
37
- </Box>
38
- <Divider className="stigg-checkout-plan-header-divider" />
39
- </>
40
- );
41
- }
@@ -1 +0,0 @@
1
- export * from './PlanHeader';
@@ -1,35 +0,0 @@
1
- import styled from '@utils/style';
2
- import LinearProgress, { linearProgressClasses } from '@mui/material/LinearProgress';
3
- import Button, { buttonClasses } from '@mui/material/Button';
4
- import { Icon } from '../../common/Icon';
5
-
6
- export const StyledProgress = styled(LinearProgress, { shouldForwardProp: (prop) => !prop.startsWith('$') })<{
7
- $disabled?: boolean;
8
- }>(({ theme, $disabled }) => ({
9
- [`&.${linearProgressClasses.root}`]: {
10
- borderRadius: theme.stigg.border.radius,
11
- backgroundColor: theme.stigg.palette.outlinedBorder,
12
- },
13
- [`& .${linearProgressClasses.bar}`]: {
14
- backgroundColor: $disabled ? theme.stigg.palette.primaryLight : theme.stigg.palette.primary,
15
- },
16
- }));
17
-
18
- export const StyledStepButton = styled(Button)(() => ({
19
- [`&.${buttonClasses.root}`]: {
20
- textTransform: 'none',
21
- lineHeight: 'inherit',
22
- justifyContent: 'flex-start',
23
- padding: '8px 4px',
24
- },
25
- }));
26
-
27
- export const StyledIcon = styled(Icon, { shouldForwardProp: (prop) => !prop.startsWith('$') })<{
28
- $disabled?: boolean;
29
- $shouldFill?: boolean;
30
- }>(({ theme, $disabled, $shouldFill }) => ({
31
- circle: {
32
- stroke: $disabled ? theme.stigg.palette.primaryLight : theme.stigg.palette.primary,
33
- fill: $shouldFill ? ($disabled ? theme.stigg.palette.primaryLight : theme.stigg.palette.primary) : undefined,
34
- },
35
- }));