@edx/frontend-app-subscription-manage 1.16.0 → 1.18.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.
@@ -4,12 +4,33 @@ import { useIntl } from '@openedx/frontend-base';
4
4
  import { formatDisplayDate } from '../../utils/formatDate';
5
5
  import { resolvePlanLabel } from '../../utils/subscriptionView';
6
6
  import messages from '../messages';
7
+ import { getCommonTrackingProps } from '../../tracking/trackingContext';
8
+ const isRenewEligible = () => {
9
+ const { paymentMethod, subscription_status, isUserSuspended } = getCommonTrackingProps();
10
+ console.log({ paymentMethod, subscription_status, isUserSuspended });
11
+ switch (paymentMethod === null || paymentMethod === void 0 ? void 0 : paymentMethod.toLowerCase()) {
12
+ case 'stripe':
13
+ return (subscription_status === 'RENEWAL_FAILED'
14
+ || subscription_status === 'CANCEL_PENDING');
15
+ case 'paypal':
16
+ // User paused subscription or 3 renewal failures
17
+ if (isUserSuspended)
18
+ return true;
19
+ // First renewal failure, grace period applies
20
+ if (subscription_status === 'RENEWAL_FAILED')
21
+ return false;
22
+ return false;
23
+ default:
24
+ return false;
25
+ }
26
+ };
7
27
  export const RenewBanner = ({ expireDate, onRenew, }) => {
8
28
  const { formatMessage } = useIntl();
9
29
  if (!expireDate) {
10
30
  return null;
11
31
  }
12
- return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "manage-renew-banner__content", children: [_jsx("h2", { className: "manage-renew-banner__title h3 font-weight-bold text-primary-500 mb-2", children: formatMessage(messages['manage.canceled.bannerTitle']) }), _jsx("p", { className: "manage-renew-banner__body text-primary-500 mb-0", children: formatMessage(messages['manage.canceled.bannerBody'], { date: expireDate }) })] }), _jsx("div", { className: "manage-renew-banner__actions", children: _jsx(Button, { className: "manage-btn manage-btn--brand", onClick: onRenew, children: formatMessage(messages['manage.canceled.renew']) }) })] }));
32
+ const showRenewButton = isRenewEligible();
33
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "manage-renew-banner__content", children: [_jsx("h2", { className: "manage-renew-banner__title h3 font-weight-bold text-primary-500 mb-2", children: formatMessage(messages['manage.canceled.bannerTitle']) }), _jsx("p", { className: "manage-renew-banner__body text-primary-500 mb-0", children: formatMessage(messages['manage.canceled.bannerBody'], { date: expireDate }) })] }), _jsx("div", { className: "manage-renew-banner__actions", children: showRenewButton && (_jsx(Button, { className: "manage-btn manage-btn--brand", onClick: onRenew, children: formatMessage(messages['manage.canceled.renew']) })) })] }));
13
34
  };
14
35
  const CanceledSubscription = ({ subscriber, onRenew, }) => {
15
36
  var _a, _b;
@@ -17,11 +38,12 @@ const CanceledSubscription = ({ subscriber, onRenew, }) => {
17
38
  const plan = resolvePlanLabel(subscriber);
18
39
  const sinceDate = formatDisplayDate(subscriber === null || subscriber === void 0 ? void 0 : subscriber.subscriptionStartDate);
19
40
  const canceledOn = formatDisplayDate((_b = (_a = subscriber === null || subscriber === void 0 ? void 0 : subscriber.canceledAt) !== null && _a !== void 0 ? _a : subscriber === null || subscriber === void 0 ? void 0 : subscriber.subscriptionEndDate) !== null && _b !== void 0 ? _b : subscriber === null || subscriber === void 0 ? void 0 : subscriber.currentPeriodEnd);
41
+ const showRenewButton = isRenewEligible();
20
42
  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("span", { className: "manage-card__status-badge manage-card__status-badge--cancel flex-shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "manage-card__status-label font-weight-bold text-primary-500", children: formatMessage(plan === 'annual'
21
43
  ? messages['manage.canceled.statusAnnual']
22
44
  : messages['manage.canceled.statusMonthly']) })] }), _jsx("p", { className: "manage-card__body text-gray-700 mb-0", children: canceledOn
23
45
  ? formatMessage(messages['manage.canceled.noPayments'], { date: canceledOn })
24
- : formatMessage(messages['manage.canceled.noPaymentsNoDate']) })] }), _jsx("div", { className: "manage-card__actions d-flex flex-wrap align-items-center flex-shrink-0", children: _jsx(Button, { className: "manage-btn manage-btn--brand", onClick: onRenew, children: formatMessage(messages['manage.canceled.renew']) }) })] })] }));
46
+ : formatMessage(messages['manage.canceled.noPaymentsNoDate']) })] }), _jsx("div", { className: "manage-card__actions d-flex flex-wrap align-items-center flex-shrink-0", children: showRenewButton && (_jsx(Button, { className: "manage-btn manage-btn--brand", onClick: onRenew, children: formatMessage(messages['manage.canceled.renew']) })) })] })] }));
25
47
  };
