@edx/frontend-app-subscription-manage 1.18.1 → 1.19.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 (107) hide show
  1. package/dist/Main.js +8 -2
  2. package/dist/Main.js.map +1 -1
  3. package/dist/components/ActiveSubscription/ActiveSubscription.js +5 -5
  4. package/dist/components/ActiveSubscription/ActiveSubscription.js.map +1 -1
  5. package/dist/components/BecomeSubscriber/BecomeSubscriber.js +3 -3
  6. package/dist/components/BecomeSubscriber/BecomeSubscriber.js.map +1 -1
  7. package/dist/components/CancelConfirmation/CancelConfirmation.js +6 -6
  8. package/dist/components/CancelConfirmation/CancelConfirmation.js.map +1 -1
  9. package/dist/components/CancelSuccess/CancelSuccess.js +3 -3
  10. package/dist/components/CancelSuccess/CancelSuccess.js.map +1 -1
  11. package/dist/components/CanceledSubscription/CanceledSubscription.js +8 -9
  12. package/dist/components/CanceledSubscription/CanceledSubscription.js.map +1 -1
  13. package/dist/components/EnrolledCoursesList/EnrolledCoursesList.js +2 -2
  14. package/dist/components/EnrolledCoursesList/EnrolledCoursesList.js.map +1 -1
  15. package/dist/components/HelpFooter/HelpFooter.js +1 -1
  16. package/dist/components/HelpFooter/HelpFooter.js.map +1 -1
  17. package/dist/components/OrderHistory/OrderHistoryCard.d.ts +11 -0
  18. package/dist/components/OrderHistory/OrderHistoryCard.js +6 -0
  19. package/dist/components/OrderHistory/OrderHistoryCard.js.map +1 -0
  20. package/dist/components/OrderHistory/OrderHistoryDetails.d.ts +2 -0
  21. package/dist/components/OrderHistory/OrderHistoryDetails.js +120 -0
  22. package/dist/components/OrderHistory/OrderHistoryDetails.js.map +1 -0
  23. package/dist/components/OrderHistory/OrderList.d.ts +3 -0
  24. package/dist/components/OrderHistory/OrderList.js +13 -0
  25. package/dist/components/OrderHistory/OrderList.js.map +1 -0
  26. package/dist/components/OrderHistory/OrderPurchases.d.ts +4 -0
  27. package/dist/components/OrderHistory/OrderPurchases.js +44 -0
  28. package/dist/components/OrderHistory/OrderPurchases.js.map +1 -0
  29. package/dist/components/OrderHistory/ProgramItemsTable.d.ts +7 -0
  30. package/dist/components/OrderHistory/ProgramItemsTable.js +49 -0
  31. package/dist/components/OrderHistory/ProgramItemsTable.js.map +1 -0
  32. package/dist/components/OrderHistory/data/receiptRows.d.ts +17 -0
  33. package/dist/components/OrderHistory/data/receiptRows.js +16 -0
  34. package/dist/components/OrderHistory/data/receiptRows.js.map +1 -0
  35. package/dist/components/OrderHistory/messages.d.ts +118 -0
  36. package/dist/components/OrderHistory/messages.js +120 -0
  37. package/dist/components/OrderHistory/messages.js.map +1 -0
  38. package/dist/components/OrderHistoryHeader/OrderHistoryHeader.js +1 -1
  39. package/dist/components/OrderHistoryHeader/OrderHistoryHeader.js.map +1 -1
  40. package/dist/components/PaymentHistory/PaymentHistory.js +5 -5
  41. package/dist/components/PaymentHistory/PaymentHistory.js.map +1 -1
  42. package/dist/components/RefundNotice/RefundNotice.d.ts +3 -0
  43. package/dist/components/RefundNotice/RefundNotice.js +15 -0
  44. package/dist/components/RefundNotice/RefundNotice.js.map +1 -0
  45. package/dist/components/RefundNotice/messages.d.ts +18 -0
  46. package/dist/components/RefundNotice/messages.js +20 -0
  47. package/dist/components/RefundNotice/messages.js.map +1 -0
  48. package/dist/components/RenewSubscriptionModal/RenewSubscriptionModal.js +12 -12
  49. package/dist/components/RenewSubscriptionModal/RenewSubscriptionModal.js.map +1 -1
  50. package/dist/components/ResubscribeCard/ResubscribeCard.js +5 -5
  51. package/dist/components/ResubscribeCard/ResubscribeCard.js.map +1 -1
  52. package/dist/components/UpdatePaymentMethodModal/UpdatePaymentMethodModal.js +12 -12
  53. package/dist/components/UpdatePaymentMethodModal/UpdatePaymentMethodModal.js.map +1 -1
  54. package/dist/components/messages.d.ts +89 -99
  55. package/dist/components/messages.js +180 -190
  56. package/dist/components/messages.js.map +1 -1
  57. package/dist/constants.d.ts +7 -1
  58. package/dist/constants.js +7 -1
  59. package/dist/constants.js.map +1 -1
  60. package/dist/data/hooks/keys.d.ts +5 -0
  61. package/dist/data/hooks/keys.js +5 -0
  62. package/dist/data/hooks/keys.js.map +1 -1
  63. package/dist/data/hooks/useOrderHistoryQueries.d.ts +11 -0
  64. package/dist/data/hooks/useOrderHistoryQueries.js +30 -0
  65. package/dist/data/hooks/useOrderHistoryQueries.js.map +1 -0
  66. package/dist/data/services/orderHistory/orderHistory.d.ts +7 -0
  67. package/dist/data/services/orderHistory/orderHistory.js +40 -0
  68. package/dist/data/services/orderHistory/orderHistory.js.map +1 -0
  69. package/dist/data/services/segment/AnalyticsPageWrap.d.ts +9 -0
  70. package/dist/data/services/segment/AnalyticsPageWrap.js +14 -0
  71. package/dist/data/services/segment/AnalyticsPageWrap.js.map +1 -0
  72. package/dist/data/services/segment/index.js +4 -1
  73. package/dist/data/services/segment/index.js.map +1 -1
  74. package/dist/{manageSubscriptionPage → orderHistory}/CancelSubscriptionPage.js +4 -4
  75. package/dist/orderHistory/CancelSubscriptionPage.js.map +1 -0
  76. package/dist/{manageSubscriptionPage → orderHistory}/CancelSuccessPage.js +2 -2
  77. package/dist/orderHistory/CancelSuccessPage.js.map +1 -0
  78. package/dist/orderHistory/OrderHistoryPage.d.ts +3 -0
  79. package/dist/orderHistory/OrderHistoryPage.js +127 -0
  80. package/dist/orderHistory/OrderHistoryPage.js.map +1 -0
  81. package/dist/routes.d.ts +23 -2
  82. package/dist/routes.js +44 -19
  83. package/dist/routes.js.map +1 -1
  84. package/dist/style.scss +1 -1
  85. package/dist/styles/components/{manageSubscription.scss → orderHistory.scss} +60 -24
  86. package/dist/tracking/trackingContext.d.ts +1 -1
  87. package/dist/tracking/trackingContext.js +1 -1
  88. package/dist/tracking/trackingContext.js.map +1 -1
  89. package/dist/types.d.ts +55 -0
  90. package/dist/types.js.map +1 -1
  91. package/dist/utils/currency.d.ts +6 -0
  92. package/dist/utils/currency.js +6 -0
  93. package/dist/utils/currency.js.map +1 -0
  94. package/dist/utils/queries.d.ts +6 -0
  95. package/dist/utils/queries.js +12 -0
  96. package/dist/utils/queries.js.map +1 -1
  97. package/package.json +1 -1
  98. package/dist/components/SubscriptionTabs/SubscriptionTabs.d.ts +0 -8
  99. package/dist/components/SubscriptionTabs/SubscriptionTabs.js +0 -15
  100. package/dist/components/SubscriptionTabs/SubscriptionTabs.js.map +0 -1
  101. package/dist/manageSubscriptionPage/CancelSubscriptionPage.js.map +0 -1
  102. package/dist/manageSubscriptionPage/CancelSuccessPage.js.map +0 -1
  103. package/dist/manageSubscriptionPage/ManageSubscriptionPage.d.ts +0 -3
  104. package/dist/manageSubscriptionPage/ManageSubscriptionPage.js +0 -88
  105. package/dist/manageSubscriptionPage/ManageSubscriptionPage.js.map +0 -1
  106. /package/dist/{manageSubscriptionPage → orderHistory}/CancelSubscriptionPage.d.ts +0 -0
  107. /package/dist/{manageSubscriptionPage → orderHistory}/CancelSuccessPage.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/utils/queries.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG;;EAE5C,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG;;;;;;;;;;;;;;;;;;;;;;;EAuB1C,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;EAmBjC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;EAEjC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;;EAErC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG;;;;;;;;;;;;;;;;;;;EAmB7C,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;EAe/B,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG;;;;;;;;EAQ1C,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG;;;;;;;;EAQhD,CAAC","sourcesContent":["/**\n * GraphQL documents for the manage-subscription MFE.\n */\n\n/**\n * tIsCurrentUserSubscriber is a JSON scalar — returns the full object;\n * no subfield selection is allowed.\n */\nexport const GET_IS_CURRENT_USER_SUBSCRIBER = `query IsCurrentUserSubscriber {\n tIsCurrentUserSubscriber\n}`;\n\n/**\n * Enrollments for cancel confirmation.\n * Build `_filter` client-side, e.g. tSubscriptionBiId IN ('BI…', 'BI…').\n */\nexport const GET_SUBSCRIPTION_ENROLLMENTS = `query EnrollmentsForSubscriptions($filter: String!) {\n filterTwouEnrollment(_first: 200, _filter: $filter) {\n edges {\n node {\n biId\n tSubscriptionBiId\n bpStatus { code }\n tCourseRunKey\n tCertificateId\n tCertificateUrl\n tCourse {\n maId\n maName\n imageUrl\n tBrandText\n tSchools {\n tName\n tSortValue\n }\n }\n }\n }\n }\n}`;\n\n/**\n * Invoices for the learner's subscriptions (payment history) — Stripe and PayPal.\n * Filter is inlined client-side, one clause per subscription:\n * biRelatesTo.biId = '<biId>' OR biRelatesTo.biId = '<biId>'.\n */\nexport const GET_PAYMENT_HISTORY = `query PaymentHistory($filter: String!, $first: Int!) {\n filterTwouInvoice(_first: $first, _filter: $filter) {\n edges {\n node {\n biId\n tStripeInvoiceId\n tPaypalInvoiceId\n bpStatus { code name }\n billDate\n billBillingPeriod { start end }\n billFinancialCharges {\n fichAmount {\n amount\n units { code }\n }\n }\n }\n }\n }\n}`;\n\n/**\n * Cancel the learner's subscription (default: at period end).\n * Pass `immediate: true` to end access immediately.\n */\nexport const CANCEL_SUBSCRIPTION = `mutation CancelSubscription($biId: String!, $immediate: Boolean) {\n tCancelSubscription(biId: $biId, immediate: $immediate)\n}`;\n\n/**\n * Resume a cancelled subscription before the period end / cancellation date.\n */\nexport const REACTIVATE_SUBSCRIPTION = `mutation ReactivateSubscription($biId: String!) {\n tReactivateSubscription(biId: $biId)\n}`;\n\n/**\n * Payment method on an existing subscription (for renew / manage display).\n */\nexport const GET_SUBSCRIPTION_PAYMENT_METHOD = `query SubscriptionPaymentMethod($filter: String!) {\n filterTwouSubscription(_first: 1, _filter: $filter) {\n edges {\n node {\n biId\n hiConsistsOf {\n ... on TwouSubscriptionItem {\n paybPayment {\n ... on TwouStripePayment {\n tStripePaymentMethodId\n tPaymentMethodLast4\n tPaymentMethodBrand\n }\n }\n }\n }\n }\n }\n }\n}`;\n\n/**\n * Available customer billing plans (monthly / annual template prices).\n * Same query as frontend-app-subscription-checkout.\n */\nexport const GET_BILLING_PLANS = `query GetBillingPlans {\n filterCustomerBillingPlan(_first: 10) {\n edges {\n node {\n uid\n tStripePriceId\n tStripeAmount {\n amount\n units { code }\n }\n bipIsTemplate\n bipOwnershipModel { uid omName }\n }\n }\n }\n}`;\n\n/**\n * Validate a tokenized card (pm_…) before attaching it to the subscription.\n * Runs after stripe.createPaymentMethod, before UPDATE_SUBSCRIPTION_PAYMENT_METHOD.\n */\nexport const VALIDATE_CART_PAYMENT_METHOD = `mutation ValidateCartPaymentMethod(\n $biId: String!\n $tStripePaymentMethodId: String!\n) {\n tValidateCartPaymentMethod(\n biId: $biId\n tStripePaymentMethodId: $tStripePaymentMethodId\n )\n}`;\n\n/**\n * Attach a new Stripe payment method (pm_…) as the subscription default.\n */\nexport const UPDATE_SUBSCRIPTION_PAYMENT_METHOD = `mutation UpdateSubscriptionPaymentMethod(\n $biId: String!\n $tStripePaymentMethodId: String!\n) {\n tUpdateSubscriptionPaymentMethod(\n biId: $biId\n tStripePaymentMethodId: $tStripePaymentMethodId\n )\n}`;\n"]}
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/utils/queries.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG;;EAE5C,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG;;;;;;;;;;;;;;;;;;;;;;;EAuB1C,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;EAmBjC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;EAEjC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;;EAErC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG;;;;;;;;;;;;;;;;;;;EAmB7C,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;EAe/B,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG;;;;;;;;EAQ1C,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG;;;;;;;;EAQhD,CAAC;AAEH,uEAAuE;AACvE,MAAM,CAAC,MAAM,oBAAoB,GAAG;;EAElC,CAAC;AAEH,4EAA4E;AAC5E,MAAM,CAAC,MAAM,iBAAiB,GAAG;;EAE/B,CAAC;AAEH,+CAA+C;AAC/C,MAAM,CAAC,MAAM,0BAA0B,GAAG;;EAExC,CAAC","sourcesContent":["/**\n * GraphQL documents for the manage-subscription MFE.\n */\n\n/**\n * tIsCurrentUserSubscriber is a JSON scalar — returns the full object;\n * no subfield selection is allowed.\n */\nexport const GET_IS_CURRENT_USER_SUBSCRIBER = `query IsCurrentUserSubscriber {\n tIsCurrentUserSubscriber\n}`;\n\n/**\n * Enrollments for cancel confirmation.\n * Build `_filter` client-side, e.g. tSubscriptionBiId IN ('BI…', 'BI…').\n */\nexport const GET_SUBSCRIPTION_ENROLLMENTS = `query EnrollmentsForSubscriptions($filter: String!) {\n filterTwouEnrollment(_first: 200, _filter: $filter) {\n edges {\n node {\n biId\n tSubscriptionBiId\n bpStatus { code }\n tCourseRunKey\n tCertificateId\n tCertificateUrl\n tCourse {\n maId\n maName\n imageUrl\n tBrandText\n tSchools {\n tName\n tSortValue\n }\n }\n }\n }\n }\n}`;\n\n/**\n * Invoices for the learner's subscriptions (payment history) — Stripe and PayPal.\n * Filter is inlined client-side, one clause per subscription:\n * biRelatesTo.biId = '<biId>' OR biRelatesTo.biId = '<biId>'.\n */\nexport const GET_PAYMENT_HISTORY = `query PaymentHistory($filter: String!, $first: Int!) {\n filterTwouInvoice(_first: $first, _filter: $filter) {\n edges {\n node {\n biId\n tStripeInvoiceId\n tPaypalInvoiceId\n bpStatus { code name }\n billDate\n billBillingPeriod { start end }\n billFinancialCharges {\n fichAmount {\n amount\n units { code }\n }\n }\n }\n }\n }\n}`;\n\n/**\n * Cancel the learner's subscription (default: at period end).\n * Pass `immediate: true` to end access immediately.\n */\nexport const CANCEL_SUBSCRIPTION = `mutation CancelSubscription($biId: String!, $immediate: Boolean) {\n tCancelSubscription(biId: $biId, immediate: $immediate)\n}`;\n\n/**\n * Resume a cancelled subscription before the period end / cancellation date.\n */\nexport const REACTIVATE_SUBSCRIPTION = `mutation ReactivateSubscription($biId: String!) {\n tReactivateSubscription(biId: $biId)\n}`;\n\n/**\n * Payment method on an existing subscription (for renew / manage display).\n */\nexport const GET_SUBSCRIPTION_PAYMENT_METHOD = `query SubscriptionPaymentMethod($filter: String!) {\n filterTwouSubscription(_first: 1, _filter: $filter) {\n edges {\n node {\n biId\n hiConsistsOf {\n ... on TwouSubscriptionItem {\n paybPayment {\n ... on TwouStripePayment {\n tStripePaymentMethodId\n tPaymentMethodLast4\n tPaymentMethodBrand\n }\n }\n }\n }\n }\n }\n }\n}`;\n\n/**\n * Available customer billing plans (monthly / annual template prices).\n * Same query as frontend-app-subscription-checkout.\n */\nexport const GET_BILLING_PLANS = `query GetBillingPlans {\n filterCustomerBillingPlan(_first: 10) {\n edges {\n node {\n uid\n tStripePriceId\n tStripeAmount {\n amount\n units { code }\n }\n bipIsTemplate\n bipOwnershipModel { uid omName }\n }\n }\n }\n}`;\n\n/**\n * Validate a tokenized card (pm_…) before attaching it to the subscription.\n * Runs after stripe.createPaymentMethod, before UPDATE_SUBSCRIPTION_PAYMENT_METHOD.\n */\nexport const VALIDATE_CART_PAYMENT_METHOD = `mutation ValidateCartPaymentMethod(\n $biId: String!\n $tStripePaymentMethodId: String!\n) {\n tValidateCartPaymentMethod(\n biId: $biId\n tStripePaymentMethodId: $tStripePaymentMethodId\n )\n}`;\n\n/**\n * Attach a new Stripe payment method (pm_…) as the subscription default.\n */\nexport const UPDATE_SUBSCRIPTION_PAYMENT_METHOD = `mutation UpdateSubscriptionPaymentMethod(\n $biId: String!\n $tStripePaymentMethodId: String!\n) {\n tUpdateSubscriptionPaymentMethod(\n biId: $biId\n tStripePaymentMethodId: $tStripePaymentMethodId\n )\n}`;\n\n/** One-off course and program purchases for the order history page. */\nexport const GET_PURCHASE_HISTORY = `query PurchaseHistory {\n tOrderHistory\n}`;\n\n/** Detailed payload for one order, looked up by its public order number. */\nexport const GET_ORDER_DETAILS = `query OrderDetails($orderNumber: String) {\n tOrderDetails(orderNumber: $orderNumber)\n}`;\n\n/** Stripe receipt URL for one order (biId). */\nexport const GET_STRIPE_PAYMENT_RECEIPT = `query StripePaymentReceipt($biId: String) {\n tPaymentReceipt(biId: $biId)\n}`;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edx/frontend-app-subscription-manage",
3
- "version": "1.18.1",
3
+ "version": "1.19.0",
4
4
  "description": "Subscription Manage Frontend application",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,8 +0,0 @@
