@edx/frontend-app-subscription-manage 1.3.2 → 1.4.0

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 (226) hide show
  1. package/dist/app.js +2 -2
  2. package/dist/app.js.map +1 -1
  3. package/dist/components/ActiveSubscription/ActiveSubscription.d.ts +7 -0
  4. package/dist/components/ActiveSubscription/ActiveSubscription.js +24 -0
  5. package/dist/components/ActiveSubscription/ActiveSubscription.js.map +1 -0
  6. package/dist/components/BecomeSubscriber/BecomeSubscriber.d.ts +7 -0
  7. package/dist/components/BecomeSubscriber/BecomeSubscriber.js +19 -0
  8. package/dist/components/BecomeSubscriber/BecomeSubscriber.js.map +1 -0
  9. package/dist/components/CancelConfirmation/CancelConfirmation.d.ts +12 -0
  10. package/dist/components/CancelConfirmation/CancelConfirmation.js +21 -0
  11. package/dist/components/CancelConfirmation/CancelConfirmation.js.map +1 -0
  12. package/dist/components/CancelSuccess/CancelSuccess.d.ts +7 -0
  13. package/dist/components/CancelSuccess/CancelSuccess.js +17 -0
  14. package/dist/components/CancelSuccess/CancelSuccess.js.map +1 -0
  15. package/dist/components/CanceledSubscription/CanceledSubscription.d.ts +13 -0
  16. package/dist/components/CanceledSubscription/CanceledSubscription.js +27 -0
  17. package/dist/components/CanceledSubscription/CanceledSubscription.js.map +1 -0
  18. package/dist/components/EnrolledCoursesList/EnrolledCoursesList.d.ts +8 -0
  19. package/dist/components/EnrolledCoursesList/EnrolledCoursesList.js +20 -0
  20. package/dist/components/EnrolledCoursesList/EnrolledCoursesList.js.map +1 -0
  21. package/dist/components/HelpFooter/HelpFooter.d.ts +3 -0
  22. package/dist/components/HelpFooter/HelpFooter.js +12 -0
  23. package/dist/components/HelpFooter/HelpFooter.js.map +1 -0
  24. package/dist/components/OrderHistoryHeader/OrderHistoryHeader.d.ts +3 -0
  25. package/dist/components/OrderHistoryHeader/OrderHistoryHeader.js +9 -0
  26. package/dist/components/OrderHistoryHeader/OrderHistoryHeader.js.map +1 -0
  27. package/dist/components/PaymentHistory/PaymentHistory.d.ts +10 -0
  28. package/dist/components/PaymentHistory/PaymentHistory.js +23 -0
  29. package/dist/components/PaymentHistory/PaymentHistory.js.map +1 -0
  30. package/dist/components/RenewSubscriptionModal/RenewSubscriptionModal.d.ts +17 -0
  31. package/dist/components/RenewSubscriptionModal/RenewSubscriptionModal.js +63 -0
  32. package/dist/components/RenewSubscriptionModal/RenewSubscriptionModal.js.map +1 -0
  33. package/dist/components/ResubscribeCard/ResubscribeCard.d.ts +9 -0
  34. package/dist/components/ResubscribeCard/ResubscribeCard.js +25 -0
  35. package/dist/components/ResubscribeCard/ResubscribeCard.js.map +1 -0
  36. package/dist/components/SubscriptionTabs/SubscriptionTabs.d.ts +8 -0
  37. package/dist/components/SubscriptionTabs/SubscriptionTabs.js +9 -0
  38. package/dist/components/SubscriptionTabs/SubscriptionTabs.js.map +1 -0
  39. package/dist/components/UpdatePaymentMethodModal/UpdatePaymentMethodModal.d.ts +9 -0
  40. package/dist/components/UpdatePaymentMethodModal/UpdatePaymentMethodModal.js +135 -0
  41. package/dist/components/UpdatePaymentMethodModal/UpdatePaymentMethodModal.js.map +1 -0
  42. package/dist/components/messages.d.ts +473 -0
  43. package/dist/components/messages.js +482 -0
  44. package/dist/components/messages.js.map +1 -0
  45. package/dist/constants.d.ts +14 -56
  46. package/dist/constants.js +23 -272
  47. package/dist/constants.js.map +1 -1
  48. package/dist/data/hooks/keys.d.ts +8 -13
  49. package/dist/data/hooks/keys.js +8 -13
  50. package/dist/data/hooks/keys.js.map +1 -1
  51. package/dist/data/hooks/useManageQueries.d.ts +37 -0
  52. package/dist/data/hooks/useManageQueries.js +206 -0
  53. package/dist/data/hooks/useManageQueries.js.map +1 -0
  54. package/dist/data/services/subs/urls.d.ts +2 -2
  55. package/dist/data/services/subs/urls.js.map +1 -1
  56. package/dist/data/services/subscription/cancelSubscription.d.ts +6 -0
  57. package/dist/data/services/subscription/cancelSubscription.js +31 -0
  58. package/dist/data/services/subscription/cancelSubscription.js.map +1 -0
  59. package/dist/data/services/subscription/getBillingPlans.d.ts +3 -0
  60. package/dist/{utils/fetchBillingPlans.js → data/services/subscription/getBillingPlans.js} +10 -21
  61. package/dist/data/services/subscription/getBillingPlans.js.map +1 -0
  62. package/dist/data/services/subscription/getIsCurrentUserSubscriber.d.ts +3 -0
  63. package/dist/data/services/subscription/getIsCurrentUserSubscriber.js +35 -0
  64. package/dist/data/services/subscription/getIsCurrentUserSubscriber.js.map +1 -0
  65. package/dist/data/services/subscription/getPaymentHistory.d.ts +6 -0
  66. package/dist/data/services/subscription/getPaymentHistory.js +65 -0
  67. package/dist/data/services/subscription/getPaymentHistory.js.map +1 -0
  68. package/dist/data/services/subscription/getSubscriptionEnrollments.d.ts +7 -0
  69. package/dist/data/services/subscription/getSubscriptionEnrollments.js +98 -0
  70. package/dist/data/services/subscription/getSubscriptionEnrollments.js.map +1 -0
  71. package/dist/data/services/subscription/getSubscriptionPaymentMethod.d.ts +8 -0
  72. package/dist/data/services/subscription/getSubscriptionPaymentMethod.js +42 -0
  73. package/dist/data/services/subscription/getSubscriptionPaymentMethod.js.map +1 -0
  74. package/dist/data/services/subscription/reactivateSubscription.d.ts +6 -0
  75. package/dist/data/services/subscription/reactivateSubscription.js +30 -0
  76. package/dist/data/services/subscription/reactivateSubscription.js.map +1 -0
  77. package/dist/data/services/subscription/updateSubscriptionPaymentMethod.d.ts +10 -0
  78. package/dist/data/services/subscription/updateSubscriptionPaymentMethod.js +31 -0
  79. package/dist/data/services/subscription/updateSubscriptionPaymentMethod.js.map +1 -0
  80. package/dist/icons/ExternalLinkIcon.d.ts +6 -0
  81. package/dist/icons/ExternalLinkIcon.js +18 -0
  82. package/dist/icons/ExternalLinkIcon.js.map +1 -0
  83. package/dist/icons/index.d.ts +1 -0
  84. package/dist/icons/index.js +2 -0
  85. package/dist/icons/index.js.map +1 -0
  86. package/dist/manageSubscriptionPage/CancelSubscriptionPage.d.ts +3 -0
  87. package/dist/manageSubscriptionPage/CancelSubscriptionPage.js +53 -0
  88. package/dist/manageSubscriptionPage/CancelSubscriptionPage.js.map +1 -0
  89. package/dist/manageSubscriptionPage/CancelSuccessPage.d.ts +3 -0
  90. package/dist/manageSubscriptionPage/CancelSuccessPage.js +24 -0
  91. package/dist/manageSubscriptionPage/CancelSuccessPage.js.map +1 -0
  92. package/dist/manageSubscriptionPage/ManageSubscriptionPage.d.ts +3 -0
  93. package/dist/manageSubscriptionPage/ManageSubscriptionPage.js +87 -0
  94. package/dist/manageSubscriptionPage/ManageSubscriptionPage.js.map +1 -0
  95. package/dist/messages.js +2 -2
  96. package/dist/messages.js.map +1 -1
  97. package/dist/routes.d.ts +9 -2
  98. package/dist/routes.js +26 -6
  99. package/dist/routes.js.map +1 -1
  100. package/dist/style.scss +1 -14
  101. package/dist/styles/components/manageSubscription.scss +454 -0
  102. package/dist/types.d.ts +57 -201
  103. package/dist/types.js +3 -0
  104. package/dist/types.js.map +1 -1
  105. package/dist/utils/billingDetails.d.ts +3 -20
  106. package/dist/utils/billingDetails.js +4 -25
  107. package/dist/utils/billingDetails.js.map +1 -1
  108. package/dist/utils/edxSession.d.ts +18 -0
  109. package/dist/utils/edxSession.js +72 -0
  110. package/dist/utils/edxSession.js.map +1 -0
  111. package/dist/utils/formatDate.d.ts +16 -0
  112. package/dist/utils/formatDate.js +69 -0
  113. package/dist/utils/formatDate.js.map +1 -0
  114. package/dist/utils/graphqlClient.d.ts +9 -10
  115. package/dist/utils/graphqlClient.js +22 -11
  116. package/dist/utils/graphqlClient.js.map +1 -1
  117. package/dist/utils/invoiceAmount.d.ts +22 -0
  118. package/dist/utils/invoiceAmount.js +59 -0
  119. package/dist/utils/invoiceAmount.js.map +1 -0
  120. package/dist/utils/queries.d.ts +38 -33
  121. package/dist/utils/queries.js +83 -123
  122. package/dist/utils/queries.js.map +1 -1
  123. package/dist/utils/subscriptionView.d.ts +15 -0
  124. package/dist/utils/subscriptionView.js +50 -0
  125. package/dist/utils/subscriptionView.js.map +1 -0
  126. package/dist/utils/urls.d.ts +13 -0
  127. package/dist/utils/urls.js +52 -0
  128. package/dist/utils/urls.js.map +1 -0
  129. package/package.json +7 -2
  130. package/dist/checkoutPage/CheckoutPage.d.ts +0 -3
  131. package/dist/checkoutPage/CheckoutPage.js +0 -30
  132. package/dist/checkoutPage/CheckoutPage.js.map +0 -1
  133. package/dist/components/BrandMarks/BrandMarks.d.ts +0 -3
  134. package/dist/components/BrandMarks/BrandMarks.js +0 -9
  135. package/dist/components/BrandMarks/BrandMarks.js.map +0 -1
  136. package/dist/components/CartSummary/CartSummary.d.ts +0 -21
  137. package/dist/components/CartSummary/CartSummary.js +0 -30
  138. package/dist/components/CartSummary/CartSummary.js.map +0 -1
  139. package/dist/components/CartSummary/Messages.d.ts +0 -73
  140. package/dist/components/CartSummary/Messages.js +0 -76
  141. package/dist/components/CartSummary/Messages.js.map +0 -1
  142. package/dist/components/Checkout/Checkout.d.ts +0 -4
  143. package/dist/components/Checkout/Checkout.js +0 -40
  144. package/dist/components/Checkout/Checkout.js.map +0 -1
  145. package/dist/components/CheckoutGate/CheckoutGate.d.ts +0 -7
  146. package/dist/components/CheckoutGate/CheckoutGate.js +0 -35
  147. package/dist/components/CheckoutGate/CheckoutGate.js.map +0 -1
  148. package/dist/components/CourseEnrollmentCard/CourseEnrollmentCard.d.ts +0 -9
  149. package/dist/components/CourseEnrollmentCard/CourseEnrollmentCard.js +0 -31
  150. package/dist/components/CourseEnrollmentCard/CourseEnrollmentCard.js.map +0 -1
  151. package/dist/components/CourseEnrollmentCard/Messages.d.ts +0 -33
  152. package/dist/components/CourseEnrollmentCard/Messages.js +0 -35
  153. package/dist/components/CourseEnrollmentCard/Messages.js.map +0 -1
  154. package/dist/components/EdxUnlimitedBanner/EdxUnlimitedBanner.d.ts +0 -13
  155. package/dist/components/EdxUnlimitedBanner/EdxUnlimitedBanner.js +0 -11
  156. package/dist/components/EdxUnlimitedBanner/EdxUnlimitedBanner.js.map +0 -1
  157. package/dist/components/EnrollmentSummary/EnrollmentSummary.d.ts +0 -15
  158. package/dist/components/EnrollmentSummary/EnrollmentSummary.js +0 -21
  159. package/dist/components/EnrollmentSummary/EnrollmentSummary.js.map +0 -1
  160. package/dist/components/EnrollmentSummary/Messages.d.ts +0 -33
  161. package/dist/components/EnrollmentSummary/Messages.js +0 -35
  162. package/dist/components/EnrollmentSummary/Messages.js.map +0 -1
  163. package/dist/components/PaymentFields/PaymentFields.d.ts +0 -9
  164. package/dist/components/PaymentFields/PaymentFields.js +0 -7
  165. package/dist/components/PaymentFields/PaymentFields.js.map +0 -1
  166. package/dist/components/PaymentForm/Messages.d.ts +0 -88
  167. package/dist/components/PaymentForm/Messages.js +0 -95
  168. package/dist/components/PaymentForm/Messages.js.map +0 -1
  169. package/dist/components/PaymentForm/PaymentForm.d.ts +0 -21
  170. package/dist/components/PaymentForm/PaymentForm.js +0 -69
  171. package/dist/components/PaymentForm/PaymentForm.js.map +0 -1
  172. package/dist/components/StatusScreens/Messages.d.ts +0 -103
  173. package/dist/components/StatusScreens/Messages.js +0 -108
  174. package/dist/components/StatusScreens/Messages.js.map +0 -1
  175. package/dist/components/StatusScreens/StatusScreens.d.ts +0 -23
  176. package/dist/components/StatusScreens/StatusScreens.js +0 -25
  177. package/dist/components/StatusScreens/StatusScreens.js.map +0 -1
  178. package/dist/data/hooks/useCheckout.d.ts +0 -57
  179. package/dist/data/hooks/useCheckout.js +0 -249
  180. package/dist/data/hooks/useCheckout.js.map +0 -1
  181. package/dist/data/hooks/useCheckoutGate.d.ts +0 -15
  182. package/dist/data/hooks/useCheckoutGate.js +0 -39
  183. package/dist/data/hooks/useCheckoutGate.js.map +0 -1
  184. package/dist/data/hooks/useCheckoutMutations.d.ts +0 -16
  185. package/dist/data/hooks/useCheckoutMutations.js +0 -131
  186. package/dist/data/hooks/useCheckoutMutations.js.map +0 -1
  187. package/dist/data/hooks/useCheckoutQueries.d.ts +0 -30
  188. package/dist/data/hooks/useCheckoutQueries.js +0 -97
  189. package/dist/data/hooks/useCheckoutQueries.js.map +0 -1
  190. package/dist/styles/components/brandMarks.scss +0 -54
  191. package/dist/styles/components/cartSummary.scss +0 -18
  192. package/dist/styles/components/checkout.scss +0 -29
  193. package/dist/styles/components/checkoutStepper.scss +0 -9
  194. package/dist/styles/components/courseEnrollmentCard.scss +0 -38
  195. package/dist/styles/components/edxUnlimitedBanner.scss +0 -138
  196. package/dist/styles/components/enrollmentSummary.scss +0 -13
  197. package/dist/styles/components/paymentFields.scss +0 -15
  198. package/dist/styles/components/paymentForm.scss +0 -105
  199. package/dist/styles/components/statusScreens.scss +0 -29
  200. package/dist/styles/components/successScreen.scss +0 -0
  201. package/dist/utils/auth.d.ts +0 -7
  202. package/dist/utils/auth.js +0 -28
  203. package/dist/utils/auth.js.map +0 -1
  204. package/dist/utils/bootstrapApi.d.ts +0 -20
  205. package/dist/utils/bootstrapApi.js +0 -142
  206. package/dist/utils/bootstrapApi.js.map +0 -1
  207. package/dist/utils/cartApi.d.ts +0 -16
  208. package/dist/utils/cartApi.js +0 -118
  209. package/dist/utils/cartApi.js.map +0 -1
  210. package/dist/utils/checkout.d.ts +0 -6
  211. package/dist/utils/checkout.js +0 -28
  212. package/dist/utils/checkout.js.map +0 -1
  213. package/dist/utils/fetchActiveSubscriptions.d.ts +0 -4
  214. package/dist/utils/fetchActiveSubscriptions.js +0 -36
  215. package/dist/utils/fetchActiveSubscriptions.js.map +0 -1
  216. package/dist/utils/fetchBillingPlans.d.ts +0 -2
  217. package/dist/utils/fetchBillingPlans.js.map +0 -1
  218. package/dist/utils/index.d.ts +0 -3
  219. package/dist/utils/index.js +0 -17
  220. package/dist/utils/index.js.map +0 -1
  221. package/dist/utils/provision.d.ts +0 -25
  222. package/dist/utils/provision.js +0 -95
  223. package/dist/utils/provision.js.map +0 -1
  224. package/dist/utils/stripe.d.ts +0 -7
  225. package/dist/utils/stripe.js +0 -43
  226. package/dist/utils/stripe.js.map +0 -1