26
48
  export default CanceledSubscription;
27
49
  //# sourceMappingURL=CanceledSubscription.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CanceledSubscription.js","sourceRoot":"","sources":["../../../src/components/CanceledSubscription/CanceledSubscription.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\nimport { Button } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\n\nimport type { CurrentUserSubscriberResult } from '../../types';\nimport { formatDisplayDate } from '../../utils/formatDate';\nimport { resolvePlanLabel } from '../../utils/subscriptionView';\nimport messages from '../messages';\n\ninterface RenewActions {\n onRenew: () => void,\n}\n\ninterface CanceledSubscriptionProps extends RenewActions {\n subscriber: CurrentUserSubscriberResult | null,\n}\n\nexport const RenewBanner: React.FC<RenewActions & { expireDate: string | null }> = ({\n expireDate,\n onRenew,\n}) => {\n const { formatMessage } = useIntl();\n\n if (!expireDate) {\n return null;\n }\n\n return (\n <>\n <div className=\"manage-renew-banner__content\">\n <h2 className=\"manage-renew-banner__title h3 font-weight-bold text-primary-500 mb-2\">\n {formatMessage(messages['manage.canceled.bannerTitle'])}\n </h2>\n <p className=\"manage-renew-banner__body text-primary-500 mb-0\">\n {formatMessage(messages['manage.canceled.bannerBody'], { date: expireDate })}\n </p>\n </div>\n <div className=\"manage-renew-banner__actions\">\n <Button\n className=\"manage-btn manage-btn--brand\"\n onClick={onRenew}\n >\n {formatMessage(messages['manage.canceled.renew'])}\n </Button>\n </div>\n </>\n );\n};\n\nconst CanceledSubscription: React.FC<CanceledSubscriptionProps> = ({\n subscriber,\n onRenew,\n}) => {\n const { formatMessage } = useIntl();\n const plan = resolvePlanLabel(subscriber);\n const sinceDate = formatDisplayDate(subscriber?.subscriptionStartDate);\n const canceledOn = formatDisplayDate(\n subscriber?.canceledAt ?? subscriber?.subscriptionEndDate ?? subscriber?.currentPeriodEnd,\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 <span className=\"manage-card__status-badge manage-card__status-badge--cancel flex-shrink-0\" aria-hidden=\"true\" />\n <span className=\"manage-card__status-label font-weight-bold text-primary-500\">\n {formatMessage(\n plan === 'annual'\n ? messages['manage.canceled.statusAnnual']\n : messages['manage.canceled.statusMonthly'],\n )}\n </span>\n </div>\n <p className=\"manage-card__body text-gray-700 mb-0\">\n {canceledOn\n ? formatMessage(messages['manage.canceled.noPayments'], { date: canceledOn })\n : formatMessage(messages['manage.canceled.noPaymentsNoDate'])}\n </p>\n </div>\n <div className=\"manage-card__actions d-flex flex-wrap align-items-center flex-shrink-0\">\n <Button\n className=\"manage-btn manage-btn--brand\"\n onClick={onRenew}\n >\n {formatMessage(messages['manage.canceled.renew'])}\n </Button>\n </div>\n </div>\n </section>\n );\n};\n\nexport default CanceledSubscription;\n"]}
