@edx/frontend-app-subscription-manage 1.4.0 → 1.5.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.
- package/dist/components/EnrolledCoursesList/EnrolledCoursesList.js +3 -4
- package/dist/components/EnrolledCoursesList/EnrolledCoursesList.js.map +1 -1
- package/dist/data/services/subscription/getIsCurrentUserSubscriber.js +7 -5
- package/dist/data/services/subscription/getIsCurrentUserSubscriber.js.map +1 -1
- package/dist/data/services/subscription/getSubscriptionEnrollments.js +9 -19
- package/dist/data/services/subscription/getSubscriptionEnrollments.js.map +1 -1
- package/dist/types.d.ts +6 -2
- package/dist/types.js.map +1 -1
- package/dist/utils/edxSession.js +2 -2
- package/dist/utils/edxSession.js.map +1 -1
- package/dist/utils/queries.d.ts +1 -1
- package/dist/utils/queries.js +2 -0
- package/dist/utils/queries.js.map +1 -1
- package/dist/utils/urls.d.ts +7 -0
- package/dist/utils/urls.js +25 -1
- package/dist/utils/urls.js.map +1 -1
- package/package.json +1 -1
|
@@ -10,10 +10,9 @@ const EnrolledCoursesList = ({ enrollments, isLoading = false, }) => {
|
|
|
10
10
|
return (_jsxs("div", { className: "manage-courses", children: [_jsx("h3", { className: "manage-courses__heading font-weight-bold text-primary-500 mb-3", children: formatMessage(messages['manage.cancel.coursesHeading'], {
|
|
11
11
|
count: enrollments.length,
|
|
12
12
|
}) }), _jsx("ul", { className: "manage-courses__list list-unstyled m-0 p-0 bg-white border rounded", children: enrollments.map((enrollment) => {
|
|
13
|
-
var _a, _b, _c, _d
|
|
14
|
-
const showCertificate = enrollment.
|
|
15
|
-
|
|
16
|
-
return (_jsxs("li", { className: "manage-courses__item d-flex align-items-start border-bottom p-3", children: [_jsx("div", { className: "manage-courses__logo-wrap flex-shrink-0 mr-3", children: enrollment.imageUrl || enrollment.orgLogoUrl ? (_jsx(Image, { className: "manage-courses__logo border bg-white rounded", src: enrollment.imageUrl || enrollment.orgLogoUrl || '', alt: (_c = (_b = enrollment.courseName) !== null && _b !== void 0 ? _b : enrollment.orgName) !== null && _c !== void 0 ? _c : '' })) : (_jsx("div", { className: "manage-courses__logo manage-courses__logo--placeholder border rounded" })) }), _jsxs("div", { className: "manage-courses__meta flex-grow-1", children: [enrollment.courseSlug ? (_jsx("a", { className: "manage-courses__title font-weight-bold text-primary-500 d-inline-block mb-1", href: `/${enrollment.courseSlug}`, children: (_d = enrollment.courseName) !== null && _d !== void 0 ? _d : enrollment.courseRunKey })) : (_jsx("span", { className: "manage-courses__title manage-courses__title--static font-weight-bold text-primary-500 d-inline-block text-decoration-none mb-1", children: (_e = enrollment.courseName) !== null && _e !== void 0 ? _e : enrollment.courseRunKey })), enrollment.orgName && (_jsx("p", { className: "manage-courses__org text-gray-700 small mb-0", children: enrollment.orgName })), showCertificate && (_jsx(Button, { size: "sm", variant: "outline-primary", className: "manage-btn manage-btn--outline-dark d-md-none mt-2", href: enrollment.certificateUrl || undefined, children: formatMessage(messages['manage.cancel.viewCertificate']) }))] }), showCertificate && (_jsx("div", { className: "d-none d-md-block flex-shrink-0 align-self-center ml-3", children: _jsx(Button, { size: "sm", variant: "outline-primary", className: "manage-btn manage-btn--outline-dark", href: enrollment.certificateUrl || undefined, children: formatMessage(messages['manage.cancel.viewCertificate']) }) }))] }, enrollment.biId));
|
|
13
|
+
var _a, _b, _c, _d;
|
|
14
|
+
const showCertificate = Boolean(enrollment.certificateUrl);
|
|
15
|
+
return (_jsxs("li", { className: "manage-courses__item d-flex align-items-start border-bottom p-3", children: [_jsx("div", { className: "manage-courses__logo-wrap flex-shrink-0 mr-3", children: enrollment.imageUrl || enrollment.orgLogoUrl ? (_jsx(Image, { className: "manage-courses__logo border bg-white rounded", src: enrollment.imageUrl || enrollment.orgLogoUrl || '', alt: (_b = (_a = enrollment.courseName) !== null && _a !== void 0 ? _a : enrollment.orgName) !== null && _b !== void 0 ? _b : '' })) : (_jsx("div", { className: "manage-courses__logo manage-courses__logo--placeholder border rounded" })) }), _jsxs("div", { className: "manage-courses__meta flex-grow-1", children: [enrollment.courseSlug ? (_jsx("a", { className: "manage-courses__title font-weight-bold text-primary-500 d-inline-block mb-1", href: `/${enrollment.courseSlug}`, children: (_c = enrollment.courseName) !== null && _c !== void 0 ? _c : enrollment.courseRunKey })) : (_jsx("span", { className: "manage-courses__title manage-courses__title--static font-weight-bold text-primary-500 d-inline-block text-decoration-none mb-1", children: (_d = enrollment.courseName) !== null && _d !== void 0 ? _d : enrollment.courseRunKey })), enrollment.orgName && (_jsx("p", { className: "manage-courses__org text-gray-700 small mb-0", children: enrollment.orgName })), showCertificate && (_jsx(Button, { size: "sm", variant: "outline-primary", className: "manage-btn manage-btn--outline-dark d-md-none mt-2", href: enrollment.certificateUrl || undefined, children: formatMessage(messages['manage.cancel.viewCertificate']) }))] }), showCertificate && (_jsx("div", { className: "d-none d-md-block flex-shrink-0 align-self-center ml-3", children: _jsx(Button, { size: "sm", variant: "outline-primary", className: "manage-btn manage-btn--outline-dark", href: enrollment.certificateUrl || undefined, children: formatMessage(messages['manage.cancel.viewCertificate']) }) }))] }, enrollment.biId));
|
|
17
16
|
}) })] }));
|
|
18
17
|
};
|
|
19
18
|
export default EnrolledCoursesList;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnrolledCoursesList.js","sourceRoot":"","sources":["../../../src/components/EnrolledCoursesList/EnrolledCoursesList.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGjD,OAAO,QAAQ,MAAM,aAAa,CAAC;AAOnC,MAAM,mBAAmB,GAAuC,CAAC,EAC/D,WAAW,EACX,SAAS,GAAG,KAAK,GAClB,EAAE,EAAE;IACH,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IAEpC,IAAI,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,gBAAgB,aAC7B,aAAI,SAAS,EAAC,gEAAgE,YAC3E,aAAa,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE;oBACvD,KAAK,EAAE,WAAW,CAAC,MAAM;iBAC1B,CAAC,GACC,EACL,aAAI,SAAS,EAAC,oEAAoE,YAC/E,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;;oBAC9B,MAAM,eAAe,GAAG,
|
|
1
|
+
{"version":3,"file":"EnrolledCoursesList.js","sourceRoot":"","sources":["../../../src/components/EnrolledCoursesList/EnrolledCoursesList.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGjD,OAAO,QAAQ,MAAM,aAAa,CAAC;AAOnC,MAAM,mBAAmB,GAAuC,CAAC,EAC/D,WAAW,EACX,SAAS,GAAG,KAAK,GAClB,EAAE,EAAE;IACH,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IAEpC,IAAI,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,gBAAgB,aAC7B,aAAI,SAAS,EAAC,gEAAgE,YAC3E,aAAa,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE;oBACvD,KAAK,EAAE,WAAW,CAAC,MAAM;iBAC1B,CAAC,GACC,EACL,aAAI,SAAS,EAAC,oEAAoE,YAC/E,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;;oBAC9B,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;oBAE3D,OAAO,CACL,cAEE,SAAS,EAAC,iEAAiE,aAE3E,cAAK,SAAS,EAAC,8CAA8C,YAC1D,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAC9C,KAAC,KAAK,IACJ,SAAS,EAAC,8CAA8C,EACxD,GAAG,EAAE,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,UAAU,IAAI,EAAE,EACvD,GAAG,EAAE,MAAA,MAAA,UAAU,CAAC,UAAU,mCAAI,UAAU,CAAC,OAAO,mCAAI,EAAE,GACtD,CACH,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,uEAAuE,GAAG,CAC1F,GACG,EACN,eAAK,SAAS,EAAC,kCAAkC,aAC9C,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CACvB,YACE,SAAS,EAAC,6EAA6E,EACvF,IAAI,EAAE,IAAI,UAAU,CAAC,UAAU,EAAE,YAEhC,MAAA,UAAU,CAAC,UAAU,mCAAI,UAAU,CAAC,YAAY,GAC/C,CACL,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,gIAAgI,YAC7I,MAAA,UAAU,CAAC,UAAU,mCAAI,UAAU,CAAC,YAAY,GAC5C,CACR,EACA,UAAU,CAAC,OAAO,IAAI,CACrB,YAAG,SAAS,EAAC,8CAA8C,YAAE,UAAU,CAAC,OAAO,GAAK,CACrF,EACA,eAAe,IAAI,CAClB,KAAC,MAAM,IACL,IAAI,EAAC,IAAI,EACT,OAAO,EAAC,iBAAiB,EACzB,SAAS,EAAC,oDAAoD,EAC9D,IAAI,EAAE,UAAU,CAAC,cAAc,IAAI,SAAS,YAE3C,aAAa,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC,GAClD,CACV,IACG,EACL,eAAe,IAAI,CAClB,cAAK,SAAS,EAAC,wDAAwD,YACrE,KAAC,MAAM,IACL,IAAI,EAAC,IAAI,EACT,OAAO,EAAC,iBAAiB,EACzB,SAAS,EAAC,qCAAqC,EAC/C,IAAI,EAAE,UAAU,CAAC,cAAc,IAAI,SAAS,YAE3C,aAAa,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC,GAClD,GACL,CACP,KApDI,UAAU,CAAC,IAAI,CAqDjB,CACN,CAAC;gBACJ,CAAC,CAAC,GACC,IACD,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,mBAAmB,CAAC","sourcesContent":["import React from 'react';\nimport { Button, Image } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\n\nimport type { SubscriptionEnrollment } from '../../types';\nimport messages from '../messages';\n\ninterface EnrolledCoursesListProps {\n enrollments: SubscriptionEnrollment[],\n isLoading?: boolean,\n}\n\nconst EnrolledCoursesList: React.FC<EnrolledCoursesListProps> = ({\n enrollments,\n isLoading = false,\n}) => {\n const { formatMessage } = useIntl();\n\n if (isLoading || enrollments.length === 0) {\n return null;\n }\n\n return (\n <div className=\"manage-courses\">\n <h3 className=\"manage-courses__heading font-weight-bold text-primary-500 mb-3\">\n {formatMessage(messages['manage.cancel.coursesHeading'], {\n count: enrollments.length,\n })}\n </h3>\n <ul className=\"manage-courses__list list-unstyled m-0 p-0 bg-white border rounded\">\n {enrollments.map((enrollment) => {\n const showCertificate = Boolean(enrollment.certificateUrl);\n\n return (\n <li\n key={enrollment.biId}\n className=\"manage-courses__item d-flex align-items-start border-bottom p-3\"\n >\n <div className=\"manage-courses__logo-wrap flex-shrink-0 mr-3\">\n {enrollment.imageUrl || enrollment.orgLogoUrl ? (\n <Image\n className=\"manage-courses__logo border bg-white rounded\"\n src={enrollment.imageUrl || enrollment.orgLogoUrl || ''}\n alt={enrollment.courseName ?? enrollment.orgName ?? ''}\n />\n ) : (\n <div className=\"manage-courses__logo manage-courses__logo--placeholder border rounded\" />\n )}\n </div>\n <div className=\"manage-courses__meta flex-grow-1\">\n {enrollment.courseSlug ? (\n <a\n className=\"manage-courses__title font-weight-bold text-primary-500 d-inline-block mb-1\"\n href={`/${enrollment.courseSlug}`}\n >\n {enrollment.courseName ?? enrollment.courseRunKey}\n </a>\n ) : (\n <span className=\"manage-courses__title manage-courses__title--static font-weight-bold text-primary-500 d-inline-block text-decoration-none mb-1\">\n {enrollment.courseName ?? enrollment.courseRunKey}\n </span>\n )}\n {enrollment.orgName && (\n <p className=\"manage-courses__org text-gray-700 small mb-0\">{enrollment.orgName}</p>\n )}\n {showCertificate && (\n <Button\n size=\"sm\"\n variant=\"outline-primary\"\n className=\"manage-btn manage-btn--outline-dark d-md-none mt-2\"\n href={enrollment.certificateUrl || undefined}\n >\n {formatMessage(messages['manage.cancel.viewCertificate'])}\n </Button>\n )}\n </div>\n {showCertificate && (\n <div className=\"d-none d-md-block flex-shrink-0 align-self-center ml-3\">\n <Button\n size=\"sm\"\n variant=\"outline-primary\"\n className=\"manage-btn manage-btn--outline-dark\"\n href={enrollment.certificateUrl || undefined}\n >\n {formatMessage(messages['manage.cancel.viewCertificate'])}\n </Button>\n </div>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n );\n};\n\nexport default EnrolledCoursesList;\n"]}
|
|
@@ -11,7 +11,7 @@ import { GET_IS_CURRENT_USER_SUBSCRIBER } from '../../../utils/queries';
|
|
|
11
11
|
/** Check whether the authenticated user has an active / recent subscription. */
|
|
12
12
|
export function getIsCurrentUserSubscriber(gql) {
|
|
13
13
|
return __awaiter(this, void 0, void 0, function* () {
|
|
14
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
14
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
15
15
|
const data = yield gql(GET_IS_CURRENT_USER_SUBSCRIBER);
|
|
16
16
|
const result = data === null || data === void 0 ? void 0 : data.tIsCurrentUserSubscriber;
|
|
17
17
|
if (!result || typeof result !== 'object') {
|
|
@@ -25,10 +25,12 @@ export function getIsCurrentUserSubscriber(gql) {
|
|
|
25
25
|
currentPeriodEnd: (_c = result.currentPeriodEnd) !== null && _c !== void 0 ? _c : null,
|
|
26
26
|
subscriptionStartDate: (_d = result.subscriptionStartDate) !== null && _d !== void 0 ? _d : null,
|
|
27
27
|
subscriptionEndDate: (_e = result.subscriptionEndDate) !== null && _e !== void 0 ? _e : null,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
// Prefer billingFrequency (e.g. ANNUAL / MONTHLY); planName is a display
|
|
29
|
+
// label and usually does not encode the billing cycle.
|
|
30
|
+
renewalType: (_h = (_g = (_f = result.billingFrequency) !== null && _f !== void 0 ? _f : result.renewalType) !== null && _g !== void 0 ? _g : result.planName) !== null && _h !== void 0 ? _h : null,
|
|
31
|
+
canceledAt: (_k = (_j = result.canceledAt) !== null && _j !== void 0 ? _j : result.cancelledAt) !== null && _k !== void 0 ? _k : null,
|
|
32
|
+
amount: (_m = (_l = result.amount) !== null && _l !== void 0 ? _l : result.price) !== null && _m !== void 0 ? _m : null,
|
|
33
|
+
currency: (_o = result.currency) !== null && _o !== void 0 ? _o : null,
|
|
32
34
|
};
|
|
33
35
|
});
|
|
34
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getIsCurrentUserSubscriber.js","sourceRoot":"","sources":["../../../../src/data/services/subscription/getIsCurrentUserSubscriber.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAExE,gFAAgF;AAChF,MAAM,UAAgB,0BAA0B,CAC9C,GAAc;;;QAEd,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,8BAA8B,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,wBAAwB,CAAC;QAC9C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,YAAY,EAAE,MAAM,CAAC,YAAY,KAAK,IAAI;YAC1C,SAAS,EAAE,MAAM,CAAC,SAAS,KAAK,IAAI;YACpC,gBAAgB,EAAE,MAAA,MAAM,CAAC,gBAAgB,mCAAI,IAAI;YACjD,MAAM,EAAE,MAAA,MAAM,CAAC,MAAM,mCAAI,IAAI;YAC7B,gBAAgB,EAAE,MAAA,MAAM,CAAC,gBAAgB,mCAAI,IAAI;YACjD,qBAAqB,EAAE,MAAA,MAAM,CAAC,qBAAqB,mCAAI,IAAI;YAC3D,mBAAmB,EAAE,MAAA,MAAM,CAAC,mBAAmB,mCAAI,IAAI;YACvD,WAAW,
|
|
1
|
+
{"version":3,"file":"getIsCurrentUserSubscriber.js","sourceRoot":"","sources":["../../../../src/data/services/subscription/getIsCurrentUserSubscriber.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAExE,gFAAgF;AAChF,MAAM,UAAgB,0BAA0B,CAC9C,GAAc;;;QAEd,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,8BAA8B,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,wBAAwB,CAAC;QAC9C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,YAAY,EAAE,MAAM,CAAC,YAAY,KAAK,IAAI;YAC1C,SAAS,EAAE,MAAM,CAAC,SAAS,KAAK,IAAI;YACpC,gBAAgB,EAAE,MAAA,MAAM,CAAC,gBAAgB,mCAAI,IAAI;YACjD,MAAM,EAAE,MAAA,MAAM,CAAC,MAAM,mCAAI,IAAI;YAC7B,gBAAgB,EAAE,MAAA,MAAM,CAAC,gBAAgB,mCAAI,IAAI;YACjD,qBAAqB,EAAE,MAAA,MAAM,CAAC,qBAAqB,mCAAI,IAAI;YAC3D,mBAAmB,EAAE,MAAA,MAAM,CAAC,mBAAmB,mCAAI,IAAI;YACvD,yEAAyE;YACzE,uDAAuD;YACvD,WAAW,EACT,MAAA,MAAA,MAAA,MAAM,CAAC,gBAAgB,mCAAI,MAAM,CAAC,WAAW,mCAAI,MAAM,CAAC,QAAQ,mCAAI,IAAI;YAC1E,UAAU,EAAE,MAAA,MAAA,MAAM,CAAC,UAAU,mCAAI,MAAM,CAAC,WAAW,mCAAI,IAAI;YAC3D,MAAM,EAAE,MAAA,MAAA,MAAM,CAAC,MAAM,mCAAI,MAAM,CAAC,KAAK,mCAAI,IAAI;YAC7C,QAAQ,EAAE,MAAA,MAAM,CAAC,QAAQ,mCAAI,IAAI;SAClC,CAAC;IACJ,CAAC;CAAA","sourcesContent":["import type { GqlRunner, CurrentUserSubscriberResult } from '../../../types';\nimport { GET_IS_CURRENT_USER_SUBSCRIBER } from '../../../utils/queries';\n\n/** Check whether the authenticated user has an active / recent subscription. */\nexport async function getIsCurrentUserSubscriber(\n gql: GqlRunner,\n): Promise<CurrentUserSubscriberResult | null> {\n const data = await gql(GET_IS_CURRENT_USER_SUBSCRIBER);\n const result = data?.tIsCurrentUserSubscriber;\n if (!result || typeof result !== 'object') {\n return null;\n }\n\n return {\n isSubscriber: result.isSubscriber === true,\n canEnroll: result.canEnroll === true,\n subscriptionBiId: result.subscriptionBiId ?? null,\n status: result.status ?? null,\n currentPeriodEnd: result.currentPeriodEnd ?? null,\n subscriptionStartDate: result.subscriptionStartDate ?? null,\n subscriptionEndDate: result.subscriptionEndDate ?? null,\n // Prefer billingFrequency (e.g. ANNUAL / MONTHLY); planName is a display\n // label and usually does not encode the billing cycle.\n renewalType:\n result.billingFrequency ?? result.renewalType ?? result.planName ?? null,\n canceledAt: result.canceledAt ?? result.cancelledAt ?? null,\n amount: result.amount ?? result.price ?? null,\n currency: result.currency ?? null,\n };\n}\n"]}
|
|
@@ -7,8 +7,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import { getSiteConfig } from '@openedx/frontend-base';
|
|
11
10
|
import { GET_SUBSCRIPTION_ENROLLMENTS } from '../../../utils/queries';
|
|
11
|
+
import { getCertificateUrl } from '../../../utils/urls';
|
|
12
12
|
/** Known TwouEnrollment bpStatus.code values. */
|
|
13
13
|
const ENROLLMENT_STATUSES = new Set([
|
|
14
14
|
'ACTIVE',
|
|
@@ -32,17 +32,6 @@ function resolveInstitutionName(course) {
|
|
|
32
32
|
const brand = (_c = course === null || course === void 0 ? void 0 : course.tBrandText) === null || _c === void 0 ? void 0 : _c.trim();
|
|
33
33
|
return brand || null;
|
|
34
34
|
}
|
|
35
|
-
/** LMS certificate page for a completed course run, when available. */
|
|
36
|
-
function resolveCertificateUrl(courseRunKey) {
|
|
37
|
-
var _a, _b;
|
|
38
|
-
const key = courseRunKey === null || courseRunKey === void 0 ? void 0 : courseRunKey.trim();
|
|
39
|
-
if (!key) {
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
const lms = (_b = (_a = getSiteConfig().lmsBaseUrl) === null || _a === void 0 ? void 0 : _a.replace(/\/+$/, '')) !== null && _b !== void 0 ? _b : '';
|
|
43
|
-
const path = `/certificates/${encodeURIComponent(key)}`;
|
|
44
|
-
return lms ? `${lms}${path}` : path;
|
|
45
|
-
}
|
|
46
35
|
/** Build `tSubscriptionBiId IN ('…', '…')` for one or more subscription BI ids. */
|
|
47
36
|
export function buildEnrollmentsFilter(subscriptionBiIds) {
|
|
48
37
|
const ids = (Array.isArray(subscriptionBiIds) ? subscriptionBiIds : [subscriptionBiIds])
|
|
@@ -75,22 +64,23 @@ export function getSubscriptionEnrollments(gql, subscriptionBiIds) {
|
|
|
75
64
|
return ENROLLMENT_STATUSES.has(code);
|
|
76
65
|
})
|
|
77
66
|
.map((node) => {
|
|
78
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
67
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
79
68
|
const status = ((_b = (_a = node === null || node === void 0 ? void 0 : node.bpStatus) === null || _a === void 0 ? void 0 : _a.code) !== null && _b !== void 0 ? _b : '').toUpperCase();
|
|
80
69
|
const courseRunKey = (_c = node.tCourseRunKey) !== null && _c !== void 0 ? _c : null;
|
|
81
|
-
const
|
|
70
|
+
const certificateId = ((_d = node.tCertificateId) === null || _d === void 0 ? void 0 : _d.trim()) || null;
|
|
71
|
+
const certificateUrl = getCertificateUrl(node.tCertificateUrl);
|
|
82
72
|
return {
|
|
83
73
|
biId: node.biId,
|
|
84
|
-
courseMaId: (
|
|
85
|
-
courseName: (
|
|
74
|
+
courseMaId: (_f = (_e = node.tCourse) === null || _e === void 0 ? void 0 : _e.maId) !== null && _f !== void 0 ? _f : null,
|
|
75
|
+
courseName: (_h = (_g = node.tCourse) === null || _g === void 0 ? void 0 : _g.maName) !== null && _h !== void 0 ? _h : null,
|
|
86
76
|
courseSlug: null,
|
|
87
|
-
imageUrl: (
|
|
77
|
+
imageUrl: (_k = (_j = node.tCourse) === null || _j === void 0 ? void 0 : _j.imageUrl) !== null && _k !== void 0 ? _k : null,
|
|
88
78
|
orgName: resolveInstitutionName(node.tCourse),
|
|
89
79
|
orgLogoUrl: null,
|
|
90
80
|
courseRunKey,
|
|
91
81
|
status,
|
|
92
|
-
hasCertificate:
|
|
93
|
-
certificateUrl
|
|
82
|
+
hasCertificate: Boolean(certificateUrl || certificateId),
|
|
83
|
+
certificateUrl,
|
|
94
84
|
};
|
|
95
85
|
});
|
|
96
86
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSubscriptionEnrollments.js","sourceRoot":"","sources":["../../../../src/data/services/subscription/getSubscriptionEnrollments.ts"],"names":[],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"getSubscriptionEnrollments.js","sourceRoot":"","sources":["../../../../src/data/services/subscription/getSubscriptionEnrollments.ts"],"names":[],"mappings":"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","sourcesContent":["import type { GqlRunner, SubscriptionEnrollment } from '../../../types';\nimport { GET_SUBSCRIPTION_ENROLLMENTS } from '../../../utils/queries';\nimport { getCertificateUrl } from '../../../utils/urls';\n\n/** Known TwouEnrollment bpStatus.code values. */\nconst ENROLLMENT_STATUSES = new Set([\n 'ACTIVE',\n 'COMPLETED',\n 'SUSPENDED',\n 'PENDING',\n 'FAILED',\n]);\n\nfunction escapeFilterValue(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n\nfunction resolveInstitutionName(course: any): string | null {\n const schools = Array.isArray(course?.tSchools)\n ? [...course.tSchools].sort(\n (a: any, b: any) => (a?.tSortValue ?? 0) - (b?.tSortValue ?? 0),\n )\n : [];\n const fromSchool = schools.find((s: any) => s?.tName?.trim())?.tName?.trim();\n if (fromSchool) {\n return fromSchool;\n }\n const brand = course?.tBrandText?.trim();\n return brand || null;\n}\n\n/** Build `tSubscriptionBiId IN ('…', '…')` for one or more subscription BI ids. */\nexport function buildEnrollmentsFilter(\n subscriptionBiIds: string | string[],\n): string | null {\n const ids = (Array.isArray(subscriptionBiIds) ? subscriptionBiIds : [subscriptionBiIds])\n .map((id) => id.trim())\n .filter(Boolean);\n\n if (!ids.length) {\n return null;\n }\n\n const quoted = ids.map((id) => `'${escapeFilterValue(id)}'`).join(', ');\n return `tSubscriptionBiId IN (${quoted})`;\n}\n\n/**\n * List enrollments for the learner's subscription(s) (cancel confirmation course list).\n */\nexport async function getSubscriptionEnrollments(\n gql: GqlRunner,\n subscriptionBiIds: string | string[],\n): Promise<SubscriptionEnrollment[]> {\n const filter = buildEnrollmentsFilter(subscriptionBiIds);\n if (!filter) {\n return [];\n }\n\n const data = await gql(GET_SUBSCRIPTION_ENROLLMENTS, { filter });\n const edges = data?.filterTwouEnrollment?.edges ?? [];\n\n return edges\n .map((edge: { node?: any }) => edge?.node)\n .filter(Boolean)\n .filter((node: any) => {\n const code = (node?.bpStatus?.code ?? '').toUpperCase();\n return ENROLLMENT_STATUSES.has(code);\n })\n .map((node: any): SubscriptionEnrollment => {\n const status = (node?.bpStatus?.code ?? '').toUpperCase();\n const courseRunKey = node.tCourseRunKey ?? null;\n const certificateId = node.tCertificateId?.trim() || null;\n const certificateUrl = getCertificateUrl(node.tCertificateUrl);\n\n return {\n biId: node.biId,\n courseMaId: node.tCourse?.maId ?? null,\n courseName: node.tCourse?.maName ?? null,\n courseSlug: null,\n imageUrl: node.tCourse?.imageUrl ?? null,\n orgName: resolveInstitutionName(node.tCourse),\n orgLogoUrl: null,\n courseRunKey,\n status,\n hasCertificate: Boolean(certificateUrl || certificateId),\n certificateUrl,\n };\n });\n}\n"]}
|
package/dist/types.d.ts
CHANGED
|
@@ -14,7 +14,10 @@ export interface CurrentUserSubscriberResult {
|
|
|
14
14
|
currentPeriodEnd: string | null;
|
|
15
15
|
subscriptionStartDate: string | null;
|
|
16
16
|
subscriptionEndDate: string | null;
|
|
17
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* Billing cycle / plan label used by UI (from `billingFrequency`,
|
|
19
|
+
* `renewalType`, or `planName` on the API payload).
|
|
20
|
+
*/
|
|
18
21
|
renewalType?: string | null;
|
|
19
22
|
/** Optional cancel timestamp when present. */
|
|
20
23
|
canceledAt?: string | null;
|
|
@@ -35,8 +38,9 @@ export interface SubscriptionEnrollment {
|
|
|
35
38
|
courseRunKey: string | null;
|
|
36
39
|
/** TwouEnrollment bpStatus.code (ACTIVE, COMPLETED, …). */
|
|
37
40
|
status: string | null;
|
|
38
|
-
/** True when
|
|
41
|
+
/** True when the enrollment has a certificate id and/or URL. */
|
|
39
42
|
hasCertificate: boolean;
|
|
43
|
+
/** Absolute certificate link (`COURSES_BASE_URL` + `tCertificateUrl`). */
|
|
40
44
|
certificateUrl: string | null;
|
|
41
45
|
}
|
|
42
46
|
/** Normalized invoice row for the Payment history tab. */
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG","sourcesContent":["/**\n * Manage Subscription — domain types for Viax subscriber + enrollment data.\n */\n\n/** GraphQL runner used by VIAX fetchers. */\nexport type GqlRunner = (\n query: string,\n variables?: Record<string, unknown>,\n) => Promise<any>;\n\n/** Result of `tIsCurrentUserSubscriber` (JSON scalar). */\nexport interface CurrentUserSubscriberResult {\n /** Has/expects access — drive manage vs upsell messaging. */\n isSubscriber: boolean,\n /** Enrollable right now (ACTIVE / TRIAL_ACTIVE). */\n canEnroll: boolean,\n subscriptionBiId: string | null,\n status: string | null,\n currentPeriodEnd: string | null,\n subscriptionStartDate: string | null,\n subscriptionEndDate: string | null,\n
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG","sourcesContent":["/**\n * Manage Subscription — domain types for Viax subscriber + enrollment data.\n */\n\n/** GraphQL runner used by VIAX fetchers. */\nexport type GqlRunner = (\n query: string,\n variables?: Record<string, unknown>,\n) => Promise<any>;\n\n/** Result of `tIsCurrentUserSubscriber` (JSON scalar). */\nexport interface CurrentUserSubscriberResult {\n /** Has/expects access — drive manage vs upsell messaging. */\n isSubscriber: boolean,\n /** Enrollable right now (ACTIVE / TRIAL_ACTIVE). */\n canEnroll: boolean,\n subscriptionBiId: string | null,\n status: string | null,\n currentPeriodEnd: string | null,\n subscriptionStartDate: string | null,\n subscriptionEndDate: string | null,\n /**\n * Billing cycle / plan label used by UI (from `billingFrequency`,\n * `renewalType`, or `planName` on the API payload).\n */\n renewalType?: string | null,\n /** Optional cancel timestamp when present. */\n canceledAt?: string | null,\n /** Optional price display amount when present. */\n amount?: string | null,\n currency?: string | null,\n}\n\n/** Normalized enrollment for the cancel confirmation course list. */\nexport interface SubscriptionEnrollment {\n biId: string,\n courseMaId: string | null,\n courseName: string | null,\n courseSlug: string | null,\n /** Course card / thumbnail image. */\n imageUrl: string | null,\n orgName: string | null,\n orgLogoUrl: string | null,\n courseRunKey: string | null,\n /** TwouEnrollment bpStatus.code (ACTIVE, COMPLETED, …). */\n status: string | null,\n /** True when the enrollment has a certificate id and/or URL. */\n hasCertificate: boolean,\n /** Absolute certificate link (`COURSES_BASE_URL` + `tCertificateUrl`). */\n certificateUrl: string | null,\n}\n\n/** Normalized invoice row for the Payment history tab. */\nexport interface PaymentHistoryItem {\n biId: string,\n /** Display order number, e.g. EDX-BI3X25N5SY30OSIK */\n orderNumber: string,\n stripeInvoiceId: string | null,\n status: string | null,\n billDate: string | null,\n periodStart: string | null,\n periodEnd: string | null,\n /** Charged amount in major currency units (e.g. 59.00). */\n amount: number,\n currency: string,\n isTrial: boolean,\n}\n\n/** UI view derived from subscriber status. */\nexport type SubscriptionView =\n | 'none'\n | 'active'\n | 'canceled_access'\n | 'canceled_expired';\n\nexport type ManageTab = 'subscription' | 'payment-history';\n\nexport type BillingCycle = 'monthly' | 'annual';\n\nexport interface BillingPlanOwnershipModel {\n uid: string,\n omName: string,\n}\n\n/** Normalized row from `filterCustomerBillingPlan`. */\nexport interface BillingPlan {\n uid: string,\n stripePriceId: string,\n /** Price amount e.g. \"39.99\" */\n amount: string,\n /** Currency code e.g. \"USD\" */\n currency: string,\n isTemplate: boolean,\n ownershipModel: BillingPlanOwnershipModel,\n}\n\nexport interface BillingPlansResult {\n plans: BillingPlan[],\n}\n"]}
|
package/dist/utils/edxSession.js
CHANGED
|
@@ -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.
|
|
20
|
-
signature: '
|
|
19
|
+
payload: 'eyJhbGciOiJSUzUxMiIsImtpZCI6Imxtc3N0YWdlMDAyIiwidHlwIjoiSldUIn0.eyJhdWQiOiJJbmtvY3VqTGlreXVjc0Vkd2lXYXRkZWJyRWFja21ldkxha0R1aWZLb29zaGtha1dvdyIsImV4cCI6MTc4NzY3MDk3MCwiZ3JhbnRfdHlwZSI6InBhc3N3b3JkIiwiaWF0IjoxNzg3NjY3MzcwLCJpc3MiOiJodHRwczovL2NvdXJzZXMuc3RhZ2UuZWR4Lm9yZy9vYXV0aDIiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJNXzI2MDhfT1o2QSIsInNjb3BlcyI6WyJ1c2VyX2lkIiwiZW1haWwiLCJwcm9maWxlIl0sInZlcnNpb24iOiIxLjIuMCIsInN1YiI6ImU4MGRhNjk4MjQ1MWM2MmVmZmM3MDc0MjRjOTVmNjVlIiwiZmlsdGVycyI6WyJ1c2VyOm1lIl0sImlzX3Jlc3RyaWN0ZWQiOmZhbHNlLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwidXNlcl9pZCI6NTI4NDk1NywiZW1haWwiOiJtc2FoYS1zb25hdGErVGVzdHVzZXIwMUAydS5jb20iLCJuYW1lIjoiTWFoYS1CMkMtVGVzdCIsImZhbWlseV9uYW1lIjoiIiwiZ2l2ZW5fbmFtZSI6IiIsImFkbWluaXN0cmF0b3IiOmZhbHNlLCJzdXBlcnVzZXIiOmZhbHNlfQ',
|
|
20
|
+
signature: 'DjXh1h8I8U8hRQmgEDn58gWQcxM7wBmDj0jJpWVb_Li5JvnVr-3a8MAsmtxa8MIEitYVJIXvq-AAenGYbJBbPYYpeYZ7DT-WERf341F4mokhsRSSXKIaLp6Gk-341879jC9UkXz-DeXEpoAJDaY4879wR3daaaOTmtS5jxj6ywOhlVYM4D4gGluXFdKAQ3sANJfUIA5YA_QKJWM434SUo6YGifQ-ZyVreDK7OdGOygkyVti4T4UusEtaJ0Zh_yXbZEc6gbmPOuE7ndzlTh25LZx_vwXpcx_QI_YlBKO0aMoL5J2ma9_O0jqqgN9-hhCbU09_GTw2lpM2tf6GmK4b7A'
|
|
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,
|
|
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,ovBAAovB;IAC7vB,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.eyJhdWQiOiJJbmtvY3VqTGlreXVjc0Vkd2lXYXRkZWJyRWFja21ldkxha0R1aWZLb29zaGtha1dvdyIsImV4cCI6MTc4NzY3MDk3MCwiZ3JhbnRfdHlwZSI6InBhc3N3b3JkIiwiaWF0IjoxNzg3NjY3MzcwLCJpc3MiOiJodHRwczovL2NvdXJzZXMuc3RhZ2UuZWR4Lm9yZy9vYXV0aDIiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJNXzI2MDhfT1o2QSIsInNjb3BlcyI6WyJ1c2VyX2lkIiwiZW1haWwiLCJwcm9maWxlIl0sInZlcnNpb24iOiIxLjIuMCIsInN1YiI6ImU4MGRhNjk4MjQ1MWM2MmVmZmM3MDc0MjRjOTVmNjVlIiwiZmlsdGVycyI6WyJ1c2VyOm1lIl0sImlzX3Jlc3RyaWN0ZWQiOmZhbHNlLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwidXNlcl9pZCI6NTI4NDk1NywiZW1haWwiOiJtc2FoYS1zb25hdGErVGVzdHVzZXIwMUAydS5jb20iLCJuYW1lIjoiTWFoYS1CMkMtVGVzdCIsImZhbWlseV9uYW1lIjoiIiwiZ2l2ZW5fbmFtZSI6IiIsImFkbWluaXN0cmF0b3IiOmZhbHNlLCJzdXBlcnVzZXIiOmZhbHNlfQ',\n signature: 'DjXh1h8I8U8hRQmgEDn58gWQcxM7wBmDj0jJpWVb_Li5JvnVr-3a8MAsmtxa8MIEitYVJIXvq-AAenGYbJBbPYYpeYZ7DT-WERf341F4mokhsRSSXKIaLp6Gk-341879jC9UkXz-DeXEpoAJDaY4879wR3daaaOTmtS5jxj6ywOhlVYM4D4gGluXFdKAQ3sANJfUIA5YA_QKJWM434SUo6YGifQ-ZyVreDK7OdGOygkyVti4T4UusEtaJ0Zh_yXbZEc6gbmPOuE7ndzlTh25LZx_vwXpcx_QI_YlBKO0aMoL5J2ma9_O0jqqgN9-hhCbU09_GTw2lpM2tf6GmK4b7A'\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/dist/utils/queries.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export declare const GET_IS_CURRENT_USER_SUBSCRIBER = "query IsCurrentUserSubscr
|
|
|
10
10
|
* Enrollments for cancel confirmation.
|
|
11
11
|
* Build `_filter` client-side, e.g. tSubscriptionBiId IN ('BI…', 'BI…').
|
|
12
12
|
*/
|
|
13
|
-
export declare 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 tCourse {\n maId\n maName\n imageUrl\n tBrandText\n tSchools {\n tName\n tSortValue\n }\n }\n }\n }\n }\n}";
|
|
13
|
+
export declare 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}";
|
|
14
14
|
/**
|
|
15
15
|
* Invoices for the learner's subscription (payment history).
|
|
16
16
|
* Filter is inlined client-side: biRelatesTo.biId = '<subscriptionBiId>'.
|
package/dist/utils/queries.js
CHANGED
|
@@ -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
|
|
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;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;EAkBjC,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;;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 subscription (payment history).\n * Filter is inlined client-side: biRelatesTo.biId = '<subscriptionBiId>'.\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 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 * 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"]}
|
package/dist/utils/urls.d.ts
CHANGED
|
@@ -11,3 +11,10 @@ export declare function getLearnerHelpCenterUrl(): string;
|
|
|
11
11
|
export declare function getLearnerDashboardUrl(): string;
|
|
12
12
|
/** Optional change-to-annual checkout deep link. */
|
|
13
13
|
export declare function getChangeToAnnualUrl(): string;
|
|
14
|
+
/** Courses / LMS host used for certificate and course deep links. */
|
|
15
|
+
export declare function getCoursesBaseUrl(): string;
|
|
16
|
+
/**
|
|
17
|
+
* Resolve a certificate path (`tCertificateUrl`) against COURSES_BASE_URL.
|
|
18
|
+
* Returns null when the path is empty.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getCertificateUrl(certificatePath: string | null | undefined): string | null;
|
package/dist/utils/urls.js
CHANGED
|
@@ -15,7 +15,7 @@ export function getCheckoutUrl() {
|
|
|
15
15
|
if (fromRole) {
|
|
16
16
|
return fromRole;
|
|
17
17
|
}
|
|
18
|
-
return '/checkout
|
|
18
|
+
return '/checkout';
|
|
19
19
|
}
|
|
20
20
|
/** Marketing page for "Learn about edX Subscription". */
|
|
21
21
|
export function getLearnMoreUrl() {
|
|
@@ -49,4 +49,28 @@ export function getChangeToAnnualUrl() {
|
|
|
49
49
|
}
|
|
50
50
|
return `${getCheckoutUrl()}?plan=annual`;
|
|
51
51
|
}
|
|
52
|
+
/** Courses / LMS host used for certificate and course deep links. */
|
|
53
|
+
export function getCoursesBaseUrl() {
|
|
54
|
+
var _a, _b;
|
|
55
|
+
const config = getAppConfig(appId);
|
|
56
|
+
return (_b = (_a = config.COURSES_BASE_URL) === null || _a === void 0 ? void 0 : _a.replace(/\/+$/, '')) !== null && _b !== void 0 ? _b : '';
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Resolve a certificate path (`tCertificateUrl`) against COURSES_BASE_URL.
|
|
60
|
+
* Returns null when the path is empty.
|
|
61
|
+
*/
|
|
62
|
+
export function getCertificateUrl(certificatePath) {
|
|
63
|
+
const path = certificatePath === null || certificatePath === void 0 ? void 0 : certificatePath.trim();
|
|
64
|
+
if (!path) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
if (/^https?:\/\//i.test(path)) {
|
|
68
|
+
return path;
|
|
69
|
+
}
|
|
70
|
+
const base = getCoursesBaseUrl();
|
|
71
|
+
if (!base) {
|
|
72
|
+
return path.startsWith('/') ? path : `/${path}`;
|
|
73
|
+
}
|
|
74
|
+
return `${base}${path.startsWith('/') ? path : `/${path}`}`;
|
|
75
|
+
}
|
|
52
76
|
//# sourceMappingURL=urls.js.map
|
package/dist/utils/urls.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urls.js","sourceRoot":"","sources":["../../src/utils/urls.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAExF,OAAO,EACL,+BAA+B,EAC/B,mCAAmC,EACnC,KAAK,EACL,wBAAwB,GACzB,MAAM,cAAc,CAAC;AAEtB,6DAA6D;AAC7D,MAAM,UAAU,cAAc;;IAC5B,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,YAAkC,CAAC;IAC7D,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAA,iBAAiB,CAAC,wBAAwB,CAAC,0CAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClF,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,
|
|
1
|
+
{"version":3,"file":"urls.js","sourceRoot":"","sources":["../../src/utils/urls.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAExF,OAAO,EACL,+BAA+B,EAC/B,mCAAmC,EACnC,KAAK,EACL,wBAAwB,GACzB,MAAM,cAAc,CAAC;AAEtB,6DAA6D;AAC7D,MAAM,UAAU,cAAc;;IAC5B,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,YAAkC,CAAC;IAC7D,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAA,iBAAiB,CAAC,wBAAwB,CAAC,0CAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClF,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,eAAe;;IAC7B,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,MAAC,MAAM,CAAC,2BAAkD,mCAC5D,mCAAmC,CAAC;AAC3C,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,uBAAuB;;IACrC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,MAAC,MAAM,CAAC,uBAA8C,mCACxD,+BAA+B,CAAC;AACvC,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,sBAAsB;;IACpC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,qBAA2C,CAAC;IACtE,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,GAAG,GAAG,MAAA,MAAA,aAAa,EAAE,CAAC,UAAU,0CAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,mCAAI,EAAE,CAAC;IAClE,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;AACjD,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,oBAAoB;IAClC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,oBAA0C,CAAC;IACrE,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,GAAG,cAAc,EAAE,cAAc,CAAC;AAC3C,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,iBAAiB;;IAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,MAAA,MAAC,MAAM,CAAC,gBAAuC,0CAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,mCAAI,EAAE,CAAC;AACpF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,eAA0C;IAC1E,MAAM,IAAI,GAAG,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAClD,CAAC;IACD,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;AAC9D,CAAC","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().lmsBaseUrl?.replace(/\\/+$/, '') ?? '';\n return lms ? `${lms}/dashboard` : '/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"]}
|