@edx/frontend-app-subscription-manage 1.10.0 → 1.11.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.
@@ -23,9 +23,9 @@ const ActiveSubscription = ({ subscriber }) => {
23
23
  trackManageSubscriptionUpdatePaymentButtonClick({ buttonName: 'updatePayment' });
24
24
  setIsPaymentModalOpen(true);
25
25
  };
26
- return (_jsxs("section", { className: "manage-section mt-4", children: [_jsx("h2", { className: "manage-section__title h3 font-weight-bold text-primary-500 mb-1", children: formatMessage(messages['manage.active.heading']) }), sinceDate && (_jsx("p", { className: "manage-section__subtitle text-gray-700 mb-3", children: formatMessage(messages['manage.active.since'], { date: sinceDate }) })), ((paymentMethod === null || paymentMethod === void 0 ? void 0 : paymentMethod.toLowerCase()) === STRIPE_PAYMENT_GATEWAY) && (_jsxs("div", { className: "manage-card d-flex flex-column flex-md-row align-items-md-center justify-content-md-between bg-white border p-4 rounded", children: [_jsxs("div", { className: "manage-card__content", children: [_jsxs("div", { className: "manage-card__status-row d-flex align-items-center mb-1", children: [_jsx(Icon, { src: SpinnerIcon, className: "manage-card__status-badge manage-card__status-badge--sync flex-shrink-0", "aria-hidden": true }), _jsx("span", { className: "manage-card__status-label font-weight-bold text-primary-500", children: formatMessage(plan === 'annual'
26
+ return (_jsxs("section", { className: "manage-section mt-4", children: [_jsx("h2", { className: "manage-section__title h3 font-weight-bold text-primary-500 mb-1", children: formatMessage(messages['manage.active.heading']) }), sinceDate && (_jsx("p", { className: "manage-section__subtitle text-gray-700 mb-3", children: formatMessage(messages['manage.active.since'], { date: sinceDate }) })), _jsxs("div", { className: "manage-card d-flex flex-column flex-md-row align-items-md-center justify-content-md-between bg-white border p-4 rounded", children: [_jsxs("div", { className: "manage-card__content", children: [_jsxs("div", { className: "manage-card__status-row d-flex align-items-center mb-1", children: [_jsx(Icon, { src: SpinnerIcon, className: "manage-card__status-badge manage-card__status-badge--sync flex-shrink-0", "aria-hidden": true }), _jsx("span", { className: "manage-card__status-label font-weight-bold text-primary-500", children: formatMessage(plan === 'annual'
27
27
  ? messages['manage.active.statusAnnual']
28
- : messages['manage.active.statusMonthly']) })] }), nextPayment && (_jsx("p", { className: "manage-card__body text-gray-700 mb-0", children: formatMessage(messages['manage.active.nextPayment'], { date: nextPayment }) }))] }), _jsx("div", { className: "manage-card__actions manage-card__actions--row d-flex flex-wrap align-items-center flex-shrink-0 justify-content-end", children: _jsx(Button, { className: "manage-btn manage-btn--dark", variant: "primary", onClick: handleUpdatePaymentClick, disabled: !canUpdatePayment, children: formatMessage(messages['manage.active.updatePayment']) }) })] })), _jsxs("p", { className: "manage-cancel-prompt mt-3 text-right text-gray-700 small", children: [formatMessage(messages['manage.active.cancelPrompt']), ' ', _jsx(Link, { className: "manage-cancel-prompt__link text-info-500 font-weight-bold text-decoration-none", to: `/${MANAGE_PAGE_PATH}/cancel`, children: formatMessage(messages['manage.active.cancelLink']) })] }), _jsx(UpdatePaymentMethodModal, { isOpen: isPaymentModalOpen, onClose: () => setIsPaymentModalOpen(false), subscriptionBiId: subscriber === null || subscriber === void 0 ? void 0 : subscriber.subscriptionBiId, nextBillingDate: nextPayment })] }));
28
+ : messages['manage.active.statusMonthly']) })] }), nextPayment && (_jsx("p", { className: "manage-card__body text-gray-700 mb-0", children: formatMessage(messages['manage.active.nextPayment'], { date: nextPayment }) }))] }), ((paymentMethod === null || paymentMethod === void 0 ? void 0 : paymentMethod.toLowerCase()) === STRIPE_PAYMENT_GATEWAY) && (_jsx("div", { className: "manage-card__actions manage-card__actions--row d-flex flex-wrap align-items-center flex-shrink-0 justify-content-end", children: _jsx(Button, { className: "manage-btn manage-btn--dark", variant: "primary", onClick: handleUpdatePaymentClick, disabled: !canUpdatePayment, children: formatMessage(messages['manage.active.updatePayment']) }) }))] }), _jsxs("p", { className: "manage-cancel-prompt mt-3 text-right text-gray-700 small", children: [formatMessage(messages['manage.active.cancelPrompt']), ' ', _jsx(Link, { className: "manage-cancel-prompt__link text-info-500 font-weight-bold text-decoration-none", to: `/${MANAGE_PAGE_PATH}/cancel`, children: formatMessage(messages['manage.active.cancelLink']) })] }), _jsx(UpdatePaymentMethodModal, { isOpen: isPaymentModalOpen, onClose: () => setIsPaymentModalOpen(false), subscriptionBiId: subscriber === null || subscriber === void 0 ? void 0 : subscriber.subscriptionBiId, nextBillingDate: nextPayment })] }));
29
29
  };
30
30
  export default ActiveSubscription;
31
31
  //# sourceMappingURL=ActiveSubscription.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ActiveSubscription.js","sourceRoot":"","sources":["../../../src/components/ActiveSubscription/ActiveSubscription.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState } from 'react';\nimport { Button, Icon } from '@openedx/paragon';\nimport { SpinnerIcon } from '@openedx/paragon/icons';\nimport { useIntl } from '@openedx/frontend-base';\nimport { Link } from 'react-router-dom';\n\nimport type { CurrentUserSubscriberResult } from '../../types';\nimport { formatDisplayDate } from '../../utils/formatDate';\nimport { resolvePlanLabel } from '../../utils/subscriptionView';\nimport { MANAGE_PAGE_PATH, STRIPE_PAYMENT_GATEWAY } from '../../constants';\nimport UpdatePaymentMethodModal from '../UpdatePaymentMethodModal/UpdatePaymentMethodModal';\nimport messages from '../messages';\nimport { trackManageSubscriptionUpdatePaymentButtonClick } from '@src/tracking';\nimport { getCommonTrackingProps } from '@src/tracking/trackingContext';\n\ninterface ActiveSubscriptionProps {\n subscriber: CurrentUserSubscriberResult | null,\n}\n\nconst ActiveSubscription: React.FC<ActiveSubscriptionProps> = ({ subscriber }) => {\n const { formatMessage } = useIntl();\n const [isPaymentModalOpen, setIsPaymentModalOpen] = useState(false);\n const plan = resolvePlanLabel(subscriber);\n const sinceDate = formatDisplayDate(subscriber?.subscriptionStartDate);\n const nextPayment = formatDisplayDate(subscriber?.currentPeriodEnd);\n const canUpdatePayment = Boolean(subscriber?.subscriptionBiId);\n const { paymentMethod } = getCommonTrackingProps();\n\n const handleUpdatePaymentClick = () => {\n trackManageSubscriptionUpdatePaymentButtonClick({ buttonName: 'updatePayment' });\n setIsPaymentModalOpen(true);\n };\n\n return (\n <section className=\"manage-section mt-4\">\n <h2 className=\"manage-section__title h3 font-weight-bold text-primary-500 mb-1\">\n {formatMessage(messages['manage.active.heading'])}\n </h2>\n {sinceDate && (\n <p className=\"manage-section__subtitle text-gray-700 mb-3\">\n {formatMessage(messages['manage.active.since'], { date: sinceDate })}\n </p>\n )}\n\n {(paymentMethod?.toLowerCase() === STRIPE_PAYMENT_GATEWAY) && (\n <div className=\"manage-card d-flex flex-column flex-md-row align-items-md-center justify-content-md-between bg-white border p-4 rounded\">\n <div className=\"manage-card__content\">\n <div className=\"manage-card__status-row d-flex align-items-center mb-1\">\n <Icon\n src={SpinnerIcon}\n className=\"manage-card__status-badge manage-card__status-badge--sync flex-shrink-0\"\n aria-hidden\n />\n <span className=\"manage-card__status-label font-weight-bold text-primary-500\">\n {formatMessage(\n plan === 'annual'\n ? messages['manage.active.statusAnnual']\n : messages['manage.active.statusMonthly'],\n )}\n </span>\n </div>\n {nextPayment && (\n <p className=\"manage-card__body text-gray-700 mb-0\">\n {formatMessage(messages['manage.active.nextPayment'], { date: nextPayment })}\n </p>\n )}\n </div>\n <div className=\"manage-card__actions manage-card__actions--row d-flex flex-wrap align-items-center flex-shrink-0 justify-content-end\">\n <Button\n className=\"manage-btn manage-btn--dark\"\n variant=\"primary\"\n onClick={handleUpdatePaymentClick}\n disabled={!canUpdatePayment}\n >\n {formatMessage(messages['manage.active.updatePayment'])}\n </Button>\n </div>\n </div>\n )}\n\n <p className=\"manage-cancel-prompt mt-3 text-right text-gray-700 small\">\n {formatMessage(messages['manage.active.cancelPrompt'])}\n {' '}\n <Link className=\"manage-cancel-prompt__link text-info-500 font-weight-bold text-decoration-none\" to={`/${MANAGE_PAGE_PATH}/cancel`}>\n {formatMessage(messages['manage.active.cancelLink'])}\n </Link>\n </p>\n\n <UpdatePaymentMethodModal\n isOpen={isPaymentModalOpen}\n onClose={() => setIsPaymentModalOpen(false)}\n subscriptionBiId={subscriber?.subscriptionBiId}\n nextBillingDate={nextPayment}\n />\n </section>\n );\n};\n\nexport default ActiveSubscription;\n"]}