1
+ {"version":3,"file":"CanceledSubscription.js","sourceRoot":"","sources":["../../../src/components/CanceledSubscription/CanceledSubscription.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\nimport { Button } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\n\nimport type { CurrentUserSubscriberResult } from '../../types';\nimport { formatDisplayDate } from '../../utils/formatDate';\nimport { resolvePlanLabel } from '../../utils/subscriptionView';\nimport messages from '../messages';\nimport { getCommonTrackingProps } from '@src/tracking/trackingContext';\n\nconst isRenewEligible = () => {\n const { paymentMethod, subscription_status, isUserSuspended } = getCommonTrackingProps();\n console.log({ paymentMethod, subscription_status, isUserSuspended });\n switch (paymentMethod?.toLowerCase()) {\n case 'stripe':\n return (\n subscription_status === 'RENEWAL_FAILED'\n || subscription_status === 'CANCEL_PENDING'\n );\n\n case 'paypal':\n // User paused subscription or 3 renewal failures\n if (isUserSuspended)\n return true;\n\n // First renewal failure, grace period applies\n if (subscription_status === 'RENEWAL_FAILED')\n return false;\n\n return false;\n\n default:\n return false;\n }\n};\n\ninterface RenewActions {\n onRenew: () => void,\n}\n\ninterface CanceledSubscriptionProps extends RenewActions {\n subscriber: CurrentUserSubscriberResult | null,\n}\n\nexport const RenewBanner: React.FC<RenewActions & { expireDate: string | null }> = ({\n expireDate,\n onRenew,\n}) => {\n const { formatMessage } = useIntl();\n if (!expireDate) {\n return null;\n }\n\n const showRenewButton = isRenewEligible();\n\n return (\n <>\n <div className=\"manage-renew-banner__content\">\n <h2 className=\"manage-renew-banner__title h3 font-weight-bold text-primary-500 mb-2\">\n {formatMessage(messages['manage.canceled.bannerTitle'])}\n </h2>\n <p className=\"manage-renew-banner__body text-primary-500 mb-0\">\n {formatMessage(messages['manage.canceled.bannerBody'], { date: expireDate })}\n </p>\n </div>\n <div className=\"manage-renew-banner__actions\">\n {showRenewButton && (\n <Button\n className=\"manage-btn manage-btn--brand\"\n onClick={onRenew}\n >\n {formatMessage(messages['manage.canceled.renew'])}\n </Button>\n )}\n </div>\n </>\n );\n};\n\nconst CanceledSubscription: React.FC<CanceledSubscriptionProps> = ({\n subscriber,\n onRenew,\n}) => {\n const { formatMessage } = useIntl();\n const plan = resolvePlanLabel(subscriber);\n const sinceDate = formatDisplayDate(subscriber?.subscriptionStartDate);\n const canceledOn = formatDisplayDate(\n subscriber?.canceledAt ?? subscriber?.subscriptionEndDate ?? subscriber?.currentPeriodEnd,\n );\n const showRenewButton = isRenewEligible();\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 <span className=\"manage-card__status-badge manage-card__status-badge--cancel flex-shrink-0\" aria-hidden=\"true\" />\n <span className=\"manage-card__status-label font-weight-bold text-primary-500\">\n {formatMessage(\n plan === 'annual'\n ? messages['manage.canceled.statusAnnual']\n : messages['manage.canceled.statusMonthly'],\n )}\n </span>\n </div>\n <p className=\"manage-card__body text-gray-700 mb-0\">\n {canceledOn\n ? formatMessage(messages['manage.canceled.noPayments'], { date: canceledOn })\n : formatMessage(messages['manage.canceled.noPaymentsNoDate'])}\n </p>\n </div>\n <div className=\"manage-card__actions d-flex flex-wrap align-items-center flex-shrink-0\">\n {showRenewButton && (\n <Button\n className=\"manage-btn manage-btn--brand\"\n onClick={onRenew}\n >\n {formatMessage(messages['manage.canceled.renew'])}\n </Button>\n )}\n </div>\n </div>\n </section>\n );\n};\n\nexport default CanceledSubscription;\n"]}
@@ -11,6 +11,7 @@ export interface CommonTrackingProps {
11
11
  experimentation?: string | null;
12
12
  device_type?: string | null;
13
13
  opt_in?: boolean | null;
14
+ isUserSuspended?: boolean | null | undefined;
14
15
  }