1
- import React from 'react';
2
- import type { ManageTab } from '../../types';
3
- interface SubscriptionTabsProps {
4
- activeTab: ManageTab;
5
- onChange: (tab: ManageTab) => void;
6
- }
7
- declare const SubscriptionTabs: React.FC<SubscriptionTabsProps>;
8
- export default SubscriptionTabs;
@@ -1,15 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useIntl } from '@openedx/frontend-base';
3
- import { trackManageSubscriptionTabClick } from '../../tracking';
4
- import messages from '../messages';
5
- const SubscriptionTabs = ({ activeTab, onChange }) => {
6
- const { formatMessage } = useIntl();
7
- const handleClick = (tab) => {
8
- // Track tab click event here
9
- trackManageSubscriptionTabClick({ tab });
10
- onChange(tab);
11
- };
12
- return (_jsxs("div", { className: "manage-tabs d-flex border-bottom mt-4", role: "tablist", "aria-label": formatMessage(messages['manage.header.title']), children: [_jsx("button", { type: "button", role: "tab", id: "manage-tab-subscription", "aria-selected": activeTab === 'subscription', "aria-controls": "manage-tabpanel-subscription", className: `manage-tabs__tab${activeTab === 'subscription' ? ' manage-tabs__tab--active' : ''}`, onClick: () => handleClick('subscription'), children: formatMessage(messages['manage.tab.subscription']) }), _jsx("button", { type: "button", role: "tab", id: "manage-tab-payment-history", "aria-selected": activeTab === 'payment-history', "aria-controls": "manage-tabpanel-payment-history", className: `manage-tabs__tab${activeTab === 'payment-history' ? ' manage-tabs__tab--active' : ''}`, onClick: () => handleClick('payment-history'), children: formatMessage(messages['manage.tab.paymentHistory']) })] }));
13
- };
14
- export default SubscriptionTabs;
15
- //# sourceMappingURL=SubscriptionTabs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SubscriptionTabs.js","sourceRoot":"","sources":["../../../src/components/SubscriptionTabs/SubscriptionTabs.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,+BAA+B,EAAE,MAAM,eAAe,CAAC;AAGhE,OAAO,QAAQ,MAAM,aAAa,CAAC;AAOnC,MAAM,gBAAgB,GAAoC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;IACpF,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IAEpC,MAAM,WAAW,GAAG,CAAC,GAAc,EAAE,EAAE;QACrC,6BAA6B;QAC7B,+BAA+B,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACzC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO,CACL,eACE,SAAS,EAAC,uCAAuC,EACjD,IAAI,EAAC,SAAS,gBACF,aAAa,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,aAE1D,iBACE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,KAAK,EACV,EAAE,EAAC,yBAAyB,mBACb,SAAS,KAAK,cAAc,mBAC7B,8BAA8B,EAC5C,SAAS,EAAE,mBAAmB,SAAS,KAAK,cAAc,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,EAAE,EAAE,EAC/F,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,YAEzC,aAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,GAC5C,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,KAAK,EACV,EAAE,EAAC,4BAA4B,mBAChB,SAAS,KAAK,iBAAiB,mBAChC,iCAAiC,EAC/C,SAAS,EAAE,mBAAmB,SAAS,KAAK,iBAAiB,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,EAAE,EAAE,EAClG,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,iBAAiB,CAAC,YAE5C,aAAa,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC,GAC9C,IACL,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC","sourcesContent":["import React from 'react';\nimport { useIntl } from '@openedx/frontend-base';\nimport { trackManageSubscriptionTabClick } from '@src/tracking';\n\nimport type { ManageTab } from '../../types';\nimport messages from '../messages';\n\ninterface SubscriptionTabsProps {\n activeTab: ManageTab,\n onChange: (tab: ManageTab) => void,\n}\n\nconst SubscriptionTabs: React.FC<SubscriptionTabsProps> = ({ activeTab, onChange }) => {\n const { formatMessage } = useIntl();\n\n const handleClick = (tab: ManageTab) => {\n // Track tab click event here\n trackManageSubscriptionTabClick({ tab });\n onChange(tab);\n };\n\n return (\n <div\n className=\"manage-tabs d-flex border-bottom mt-4\"\n role=\"tablist\"\n aria-label={formatMessage(messages['manage.header.title'])}\n >\n <button\n type=\"button\"\n role=\"tab\"\n id=\"manage-tab-subscription\"\n aria-selected={activeTab === 'subscription'}\n aria-controls=\"manage-tabpanel-subscription\"\n className={`manage-tabs__tab${activeTab === 'subscription' ? ' manage-tabs__tab--active' : ''}`}\n onClick={() => handleClick('subscription')}\n >\n {formatMessage(messages['manage.tab.subscription'])}\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n id=\"manage-tab-payment-history\"\n aria-selected={activeTab === 'payment-history'}\n aria-controls=\"manage-tabpanel-payment-history\"\n className={`manage-tabs__tab${activeTab === 'payment-history' ? ' manage-tabs__tab--active' : ''}`}\n onClick={() => handleClick('payment-history')}\n >\n {formatMessage(messages['manage.tab.paymentHistory'])}\n </button>\n </div>\n );\n};\n\nexport default SubscriptionTabs;\n"]}
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
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"]}
@@ -1,3 +0,0 @@
1
- import React from 'react';
2
- declare const ManageSubscriptionPage: React.FC;
3
- export default ManageSubscriptionPage;
@@ -1,88 +0,0 @@
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 { getPaymentHistorySubscriptionIds } from '../data/services/subscription/getPaymentHistory';
17
- import { getPlanPrice } from '../utils/billingDetails';
18
- import { formatDisplayDate } from '../utils/formatDate';
19
- import { resolvePlanLabel, resolveSubscriptionView, } from '../utils/subscriptionView';
20
- const ManageSubscriptionPage = () => {
21
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
22
- const { formatMessage } = useIntl();
23
- const [activeTab, setActiveTab] = useState('subscription');
24
- const [isRenewModalOpen, setIsRenewModalOpen] = useState(false);
25
- const client = useViaxClient();
26
- const { sessionReady, isSessionLoading, isSessionError } = useViaxSession(client);
27
- const subscriberQuery = useIsSubscriberQuery(client, sessionReady);
28
- const billingPlansQuery = useBillingPlansQuery(client, sessionReady);
29
- const reactivateMutation = useReactivateSubscriptionMutation(client);
30
- const subscriptionBiId = (_b = (_a = subscriberQuery.data) === null || _a === void 0 ? void 0 : _a.subscriptionBiId) !== null && _b !== void 0 ? _b : null;
31
- const paymentHistoryQuery = usePaymentHistoryQuery(client, sessionReady && activeTab === 'payment-history', getPaymentHistorySubscriptionIds(subscriberQuery.data));
32
- const subscriber = (_c = subscriberQuery.data) !== null && _c !== void 0 ? _c : null;
33
- const planCycle = resolvePlanLabel(subscriber);
34
- const planPrice = getPlanPrice((_e = (_d = billingPlansQuery.data) === null || _d === void 0 ? void 0 : _d.plans) !== null && _e !== void 0 ? _e : [], planCycle);
35
- const price = (_f = planPrice === null || planPrice === void 0 ? void 0 : planPrice.amount) !== null && _f !== void 0 ? _f : null;
36
- const currency = (_g = planPrice === null || planPrice === void 0 ? void 0 : planPrice.currency) !== null && _g !== void 0 ? _g : null;
37
- 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);
38
- const handleOpenRenewModal = () => {
39
- if (!subscriptionBiId) {
40
- return;
41
- }
42
- reactivateMutation.reset();
43
- setIsRenewModalOpen(true);
44
- };
45
- const handleConfirmRenew = () => {
46
- if (!subscriptionBiId || reactivateMutation.isPending) {
47
- return;
48
- }
49
- reactivateMutation.mutate(subscriptionBiId);
50
- };
51
- useEffect(() => {
52
- if (reactivateMutation.isSuccess) {
53
- setIsRenewModalOpen(false);
54
- }
55
- }, [reactivateMutation.isSuccess]);
56
- const isLoading = isSessionLoading || (sessionReady && subscriberQuery.isPending);
57
- const isError = isSessionError || subscriberQuery.isError;
58
- if (isLoading) {
59
- 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']) }) }));
60
- }
61
- if (isError) {
62
- 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']) }) }) }));
63
- }
64
- const resolvedView = resolveSubscriptionView(subscriber);
65
- const showRenewBanner = resolvedView === 'canceled_access';
66
- const renewProps = {
67
- onRenew: handleOpenRenewModal,
68
- };
69
- let subscriptionPanel;
70
- switch (resolvedView) {
71
- case 'active':
72
- subscriptionPanel = _jsx(ActiveSubscription, { subscriber: subscriber });
73
- break;
74
- case 'canceled_access':
75
- subscriptionPanel = (_jsx(CanceledSubscription, Object.assign({ subscriber: subscriber }, renewProps)));
76
- break;
77
- case 'canceled_expired':
78
- subscriptionPanel = (_jsx(ResubscribeCard, { subscriber: subscriber, price: price, currency: currency }));
79
- break;
80
- case 'none':
81
- default:
82
- subscriptionPanel = (_jsx(BecomeSubscriber, { price: price, currency: currency }));
83
- break;
84
- }
85
- 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 })] }));
86
- };
87
- export default ManageSubscriptionPage;
88
- //# sourceMappingURL=ManageSubscriptionPage.js.map
@@ -1 +0,0 @@
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 { getPaymentHistorySubscriptionIds } from '../data/services/subscription/getPaymentHistory';\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 getPaymentHistorySubscriptionIds(subscriberQuery.data),\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"]}