1
+ {"version":3,"file":"ActiveSubscription.js","sourceRoot":"","sources":["../../../src/components/ActiveSubscription/ActiveSubscription.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState } from 'react';\nimport { Button, Icon } from '@openedx/paragon';\nimport { SpinnerIcon } from '@openedx/paragon/icons';\nimport { useIntl } from '@openedx/frontend-base';\nimport { Link } from 'react-router-dom';\n\nimport type { CurrentUserSubscriberResult } from '../../types';\nimport { formatDisplayDate } from '../../utils/formatDate';\nimport { resolvePlanLabel } from '../../utils/subscriptionView';\nimport { MANAGE_PAGE_PATH, STRIPE_PAYMENT_GATEWAY } from '../../constants';\nimport UpdatePaymentMethodModal from '../UpdatePaymentMethodModal/UpdatePaymentMethodModal';\nimport messages from '../messages';\nimport { trackManageSubscriptionUpdatePaymentButtonClick } from '@src/tracking';\nimport { getCommonTrackingProps } from '@src/tracking/trackingContext';\n\ninterface ActiveSubscriptionProps {\n subscriber: CurrentUserSubscriberResult | null,\n}\n\nconst ActiveSubscription: React.FC<ActiveSubscriptionProps> = ({ subscriber }) => {\n const { formatMessage } = useIntl();\n const [isPaymentModalOpen, setIsPaymentModalOpen] = useState(false);\n const plan = resolvePlanLabel(subscriber);\n const sinceDate = formatDisplayDate(subscriber?.subscriptionStartDate);\n const nextPayment = formatDisplayDate(subscriber?.currentPeriodEnd);\n const canUpdatePayment = Boolean(subscriber?.subscriptionBiId);\n const { paymentMethod } = getCommonTrackingProps();\n\n const handleUpdatePaymentClick = () => {\n trackManageSubscriptionUpdatePaymentButtonClick({ buttonName: 'updatePayment' });\n setIsPaymentModalOpen(true);\n };\n\n return (\n <section className=\"manage-section mt-4\">\n <h2 className=\"manage-section__title h3 font-weight-bold text-primary-500 mb-1\">\n {formatMessage(messages['manage.active.heading'])}\n </h2>\n {sinceDate && (\n <p className=\"manage-section__subtitle text-gray-700 mb-3\">\n {formatMessage(messages['manage.active.since'], { date: sinceDate })}\n </p>\n )}\n\n <div className=\"manage-card d-flex flex-column flex-md-row align-items-md-center justify-content-md-between bg-white border p-4 rounded\">\n <div className=\"manage-card__content\">\n <div className=\"manage-card__status-row d-flex align-items-center mb-1\">\n <Icon\n src={SpinnerIcon}\n className=\"manage-card__status-badge manage-card__status-badge--sync flex-shrink-0\"\n aria-hidden\n />\n <span className=\"manage-card__status-label font-weight-bold text-primary-500\">\n {formatMessage(\n plan === 'annual'\n ? messages['manage.active.statusAnnual']\n : messages['manage.active.statusMonthly'],\n )}\n </span>\n </div>\n {nextPayment && (\n <p className=\"manage-card__body text-gray-700 mb-0\">\n {formatMessage(messages['manage.active.nextPayment'], { date: nextPayment })}\n </p>\n )}\n </div>\n\n {(paymentMethod?.toLowerCase() === STRIPE_PAYMENT_GATEWAY) && (\n <div className=\"manage-card__actions manage-card__actions--row d-flex flex-wrap align-items-center flex-shrink-0 justify-content-end\">\n <Button\n className=\"manage-btn manage-btn--dark\"\n variant=\"primary\"\n onClick={handleUpdatePaymentClick}\n disabled={!canUpdatePayment}\n >\n {formatMessage(messages['manage.active.updatePayment'])}\n </Button>\n </div>\n )}\n </div>\n\n <p className=\"manage-cancel-prompt mt-3 text-right text-gray-700 small\">\n {formatMessage(messages['manage.active.cancelPrompt'])}\n {' '}\n <Link className=\"manage-cancel-prompt__link text-info-500 font-weight-bold text-decoration-none\" to={`/${MANAGE_PAGE_PATH}/cancel`}>\n {formatMessage(messages['manage.active.cancelLink'])}\n </Link>\n </p>\n\n <UpdatePaymentMethodModal\n isOpen={isPaymentModalOpen}\n onClose={() => setIsPaymentModalOpen(false)}\n subscriptionBiId={subscriber?.subscriptionBiId}\n nextBillingDate={nextPayment}\n />\n </section>\n );\n};\n\nexport default ActiveSubscription;\n"]}
@@ -8,7 +8,7 @@ import UpdatePaymentMethodModal from '../UpdatePaymentMethodModal/UpdatePaymentM
8
8
  import messages from '../messages';
9
9
  const CARD_ICON = (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: _jsx("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M0 4C0 3.46957 0.210714 2.96086 0.585786 2.58579C0.960859 2.21071 1.46957 2 2 2H14C14.5304 2 15.0391 2.21071 15.4142 2.58579C15.7893 2.96086 16 3.46957 16 4H0ZM0 6V12C0 12.5304 0.210714 13.0391 0.585786 13.4142C0.960859 13.7893 1.46957 14 2 14H14C14.5304 14 15.0391 13.7893 15.4142 13.4142C15.7893 13.0391 16 12.5304 16 12V6H0ZM3 11C3 10.7348 3.10536 10.4804 3.29289 10.2929C3.48043 10.1054 3.73478 10 4 10H5C5.26522 10 5.51957 10.1054 5.70711 10.2929C5.89464 10.4804 6 10.7348 6 11C6 11.2652 5.89464 11.5196 5.70711 11.7071C5.51957 11.8946 5.26522 12 5 12H4C3.73478 12 3.48043 11.8946 3.29289 11.7071C3.10536 11.5196 3 11.2652 3 11Z", fill: "#0270DE" }) }));