@@ -0,0 +1,42 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { GET_SUBSCRIPTION_PAYMENT_METHOD } from '../../../utils/queries';
11
+ function escapeFilterValue(value) {
12
+ return value.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
13
+ }
14
+ /** Load the Stripe payment method on file for a subscription BI. */
15
+ export function getSubscriptionPaymentMethod(gql, subscriptionBiId) {
16
+ return __awaiter(this, void 0, void 0, function* () {
17
+ var _a, _b, _c, _d, _e, _f;
18
+ const biId = subscriptionBiId.trim();
19
+ if (!biId) {
20
+ return null;
21
+ }
22
+ const filter = `biId = '${escapeFilterValue(biId)}'`;
23
+ const data = yield gql(GET_SUBSCRIPTION_PAYMENT_METHOD, { filter });
24
+ const node = (_c = (_b = (_a = data === null || data === void 0 ? void 0 : data.filterTwouSubscription) === null || _a === void 0 ? void 0 : _a.edges) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.node;
25
+ if (!node) {
26
+ return null;
27
+ }
28
+ const items = Array.isArray(node.hiConsistsOf) ? node.hiConsistsOf : [];
29
+ for (const item of items) {
30
+ const payment = item === null || item === void 0 ? void 0 : item.paybPayment;
31
+ if ((payment === null || payment === void 0 ? void 0 : payment.tPaymentMethodLast4) || (payment === null || payment === void 0 ? void 0 : payment.tStripePaymentMethodId)) {
32
+ return {
33
+ stripePaymentMethodId: (_d = payment.tStripePaymentMethodId) !== null && _d !== void 0 ? _d : null,
34
+ last4: (_e = payment.tPaymentMethodLast4) !== null && _e !== void 0 ? _e : null,
35
+ brand: (_f = payment.tPaymentMethodBrand) !== null && _f !== void 0 ? _f : null,
36
+ };
37
+ }
38
+ }
39
+ return null;
40
+ });
41
+ }
42
+ //# sourceMappingURL=getSubscriptionPaymentMethod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getSubscriptionPaymentMethod.js","sourceRoot":"","sources":["../../../../src/data/services/subscription/getSubscriptionPaymentMethod.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC;AAQzE,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAgB,4BAA4B,CAChD,GAAc,EACd,gBAAwB;;;QAExB,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC;QACrD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,+BAA+B,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,MAAA,MAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,sBAAsB,0CAAE,KAAK,0CAAG,CAAC,CAAC,0CAAE,IAAI,CAAC;QAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,WAAW,CAAC;YAClC,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,mBAAmB,MAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,sBAAsB,CAAA,EAAE,CAAC;gBACpE,OAAO;oBACL,qBAAqB,EAAE,MAAA,OAAO,CAAC,sBAAsB,mCAAI,IAAI;oBAC7D,KAAK,EAAE,MAAA,OAAO,CAAC,mBAAmB,mCAAI,IAAI;oBAC1C,KAAK,EAAE,MAAA,OAAO,CAAC,mBAAmB,mCAAI,IAAI;iBAC3C,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CAAA","sourcesContent":["import type { GqlRunner } from '../../../types';\nimport { GET_SUBSCRIPTION_PAYMENT_METHOD } from '../../../utils/queries';\n\nexport interface SubscriptionPaymentMethod {\n stripePaymentMethodId: string | null,\n last4: string | null,\n brand: string | null,\n}\n\nfunction escapeFilterValue(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n\n/** Load the Stripe payment method on file for a subscription BI. */\nexport async function getSubscriptionPaymentMethod(\n gql: GqlRunner,\n subscriptionBiId: string,\n): Promise<SubscriptionPaymentMethod | null> {\n const biId = subscriptionBiId.trim();\n if (!biId) {\n return null;\n }\n\n const filter = `biId = '${escapeFilterValue(biId)}'`;\n const data = await gql(GET_SUBSCRIPTION_PAYMENT_METHOD, { filter });\n const node = data?.filterTwouSubscription?.edges?.[0]?.node;\n if (!node) {\n return null;\n }\n\n const items = Array.isArray(node.hiConsistsOf) ? node.hiConsistsOf : [];\n for (const item of items) {\n const payment = item?.paybPayment;\n if (payment?.tPaymentMethodLast4 || payment?.tStripePaymentMethodId) {\n return {\n stripePaymentMethodId: payment.tStripePaymentMethodId ?? null,\n last4: payment.tPaymentMethodLast4 ?? null,\n brand: payment.tPaymentMethodBrand ?? null,\n };\n }\n }\n\n return null;\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { GqlRunner } from '../../../types';
2
+ /**
3
+ * Undo a pending cancellation — resumes billing before period end.
4
+ * Returns the raw JSON scalar from Viax when available.
5
+ */
6
+ export declare function reactivateSubscription(gql: GqlRunner, subscriptionBiId: string): Promise<Record<string, unknown> | null>;
@@ -0,0 +1,30 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { REACTIVATE_SUBSCRIPTION } from '../../../utils/queries';
11
+ /**
12
+ * Undo a pending cancellation — resumes billing before period end.
13
+ * Returns the raw JSON scalar from Viax when available.
14
+ */
15
+ export function reactivateSubscription(gql, subscriptionBiId) {
16
+ return __awaiter(this, void 0, void 0, function* () {
17
+ const data = yield gql(REACTIVATE_SUBSCRIPTION, {
18
+ biId: subscriptionBiId,
19
+ });
20
+ const result = data === null || data === void 0 ? void 0 : data.tReactivateSubscription;
21
+ if (!result) {
22
+ return null;
23
+ }
24
+ if (typeof result === 'object') {
25
+ return result;
26
+ }
27
+ return { result };
28
+ });
29
+ }
30
+ //# sourceMappingURL=reactivateSubscription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactivateSubscription.js","sourceRoot":"","sources":["../../../../src/data/services/subscription/reactivateSubscription.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE;;;GAGG;AACH,MAAM,UAAgB,sBAAsB,CAC1C,GAAc,EACd,gBAAwB;;QAExB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,uBAAuB,EAAE;YAC9C,IAAI,EAAE,gBAAgB;SACvB,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,uBAAuB,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,MAAiC,CAAC;QAC3C,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;CAAA","sourcesContent":["import type { GqlRunner } from '../../../types';\nimport { REACTIVATE_SUBSCRIPTION } from '../../../utils/queries';\n\n/**\n * Undo a pending cancellation — resumes billing before period end.\n * Returns the raw JSON scalar from Viax when available.\n */\nexport async function reactivateSubscription(\n gql: GqlRunner,\n subscriptionBiId: string,\n): Promise<Record<string, unknown> | null> {\n const data = await gql(REACTIVATE_SUBSCRIPTION, {\n biId: subscriptionBiId,\n });\n const result = data?.tReactivateSubscription;\n if (!result) {\n return null;\n }\n if (typeof result === 'object') {\n return result as Record<string, unknown>;\n }\n return { result };\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { GqlRunner } from '../../../types';
2
+ export interface UpdatePaymentMethodArgs {
3
+ biId: string;
4
+ tStripePaymentMethodId: string;
5
+ }
6
+ /**
7
+ * Set a new Stripe payment method on the learner's subscription.
8
+ * Returns the raw JSON scalar from Viax when present.
9
+ */
10
+ export declare function updateSubscriptionPaymentMethod(gql: GqlRunner, { biId, tStripePaymentMethodId }: UpdatePaymentMethodArgs): Promise<Record<string, unknown> | null>;
@@ -0,0 +1,31 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { UPDATE_SUBSCRIPTION_PAYMENT_METHOD } from '../../../utils/queries';
11
+ /**
12
+ * Set a new Stripe payment method on the learner's subscription.
13
+ * Returns the raw JSON scalar from Viax when present.
14
+ */
15
+ export function updateSubscriptionPaymentMethod(gql_1, _a) {
16
+ return __awaiter(this, arguments, void 0, function* (gql, { biId, tStripePaymentMethodId }) {
17
+ const data = yield gql(UPDATE_SUBSCRIPTION_PAYMENT_METHOD, {
18
+ biId,
19
+ tStripePaymentMethodId,
20
+ });
21
+ const result = data === null || data === void 0 ? void 0 : data.tUpdateSubscriptionPaymentMethod;
22
+ if (!result) {
23
+ return null;
24
+ }
25
+ if (typeof result === 'object') {
26
+ return result;
27
+ }
28
+ return { result };
29
+ });
30
+ }
31
+ //# sourceMappingURL=updateSubscriptionPaymentMethod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateSubscriptionPaymentMethod.js","sourceRoot":"","sources":["../../../../src/data/services/subscription/updateSubscriptionPaymentMethod.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,kCAAkC,EAAE,MAAM,wBAAwB,CAAC;AAO5E;;;GAGG;AACH,MAAM,UAAgB,+BAA+B;yDACnD,GAAc,EACd,EAAE,IAAI,EAAE,sBAAsB,EAA2B;QAEzD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,kCAAkC,EAAE;YACzD,IAAI;YACJ,sBAAsB;SACvB,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gCAAgC,CAAC;QACtD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,MAAiC,CAAC;QAC3C,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;CAAA","sourcesContent":["import type { GqlRunner } from '../../../types';\nimport { UPDATE_SUBSCRIPTION_PAYMENT_METHOD } from '../../../utils/queries';\n\nexport interface UpdatePaymentMethodArgs {\n biId: string,\n tStripePaymentMethodId: string,\n}\n\n/**\n * Set a new Stripe payment method on the learner's subscription.\n * Returns the raw JSON scalar from Viax when present.\n */\nexport async function updateSubscriptionPaymentMethod(\n gql: GqlRunner,\n { biId, tStripePaymentMethodId }: UpdatePaymentMethodArgs,\n): Promise<Record<string, unknown> | null> {\n const data = await gql(UPDATE_SUBSCRIPTION_PAYMENT_METHOD, {\n biId,\n tStripePaymentMethodId,\n });\n const result = data?.tUpdateSubscriptionPaymentMethod;\n if (!result) {\n return null;\n }\n if (typeof result === 'object') {\n return result as Record<string, unknown>;\n }\n return { result };\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ interface ExternalLinkIconProps extends React.SVGProps<SVGSVGElement> {
3
+ size?: number | string;
4
+ }
5
+ declare const ExternalLinkIcon: React.FC<ExternalLinkIconProps>;
6
+ export default ExternalLinkIcon;
@@ -0,0 +1,18 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import { jsx as _jsx } from "react/jsx-runtime";
13
+ const ExternalLinkIcon = (_a) => {
14
+ var { size = 18, className } = _a, rest = __rest(_a, ["size", "className"]);
15
+ return (_jsx("svg", Object.assign({ className: className, width: size, height: size, viewBox: "0 0 18 18", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", focusable: "false" }, rest, { children: _jsx("path", { d: "M16 16H2V2H9V0H0V18H18V9H16V16ZM11 0V2H14.59L4.76 11.83L6.17 13.24L16 3.41V7H18V0H11Z", fill: "currentColor" }) })));
16
+ };
17
+ export default ExternalLinkIcon;
18
+ //# sourceMappingURL=ExternalLinkIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExternalLinkIcon.js","sourceRoot":"","sources":["../../src/icons/ExternalLinkIcon.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAMA,MAAM,gBAAgB,GAAoC,CAAC,EAI1D,EAAE,EAAE;QAJsD,EACzD,IAAI,GAAG,EAAE,EACT,SAAS,OAEV,EADI,IAAI,cAHkD,qBAI1D,CADQ;IACH,OAAA,CACJ,4BACE,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,KAAK,EAAC,4BAA4B,iBACtB,MAAM,EAClB,SAAS,EAAC,OAAO,IACb,IAAI,cAER,eACE,CAAC,EAAC,uFAAuF,EACzF,IAAI,EAAC,cAAc,GACnB,IACE,CACP,CAAA;CAAA,CAAC;AAEF,eAAe,gBAAgB,CAAC","sourcesContent":["import React from 'react';\n\ninterface ExternalLinkIconProps extends React.SVGProps<SVGSVGElement> {\n size?: number | string,\n}\n\nconst ExternalLinkIcon: React.FC<ExternalLinkIconProps> = ({\n size = 18,\n className,\n ...rest\n}) => (\n <svg\n className={className}\n width={size}\n height={size}\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n focusable=\"false\"\n {...rest}\n >\n <path\n d=\"M16 16H2V2H9V0H0V18H18V9H16V16ZM11 0V2H14.59L4.76 11.83L6.17 13.24L16 3.41V7H18V0H11Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default ExternalLinkIcon;\n"]}
@@ -0,0 +1 @@
1
+ export { default as ExternalLinkIcon } from './ExternalLinkIcon';
@@ -0,0 +1,2 @@
1
+ export { default as ExternalLinkIcon } from './ExternalLinkIcon';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/icons/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC","sourcesContent":["export { default as ExternalLinkIcon } from './ExternalLinkIcon';\n"]}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const CancelSubscriptionPage: React.FC;
3
+ export default CancelSubscriptionPage;
@@ -0,0 +1,53 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ import { Alert, Container, Spinner } from '@openedx/paragon';
12
+ import { useIntl } from '@openedx/frontend-base';
13
+ import { useNavigate } from 'react-router-dom';
14
+ import CancelConfirmation from '../components/CancelConfirmation/CancelConfirmation';
15
+ import messages from '../components/messages';
16
+ import { MANAGE_PAGE_PATH } from '../constants';
17
+ import { useCancelSubscriptionMutation, useIsSubscriberQuery, useSubscriptionEnrollmentsQuery, useViaxClient, useViaxSession, } from '../data/hooks/useManageQueries';
18
+ const CancelSubscriptionPage = () => {
19
+ var _a, _b, _c, _d;
20
+ const { formatMessage } = useIntl();
21
+ const navigate = useNavigate();
22
+ const client = useViaxClient();
23
+ const { sessionReady, isSessionLoading, isSessionError } = useViaxSession(client);
24
+ const subscriberQuery = useIsSubscriberQuery(client, sessionReady);
25
+ const subscriptionBiId = (_b = (_a = subscriberQuery.data) === null || _a === void 0 ? void 0 : _a.subscriptionBiId) !== null && _b !== void 0 ? _b : null;
26
+ const enrollmentsQuery = useSubscriptionEnrollmentsQuery(client, sessionReady, subscriptionBiId);
27
+ const cancelMutation = useCancelSubscriptionMutation(client);
28
+ const isLoading = isSessionLoading || subscriberQuery.isPending;
29
+ const isError = isSessionError || subscriberQuery.isError;
30
+ if (isLoading) {
31
+ return (_jsx("div", { className: "manage-page manage-page--loading d-flex justify-content-center align-items-center", children: _jsx(Spinner, { animation: "border", screenReaderText: formatMessage(messages['manage.loading']) }) }));
32
+ }
33
+ if (isError) {
34
+ return (_jsx("div", { className: "manage-page", children: _jsx(Container, { size: "lg", className: "px-3 px-md-4 py-5", children: _jsx(Alert, { variant: "danger", children: formatMessage(messages['manage.error']) }) }) }));
35
+ }
36
+ const subscriber = (_c = subscriberQuery.data) !== null && _c !== void 0 ? _c : null;
37
+ const enrollments = (_d = enrollmentsQuery.data) !== null && _d !== void 0 ? _d : [];
38
+ const handleConfirmCancel = () => __awaiter(void 0, void 0, void 0, function* () {
39
+ if (!subscriptionBiId) {
40
+ return;
41
+ }
42
+ try {
43
+ yield cancelMutation.mutateAsync(subscriptionBiId);
44
+ navigate(`/${MANAGE_PAGE_PATH}/cancel/success`);
45
+ }
46
+ catch (_a) {
47
+ // Error surfaced via cancelMutation.isError
48
+ }
49
+ });
50
+ return (_jsx("div", { className: "manage-page", children: _jsx(Container, { size: "lg", className: "px-3 px-md-4", children: _jsx(CancelConfirmation, { subscriber: subscriber, enrollments: enrollments, isEnrollmentsLoading: enrollmentsQuery.isPending, isCanceling: cancelMutation.isPending, cancelError: cancelMutation.isError, onConfirmCancel: handleConfirmCancel }) }) }));
51
+ };
52
+ export default CancelSubscriptionPage;
53
+ //# sourceMappingURL=CancelSubscriptionPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CancelSubscriptionPage.js","sourceRoot":"","sources":["../../src/manageSubscriptionPage/CancelSubscriptionPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\nimport { Alert, Container, Spinner } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\nimport { useNavigate } from 'react-router-dom';\n\nimport CancelConfirmation from '../components/CancelConfirmation/CancelConfirmation';\nimport messages from '../components/messages';\nimport { MANAGE_PAGE_PATH } from '../constants';\nimport {\n useCancelSubscriptionMutation,\n useIsSubscriberQuery,\n useSubscriptionEnrollmentsQuery,\n useViaxClient,\n useViaxSession,\n} from '../data/hooks/useManageQueries';\n\nconst CancelSubscriptionPage: React.FC = () => {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const client = useViaxClient();\n const { sessionReady, isSessionLoading, isSessionError } = useViaxSession(client);\n const subscriberQuery = useIsSubscriberQuery(client, sessionReady);\n const subscriptionBiId = subscriberQuery.data?.subscriptionBiId ?? null;\n const enrollmentsQuery = useSubscriptionEnrollmentsQuery(\n client,\n sessionReady,\n subscriptionBiId,\n );\n const cancelMutation = useCancelSubscriptionMutation(client);\n\n const isLoading = isSessionLoading || subscriberQuery.isPending;\n const isError = isSessionError || subscriberQuery.isError;\n\n if (isLoading) {\n return (\n <div className=\"manage-page manage-page--loading d-flex justify-content-center align-items-center\">\n <Spinner\n animation=\"border\"\n screenReaderText={formatMessage(messages['manage.loading'])}\n />\n </div>\n );\n }\n\n if (isError) {\n return (\n <div className=\"manage-page\">\n <Container size=\"lg\" className=\"px-3 px-md-4 py-5\">\n <Alert variant=\"danger\">{formatMessage(messages['manage.error'])}</Alert>\n </Container>\n </div>\n );\n }\n\n const subscriber = subscriberQuery.data ?? null;\n const enrollments = enrollmentsQuery.data ?? [];\n\n const handleConfirmCancel = async () => {\n if (!subscriptionBiId) {\n return;\n }\n\n try {\n await cancelMutation.mutateAsync(subscriptionBiId);\n navigate(`/${MANAGE_PAGE_PATH}/cancel/success`);\n } catch {\n // Error surfaced via cancelMutation.isError\n }\n };\n\n return (\n <div className=\"manage-page\">\n <Container size=\"lg\" className=\"px-3 px-md-4\">\n <CancelConfirmation\n subscriber={subscriber}\n enrollments={enrollments}\n isEnrollmentsLoading={enrollmentsQuery.isPending}\n isCanceling={cancelMutation.isPending}\n cancelError={cancelMutation.isError}\n onConfirmCancel={handleConfirmCancel}\n />\n </Container>\n </div>\n );\n};\n\nexport default CancelSubscriptionPage;\n"]}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const CancelSuccessPage: React.FC;
3
+ export default CancelSuccessPage;
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Alert, Container, Spinner } from '@openedx/paragon';
3
+ import { useIntl } from '@openedx/frontend-base';
4
+ import CancelSuccess from '../components/CancelSuccess/CancelSuccess';
5
+ import messages from '../components/messages';
6
+ import { useIsSubscriberQuery, useViaxClient, useViaxSession, } from '../data/hooks/useManageQueries';
7
+ const CancelSuccessPage = () => {
8
+ var _a;
9
+ const { formatMessage } = useIntl();
10
+ const client = useViaxClient();
11
+ const { sessionReady, isSessionLoading, isSessionError } = useViaxSession(client);
12
+ const subscriberQuery = useIsSubscriberQuery(client, sessionReady);
13
+ const isLoading = isSessionLoading || subscriberQuery.isPending;
14
+ const isError = isSessionError || subscriberQuery.isError;
15
+ if (isLoading) {
16
+ return (_jsx("div", { className: "manage-page manage-page--loading d-flex justify-content-center align-items-center", children: _jsx(Spinner, { animation: "border", screenReaderText: formatMessage(messages['manage.loading']) }) }));
17
+ }
18
+ if (isError) {
19
+ return (_jsx("div", { className: "manage-page", children: _jsx(Container, { size: "lg", className: "px-3 px-md-4 py-5", children: _jsx(Alert, { variant: "danger", children: formatMessage(messages['manage.error']) }) }) }));
20
+ }
21
+ return (_jsx("div", { className: "manage-page", children: _jsx(Container, { size: "lg", className: "px-3 px-md-4", children: _jsx(CancelSuccess, { subscriber: (_a = subscriberQuery.data) !== null && _a !== void 0 ? _a : null }) }) }));
22
+ };
23
+ export default CancelSuccessPage;
24
+ //# sourceMappingURL=CancelSuccessPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CancelSuccessPage.js","sourceRoot":"","sources":["../../src/manageSubscriptionPage/CancelSuccessPage.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,aAAa,MAAM,2CAA2C,CAAC;AACtE,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,cAAc,GACf,MAAM,gCAAgC,CAAC;AAExC,MAAM,iBAAiB,GAAa,GAAG,EAAE;;IACvC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAClF,MAAM,eAAe,GAAG,oBAAoB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAEnE,MAAM,SAAS,GAAG,gBAAgB,IAAI,eAAe,CAAC,SAAS,CAAC;IAChE,MAAM,OAAO,GAAG,cAAc,IAAI,eAAe,CAAC,OAAO,CAAC;IAE1D,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CACL,cAAK,SAAS,EAAC,mFAAmF,YAChG,KAAC,OAAO,IACN,SAAS,EAAC,QAAQ,EAClB,gBAAgB,EAAE,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,GAC3D,GACE,CACP,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,cAAK,SAAS,EAAC,aAAa,YAC1B,KAAC,SAAS,IAAC,IAAI,EAAC,IAAI,EAAC,SAAS,EAAC,mBAAmB,YAChD,KAAC,KAAK,IAAC,OAAO,EAAC,QAAQ,YAAE,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,GAAS,GAC/D,GACR,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,cAAK,SAAS,EAAC,aAAa,YAC1B,KAAC,SAAS,IAAC,IAAI,EAAC,IAAI,EAAC,SAAS,EAAC,cAAc,YAC3C,KAAC,aAAa,IAAC,UAAU,EAAE,MAAA,eAAe,CAAC,IAAI,mCAAI,IAAI,GAAI,GACjD,GACR,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,iBAAiB,CAAC","sourcesContent":["import React from 'react';\nimport { Alert, Container, Spinner } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\n\nimport CancelSuccess from '../components/CancelSuccess/CancelSuccess';\nimport messages from '../components/messages';\nimport {\n useIsSubscriberQuery,\n useViaxClient,\n useViaxSession,\n} from '../data/hooks/useManageQueries';\n\nconst CancelSuccessPage: React.FC = () => {\n const { formatMessage } = useIntl();\n const client = useViaxClient();\n const { sessionReady, isSessionLoading, isSessionError } = useViaxSession(client);\n const subscriberQuery = useIsSubscriberQuery(client, sessionReady);\n\n const isLoading = isSessionLoading || subscriberQuery.isPending;\n const isError = isSessionError || subscriberQuery.isError;\n\n if (isLoading) {\n return (\n <div className=\"manage-page manage-page--loading d-flex justify-content-center align-items-center\">\n <Spinner\n animation=\"border\"\n screenReaderText={formatMessage(messages['manage.loading'])}\n />\n </div>\n );\n }\n\n if (isError) {\n return (\n <div className=\"manage-page\">\n <Container size=\"lg\" className=\"px-3 px-md-4 py-5\">\n <Alert variant=\"danger\">{formatMessage(messages['manage.error'])}</Alert>\n </Container>\n </div>\n );\n }\n\n return (\n <div className=\"manage-page\">\n <Container size=\"lg\" className=\"px-3 px-md-4\">\n <CancelSuccess subscriber={subscriberQuery.data ?? null} />\n </Container>\n </div>\n );\n};\n\nexport default CancelSuccessPage;\n"]}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const ManageSubscriptionPage: React.FC;
3
+ export default ManageSubscriptionPage;
@@ -0,0 +1,87 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { Alert, Container, Spinner, } from '@openedx/paragon';
4
+ import { useIntl } from '@openedx/frontend-base';
5
+ import ActiveSubscription from '../components/ActiveSubscription/ActiveSubscription';
6
+ import BecomeSubscriber from '../components/BecomeSubscriber/BecomeSubscriber';
7
+ import CanceledSubscription, { RenewBanner, } from '../components/CanceledSubscription/CanceledSubscription';
8
+ import HelpFooter from '../components/HelpFooter/HelpFooter';
9
+ import OrderHistoryHeader from '../components/OrderHistoryHeader/OrderHistoryHeader';
10
+ import PaymentHistory from '../components/PaymentHistory/PaymentHistory';
11
+ import RenewSubscriptionModal from '../components/RenewSubscriptionModal/RenewSubscriptionModal';
12
+ import ResubscribeCard from '../components/ResubscribeCard/ResubscribeCard';
13
+ import SubscriptionTabs from '../components/SubscriptionTabs/SubscriptionTabs';
14
+ import messages from '../components/messages';
15
+ import { useBillingPlansQuery, useIsSubscriberQuery, usePaymentHistoryQuery, useReactivateSubscriptionMutation, useViaxClient, useViaxSession, } from '../data/hooks/useManageQueries';
16
+ import { getPlanPrice } from '../utils/billingDetails';
17
+ import { formatDisplayDate } from '../utils/formatDate';
18
+ import { resolvePlanLabel, resolveSubscriptionView, } from '../utils/subscriptionView';
19
+ const ManageSubscriptionPage = () => {
20
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
21
+ const { formatMessage } = useIntl();
22
+ const [activeTab, setActiveTab] = useState('subscription');
23
+ const [isRenewModalOpen, setIsRenewModalOpen] = useState(false);
24
+ const client = useViaxClient();
25
+ const { sessionReady, isSessionLoading, isSessionError } = useViaxSession(client);
26
+ const subscriberQuery = useIsSubscriberQuery(client, sessionReady);
27
+ const billingPlansQuery = useBillingPlansQuery(client, sessionReady);
28
+ const reactivateMutation = useReactivateSubscriptionMutation(client);
29
+ const subscriptionBiId = (_b = (_a = subscriberQuery.data) === null || _a === void 0 ? void 0 : _a.subscriptionBiId) !== null && _b !== void 0 ? _b : null;
30
+ const paymentHistoryQuery = usePaymentHistoryQuery(client, sessionReady && activeTab === 'payment-history', subscriptionBiId);
31
+ const subscriber = (_c = subscriberQuery.data) !== null && _c !== void 0 ? _c : null;
32
+ const planCycle = resolvePlanLabel(subscriber);
33
+ const planPrice = getPlanPrice((_e = (_d = billingPlansQuery.data) === null || _d === void 0 ? void 0 : _d.plans) !== null && _e !== void 0 ? _e : [], planCycle);
34
+ const price = (_f = planPrice === null || planPrice === void 0 ? void 0 : planPrice.amount) !== null && _f !== void 0 ? _f : null;
35
+ const currency = (_g = planPrice === null || planPrice === void 0 ? void 0 : planPrice.currency) !== null && _g !== void 0 ? _g : null;
36
+ const renewalDate = formatDisplayDate((_h = subscriber === null || subscriber === void 0 ? void 0 : subscriber.currentPeriodEnd) !== null && _h !== void 0 ? _h : subscriber === null || subscriber === void 0 ? void 0 : subscriber.subscriptionEndDate);
37
+ const handleOpenRenewModal = () => {
38
+ if (!subscriptionBiId) {
39
+ return;
40
+ }
41
+ reactivateMutation.reset();
42
+ setIsRenewModalOpen(true);
43
+ };
44
+ const handleConfirmRenew = () => {
45
+ if (!subscriptionBiId || reactivateMutation.isPending) {
46
+ return;
47
+ }
48
+ reactivateMutation.mutate(subscriptionBiId);
49
+ };
50
+ useEffect(() => {
51
+ if (reactivateMutation.isSuccess) {
52
+ setIsRenewModalOpen(false);
53
+ }
54
+ }, [reactivateMutation.isSuccess]);
55
+ const isLoading = isSessionLoading || (sessionReady && subscriberQuery.isPending);
56
+ const isError = isSessionError || subscriberQuery.isError;
57
+ if (isLoading) {
58
+ return (_jsx("div", { className: "manage-page manage-page--loading d-flex justify-content-center align-items-center", children: _jsx(Spinner, { animation: "border", screenReaderText: formatMessage(messages['manage.loading']) }) }));
59
+ }
60
+ if (isError) {
61
+ return (_jsx("div", { className: "manage-page", children: _jsx(Container, { size: "lg", className: "manage-page__inner px-3 px-md-4 py-5", children: _jsx(Alert, { variant: "danger", children: formatMessage(messages['manage.error']) }) }) }));
62
+ }
63
+ const resolvedView = resolveSubscriptionView(subscriber);
64
+ const showRenewBanner = resolvedView === 'canceled_access';
65
+ const renewProps = {
66
+ onRenew: handleOpenRenewModal,
67
+ };
68
+ let subscriptionPanel;
69
+ switch (resolvedView) {
70
+ case 'active':
71
+ subscriptionPanel = _jsx(ActiveSubscription, { subscriber: subscriber });
72
+ break;
73
+ case 'canceled_access':
74
+ subscriptionPanel = (_jsx(CanceledSubscription, Object.assign({ subscriber: subscriber }, renewProps)));
75
+ break;
76
+ case 'canceled_expired':
77
+ subscriptionPanel = (_jsx(ResubscribeCard, { subscriber: subscriber, price: price, currency: currency }));
78
+ break;
79
+ case 'none':
80
+ default:
81
+ subscriptionPanel = (_jsx(BecomeSubscriber, { price: price, currency: currency }));
82
+ break;
83
+ }
84
+ return (_jsxs("div", { className: "manage-page", children: [showRenewBanner && (_jsx("div", { className: "manage-renew-banner py-5 mb-2", children: _jsx(Container, { size: "lg", className: "px-3 px-md-4", children: _jsx("div", { className: "manage-renew-banner__inner d-flex flex-column align-items-start", children: _jsx(RenewBanner, Object.assign({ expireDate: renewalDate }, renewProps)) }) }) })), _jsxs(Container, { size: "lg", className: "manage-page__inner px-3 px-md-4 py-5", children: [_jsx(OrderHistoryHeader, {}), _jsx(SubscriptionTabs, { activeTab: activeTab, onChange: setActiveTab }), activeTab === 'subscription' ? (_jsxs("div", { role: "tabpanel", id: "manage-tabpanel-subscription", "aria-labelledby": "manage-tab-subscription", children: [subscriptionPanel, _jsx(HelpFooter, {})] })) : (_jsxs("div", { role: "tabpanel", id: "manage-tabpanel-payment-history", "aria-labelledby": "manage-tab-payment-history", children: [_jsx(PaymentHistory, { subscriber: subscriber, invoices: (_j = paymentHistoryQuery.data) !== null && _j !== void 0 ? _j : [], isLoading: paymentHistoryQuery.isPending, isError: paymentHistoryQuery.isError }), _jsx(HelpFooter, {})] }))] }), _jsx(RenewSubscriptionModal, { isOpen: isRenewModalOpen, onClose: () => setIsRenewModalOpen(false), onConfirm: handleConfirmRenew, isConfirming: reactivateMutation.isPending, confirmError: reactivateMutation.isError, subscriptionBiId: subscriptionBiId, renewalDate: renewalDate, price: price, currency: currency, cycle: planCycle })] }));
85
+ };
86
+ export default ManageSubscriptionPage;
87
+ //# sourceMappingURL=ManageSubscriptionPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ManageSubscriptionPage.js","sourceRoot":"","sources":["../../src/manageSubscriptionPage/ManageSubscriptionPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useState } from 'react';\nimport {\n Alert,\n Container,\n Spinner,\n} from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\n\nimport ActiveSubscription from '../components/ActiveSubscription/ActiveSubscription';\nimport BecomeSubscriber from '../components/BecomeSubscriber/BecomeSubscriber';\nimport CanceledSubscription, {\n RenewBanner,\n} from '../components/CanceledSubscription/CanceledSubscription';\nimport HelpFooter from '../components/HelpFooter/HelpFooter';\nimport OrderHistoryHeader from '../components/OrderHistoryHeader/OrderHistoryHeader';\nimport PaymentHistory from '../components/PaymentHistory/PaymentHistory';\nimport RenewSubscriptionModal from '../components/RenewSubscriptionModal/RenewSubscriptionModal';\nimport ResubscribeCard from '../components/ResubscribeCard/ResubscribeCard';\nimport SubscriptionTabs from '../components/SubscriptionTabs/SubscriptionTabs';\nimport messages from '../components/messages';\nimport {\n useBillingPlansQuery,\n useIsSubscriberQuery,\n usePaymentHistoryQuery,\n useReactivateSubscriptionMutation,\n useViaxClient,\n useViaxSession,\n} from '../data/hooks/useManageQueries';\nimport type { ManageTab } from '../types';\nimport { getPlanPrice } from '../utils/billingDetails';\nimport { formatDisplayDate } from '../utils/formatDate';\nimport {\n resolvePlanLabel,\n resolveSubscriptionView,\n} from '../utils/subscriptionView';\n\nconst ManageSubscriptionPage: React.FC = () => {\n const { formatMessage } = useIntl();\n const [activeTab, setActiveTab] = useState<ManageTab>('subscription');\n const [isRenewModalOpen, setIsRenewModalOpen] = useState(false);\n const client = useViaxClient();\n const { sessionReady, isSessionLoading, isSessionError } = useViaxSession(client);\n const subscriberQuery = useIsSubscriberQuery(client, sessionReady);\n const billingPlansQuery = useBillingPlansQuery(client, sessionReady);\n const reactivateMutation = useReactivateSubscriptionMutation(client);\n const subscriptionBiId = subscriberQuery.data?.subscriptionBiId ?? null;\n const paymentHistoryQuery = usePaymentHistoryQuery(\n client,\n sessionReady && activeTab === 'payment-history',\n subscriptionBiId,\n );\n\n const subscriber = subscriberQuery.data ?? null;\n const planCycle = resolvePlanLabel(subscriber);\n const planPrice = getPlanPrice(\n billingPlansQuery.data?.plans ?? [],\n planCycle,\n );\n const price = planPrice?.amount ?? null;\n const currency = planPrice?.currency ?? null;\n const renewalDate = formatDisplayDate(\n subscriber?.currentPeriodEnd ?? subscriber?.subscriptionEndDate,\n );\n\n const handleOpenRenewModal = () => {\n if (!subscriptionBiId) {\n return;\n }\n reactivateMutation.reset();\n setIsRenewModalOpen(true);\n };\n\n const handleConfirmRenew = () => {\n if (!subscriptionBiId || reactivateMutation.isPending) {\n return;\n }\n reactivateMutation.mutate(subscriptionBiId);\n };\n\n useEffect(() => {\n if (reactivateMutation.isSuccess) {\n setIsRenewModalOpen(false);\n }\n }, [reactivateMutation.isSuccess]);\n\n const isLoading = isSessionLoading || (sessionReady && subscriberQuery.isPending);\n const isError = isSessionError || subscriberQuery.isError;\n\n if (isLoading) {\n return (\n <div className=\"manage-page manage-page--loading d-flex justify-content-center align-items-center\">\n <Spinner\n animation=\"border\"\n screenReaderText={formatMessage(messages['manage.loading'])}\n />\n </div>\n );\n }\n\n if (isError) {\n return (\n <div className=\"manage-page\">\n <Container size=\"lg\" className=\"manage-page__inner px-3 px-md-4 py-5\">\n <Alert variant=\"danger\">{formatMessage(messages['manage.error'])}</Alert>\n </Container>\n </div>\n );\n }\n\n const resolvedView = resolveSubscriptionView(subscriber);\n const showRenewBanner = resolvedView === 'canceled_access';\n const renewProps = {\n onRenew: handleOpenRenewModal,\n };\n\n let subscriptionPanel: React.ReactNode;\n switch (resolvedView) {\n case 'active':\n subscriptionPanel = <ActiveSubscription subscriber={subscriber} />;\n break;\n case 'canceled_access':\n subscriptionPanel = (\n <CanceledSubscription subscriber={subscriber} {...renewProps} />\n );\n break;\n case 'canceled_expired':\n subscriptionPanel = (\n <ResubscribeCard\n subscriber={subscriber}\n price={price}\n currency={currency}\n />\n );\n break;\n case 'none':\n default:\n subscriptionPanel = (\n <BecomeSubscriber price={price} currency={currency} />\n );\n break;\n }\n\n return (\n <div className=\"manage-page\">\n {showRenewBanner && (\n <div className=\"manage-renew-banner py-5 mb-2\">\n <Container size=\"lg\" className=\"px-3 px-md-4\">\n <div className=\"manage-renew-banner__inner d-flex flex-column align-items-start\">\n <RenewBanner\n expireDate={renewalDate}\n {...renewProps}\n />\n </div>\n </Container>\n </div>\n )}\n\n <Container size=\"lg\" className=\"manage-page__inner px-3 px-md-4 py-5\">\n <OrderHistoryHeader />\n <SubscriptionTabs activeTab={activeTab} onChange={setActiveTab} />\n\n {activeTab === 'subscription' ? (\n <div\n role=\"tabpanel\"\n id=\"manage-tabpanel-subscription\"\n aria-labelledby=\"manage-tab-subscription\"\n >\n {subscriptionPanel}\n <HelpFooter />\n </div>\n ) : (\n <div\n role=\"tabpanel\"\n id=\"manage-tabpanel-payment-history\"\n aria-labelledby=\"manage-tab-payment-history\"\n >\n <PaymentHistory\n subscriber={subscriber}\n invoices={paymentHistoryQuery.data ?? []}\n isLoading={paymentHistoryQuery.isPending}\n isError={paymentHistoryQuery.isError}\n />\n <HelpFooter />\n </div>\n )}\n </Container>\n\n <RenewSubscriptionModal\n isOpen={isRenewModalOpen}\n onClose={() => setIsRenewModalOpen(false)}\n onConfirm={handleConfirmRenew}\n isConfirming={reactivateMutation.isPending}\n confirmError={reactivateMutation.isError}\n subscriptionBiId={subscriptionBiId}\n renewalDate={renewalDate}\n price={price}\n currency={currency}\n cycle={planCycle}\n />\n </div>\n );\n};\n\nexport default ManageSubscriptionPage;\n"]}
package/dist/messages.js CHANGED
@@ -2,8 +2,8 @@ import { defineMessages } from '@openedx/frontend-base';
2
2
  const messages = defineMessages({
3
3
  'template.page.title': {
4
4
  id: 'template.page.title',
5
- defaultMessage: 'Template | {siteName}',
6
- description: 'Document title for the template app',
5
+ defaultMessage: 'Order History | {siteName}',
6
+ description: 'Document title for the subscription manage app',
7
7
  },
8
8
  });
9
9
  export default messages;
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,qBAAqB,EAAE;QACrB,EAAE,EAAE,qBAAqB;QACzB,cAAc,EAAE,uBAAuB;QACvC,WAAW,EAAE,qCAAqC;KACnD;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n 'template.page.title': {\n id: 'template.page.title',\n defaultMessage: 'Template | {siteName}',\n description: 'Document title for the template app',\n },\n});\n\nexport default messages;\n"]}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,qBAAqB,EAAE;QACrB,EAAE,EAAE,qBAAqB;QACzB,cAAc,EAAE,4BAA4B;QAC5C,WAAW,EAAE,gDAAgD;KAC9D;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n 'template.page.title': {\n id: 'template.page.title',\n defaultMessage: 'Order History | {siteName}',\n description: 'Document title for the subscription manage app',\n },\n});\n\nexport default messages;\n"]}
package/dist/routes.d.ts CHANGED
@@ -8,11 +8,18 @@ declare const routes: {
8
8
  lazy(): Promise<{
9
9
  Component: () => import("react/jsx-runtime").JSX.Element;
10
10
  }>;
11
- children: {
11
+ children: ({
12
12
  index: boolean;
13
13
  lazy(): Promise<{
14
14
  Component: import("react").FC<{}>;
15
15
  }>;
16
- }[];
16
+ path?: undefined;
17
+ } | {
18
+ path: string;
19
+ lazy(): Promise<{
20
+ Component: import("react").FC<{}>;
21
+ }>;
22
+ index?: undefined;
23
+ })[];
17
24
  }[];