15
16
  export declare const setCommonTrackingProps: (props: CommonTrackingProps) => void;
16
17
  export declare const getCommonTrackingProps: () => CommonTrackingProps;
@@ -6,7 +6,7 @@ export const setCommonTrackingProps = (props) => {
6
6
  export const getCommonTrackingProps = () => commonProps;
7
7
  // Single place that maps the subs/init API response -> tracking props
8
8
  export const mapSubsInitToTrackingProps = (data) => {
9
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
9
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
10
10
  return ({
11
11
  free_trial_status: (_a = data === null || data === void 0 ? void 0 : data.userSubscription) === null || _a === void 0 ? void 0 : _a.trialActive,
12
12
  subscription_status: (_b = data === null || data === void 0 ? void 0 : data.userSubscription) === null || _b === void 0 ? void 0 : _b.status,
@@ -20,6 +20,7 @@ export const mapSubsInitToTrackingProps = (data) => {
20
20
  experimentation: '',
21
21
  device_type: '',
22
22
  opt_in: (_p = data === null || data === void 0 ? void 0 : data.opt_in) !== null && _p !== void 0 ? _p : null,
23
+ isUserSuspended: (_r = (_q = data === null || data === void 0 ? void 0 : data.userSubscription) === null || _q === void 0 ? void 0 : _q.tIsUserSuspended) !== null && _r !== void 0 ? _r : null,
23
24
  });
24
25
  };
25
26
  //# sourceMappingURL=trackingContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"trackingContext.js","sourceRoot":"","sources":["../../src/tracking/trackingContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAiB9D,IAAI,WAAW,GAAwB,EAAE,CAAC;AAE1C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAA0B,EAAE,EAAE;IACnE,WAAW,mCAAQ,WAAW,GAAK,KAAK,CAAE,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAwB,EAAE,CAAC,WAAW,CAAC;AAE7E,sEAAsE;AACtE,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,IAAS,EAAuB,EAAE;;IAAC,OAAA,CAAC;QAC7E,iBAAiB,EAAE,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB,0CAAE,WAAW;QACtD,mBAAmB,EAAE,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB,0CAAE,MAAM;QACnD,iBAAiB,EAAE,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB,0CAAE,gBAAgB;QAC3D,uBAAuB,EAAE,MAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB,0CAAE,qBAAqB,mCAAI,IAAI;QAC9E,qBAAqB,EAAE,MAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB,0CAAE,mBAAmB,mCAAI,IAAI;QAC1E,kBAAkB,EAAE,MAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB,0CAAE,gBAAgB,mCAAI,IAAI;QACpE,aAAa,EAAE,MAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB,0CAAE,aAAa,mCAAI,IAAI;QAC5D,UAAU,EAAE,MAAA,MAAA,oBAAoB,EAAE,0CAAE,KAAK,mCAAI,IAAI;QACjD,UAAU,EAAE,EAAE;QACd,eAAe,EAAE,EAAE;QACnB,WAAW,EAAE,EAAE;QACf,MAAM,EAAE,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,mCAAI,IAAI;KAC7B,CAAC,CAAA;CAAA,CAAC","sourcesContent":["import { getAuthenticatedUser } from '@openedx/frontend-base';\n\nexport interface CommonTrackingProps {\n free_trial_status?: string,\n subscription_status?: string,\n subscription_tier?: string,\n subscription_start_date?: string | null,\n subscription_end_date?: string | null,\n current_period_end?: string | null,\n paymentMethod?: string | null,\n user_email?: string | null,\n session_id?: string | null,\n experimentation?: string | null,\n device_type?: string | null,\n opt_in?: boolean | null,\n}\n\nlet commonProps: CommonTrackingProps = {};\n\nexport const setCommonTrackingProps = (props: CommonTrackingProps) => {\n commonProps = { ...commonProps, ...props };\n};\n\nexport const getCommonTrackingProps = (): CommonTrackingProps => commonProps;\n\n// Single place that maps the subs/init API response -> tracking props\nexport const mapSubsInitToTrackingProps = (data: any): CommonTrackingProps => ({\n free_trial_status: data?.userSubscription?.trialActive,\n subscription_status: data?.userSubscription?.status,\n subscription_tier: data?.userSubscription?.billingFrequency,\n subscription_start_date: data?.userSubscription?.subscriptionStartDate ?? null,\n subscription_end_date: data?.userSubscription?.subscriptionEndDate ?? null,\n current_period_end: data?.userSubscription?.currentPeriodEnd ?? null,\n paymentMethod: data?.userSubscription?.paymentMethod ?? null,\n user_email: getAuthenticatedUser()?.email ?? null,\n session_id: '',\n experimentation: '',\n device_type: '',\n opt_in: data?.opt_in ?? null,\n});\n"]}
1
+ {"version":3,"file":"trackingContext.js","sourceRoot":"","sources":["../../src/tracking/trackingContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAkB9D,IAAI,WAAW,GAAwB,EAAE,CAAC;AAE1C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAA0B,EAAE,EAAE;IACnE,WAAW,mCAAQ,WAAW,GAAK,KAAK,CAAE,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAwB,EAAE,CAAC,WAAW,CAAC;AAE7E,sEAAsE;AACtE,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,IAAS,EAAuB,EAAE;;IAAC,OAAA,CAAC;QAC7E,iBAAiB,EAAE,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB,0CAAE,WAAW;QACtD,mBAAmB,EAAE,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB,0CAAE,MAAM;QACnD,iBAAiB,EAAE,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB,0CAAE,gBAAgB;QAC3D,uBAAuB,EAAE,MAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB,0CAAE,qBAAqB,mCAAI,IAAI;QAC9E,qBAAqB,EAAE,MAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB,0CAAE,mBAAmB,mCAAI,IAAI;QAC1E,kBAAkB,EAAE,MAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB,0CAAE,gBAAgB,mCAAI,IAAI;QACpE,aAAa,EAAE,MAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB,0CAAE,aAAa,mCAAI,IAAI;QAC5D,UAAU,EAAE,MAAA,MAAA,oBAAoB,EAAE,0CAAE,KAAK,mCAAI,IAAI;QACjD,UAAU,EAAE,EAAE;QACd,eAAe,EAAE,EAAE;QACnB,WAAW,EAAE,EAAE;QACf,MAAM,EAAE,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,mCAAI,IAAI;QAC5B,eAAe,EAAE,MAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB,0CAAE,gBAAgB,mCAAI,IAAI;KAClE,CAAC,CAAA;CAAA,CAAC","sourcesContent":["import { getAuthenticatedUser } from '@openedx/frontend-base';\n\nexport interface CommonTrackingProps {\n free_trial_status?: string,\n subscription_status?: string,\n subscription_tier?: string,\n subscription_start_date?: string | null,\n subscription_end_date?: string | null,\n current_period_end?: string | null,\n paymentMethod?: string | null,\n user_email?: string | null,\n session_id?: string | null,\n experimentation?: string | null,\n device_type?: string | null,\n opt_in?: boolean | null,\n isUserSuspended?: boolean | null | undefined,\n}\n\nlet commonProps: CommonTrackingProps = {};\n\nexport const setCommonTrackingProps = (props: CommonTrackingProps) => {\n commonProps = { ...commonProps, ...props };\n};\n\nexport const getCommonTrackingProps = (): CommonTrackingProps => commonProps;\n\n// Single place that maps the subs/init API response -> tracking props\nexport const mapSubsInitToTrackingProps = (data: any): CommonTrackingProps => ({\n free_trial_status: data?.userSubscription?.trialActive,\n subscription_status: data?.userSubscription?.status,\n subscription_tier: data?.userSubscription?.billingFrequency,\n subscription_start_date: data?.userSubscription?.subscriptionStartDate ?? null,\n subscription_end_date: data?.userSubscription?.subscriptionEndDate ?? null,\n current_period_end: data?.userSubscription?.currentPeriodEnd ?? null,\n paymentMethod: data?.userSubscription?.paymentMethod ?? null,\n user_email: getAuthenticatedUser()?.email ?? null,\n session_id: '',\n experimentation: '',\n device_type: '',\n opt_in: data?.opt_in ?? null,\n isUserSuspended: data?.userSubscription?.tIsUserSuspended ?? null,\n});\n"]}
@@ -38,7 +38,7 @@ export function getLearnerDashboardUrl() {
38
38
  return fromConfig;
39
39
  }
40
40
  const lms = (_b = (_a = getSiteConfig().baseUrl) === null || _a === void 0 ? void 0 : _a.replace(/\/+$/, '')) !== null && _b !== void 0 ? _b : '';
41
- return lms ? `${lms}/subscription-learner-dashboard'` : '/subscription-learner-dashboard';
41
+ return lms ? `${lms}/subscription-learner-dashboard` : '/subscription-learner-dashboard';
42
42
  }
43
43
  /** Optional change-to-annual checkout deep link. */
44
44
  export function getChangeToAnnualUrl() {
@@ -1 +1 @@
1
- {"version":3,"file":"urls.js","sourceRoot":"","sources":["../../src/utils/urls.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * External / sibling-app URLs for manage-subscription CTAs.\n */\n\nimport { getAppConfig, getSiteConfig, getUrlByRouteRole } from '@openedx/frontend-base';\n\nimport {\n DEFAULT_LEARNER_HELP_CENTER_URL,\n DEFAULT_SUBSCRIPTION_LEARN_MORE_URL,\n appId,\n subscriptionCheckoutRole,\n} from '../constants';\n\n/** Checkout / subscribe flow URL (renew + new subscribe). */\nexport function getCheckoutUrl(): string {\n const config = getAppConfig(appId);\n const fromConfig = config.CHECKOUT_URL as string | undefined;\n if (fromConfig) {\n return fromConfig;\n }\n\n const fromRole = getUrlByRouteRole(subscriptionCheckoutRole)?.replace(/\\/+$/, '');\n if (fromRole) {\n return fromRole;\n }\n\n return '/checkout';\n}\n\n/** Marketing page for \"Learn about edX Subscription\". */\nexport function getLearnMoreUrl(): string {\n const config = getAppConfig(appId);\n return (config.SUBSCRIPTION_LEARN_MORE_URL as string | undefined)\n ?? DEFAULT_SUBSCRIPTION_LEARN_MORE_URL;\n}\n\n/** Learner Help Center (footer link). */\nexport function getLearnerHelpCenterUrl(): string {\n const config = getAppConfig(appId);\n return (config.LEARNER_HELP_CENTER_URL as string | undefined)\n ?? DEFAULT_LEARNER_HELP_CENTER_URL;\n}\n\n/** Learner dashboard URL for post-cancel return. */\nexport function getLearnerDashboardUrl(): string {\n const config = getAppConfig(appId);\n const fromConfig = config.LEARNER_DASHBOARD_URL as string | undefined;\n if (fromConfig) {\n return fromConfig;\n }\n const lms = getSiteConfig().baseUrl?.replace(/\\/+$/, '') ?? '';\n return lms ? `${lms}/subscription-learner-dashboard'` : '/subscription-learner-dashboard';\n}\n\n/** Optional change-to-annual checkout deep link. */\nexport function getChangeToAnnualUrl(): string {\n const config = getAppConfig(appId);\n const fromConfig = config.CHANGE_TO_ANNUAL_URL as string | undefined;\n if (fromConfig) {\n return fromConfig;\n }\n return `${getCheckoutUrl()}?plan=annual`;\n}\n\n/** Courses / LMS host used for certificate and course deep links. */\nexport function getCoursesBaseUrl(): string {\n const config = getAppConfig(appId);\n return (config.COURSES_BASE_URL as string | undefined)?.replace(/\\/+$/, '') ?? '';\n}\n\n/**\n * Resolve a certificate path (`tCertificateUrl`) against COURSES_BASE_URL.\n * Returns null when the path is empty.\n */\nexport function getCertificateUrl(certificatePath: string | null | undefined): string | null {\n const path = certificatePath?.trim();\n if (!path) {\n return null;\n }\n if (/^https?:\\/\\//i.test(path)) {\n return path;\n }\n const base = getCoursesBaseUrl();\n if (!base) {\n return path.startsWith('/') ? path : `/${path}`;\n }\n return `${base}${path.startsWith('/') ? path : `/${path}`}`;\n}\n"]}
1
+ {"version":3,"file":"urls.js","sourceRoot":"","sources":["../../src/utils/urls.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * External / sibling-app URLs for manage-subscription CTAs.\n */\n\nimport { getAppConfig, getSiteConfig, getUrlByRouteRole } from '@openedx/frontend-base';\n\nimport {\n DEFAULT_LEARNER_HELP_CENTER_URL,\n DEFAULT_SUBSCRIPTION_LEARN_MORE_URL,\n appId,\n subscriptionCheckoutRole,\n} from '../constants';\n\n/** Checkout / subscribe flow URL (renew + new subscribe). */\nexport function getCheckoutUrl(): string {\n const config = getAppConfig(appId);\n const fromConfig = config.CHECKOUT_URL as string | undefined;\n if (fromConfig) {\n return fromConfig;\n }\n\n const fromRole = getUrlByRouteRole(subscriptionCheckoutRole)?.replace(/\\/+$/, '');\n if (fromRole) {\n return fromRole;\n }\n\n return '/checkout';\n}\n\n/** Marketing page for \"Learn about edX Subscription\". */\nexport function getLearnMoreUrl(): string {\n const config = getAppConfig(appId);\n return (config.SUBSCRIPTION_LEARN_MORE_URL as string | undefined)\n ?? DEFAULT_SUBSCRIPTION_LEARN_MORE_URL;\n}\n\n/** Learner Help Center (footer link). */\nexport function getLearnerHelpCenterUrl(): string {\n const config = getAppConfig(appId);\n return (config.LEARNER_HELP_CENTER_URL as string | undefined)\n ?? DEFAULT_LEARNER_HELP_CENTER_URL;\n}\n\n/** Learner dashboard URL for post-cancel return. */\nexport function getLearnerDashboardUrl(): string {\n const config = getAppConfig(appId);\n const fromConfig = config.LEARNER_DASHBOARD_URL as string | undefined;\n if (fromConfig) {\n return fromConfig;\n }\n const lms = getSiteConfig().baseUrl?.replace(/\\/+$/, '') ?? '';\n return lms ? `${lms}/subscription-learner-dashboard` : '/subscription-learner-dashboard';\n}\n\n/** Optional change-to-annual checkout deep link. */\nexport function getChangeToAnnualUrl(): string {\n const config = getAppConfig(appId);\n const fromConfig = config.CHANGE_TO_ANNUAL_URL as string | undefined;\n if (fromConfig) {\n return fromConfig;\n }\n return `${getCheckoutUrl()}?plan=annual`;\n}\n\n/** Courses / LMS host used for certificate and course deep links. */\nexport function getCoursesBaseUrl(): string {\n const config = getAppConfig(appId);\n return (config.COURSES_BASE_URL as string | undefined)?.replace(/\\/+$/, '') ?? '';\n}\n\n/**\n * Resolve a certificate path (`tCertificateUrl`) against COURSES_BASE_URL.\n * Returns null when the path is empty.\n */\nexport function getCertificateUrl(certificatePath: string | null | undefined): string | null {\n const path = certificatePath?.trim();\n if (!path) {\n return null;\n }\n if (/^https?:\\/\\//i.test(path)) {\n return path;\n }\n const base = getCoursesBaseUrl();\n if (!base) {\n return path.startsWith('/') ? path : `/${path}`;\n }\n return `${base}${path.startsWith('/') ? path : `/${path}`}`;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edx/frontend-app-subscription-manage",
3
- "version": "1.16.0",
3
+ "version": "1.18.0",
4
4
  "description": "Subscription Manage Frontend application",
5
5
  "repository": {
6
6
  "type": "git",