10
10
  const RenewSubscriptionModal = ({ isOpen, onClose, onConfirm, isConfirming = false, confirmError = false, subscriptionBiId, renewalDate, price, currency, cycle = 'monthly', userCountry = null, }) => {
11
- var _a, _b;
11
+ var _a, _b, _c, _d, _e, _f;
12
12
  const { formatMessage } = useIntl();
13
13
  const client = useViaxClient();
14
14
  const { sessionReady } = useViaxSession(client);
@@ -22,6 +22,10 @@ const RenewSubscriptionModal = ({ isOpen, onClose, onConfirm, isConfirming = fal
22
22
  const displayPrice = price !== null && price !== void 0 ? price : '';
23
23
  const displayCurrency = currency !== null && currency !== void 0 ? currency : 'USD';
24
24
  const last4 = (_b = (_a = paymentMethodQuery.data) === null || _a === void 0 ? void 0 : _a.last4) !== null && _b !== void 0 ? _b : null;
25
+ // Check if payment method is PayPal
26
+ const paymentType = (_d = (_c = paymentMethodQuery.data) === null || _c === void 0 ? void 0 : _c.type) === null || _d === void 0 ? void 0 : _d.toLowerCase();
27
+ const paymentBrand = (_f = (_e = paymentMethodQuery.data) === null || _e === void 0 ? void 0 : _e.brand) === null || _f === void 0 ? void 0 : _f.toLowerCase();
28
+ const isPayPal = paymentType === 'paypal' || paymentBrand === 'paypal';
25
29
  useEffect(() => {
26
30
  if (isOpen) {
27
31
  setConfirmed(false);
@@ -46,7 +50,7 @@ const RenewSubscriptionModal = ({ isOpen, onClose, onConfirm, isConfirming = fal
46
50
  currency: displayCurrency,
47
51
  termsLink: (_jsx("a", { href: "/terms", target: "_blank", rel: "noreferrer", children: formatMessage(messages['manage.renewModal.termsOfUse']) })),
48
52
  refundLink: (_jsx("a", { href: "/refund-policy", target: "_blank", rel: "noreferrer", children: formatMessage(messages['manage.renewModal.refundPolicy']) })),
49
- }) }), _jsxs("div", { className: "manage-renew-modal__payment mb-4", children: [_jsx("h3", { className: "manage-renew-modal__payment-heading font-weight-bold text-primary-500 mb-3", children: formatMessage(messages['manage.renewModal.paymentMethod']) }), paymentMethodQuery.isPending ? (_jsx("div", { className: "d-flex align-items-center py-2", children: _jsx(Spinner, { animation: "border", size: "sm", screenReaderText: formatMessage(messages['manage.loading']) }) })) : (_jsxs("label", { className: "manage-renew-modal__card-row d-flex align-items-center mb-3", htmlFor: "renew-payment-card", children: [_jsx("input", { id: "renew-payment-card", type: "radio", name: "renewPaymentMethod", checked: true, readOnly: true, className: "manage-renew-modal__radio m-0" }), CARD_ICON, _jsxs("span", { className: "manage-renew-modal__card-label font-weight-bold text-info-500", children: [formatMessage(messages['manage.renewModal.card']), last4 ? ` *${last4}` : ''] })] })), _jsx(Button, { className: "manage-btn manage-btn--outline-dark manage-renew-modal__update-payment d-inline-flex", variant: "outline-primary", onClick: () => setIsPaymentModalOpen(true), disabled: !subscriptionBiId, children: formatMessage(messages['manage.renewModal.updatePayment']) })] }), _jsx(Form.Group, { controlId: "renewRecurringConfirm", className: "mb-2", children: _jsx(Form.Checkbox, { id: "renewRecurringConfirm", checked: confirmed, onChange: (e) => {
53
+ }) }), !isPayPal && (_jsxs("div", { className: "manage-renew-modal__payment mb-4", children: [_jsx("h3", { className: "manage-renew-modal__payment-heading font-weight-bold text-primary-500 mb-3", children: formatMessage(messages['manage.renewModal.paymentMethod']) }), paymentMethodQuery.isPending ? (_jsx("div", { className: "d-flex align-items-center py-2", children: _jsx(Spinner, { animation: "border", size: "sm", screenReaderText: formatMessage(messages['manage.loading']) }) })) : (_jsxs("label", { className: "manage-renew-modal__card-row d-flex align-items-center mb-3", htmlFor: "renew-payment-card", children: [_jsx("input", { id: "renew-payment-card", type: "radio", name: "renewPaymentMethod", checked: true, readOnly: true, className: "manage-renew-modal__radio m-0" }), CARD_ICON, _jsxs("span", { className: "manage-renew-modal__card-label font-weight-bold text-info-500", children: [formatMessage(messages['manage.renewModal.card']), last4 ? ` *${last4}` : ''] })] })), _jsx(Button, { className: "manage-btn manage-btn--outline-dark manage-renew-modal__update-payment d-inline-flex", variant: "outline-primary", onClick: () => setIsPaymentModalOpen(true), disabled: !subscriptionBiId, children: formatMessage(messages['manage.renewModal.updatePayment']) })] })), _jsx(Form.Group, { controlId: "renewRecurringConfirm", className: "mb-2", children: _jsx(Form.Checkbox, { id: "renewRecurringConfirm", checked: confirmed, onChange: (e) => {
50
54
  setConfirmed(e.target.checked);
51
55
  }, children: _jsx("span", { className: "text-primary-500", children: formatMessage(messages['manage.renewModal.recurringConfirm'], {
52
56
  cycle: cycleLabel,
@@ -57,7 +61,7 @@ const RenewSubscriptionModal = ({ isOpen, onClose, onConfirm, isConfirming = fal
57
61
  setUkCaConfirmed(e.target.checked);
58
62
  }, children: _jsx("span", { className: "text-primary-500", children: formatMessage(messages['manage.renewModal.ukCaConfirm']) }) }) })), confirmError && (_jsx(Alert, { variant: "danger", className: "mt-2", children: formatMessage(messages['manage.canceled.renewError']) })), _jsx(Button, { className: "manage-btn manage-btn--brand manage-renew-modal__confirm mt-3", onClick: onConfirm, disabled: !canConfirm, children: isConfirming
59
63
  ? formatMessage(messages['manage.canceled.renewing'])
60
- : formatMessage(messages['manage.renewModal.confirm']) })] }) })] }), _jsx(UpdatePaymentMethodModal, { isOpen: isPaymentModalOpen, onClose: () => setIsPaymentModalOpen(false), subscriptionBiId: subscriptionBiId, nextBillingDate: renewalDate })] }));
64
+ : formatMessage(messages['manage.renewModal.confirm']) })] }) })] }), !isPayPal && (_jsx(UpdatePaymentMethodModal, { isOpen: isPaymentModalOpen, onClose: () => setIsPaymentModalOpen(false), subscriptionBiId: subscriptionBiId, nextBillingDate: renewalDate }))] }));
61
65
  };
62
66
  export default RenewSubscriptionModal;