18
25
  export default routes;
package/dist/routes.js CHANGED
@@ -15,8 +15,8 @@ import { subscriptionManageRole } from './constants';
15
15
  const subscriptionAccessLoader = () => __awaiter(void 0, void 0, void 0, function* () {
16
16
  try {
17
17
  const { data } = yield getAuthenticatedHttpClient().get(getSubsInitApiUrl());
18
- if (data.userSubscription && data.userSubscription.isSubscriber) {
19
- throw redirect('/subscription-learner-dashboard'); // redirect to subscription learner dashboard if user have subscription access
18
+ if (!(data === null || data === void 0 ? void 0 : data.userSubscription) || !data.userSubscription.isSubscriber) {
19
+ throw redirect('/learner-dashboard'); // redirect to learner dashboard if user does not have subscription access
20
20
  }
21
21
  return null;
22
22
  }
@@ -36,8 +36,8 @@ const protectedLoader = (args) => __awaiter(void 0, void 0, void 0, function* ()
36
36
  });
37
37
  const routes = [
38
38
  {
39
- id: 'org.openedx.frontend.route.template.main',
40
- path: 'checkout-page',
39
+ id: 'org.openedx.frontend.route.subscription.manage.main',
40
+ path: 'manage-subscription',
41
41
  loader: protectedLoader,
42
42
  handle: {
43
43
  roles: [subscriptionManageRole],
@@ -45,7 +45,7 @@ const routes = [
45
45
  lazy() {
46
46
  return __awaiter(this, void 0, void 0, function* () {
47
47
  const module = yield import(
48
- /* webpackChunkName: "template-main" */ './Main');
48
+ /* webpackChunkName: "subscription-manage-main" */ './Main');
49
49
  return { Component: module.default };
50
50
  });
51
51
  },
@@ -55,7 +55,27 @@ const routes = [
55
55
  lazy() {
56
56
  return __awaiter(this, void 0, void 0, function* () {
57
57
  const module = yield import(
58
- /* webpackChunkName: "CheckoutPage" */ './checkoutPage/CheckoutPage');
58
+ /* webpackChunkName: "ManageSubscriptionPage" */ './manageSubscriptionPage/ManageSubscriptionPage');
59
+ return { Component: module.default };
60
+ });
61
+ },
62
+ },
63
+ {
64
+ path: 'cancel',
65
+ lazy() {
66
+ return __awaiter(this, void 0, void 0, function* () {
67
+ const module = yield import(
68
+ /* webpackChunkName: "CancelSubscriptionPage" */ './manageSubscriptionPage/CancelSubscriptionPage');
69
+ return { Component: module.default };
70
+ });
71
+ },
72
+ },
73
+ {
74
+ path: 'cancel/success',
75
+ lazy() {
76
+ return __awaiter(this, void 0, void 0, function* () {
77
+ const module = yield import(
78
+ /* webpackChunkName: "CancelSuccessPage" */ './manageSubscriptionPage/CancelSuccessPage');
59
79
  return { Component: module.default };
60
80
  });
61
81
  },
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.tsx"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EACL,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,sDAAsD;AACtD,MAAM,wBAAwB,GAAG,GAAS,EAAE;IAC1C,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GACV,MAAM,0BAA0B,EAAE,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAEhE,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC;YAChE,MAAM,QAAQ,CAAC,iCAAiC,CAAC,CAAC,CAAC,8EAA8E;QACnI,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,mCAAmC;QACnC,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC,mDAAmD;IAC3F,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,yEAAyE;AACzE,MAAM,eAAe,GAAG,CAAO,IAAI,EAAE,EAAE;IACrC,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,wBAAwB,EAAE,CAAC;IAEjC,OAAO,IAAI,CAAC;AACd,CAAC,CAAA,CAAC;AAEF,MAAM,MAAM,GAAG;IACb;QACE,EAAE,EAAE,0CAA0C;QAC9C,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE;YACN,KAAK,EAAE,CAAC,sBAAsB,CAAC;SAChC;QACK,IAAI;;gBACR,MAAM,MAAM,GAAG,MAAM,MAAM;gBACzB,uCAAuC,CAAC,QAAQ,CACjD,CAAC;gBACF,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YACvC,CAAC;SAAA;QACD,QAAQ,EAAE;YACR;gBACE,KAAK,EAAE,IAAI;gBACL,IAAI;;wBACR,MAAM,MAAM,GAAG,MAAM,MAAM;wBACzB,sCAAsC,CAAC,6BAA6B,CACrE,CAAC;wBACF,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;oBACvC,CAAC;iBAAA;aACF;SACF;KACF;CACF,CAAC;AAEF,eAAe,MAAM,CAAC","sourcesContent":["import {\n authenticatedLoader,\n getAuthenticatedHttpClient,\n} from '@openedx/frontend-base';\nimport { redirect } from 'react-router-dom';\n\nimport { getSubsInitApiUrl } from './data/services/subs/urls';\nimport { subscriptionManageRole } from './constants';\n\n// loader to check if the user has subscription access\nconst subscriptionAccessLoader = async () => {\n try {\n const { data }\n = await getAuthenticatedHttpClient().get(getSubsInitApiUrl());\n\n if (data.userSubscription && data.userSubscription.isSubscriber) {\n throw redirect('/subscription-learner-dashboard'); // redirect to subscription learner dashboard if user have subscription access\n }\n\n return null;\n } catch (error) {\n // Let redirect responses bubble up\n if (error instanceof Response) {\n throw error;\n }\n\n throw redirect('/learner-dashboard'); // redirect to learner dashboard if an error occurs\n }\n};\n\n// composed loader that checks for authentication and subscription access\nconst protectedLoader = async (args) => {\n await authenticatedLoader(args);\n await subscriptionAccessLoader();\n\n return null;\n};\n\nconst routes = [\n {\n id: 'org.openedx.frontend.route.template.main',\n path: 'checkout-page',\n loader: protectedLoader,\n handle: {\n roles: [subscriptionManageRole],\n },\n async lazy() {\n const module = await import(\n /* webpackChunkName: \"template-main\" */ './Main'\n );\n return { Component: module.default };\n },\n children: [\n {\n index: true,\n async lazy() {\n const module = await import(\n /* webpackChunkName: \"CheckoutPage\" */ './checkoutPage/CheckoutPage'\n );\n return { Component: module.default };\n },\n },\n ],\n },\n];\n\nexport default routes;\n"]}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.tsx"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EACL,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,sDAAsD;AACtD,MAAM,wBAAwB,GAAG,GAAS,EAAE;IAC1C,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GACV,MAAM,0BAA0B,EAAE,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAEhE,IAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB,CAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC;YACnE,MAAM,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC,0EAA0E;QAClH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,mCAAmC;QACnC,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC,mDAAmD;IAC3F,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,yEAAyE;AACzE,MAAM,eAAe,GAAG,CAAO,IAAI,EAAE,EAAE;IACrC,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,wBAAwB,EAAE,CAAC;IAEjC,OAAO,IAAI,CAAC;AACd,CAAC,CAAA,CAAC;AAEF,MAAM,MAAM,GAAG;IACb;QACE,EAAE,EAAE,qDAAqD;QACzD,IAAI,EAAE,qBAAqB;QAC3B,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE;YACN,KAAK,EAAE,CAAC,sBAAsB,CAAC;SAChC;QACK,IAAI;;gBACR,MAAM,MAAM,GAAG,MAAM,MAAM;gBACzB,kDAAkD,CAAC,QAAQ,CAC5D,CAAC;gBACF,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YACvC,CAAC;SAAA;QACD,QAAQ,EAAE;YACR;gBACE,KAAK,EAAE,IAAI;gBACL,IAAI;;wBACR,MAAM,MAAM,GAAG,MAAM,MAAM;wBACzB,gDAAgD,CAAC,iDAAiD,CACnG,CAAC;wBACF,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;oBACvC,CAAC;iBAAA;aACF;YACD;gBACE,IAAI,EAAE,QAAQ;gBACR,IAAI;;wBACR,MAAM,MAAM,GAAG,MAAM,MAAM;wBACzB,gDAAgD,CAAC,iDAAiD,CACnG,CAAC;wBACF,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;oBACvC,CAAC;iBAAA;aACF;YACD;gBACE,IAAI,EAAE,gBAAgB;gBAChB,IAAI;;wBACR,MAAM,MAAM,GAAG,MAAM,MAAM;wBACzB,2CAA2C,CAAC,4CAA4C,CACzF,CAAC;wBACF,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;oBACvC,CAAC;iBAAA;aACF;SACF;KACF;CACF,CAAC;AAEF,eAAe,MAAM,CAAC","sourcesContent":["import {\n authenticatedLoader,\n getAuthenticatedHttpClient,\n} from '@openedx/frontend-base';\nimport { redirect } from 'react-router-dom';\n\nimport { getSubsInitApiUrl } from './data/services/subs/urls';\nimport { subscriptionManageRole } from './constants';\n\n// loader to check if the user has subscription access\nconst subscriptionAccessLoader = async () => {\n try {\n const { data }\n = await getAuthenticatedHttpClient().get(getSubsInitApiUrl());\n\n if (!data?.userSubscription || !data.userSubscription.isSubscriber) {\n throw redirect('/learner-dashboard'); // redirect to learner dashboard if user does not have subscription access\n }\n\n return null;\n } catch (error) {\n // Let redirect responses bubble up\n if (error instanceof Response) {\n throw error;\n }\n\n throw redirect('/learner-dashboard'); // redirect to learner dashboard if an error occurs\n }\n};\n\n// composed loader that checks for authentication and subscription access\nconst protectedLoader = async (args) => {\n await authenticatedLoader(args);\n await subscriptionAccessLoader();\n\n return null;\n};\n\nconst routes = [\n {\n id: 'org.openedx.frontend.route.subscription.manage.main',\n path: 'manage-subscription',\n loader: protectedLoader,\n handle: {\n roles: [subscriptionManageRole],\n },\n async lazy() {\n const module = await import(\n /* webpackChunkName: \"subscription-manage-main\" */ './Main'\n );\n return { Component: module.default };\n },\n children: [\n {\n index: true,\n async lazy() {\n const module = await import(\n /* webpackChunkName: \"ManageSubscriptionPage\" */ './manageSubscriptionPage/ManageSubscriptionPage'\n );\n return { Component: module.default };\n },\n },\n {\n path: 'cancel',\n async lazy() {\n const module = await import(\n /* webpackChunkName: \"CancelSubscriptionPage\" */ './manageSubscriptionPage/CancelSubscriptionPage'\n );\n return { Component: module.default };\n },\n },\n {\n path: 'cancel/success',\n async lazy() {\n const module = await import(\n /* webpackChunkName: \"CancelSuccessPage\" */ './manageSubscriptionPage/CancelSuccessPage'\n );\n return { Component: module.default };\n },\n },\n ],\n },\n];\n\nexport default routes;\n"]}
package/dist/style.scss CHANGED
@@ -1,14 +1 @@
1
- @use "@openedx/paragon/styles/css/core/custom-media-breakpoints.css";
2
-
3
-
4
- //components
5
- @use "./styles/components/checkout.scss";
6
- @use "./styles/components/enrollmentSummary.scss";
7
- @use "./styles/components/paymentForm.scss";
8
- @use "./styles/components/checkoutStepper.scss";
9
- @use "./styles/components/paymentFields.scss";
10
- @use "./styles/components/brandMarks.scss";
11
- @use "./styles/components/statusScreens.scss";
12
- @use "./styles/components/edxUnlimitedBanner.scss";
13
- @use "./styles/components/cartSummary.scss";
14
- @use "./styles/components/courseEnrollmentCard.scss";
1
+ @use "./styles/components/manageSubscription.scss";