63
67
  //# sourceMappingURL=RenewSubscriptionModal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RenewSubscriptionModal.js","sourceRoot":"","sources":["../../../src/components/RenewSubscriptionModal/RenewSubscriptionModal.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EACL,KAAK,EACL,MAAM,EACN,IAAI,EACJ,WAAW,EACX,OAAO,GACR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAE,iCAAiC,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EACL,iCAAiC,EACjC,aAAa,EACb,cAAc,GACf,MAAM,mCAAmC,CAAC;AAC3C,OAAO,wBAAwB,MAAM,sDAAsD,CAAC;AAC5F,OAAO,QAAQ,MAAM,aAAa,CAAC;AAiBnC,MAAM,SAAS,GAAG,CAChB,cACE,KAAK,EAAC,4BAA4B,EAClC,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,iBACC,MAAM,YAElB,eACE,QAAQ,EAAC,SAAS,EAClB,QAAQ,EAAC,SAAS,EAClB,CAAC,EAAC,2nBAA2nB,EAC7nB,IAAI,EAAC,SAAS,GACd,GACE,CACP,CAAC;AAEF,MAAM,sBAAsB,GAA0C,CAAC,EACrE,MAAM,EACN,OAAO,EACP,SAAS,EACT,YAAY,GAAG,KAAK,EACpB,YAAY,GAAG,KAAK,EACpB,gBAAgB,EAChB,WAAW,EACX,KAAK,EACL,QAAQ,EACR,KAAK,GAAG,SAAS,EACjB,WAAW,GAAG,IAAI,GACnB,EAAE,EAAE;;IACH,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,EAAE,YAAY,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,kBAAkB,GAAG,iCAAiC,CAC1D,MAAM,EACN,YAAY,EACZ,gBAAgB,EAChB,MAAM,CACP,CAAC;IAEF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpE,MAAM,gBAAgB,GAAG,OAAO,CAC9B,WAAW,IAAI,iCAAiC,CAAC,QAAQ,CAAC,WAAW,CAAC,CACvE,CAAC;IACF,MAAM,SAAS,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IACxD,MAAM,UAAU,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,MAAM,YAAY,GAAG,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,EAAE,CAAC;IACjC,MAAM,eAAe,GAAG,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,KAAK,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAA,MAAA,kBAAkB,CAAC,IAAI,0CAAE,KAAK,mCAAI,IAAI,CAAC;IAErD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,EAAE,CAAC;YACX,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACxB,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,UAAU,GAAG,SAAS;WACvB,CAAC,CAAC,gBAAgB,IAAI,aAAa,CAAC;WACpC,CAAC,YAAY;WACb,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAE/B,MAAM,KAAK,GAAG,YAAY;QACxB,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE;YACjD,KAAK,EAAE,YAAY;YACnB,SAAS;SACV,CAAC;QACJ,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAE9D,OAAO,CACL,8BACE,MAAC,WAAW,IACV,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,IAAI,CAAC,kBAAkB,EACrC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAC,IAAI,EACT,cAAc,QACd,iBAAiB,EAAE,KAAK,EACxB,oBAAoB,QACpB,SAAS,EAAC,oBAAoB,aAE9B,KAAC,WAAW,CAAC,MAAM,cACjB,KAAC,WAAW,CAAC,KAAK,cAAE,KAAK,GAAqB,GAC3B,EAErB,KAAC,WAAW,CAAC,IAAI,cACf,eAAK,SAAS,EAAC,6BAA6B,aAC1C,YAAG,SAAS,EAAC,iDAAiD,YAC3D,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE;wCACjD,IAAI,EAAE,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,QAAQ;wCAC7B,KAAK,EAAE,YAAY;wCACnB,SAAS;wCACT,QAAQ,EAAE,eAAe;wCACzB,SAAS,EAAE,CACT,YAAG,IAAI,EAAC,QAAQ,EAAC,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,YAAY,YAC9C,aAAa,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC,GACtD,CACL;wCACD,UAAU,EAAE,CACV,YAAG,IAAI,EAAC,gBAAgB,EAAC,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,YAAY,YACtD,aAAa,CAAC,QAAQ,CAAC,gCAAgC,CAAC,CAAC,GACxD,CACL;qCACF,CAAC,GACA,EAEJ,eAAK,SAAS,EAAC,kCAAkC,aAC/C,aAAI,SAAS,EAAC,4EAA4E,YACvF,aAAa,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAC,GACxD,EAEJ,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,CAC9B,cAAK,SAAS,EAAC,gCAAgC,YAC7C,KAAC,OAAO,IACN,SAAS,EAAC,QAAQ,EAClB,IAAI,EAAC,IAAI,EACT,gBAAgB,EAAE,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,GAC3D,GACE,CACP,CAAC,CAAC,CAAC,CACF,iBAAO,SAAS,EAAC,6DAA6D,EAAC,OAAO,EAAC,oBAAoB,aACzG,gBACE,EAAE,EAAC,oBAAoB,EACvB,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,oBAAoB,EACzB,OAAO,QACP,QAAQ,QACR,SAAS,EAAC,+BAA+B,GACzC,EACD,SAAS,EACV,gBAAM,SAAS,EAAC,+DAA+D,aAC5E,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,EACjD,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IACrB,IACD,CACT,EAED,KAAC,MAAM,IACL,SAAS,EAAC,sFAAsF,EAChG,OAAO,EAAC,iBAAiB,EACzB,OAAO,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAC1C,QAAQ,EAAE,CAAC,gBAAgB,YAE1B,aAAa,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAC,GACpD,IACL,EAEN,KAAC,IAAI,CAAC,KAAK,IAAC,SAAS,EAAC,uBAAuB,EAAC,SAAS,EAAC,MAAM,YAC5D,KAAC,IAAI,CAAC,QAAQ,IACZ,EAAE,EAAC,uBAAuB,EAC1B,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,CAAC,CAAsC,EAAE,EAAE;4CACnD,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;wCACjC,CAAC,YAED,eAAM,SAAS,EAAC,kBAAkB,YAC/B,aAAa,CAAC,QAAQ,CAAC,oCAAoC,CAAC,EAAE;gDAC7D,KAAK,EAAE,UAAU;gDACjB,KAAK,EAAE,YAAY;gDACnB,SAAS;gDACT,QAAQ,EAAE,eAAe;6CAC1B,CAAC,GACG,GACO,GACL,EAEZ,gBAAgB,IAAI,CACnB,KAAC,IAAI,CAAC,KAAK,IAAC,SAAS,EAAC,kBAAkB,EAAC,SAAS,EAAC,MAAM,YACvD,KAAC,IAAI,CAAC,QAAQ,IACZ,EAAE,EAAC,kBAAkB,EACrB,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,CAAC,CAAsC,EAAE,EAAE;4CACnD,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;wCACrC,CAAC,YAED,eAAM,SAAS,EAAC,kBAAkB,YAC/B,aAAa,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC,GACpD,GACO,GACL,CACd,EAEA,YAAY,IAAI,CACf,KAAC,KAAK,IAAC,OAAO,EAAC,QAAQ,EAAC,SAAS,EAAC,MAAM,YACrC,aAAa,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC,GAChD,CACT,EAED,KAAC,MAAM,IACL,SAAS,EAAC,+DAA+D,EACzE,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,CAAC,UAAU,YAEpB,YAAY;wCACX,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;wCACrD,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC,GACjD,IACL,GACW,IACP,EAEd,KAAC,wBAAwB,IACvB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAC3C,gBAAgB,EAAE,gBAAgB,EAClC,eAAe,EAAE,WAAW,GAC5B,IACD,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,sBAAsB,CAAC","sourcesContent":["import React, { useEffect, useState } from 'react';\nimport {\n Alert,\n Button,\n Form,\n ModalDialog,\n Spinner,\n} from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\n\nimport { COUNTRIES_REQUIRING_EXTRA_CONFIRM } from '../../constants';\nimport {\n useSubscriptionPaymentMethodQuery,\n useViaxClient,\n useViaxSession,\n} from '../../data/hooks/useManageQueries';\nimport UpdatePaymentMethodModal from '../UpdatePaymentMethodModal/UpdatePaymentMethodModal';\nimport messages from '../messages';\n\ninterface RenewSubscriptionModalProps {\n isOpen: boolean,\n onClose: () => void,\n onConfirm: () => void,\n isConfirming?: boolean,\n confirmError?: boolean,\n subscriptionBiId: string | null | undefined,\n renewalDate: string | null,\n price: string | null,\n currency: string | null,\n cycle?: 'monthly' | 'annual',\n /** ISO 3166-1 alpha-2 — shows UK/CA consent when GB or CA. */\n userCountry?: string | null,\n}\n\nconst CARD_ICON = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M0 4C0 3.46957 0.210714 2.96086 0.585786 2.58579C0.960859 2.21071 1.46957 2 2 2H14C14.5304 2 15.0391 2.21071 15.4142 2.58579C15.7893 2.96086 16 3.46957 16 4H0ZM0 6V12C0 12.5304 0.210714 13.0391 0.585786 13.4142C0.960859 13.7893 1.46957 14 2 14H14C14.5304 14 15.0391 13.7893 15.4142 13.4142C15.7893 13.0391 16 12.5304 16 12V6H0ZM3 11C3 10.7348 3.10536 10.4804 3.29289 10.2929C3.48043 10.1054 3.73478 10 4 10H5C5.26522 10 5.51957 10.1054 5.70711 10.2929C5.89464 10.4804 6 10.7348 6 11C6 11.2652 5.89464 11.5196 5.70711 11.7071C5.51957 11.8946 5.26522 12 5 12H4C3.73478 12 3.48043 11.8946 3.29289 11.7071C3.10536 11.5196 3 11.2652 3 11Z\"\n fill=\"#0270DE\"\n />\n </svg>\n);\n\nconst RenewSubscriptionModal: React.FC<RenewSubscriptionModalProps> = ({\n isOpen,\n onClose,\n onConfirm,\n isConfirming = false,\n confirmError = false,\n subscriptionBiId,\n renewalDate,\n price,\n currency,\n cycle = 'monthly',\n userCountry = null,\n}) => {\n const { formatMessage } = useIntl();\n const client = useViaxClient();\n const { sessionReady } = useViaxSession(client);\n const paymentMethodQuery = useSubscriptionPaymentMethodQuery(\n client,\n sessionReady,\n subscriptionBiId,\n isOpen,\n );\n\n const [confirmed, setConfirmed] = useState(false);\n const [ukCaConfirmed, setUkCaConfirmed] = useState(false);\n const [isPaymentModalOpen, setIsPaymentModalOpen] = useState(false);\n\n const showExtraConfirm = Boolean(\n userCountry && COUNTRIES_REQUIRING_EXTRA_CONFIRM.includes(userCountry),\n );\n const frequency = cycle === 'annual' ? 'year' : 'month';\n const cycleLabel = cycle === 'annual' ? 'annual' : 'monthly';\n const displayPrice = price ?? '';\n const displayCurrency = currency ?? 'USD';\n const last4 = paymentMethodQuery.data?.last4 ?? null;\n\n useEffect(() => {\n if (isOpen) {\n setConfirmed(false);\n setUkCaConfirmed(false);\n setIsPaymentModalOpen(false);\n }\n }, [isOpen]);\n\n const canConfirm = confirmed\n && (!showExtraConfirm || ukCaConfirmed)\n && !isConfirming\n && Boolean(subscriptionBiId);\n\n const title = displayPrice\n ? formatMessage(messages['manage.renewModal.title'], {\n price: displayPrice,\n frequency,\n })\n : formatMessage(messages['manage.renewModal.titleNoPrice']);\n\n return (\n <>\n <ModalDialog\n title={title}\n isOpen={isOpen && !isPaymentModalOpen}\n onClose={onClose}\n size=\"lg\"\n hasCloseButton\n isOverflowVisible={false}\n isFullscreenOnMobile\n className=\"manage-renew-modal\"\n >\n <ModalDialog.Header>\n <ModalDialog.Title>{title}</ModalDialog.Title>\n </ModalDialog.Header>\n\n <ModalDialog.Body>\n <div className=\"manage-renew-modal__content\">\n <p className=\"manage-renew-modal__intro text-primary-500 mb-4\">\n {formatMessage(messages['manage.renewModal.body'], {\n date: renewalDate ?? '{date}',\n price: displayPrice,\n frequency,\n currency: displayCurrency,\n termsLink: (\n <a href=\"/terms\" target=\"_blank\" rel=\"noreferrer\">\n {formatMessage(messages['manage.renewModal.termsOfUse'])}\n </a>\n ),\n refundLink: (\n <a href=\"/refund-policy\" target=\"_blank\" rel=\"noreferrer\">\n {formatMessage(messages['manage.renewModal.refundPolicy'])}\n </a>\n ),\n })}\n </p>\n\n <div className=\"manage-renew-modal__payment mb-4\">\n <h3 className=\"manage-renew-modal__payment-heading font-weight-bold text-primary-500 mb-3\">\n {formatMessage(messages['manage.renewModal.paymentMethod'])}\n </h3>\n\n {paymentMethodQuery.isPending ? (\n <div className=\"d-flex align-items-center py-2\">\n <Spinner\n animation=\"border\"\n size=\"sm\"\n screenReaderText={formatMessage(messages['manage.loading'])}\n />\n </div>\n ) : (\n <label className=\"manage-renew-modal__card-row d-flex align-items-center mb-3\" htmlFor=\"renew-payment-card\">\n <input\n id=\"renew-payment-card\"\n type=\"radio\"\n name=\"renewPaymentMethod\"\n checked\n readOnly\n className=\"manage-renew-modal__radio m-0\"\n />\n {CARD_ICON}\n <span className=\"manage-renew-modal__card-label font-weight-bold text-info-500\">\n {formatMessage(messages['manage.renewModal.card'])}\n {last4 ? ` *${last4}` : ''}\n </span>\n </label>\n )}\n\n <Button\n className=\"manage-btn manage-btn--outline-dark manage-renew-modal__update-payment d-inline-flex\"\n variant=\"outline-primary\"\n onClick={() => setIsPaymentModalOpen(true)}\n disabled={!subscriptionBiId}\n >\n {formatMessage(messages['manage.renewModal.updatePayment'])}\n </Button>\n </div>\n\n <Form.Group controlId=\"renewRecurringConfirm\" className=\"mb-2\">\n <Form.Checkbox\n id=\"renewRecurringConfirm\"\n checked={confirmed}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setConfirmed(e.target.checked);\n }}\n >\n <span className=\"text-primary-500\">\n {formatMessage(messages['manage.renewModal.recurringConfirm'], {\n cycle: cycleLabel,\n price: displayPrice,\n frequency,\n currency: displayCurrency,\n })}\n </span>\n </Form.Checkbox>\n </Form.Group>\n\n {showExtraConfirm && (\n <Form.Group controlId=\"renewUkCaConfirm\" className=\"mb-3\">\n <Form.Checkbox\n id=\"renewUkCaConfirm\"\n checked={ukCaConfirmed}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setUkCaConfirmed(e.target.checked);\n }}\n >\n <span className=\"text-primary-500\">\n {formatMessage(messages['manage.renewModal.ukCaConfirm'])}\n </span>\n </Form.Checkbox>\n </Form.Group>\n )}\n\n {confirmError && (\n <Alert variant=\"danger\" className=\"mt-2\">\n {formatMessage(messages['manage.canceled.renewError'])}\n </Alert>\n )}\n\n <Button\n className=\"manage-btn manage-btn--brand manage-renew-modal__confirm mt-3\"\n onClick={onConfirm}\n disabled={!canConfirm}\n >\n {isConfirming\n ? formatMessage(messages['manage.canceled.renewing'])\n : formatMessage(messages['manage.renewModal.confirm'])}\n </Button>\n </div>\n </ModalDialog.Body>\n </ModalDialog>\n\n <UpdatePaymentMethodModal\n isOpen={isPaymentModalOpen}\n onClose={() => setIsPaymentModalOpen(false)}\n subscriptionBiId={subscriptionBiId}\n nextBillingDate={renewalDate}\n />\n </>\n );\n};\n\nexport default RenewSubscriptionModal;\n"]}
1
+ {"version":3,"file":"RenewSubscriptionModal.js","sourceRoot":"","sources":["../../../src/components/RenewSubscriptionModal/RenewSubscriptionModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useState } from 'react';\nimport {\n Alert,\n Button,\n Form,\n ModalDialog,\n Spinner,\n} from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\n\nimport { COUNTRIES_REQUIRING_EXTRA_CONFIRM } from '../../constants';\nimport {\n useSubscriptionPaymentMethodQuery,\n useViaxClient,\n useViaxSession,\n} from '../../data/hooks/useManageQueries';\nimport UpdatePaymentMethodModal from '../UpdatePaymentMethodModal/UpdatePaymentMethodModal';\nimport messages from '../messages';\n\ninterface RenewSubscriptionModalProps {\n isOpen: boolean,\n onClose: () => void,\n onConfirm: () => void,\n isConfirming?: boolean,\n confirmError?: boolean,\n subscriptionBiId: string | null | undefined,\n renewalDate: string | null,\n price: string | null,\n currency: string | null,\n cycle?: 'monthly' | 'annual',\n /** ISO 3166-1 alpha-2 — shows UK/CA consent when GB or CA. */\n userCountry?: string | null,\n}\n\nconst CARD_ICON = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M0 4C0 3.46957 0.210714 2.96086 0.585786 2.58579C0.960859 2.21071 1.46957 2 2 2H14C14.5304 2 15.0391 2.21071 15.4142 2.58579C15.7893 2.96086 16 3.46957 16 4H0ZM0 6V12C0 12.5304 0.210714 13.0391 0.585786 13.4142C0.960859 13.7893 1.46957 14 2 14H14C14.5304 14 15.0391 13.7893 15.4142 13.4142C15.7893 13.0391 16 12.5304 16 12V6H0ZM3 11C3 10.7348 3.10536 10.4804 3.29289 10.2929C3.48043 10.1054 3.73478 10 4 10H5C5.26522 10 5.51957 10.1054 5.70711 10.2929C5.89464 10.4804 6 10.7348 6 11C6 11.2652 5.89464 11.5196 5.70711 11.7071C5.51957 11.8946 5.26522 12 5 12H4C3.73478 12 3.48043 11.8946 3.29289 11.7071C3.10536 11.5196 3 11.2652 3 11Z\"\n fill=\"#0270DE\"\n />\n </svg>\n);\n\nconst RenewSubscriptionModal: React.FC<RenewSubscriptionModalProps> = ({\n isOpen,\n onClose,\n onConfirm,\n isConfirming = false,\n confirmError = false,\n subscriptionBiId,\n renewalDate,\n price,\n currency,\n cycle = 'monthly',\n userCountry = null,\n}) => {\n const { formatMessage } = useIntl();\n const client = useViaxClient();\n const { sessionReady } = useViaxSession(client);\n const paymentMethodQuery = useSubscriptionPaymentMethodQuery(\n client,\n sessionReady,\n subscriptionBiId,\n isOpen,\n );\n\n const [confirmed, setConfirmed] = useState(false);\n const [ukCaConfirmed, setUkCaConfirmed] = useState(false);\n const [isPaymentModalOpen, setIsPaymentModalOpen] = useState(false);\n\n const showExtraConfirm = Boolean(\n userCountry && COUNTRIES_REQUIRING_EXTRA_CONFIRM.includes(userCountry),\n );\n const frequency = cycle === 'annual' ? 'year' : 'month';\n const cycleLabel = cycle === 'annual' ? 'annual' : 'monthly';\n const displayPrice = price ?? '';\n const displayCurrency = currency ?? 'USD';\n const last4 = paymentMethodQuery.data?.last4 ?? null;\n\n // Check if payment method is PayPal\n const paymentType = (paymentMethodQuery.data as { type?: string } | null | undefined)?.type?.toLowerCase();\n const paymentBrand = paymentMethodQuery.data?.brand?.toLowerCase();\n const isPayPal = paymentType === 'paypal' || paymentBrand === 'paypal';\n\n useEffect(() => {\n if (isOpen) {\n setConfirmed(false);\n setUkCaConfirmed(false);\n setIsPaymentModalOpen(false);\n }\n }, [isOpen]);\n\n const canConfirm = confirmed\n && (!showExtraConfirm || ukCaConfirmed)\n && !isConfirming\n && Boolean(subscriptionBiId);\n\n const title = displayPrice\n ? formatMessage(messages['manage.renewModal.title'], {\n price: displayPrice,\n frequency,\n })\n : formatMessage(messages['manage.renewModal.titleNoPrice']);\n\n return (\n <>\n <ModalDialog\n title={title}\n isOpen={isOpen && !isPaymentModalOpen}\n onClose={onClose}\n size=\"lg\"\n hasCloseButton\n isOverflowVisible={false}\n isFullscreenOnMobile\n className=\"manage-renew-modal\"\n >\n <ModalDialog.Header>\n <ModalDialog.Title>{title}</ModalDialog.Title>\n </ModalDialog.Header>\n\n <ModalDialog.Body>\n <div className=\"manage-renew-modal__content\">\n <p className=\"manage-renew-modal__intro text-primary-500 mb-4\">\n {formatMessage(messages['manage.renewModal.body'], {\n date: renewalDate ?? '{date}',\n price: displayPrice,\n frequency,\n currency: displayCurrency,\n termsLink: (\n <a href=\"/terms\" target=\"_blank\" rel=\"noreferrer\">\n {formatMessage(messages['manage.renewModal.termsOfUse'])}\n </a>\n ),\n refundLink: (\n <a href=\"/refund-policy\" target=\"_blank\" rel=\"noreferrer\">\n {formatMessage(messages['manage.renewModal.refundPolicy'])}\n </a>\n ),\n })}\n </p>\n\n {!isPayPal && (\n <div className=\"manage-renew-modal__payment mb-4\">\n <h3 className=\"manage-renew-modal__payment-heading font-weight-bold text-primary-500 mb-3\">\n {formatMessage(messages['manage.renewModal.paymentMethod'])}\n </h3>\n\n {paymentMethodQuery.isPending ? (\n <div className=\"d-flex align-items-center py-2\">\n <Spinner\n animation=\"border\"\n size=\"sm\"\n screenReaderText={formatMessage(messages['manage.loading'])}\n />\n </div>\n ) : (\n <label className=\"manage-renew-modal__card-row d-flex align-items-center mb-3\" htmlFor=\"renew-payment-card\">\n <input\n id=\"renew-payment-card\"\n type=\"radio\"\n name=\"renewPaymentMethod\"\n checked\n readOnly\n className=\"manage-renew-modal__radio m-0\"\n />\n {CARD_ICON}\n <span className=\"manage-renew-modal__card-label font-weight-bold text-info-500\">\n {formatMessage(messages['manage.renewModal.card'])}\n {last4 ? ` *${last4}` : ''}\n </span>\n </label>\n )}\n\n <Button\n className=\"manage-btn manage-btn--outline-dark manage-renew-modal__update-payment d-inline-flex\"\n variant=\"outline-primary\"\n onClick={() => setIsPaymentModalOpen(true)}\n disabled={!subscriptionBiId}\n >\n {formatMessage(messages['manage.renewModal.updatePayment'])}\n </Button>\n </div>\n )}\n <Form.Group controlId=\"renewRecurringConfirm\" className=\"mb-2\">\n <Form.Checkbox\n id=\"renewRecurringConfirm\"\n checked={confirmed}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setConfirmed(e.target.checked);\n }}\n >\n <span className=\"text-primary-500\">\n {formatMessage(messages['manage.renewModal.recurringConfirm'], {\n cycle: cycleLabel,\n price: displayPrice,\n frequency,\n currency: displayCurrency,\n })}\n </span>\n </Form.Checkbox>\n </Form.Group>\n\n {showExtraConfirm && (\n <Form.Group controlId=\"renewUkCaConfirm\" className=\"mb-3\">\n <Form.Checkbox\n id=\"renewUkCaConfirm\"\n checked={ukCaConfirmed}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setUkCaConfirmed(e.target.checked);\n }}\n >\n <span className=\"text-primary-500\">\n {formatMessage(messages['manage.renewModal.ukCaConfirm'])}\n </span>\n </Form.Checkbox>\n </Form.Group>\n )}\n\n {confirmError && (\n <Alert variant=\"danger\" className=\"mt-2\">\n {formatMessage(messages['manage.canceled.renewError'])}\n </Alert>\n )}\n\n <Button\n className=\"manage-btn manage-btn--brand manage-renew-modal__confirm mt-3\"\n onClick={onConfirm}\n disabled={!canConfirm}\n >\n {isConfirming\n ? formatMessage(messages['manage.canceled.renewing'])\n : formatMessage(messages['manage.renewModal.confirm'])}\n </Button>\n </div>\n </ModalDialog.Body>\n </ModalDialog>\n\n {!isPayPal && (\n <UpdatePaymentMethodModal\n isOpen={isPaymentModalOpen}\n onClose={() => setIsPaymentModalOpen(false)}\n subscriptionBiId={subscriptionBiId}\n nextBillingDate={renewalDate}\n />\n )}\n </>\n );\n};\n\nexport default RenewSubscriptionModal;\n"]}
@@ -16,8 +16,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
16
16
  import { EnvironmentTypes, getSiteConfig } from '@openedx/frontend-base';
17
17
  /** Hardcoded edX JWT used only for local/dev against Viax (same pattern as enroll/checkout MFEs). */
18
18
  const DEV_SESSION_BODY = {
19
- payload: 'eyJhbGciOiJSUzUxMiIsImtpZCI6Imxtc3N0YWdlMDAyIiwidHlwIjoiSldUIn0.eyJhdWQiOiJJbmtvY3VqTGlreXVjc0Vkd2lXYXRkZWJyRWFja21ldkxha0R1aWZLb29zaGtha1dvdyIsImV4cCI6MTc5MTQzNjg2MiwiZ3JhbnRfdHlwZSI6InBhc3N3b3JkIiwiaWF0IjoxNzkxNDMzMjYyLCJpc3MiOiJodHRwczovL2NvdXJzZXMuc3RhZ2UuZWR4Lm9yZy9vYXV0aDIiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJUVV8yNjA4X0pFRzMiLCJzY29wZXMiOlsidXNlcl9pZCIsImVtYWlsIiwicHJvZmlsZSJdLCJ2ZXJzaW9uIjoiMS4yLjAiLCJzdWIiOiJiMTM0NGUxYWFjNGI5MWExZDBiZGU0NzFkMjdlMTkwNCIsImZpbHRlcnMiOlsidXNlcjptZSJdLCJpc19yZXN0cmljdGVkIjpmYWxzZSwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJ1c2VyX2lkIjo1Mjg0NzAwLCJlbWFpbCI6InRlc3QtdXNlckBnbWFpbC5jb20iLCJuYW1lIjoiVGVzdCBVc2VyIiwiZmFtaWx5X25hbWUiOiIiLCJnaXZlbl9uYW1lIjoiIiwiYWRtaW5pc3RyYXRvciI6ZmFsc2UsInN1cGVydXNlciI6ZmFsc2V9',
20
- signature: 'ONIsbRJKqTh5IQqHb9nqjzcvboT44PSwI8njUEmumge4potD4gaLMJdzjK6RmjIpAYHNzlPV10f8I0RPGr9tadzEpOa_7lPy1fh-Poq5swxaliCDdAj5cjniGm1GqGLk7fvwuPon47JgA-1ndzuAQGMcq6IgGbqv1EaZjjPrioqojo8ceQnEo46SgDXtjimK17tOBx5gyW81SfIPObjA4wWWDb3SkuGODwbWTpqgDM0wLRO6jq6sv6MGUrHcYiy_LZVggppx8Im0wuyqfCVDbqhryJFrwKykMXhNlFZowIEph8aMqrh_mjt8tPjhPIJjkfzvfNTd2PWQx3u33HL-kw'
19
+ payload: 'eyJhbGciOiJSUzUxMiIsImtpZCI6Imxtc3N0YWdlMDAyIiwidHlwIjoiSldUIn0.eyJhdWQiOiJJbmtvY3VqTGlreXVjc0Vkd2lXYXRkZWJyRWFja21ldkxha0R1aWZLb29zaGtha1dvdyIsImV4cCI6MTc5MTUyODA4OSwiZ3JhbnRfdHlwZSI6InBhc3N3b3JkIiwiaWF0IjoxNzkxNTI0NDg5LCJpc3MiOiJodHRwczovL2NvdXJzZXMuc3RhZ2UuZWR4Lm9yZy9vYXV0aDIiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJUVV8yNjA4X0pFRzMiLCJzY29wZXMiOlsidXNlcl9pZCIsImVtYWlsIiwicHJvZmlsZSJdLCJ2ZXJzaW9uIjoiMS4yLjAiLCJzdWIiOiJiMTM0NGUxYWFjNGI5MWExZDBiZGU0NzFkMjdlMTkwNCIsImZpbHRlcnMiOlsidXNlcjptZSJdLCJpc19yZXN0cmljdGVkIjpmYWxzZSwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJ1c2VyX2lkIjo1Mjg0NzAwLCJlbWFpbCI6InRlc3QtdXNlckBnbWFpbC5jb20iLCJuYW1lIjoiVGVzdCBVc2VyIiwiZmFtaWx5X25hbWUiOiIiLCJnaXZlbl9uYW1lIjoiIiwiYWRtaW5pc3RyYXRvciI6ZmFsc2UsInN1cGVydXNlciI6ZmFsc2V9',
20
+ signature: 'Ho60pm9qWXSiU9yWPJ6srgKxlDtAgiBH3kMbzCFOBZq7qm8Qi_z-iNMqxVl5dozvQNtJAuS5A--lvzkIk9fEb2u0tS_L_QKBdrEg28yvPcjwlgOsGGZ5wUOu5Vi2NN9cbNH-TiPA0zLIMVifvh8NhuWTzk6Q4yIAqU28H1Xz6Mwiz0ftHcARvdIYA-IGaWJt0YEVOw_nDLWui7V4AXSeAV50rHAlqsHzAfUnmpBxW2KAve-ZWMxmDCiF3xEaiwKtQXBsUCJ1xjGxub4dzZjry4ELRQf6EpW2l6sL5vGjD2FrlSMyt08D7lUCMBAbzpr8-ycuTRicMpnS2l64VMOp1g'
21
21
  };
22
22
  function parseSessionResponse(data) {
23
23
  var _a, _b, _c, _d;
@@ -1 +1 @@
1
- {"version":3,"file":"edxSession.js","sourceRoot":"","sources":["../../src/utils/edxSession.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;;;;;;;;;;AAEH,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAWzE,qGAAqG;AACrG,MAAM,gBAAgB,GAAG;IACvB,OAAO,EAAE,kuBAAkuB;IAC3uB,SAAS,EAAE,wVAAwV;CACpW,CAAC;AAEF,SAAS,oBAAoB,CAAC,IAA6B;;IACzD,MAAM,SAAS,GAAG,CAChB,MAAA,MAAA,MAAA,IAAI,CAAC,SAAS,mCAAI,IAAI,CAAC,KAAK,mCAAI,IAAI,CAAC,YAAY,mCAAI,IAAI,CAAC,WAAW,CAChD,CAAC;IACxB,MAAM,WAAW,GAAG,CAAC,MAAA,IAAI,CAAC,WAAW,mCAAI,IAAI,CAAC,YAAY,CAAuB,CAAC;IAElF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO;QACL,SAAS;QACT,WAAW;QACX,QAAQ,EAAE,IAAI,CAAC,QAA8B;QAC7C,SAAS,EAAE,IAAI,CAAC,SAA+B;QAC/C,QAAQ,EAAE,IAAI,CAAC,QAA8B;QAC7C,KAAK,EAAE,IAAI,CAAC,KAA2B;KACxC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,aAAa,EAAE,CAAC,WAAW,KAAK,gBAAgB,CAAC,WAAW,CAAC;AACtE,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,gBAAgB;IAC9B,OAAO,aAAa,EAAE;QACpB,CAAC,CAAC,+CAA+C;QACjD,CAAC,CAAC,GAAG,aAAa,EAAE,CAAC,UAAU,kBAAkB,CAAC;AACtD,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAgB,eAAe,CAAC,UAAkB;;QACtD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE;YAClC,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,SAAS;YACtB,OAAO,EAAE;gBACP,MAAM,EAAE,kBAAkB;gBAC1B,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS;SACrE,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,gCAAgC,GAAG,CAAC,MAAM,uCAAuC,CAClF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAkD,CAAC;QAC9E,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;CAAA","sourcesContent":["/**\n * Exchange the learner's edX session for a Viax JWT.\n *\n * Dev uses POST with a hardcoded JWT payload (local LMS cookie exchange is\n * unavailable). Stage/prod use POST with browser session cookies.\n */\n\nimport { EnvironmentTypes, getSiteConfig } from '@openedx/frontend-base';\n\nexport interface EdxSessionResult {\n viaxToken: string,\n customerUid: string,\n partyUid?: string,\n edxUserId?: string,\n username?: string,\n email?: string,\n}\n\n/** Hardcoded edX JWT used only for local/dev against Viax (same pattern as enroll/checkout MFEs). */\nconst DEV_SESSION_BODY = {\n payload: 'eyJhbGciOiJSUzUxMiIsImtpZCI6Imxtc3N0YWdlMDAyIiwidHlwIjoiSldUIn0.eyJhdWQiOiJJbmtvY3VqTGlreXVjc0Vkd2lXYXRkZWJyRWFja21ldkxha0R1aWZLb29zaGtha1dvdyIsImV4cCI6MTc5MTQzNjg2MiwiZ3JhbnRfdHlwZSI6InBhc3N3b3JkIiwiaWF0IjoxNzkxNDMzMjYyLCJpc3MiOiJodHRwczovL2NvdXJzZXMuc3RhZ2UuZWR4Lm9yZy9vYXV0aDIiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJUVV8yNjA4X0pFRzMiLCJzY29wZXMiOlsidXNlcl9pZCIsImVtYWlsIiwicHJvZmlsZSJdLCJ2ZXJzaW9uIjoiMS4yLjAiLCJzdWIiOiJiMTM0NGUxYWFjNGI5MWExZDBiZGU0NzFkMjdlMTkwNCIsImZpbHRlcnMiOlsidXNlcjptZSJdLCJpc19yZXN0cmljdGVkIjpmYWxzZSwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJ1c2VyX2lkIjo1Mjg0NzAwLCJlbWFpbCI6InRlc3QtdXNlckBnbWFpbC5jb20iLCJuYW1lIjoiVGVzdCBVc2VyIiwiZmFtaWx5X25hbWUiOiIiLCJnaXZlbl9uYW1lIjoiIiwiYWRtaW5pc3RyYXRvciI6ZmFsc2UsInN1cGVydXNlciI6ZmFsc2V9',\n signature: 'ONIsbRJKqTh5IQqHb9nqjzcvboT44PSwI8njUEmumge4potD4gaLMJdzjK6RmjIpAYHNzlPV10f8I0RPGr9tadzEpOa_7lPy1fh-Poq5swxaliCDdAj5cjniGm1GqGLk7fvwuPon47JgA-1ndzuAQGMcq6IgGbqv1EaZjjPrioqojo8ceQnEo46SgDXtjimK17tOBx5gyW81SfIPObjA4wWWDb3SkuGODwbWTpqgDM0wLRO6jq6sv6MGUrHcYiy_LZVggppx8Im0wuyqfCVDbqhryJFrwKykMXhNlFZowIEph8aMqrh_mjt8tPjhPIJjkfzvfNTd2PWQx3u33HL-kw'\n};\n\nfunction parseSessionResponse(data: Record<string, unknown>): EdxSessionResult {\n const viaxToken = (\n data.viaxToken ?? data.token ?? data.access_token ?? data.accessToken\n ) as string | undefined;\n const customerUid = (data.customerUid ?? data.customer_uid) as string | undefined;\n\n if (!viaxToken) {\n throw new Error('Session response missing viax token.');\n }\n if (!customerUid) {\n throw new Error('Session response missing customerUid.');\n }\n\n return {\n viaxToken,\n customerUid,\n partyUid: data.partyUid as string | undefined,\n edxUserId: data.edxUserId as string | undefined,\n username: data.username as string | undefined,\n email: data.email as string | undefined,\n };\n}\n\nfunction isDevelopment(): boolean {\n return getSiteConfig().environment === EnvironmentTypes.DEVELOPMENT;\n}\n\n/** LMS edx-session endpoint for the current site. */\nexport function getEdxSessionUrl(): string {\n return isDevelopment()\n ? 'https://courses.stage.edx.org/api/edx-session'\n : `${getSiteConfig().lmsBaseUrl}/api/edx-session`;\n}\n\n/** Exchange the learner's edX session for a Viax token. */\nexport async function fetchEdxSession(sessionUrl: string): Promise<EdxSessionResult> {\n const res = await fetch(sessionUrl, {\n method: 'POST',\n credentials: 'include',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: isDevelopment() ? JSON.stringify(DEV_SESSION_BODY) : undefined,\n });\n\n if (!res.ok) {\n throw new Error(\n `Failed to establish session (${res.status}). Please log into edX and try again.`,\n );\n }\n\n const data = await res.json() as Record<string, unknown> & { error?: string };\n if (data.error) {\n throw new Error(String(data.error));\n }\n\n return parseSessionResponse(data);\n}\n"]}
1
+ {"version":3,"file":"edxSession.js","sourceRoot":"","sources":["../../src/utils/edxSession.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;;;;;;;;;;AAEH,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAWzE,qGAAqG;AACrG,MAAM,gBAAgB,GAAG;IACvB,OAAO,EAAE,kuBAAkuB;IAC3uB,SAAS,EAAE,wVAAwV;CACpW,CAAC;AAEF,SAAS,oBAAoB,CAAC,IAA6B;;IACzD,MAAM,SAAS,GAAG,CAChB,MAAA,MAAA,MAAA,IAAI,CAAC,SAAS,mCAAI,IAAI,CAAC,KAAK,mCAAI,IAAI,CAAC,YAAY,mCAAI,IAAI,CAAC,WAAW,CAChD,CAAC;IACxB,MAAM,WAAW,GAAG,CAAC,MAAA,IAAI,CAAC,WAAW,mCAAI,IAAI,CAAC,YAAY,CAAuB,CAAC;IAElF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO;QACL,SAAS;QACT,WAAW;QACX,QAAQ,EAAE,IAAI,CAAC,QAA8B;QAC7C,SAAS,EAAE,IAAI,CAAC,SAA+B;QAC/C,QAAQ,EAAE,IAAI,CAAC,QAA8B;QAC7C,KAAK,EAAE,IAAI,CAAC,KAA2B;KACxC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,aAAa,EAAE,CAAC,WAAW,KAAK,gBAAgB,CAAC,WAAW,CAAC;AACtE,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,gBAAgB;IAC9B,OAAO,aAAa,EAAE;QACpB,CAAC,CAAC,+CAA+C;QACjD,CAAC,CAAC,GAAG,aAAa,EAAE,CAAC,UAAU,kBAAkB,CAAC;AACtD,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAgB,eAAe,CAAC,UAAkB;;QACtD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE;YAClC,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,SAAS;YACtB,OAAO,EAAE;gBACP,MAAM,EAAE,kBAAkB;gBAC1B,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS;SACrE,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,gCAAgC,GAAG,CAAC,MAAM,uCAAuC,CAClF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAkD,CAAC;QAC9E,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;CAAA","sourcesContent":["/**\n * Exchange the learner's edX session for a Viax JWT.\n *\n * Dev uses POST with a hardcoded JWT payload (local LMS cookie exchange is\n * unavailable). Stage/prod use POST with browser session cookies.\n */\n\nimport { EnvironmentTypes, getSiteConfig } from '@openedx/frontend-base';\n\nexport interface EdxSessionResult {\n viaxToken: string,\n customerUid: string,\n partyUid?: string,\n edxUserId?: string,\n username?: string,\n email?: string,\n}\n\n/** Hardcoded edX JWT used only for local/dev against Viax (same pattern as enroll/checkout MFEs). */\nconst DEV_SESSION_BODY = {\n payload: 'eyJhbGciOiJSUzUxMiIsImtpZCI6Imxtc3N0YWdlMDAyIiwidHlwIjoiSldUIn0.eyJhdWQiOiJJbmtvY3VqTGlreXVjc0Vkd2lXYXRkZWJyRWFja21ldkxha0R1aWZLb29zaGtha1dvdyIsImV4cCI6MTc5MTUyODA4OSwiZ3JhbnRfdHlwZSI6InBhc3N3b3JkIiwiaWF0IjoxNzkxNTI0NDg5LCJpc3MiOiJodHRwczovL2NvdXJzZXMuc3RhZ2UuZWR4Lm9yZy9vYXV0aDIiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJUVV8yNjA4X0pFRzMiLCJzY29wZXMiOlsidXNlcl9pZCIsImVtYWlsIiwicHJvZmlsZSJdLCJ2ZXJzaW9uIjoiMS4yLjAiLCJzdWIiOiJiMTM0NGUxYWFjNGI5MWExZDBiZGU0NzFkMjdlMTkwNCIsImZpbHRlcnMiOlsidXNlcjptZSJdLCJpc19yZXN0cmljdGVkIjpmYWxzZSwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJ1c2VyX2lkIjo1Mjg0NzAwLCJlbWFpbCI6InRlc3QtdXNlckBnbWFpbC5jb20iLCJuYW1lIjoiVGVzdCBVc2VyIiwiZmFtaWx5X25hbWUiOiIiLCJnaXZlbl9uYW1lIjoiIiwiYWRtaW5pc3RyYXRvciI6ZmFsc2UsInN1cGVydXNlciI6ZmFsc2V9',\n signature: 'Ho60pm9qWXSiU9yWPJ6srgKxlDtAgiBH3kMbzCFOBZq7qm8Qi_z-iNMqxVl5dozvQNtJAuS5A--lvzkIk9fEb2u0tS_L_QKBdrEg28yvPcjwlgOsGGZ5wUOu5Vi2NN9cbNH-TiPA0zLIMVifvh8NhuWTzk6Q4yIAqU28H1Xz6Mwiz0ftHcARvdIYA-IGaWJt0YEVOw_nDLWui7V4AXSeAV50rHAlqsHzAfUnmpBxW2KAve-ZWMxmDCiF3xEaiwKtQXBsUCJ1xjGxub4dzZjry4ELRQf6EpW2l6sL5vGjD2FrlSMyt08D7lUCMBAbzpr8-ycuTRicMpnS2l64VMOp1g'\n};\n\nfunction parseSessionResponse(data: Record<string, unknown>): EdxSessionResult {\n const viaxToken = (\n data.viaxToken ?? data.token ?? data.access_token ?? data.accessToken\n ) as string | undefined;\n const customerUid = (data.customerUid ?? data.customer_uid) as string | undefined;\n\n if (!viaxToken) {\n throw new Error('Session response missing viax token.');\n }\n if (!customerUid) {\n throw new Error('Session response missing customerUid.');\n }\n\n return {\n viaxToken,\n customerUid,\n partyUid: data.partyUid as string | undefined,\n edxUserId: data.edxUserId as string | undefined,\n username: data.username as string | undefined,\n email: data.email as string | undefined,\n };\n}\n\nfunction isDevelopment(): boolean {\n return getSiteConfig().environment === EnvironmentTypes.DEVELOPMENT;\n}\n\n/** LMS edx-session endpoint for the current site. */\nexport function getEdxSessionUrl(): string {\n return isDevelopment()\n ? 'https://courses.stage.edx.org/api/edx-session'\n : `${getSiteConfig().lmsBaseUrl}/api/edx-session`;\n}\n\n/** Exchange the learner's edX session for a Viax token. */\nexport async function fetchEdxSession(sessionUrl: string): Promise<EdxSessionResult> {\n const res = await fetch(sessionUrl, {\n method: 'POST',\n credentials: 'include',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: isDevelopment() ? JSON.stringify(DEV_SESSION_BODY) : undefined,\n });\n\n if (!res.ok) {\n throw new Error(\n `Failed to establish session (${res.status}). Please log into edX and try again.`,\n );\n }\n\n const data = await res.json() as Record<string, unknown> & { error?: string };\n if (data.error) {\n throw new Error(String(data.error));\n }\n\n return parseSessionResponse(data);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edx/frontend-app-subscription-manage",
3
- "version": "1.10.0",
3
+ "version": "1.11.0",
4
4
  "description": "Subscription Manage Frontend application",
5
5
  "repository": {
6
6
  "type": "git",