@edx/frontend-app-subscription-learner-dashboard 1.56.0 → 1.58.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/containers/CourseCard/components/CourseCardActions/BeginCourseButton.js +1 -1
- package/dist/containers/CourseCard/components/CourseCardActions/BeginCourseButton.js.map +1 -1
- package/dist/containers/CourseCard/components/CourseCardActions/ResumeButton.js +1 -1
- package/dist/containers/CourseCard/components/CourseCardActions/ResumeButton.js.map +1 -1
- package/dist/containers/CourseCard/components/CourseCardActions/ViewCourseButton.js +1 -1
- package/dist/containers/CourseCard/components/CourseCardActions/ViewCourseButton.js.map +1 -1
- package/dist/containers/CourseCard/components/CourseCardBanners/CourseUpgradeButton.js +8 -1
- package/dist/containers/CourseCard/components/CourseCardBanners/CourseUpgradeButton.js.map +1 -1
- package/dist/containers/CourseCard/components/CourseCardBanners/FindCourseBanner.d.ts +3 -1
- package/dist/containers/CourseCard/components/CourseCardBanners/FindCourseBanner.js +6 -2
- package/dist/containers/CourseCard/components/CourseCardBanners/FindCourseBanner.js.map +1 -1
- package/dist/containers/CourseCard/components/CourseCardBanners/ViewCertificateBanner.js +5 -3
- package/dist/containers/CourseCard/components/CourseCardBanners/ViewCertificateBanner.js.map +1 -1
- package/dist/containers/CourseCard/components/CourseCardBanners/ViewCourseDetailBanner.d.ts +3 -1
- package/dist/containers/CourseCard/components/CourseCardBanners/ViewCourseDetailBanner.js +6 -2
- package/dist/containers/CourseCard/components/CourseCardBanners/ViewCourseDetailBanner.js.map +1 -1
- package/dist/containers/CourseCard/components/CourseCardBanners/ViewGradesBanner.js +4 -2
- package/dist/containers/CourseCard/components/CourseCardBanners/ViewGradesBanner.js.map +1 -1
- package/dist/containers/CourseCard/components/CourseCardBanners/index.js +1 -1
- package/dist/containers/CourseCard/components/CourseCardBanners/index.js.map +1 -1
- package/dist/containers/CoursesPanel/CourseList/index.js +10 -1
- package/dist/containers/CoursesPanel/CourseList/index.js.map +1 -1
- package/dist/containers/CoursesPanel/NoCoursesView/index.js +4 -1
- package/dist/containers/CoursesPanel/NoCoursesView/index.js.map +1 -1
- package/dist/containers/ProductCard/index.js +5 -1
- package/dist/containers/ProductCard/index.js.map +1 -1
- package/dist/containers/ProgramDashboard/ProgramProgress/CompletedTabData/CompletedRecordBanner/index.js +3 -1
- package/dist/containers/ProgramDashboard/ProgramProgress/CompletedTabData/CompletedRecordBanner/index.js.map +1 -1
- package/dist/containers/ProgramDashboard/ProgramProgress/ProgramProgress.js +2 -1
- package/dist/containers/ProgramDashboard/ProgramProgress/ProgramProgress.js.map +1 -1
- package/dist/containers/ProgramDashboard/ProgramProgress/ProgressCard/index.js +2 -2
- package/dist/containers/ProgramDashboard/ProgramProgress/ProgressCard/index.js.map +1 -1
- package/dist/containers/ProgramDashboard/ProgramProgress/ProgressCardActions/ProgressCardButton.js +16 -4
- package/dist/containers/ProgramDashboard/ProgramProgress/ProgressCardActions/ProgressCardButton.js.map +1 -1
- package/dist/containers/ProgramDashboard/ProgramProgress/ProgressCardActions/UpgradeCourseButton.js +6 -1
- package/dist/containers/ProgramDashboard/ProgramProgress/ProgressCardActions/UpgradeCourseButton.js.map +1 -1
- package/dist/containers/ProgramDashboard/ProgramProgress/ProgressCardActions/index.js +3 -3
- package/dist/containers/ProgramDashboard/ProgramProgress/ProgressCardActions/index.js.map +1 -1
- package/dist/containers/ProgramDashboard/ProgramsList/ProgramListCard.js +5 -1
- package/dist/containers/ProgramDashboard/ProgramsList/ProgramListCard.js.map +1 -1
- package/dist/containers/ProgramDashboard/ProgramsList/index.js +9 -1
- package/dist/containers/ProgramDashboard/ProgramsList/index.js.map +1 -1
- package/dist/containers/ProgramsPanel/NoProgramsView/index.js +4 -1
- package/dist/containers/ProgramsPanel/NoProgramsView/index.js.map +1 -1
- package/dist/containers/SubscriptionBanner/components/SubscriptionBanner.js +19 -3
- package/dist/containers/SubscriptionBanner/components/SubscriptionBanner.js.map +1 -1
- package/dist/containers/SubscriptionInformation/components/SubscriptionInformation.js +18 -5
- package/dist/containers/SubscriptionInformation/components/SubscriptionInformation.js.map +1 -1
- package/dist/hooks/useCourseTrackingEvent.d.ts +1 -1
- package/dist/hooks/useCourseTrackingEvent.js.map +1 -1
- package/dist/hooks/useProgramTrackingEvents.d.ts +2 -0
- package/dist/hooks/useProgramTrackingEvents.js +9 -0
- package/dist/hooks/useProgramTrackingEvents.js.map +1 -0
- package/dist/tracking/constants.js +15 -7
- package/dist/tracking/constants.js.map +1 -1
- package/dist/tracking/index.d.ts +2 -0
- package/dist/tracking/index.js +2 -0
- package/dist/tracking/index.js.map +1 -1
- package/dist/tracking/trackers/course.d.ts +6 -2
- package/dist/tracking/trackers/course.js +7 -2
- package/dist/tracking/trackers/course.js.map +1 -1
- package/dist/tracking/trackers/program.d.ts +7 -0
- package/dist/tracking/trackers/program.js +27 -0
- package/dist/tracking/trackers/program.js.map +1 -0
- package/dist/tracking/trackers/programProgress.d.ts +16 -0
- package/dist/tracking/trackers/programProgress.js +25 -0
- package/dist/tracking/trackers/programProgress.js.map +1 -0
- package/dist/tracking/trackers/subscription.d.ts +10 -0
- package/dist/tracking/trackers/subscription.js +12 -0
- package/dist/tracking/trackers/subscription.js.map +1 -0
- package/dist/widgets/ProgressiveProfilingQuiz/SearchPageBanners/BannerEntry.js +34 -2
- package/dist/widgets/ProgressiveProfilingQuiz/SearchPageBanners/BannerEntry.js.map +1 -1
- package/dist/widgets/ProgressiveProfilingQuiz/SearchPageBanners/messages.js +1 -1
- package/dist/widgets/ProgressiveProfilingQuiz/SearchPageBanners/messages.js.map +1 -1
- package/dist/widgets/ProgressiveProfilingQuiz/data/constants.d.ts +1 -1
- package/dist/widgets/ProgressiveProfilingQuiz/data/constants.js +1 -1
- package/dist/widgets/ProgressiveProfilingQuiz/data/constants.js.map +1 -1
- package/package.json +1 -1
|
@@ -9,8 +9,9 @@ import { manageSubscriptionURL } from '../../../data/constants/app';
|
|
|
9
9
|
import '../index.scss';
|
|
10
10
|
import { Cached, WarningFilled, Cancel } from '@openedx/paragon/icons';
|
|
11
11
|
import { subscriptionRenewalURL } from '../../../data/constants/app';
|
|
12
|
+
import { eventNames, trackSubscriptionEvent } from '../../../tracking/trackers/subscription';
|
|
12
13
|
export const SubscriptionInformation = () => {
|
|
13
|
-
var _a, _b, _c, _d;
|
|
14
|
+
var _a, _b, _c, _d, _e;
|
|
14
15
|
const { data: subsData } = useInitializeSubsDashboard();
|
|
15
16
|
const { formatMessage } = useIntl();
|
|
16
17
|
const formatDate = utilHooks.useFormatDate();
|
|
@@ -65,14 +66,26 @@ export const SubscriptionInformation = () => {
|
|
|
65
66
|
const getSubscriptionAction = useMemo(() => {
|
|
66
67
|
if (status === 'CANCELLED' || status === 'CANCEL_PENDING') {
|
|
67
68
|
return ([
|
|
68
|
-
_jsx(Button, { "data-testid": "renew-button", className: "renew-button", variant: "tertiary", href: subscriptionRenewalURL,
|
|
69
|
+
_jsx(Button, { "data-testid": "renew-button", className: "renew-button", variant: "tertiary", href: subscriptionRenewalURL, onClick: () => {
|
|
70
|
+
var _a;
|
|
71
|
+
return trackSubscriptionEvent(eventNames.renewSubscriptionClicked, {
|
|
72
|
+
subscription_status: status,
|
|
73
|
+
plan_name: (_a = subsData === null || subsData === void 0 ? void 0 : subsData.userSubscription) === null || _a === void 0 ? void 0 : _a.planName,
|
|
74
|
+
});
|
|
75
|
+
}, target: "_blank", rel: "noopener noreferrer", role: "link", children: formatMessage(messages.renewSubscriptionButton) }, "renew-subscription"),
|
|
69
76
|
]);
|
|
70
77
|
}
|
|
71
78
|
else
|
|
72
79
|
return ([
|
|
73
|
-
_jsx(Button, { variant: "tertiary", "data-testid": "manage-button", href: manageSubscriptionURL,
|
|
80
|
+
_jsx(Button, { variant: "tertiary", "data-testid": "manage-button", href: manageSubscriptionURL, onClick: () => {
|
|
81
|
+
var _a;
|
|
82
|
+
return trackSubscriptionEvent(eventNames.manageSubscriptionClicked, {
|
|
83
|
+
subscription_status: status,
|
|
84
|
+
plan_name: (_a = subsData === null || subsData === void 0 ? void 0 : subsData.userSubscription) === null || _a === void 0 ? void 0 : _a.planName,
|
|
85
|
+
});
|
|
86
|
+
}, target: "_blank", rel: "noopener noreferrer", role: "link", children: formatMessage(messages.manageSubscriptionMessage) }, "manage-subscription"),
|
|
74
87
|
]);
|
|
75
|
-
}, [formatMessage, status]);
|
|
88
|
+
}, [formatMessage, status, (_d = subsData === null || subsData === void 0 ? void 0 : subsData.userSubscription) === null || _d === void 0 ? void 0 : _d.planName]);
|
|
76
89
|
const subscriptionStatusIcons = {
|
|
77
90
|
ACTIVE: Cached,
|
|
78
91
|
TRIAL_ACTIVE: Cached,
|
|
@@ -81,7 +94,7 @@ export const SubscriptionInformation = () => {
|
|
|
81
94
|
RENEWAL_PENDING: Cached,
|
|
82
95
|
CANCEL_PENDING: Cancel,
|
|
83
96
|
};
|
|
84
|
-
const bannerIcon = (
|
|
97
|
+
const bannerIcon = (_e = subscriptionStatusIcons[status]) !== null && _e !== void 0 ? _e : undefined;
|
|
85
98
|
return (_jsxs("div", { className: "container subscription-information py-5 px-4", children: [_jsx("h2", { className: "mb-4 my-subscription-heading", children: formatMessage(messages.mySubscriptionHeading) }), _jsxs(Alert, { dismissible: false, show: true, actions: getSubscriptionAction, className: "subscription-status-alert bg-white", children: [_jsxs(Alert.Heading, { as: "h6", children: [_jsx(Icon, { src: bannerIcon, className: `icon mr-1 ${bannerIcon === WarningFilled ? 'warning-icon text-warning-500' : ''}`, "data-testid": "subscription-status-icon" }), infoTitle] }), _jsx("p", { children: infoBody })] })] }));
|
|
86
99
|
};
|
|
87
100
|
//# sourceMappingURL=SubscriptionInformation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubscriptionInformation.js","sourceRoot":"","sources":["../../../../src/containers/SubscriptionInformation/components/SubscriptionInformation.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAM,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,QAAQ,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAQ,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,CAAC,MAAM,uBAAuB,GAAO,GAAG,EAAE;;IAC9C,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,0BAA0B,EAAE,CAAC;IACxD,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;IAC7C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,gBAAgB,0CAAE,MAAM,CAAC;IAElD,SAAS,CAAC,GAAG,EAAE;;QACb,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,YAAY,CAAC,EAAE,CAAC,CAAC;YACjB,WAAW,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,QAAQ,CAAC;YACd,KAAK,cAAc,CAAC;YACpB,KAAK,iBAAiB;gBACpB,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC,uBAAuB,EAAE;oBAC3D,kBAAkB,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;oBACvH,QAAQ,EAAE,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,gBAAgB,0CAAE,QAAQ;iBAC/C,CAAC,CAAC,CAAC;gBACJ,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,EAAE;oBACjD,uBAAuB,EAAE,UAAU,CAAC,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,gBAAgB,0CAAE,gBAAgB,CAAC;iBAClF,CAAC,CAAC,CAAC;gBACJ,MAAM;YACR,KAAK,gBAAgB;gBACnB,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC,0BAA0B,EAAE;oBAC9D,kBAAkB,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;oBACvH,QAAQ,EAAE,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,gBAAgB,0CAAE,QAAQ;iBAC/C,CAAC,CAAC,CAAC;gBACJ,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,yBAAyB,EAAE;oBAC5D,0BAA0B,EAAE,UAAU,CAAC,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,gBAAgB,0CAAE,gBAAgB,CAAC;iBACrF,CAAC,CAAC,CAAC;gBACJ,MAAM;YACR,KAAK,WAAW;gBACd,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC,0BAA0B,EAAE;oBAC9D,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;oBAClF,QAAQ,EAAE,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,gBAAgB,0CAAE,QAAQ;iBAC/C,CAAC,CAAC,CAAC;gBACJ,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,yBAAyB,EAAE;oBAC5D,0BAA0B,EAAE,UAAU,CAAC,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,gBAAgB,0CAAE,gBAAgB,CAAC;iBACrF,CAAC,CAAC,CAAC;gBACJ,MAAM;YACR,KAAK,gBAAgB,EAAE,iDAAiD;gBACtE,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBACzD,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,iBAAiB,EAAE;oBACpD,uBAAuB,EAAE,UAAU,CAAC,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,gBAAgB,0CAAE,gBAAgB,CAAC;iBAClF,CAAC,CAAC,CAAC;gBACJ,MAAM;QACV,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,gBAAgB,0CAAE,QAAQ,EAAE,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,gBAAgB,0CAAE,gBAAgB,CAAC,CAAC,CAAC;IAE5H,MAAM,qBAAqB,GAAG,OAAO,CAAC,GAAG,EAAE;QACzC,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,gBAAgB,EAAE,CAAC;YAC1D,OAAO,CACL;gBACE,KAAC,MAAM,mBAEO,cAAc,EAC1B,SAAS,EAAC,cAAc,EACxB,OAAO,EAAC,UAAU,EAClB,IAAI,EAAE,sBAAsB,EAC5B,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,IAAI,EAAC,MAAM,YAEV,aAAa,CAAC,QAAQ,CAAC,uBAAuB,CAAC,IAT5C,oBAAoB,CAUjB;aACV,CACF,CAAC;QACJ,CAAC;;YACC,OAAO,CACL;gBACE,KAAC,MAAM,IAEL,OAAO,EAAC,UAAU,iBACN,eAAe,EAC3B,IAAI,EAAE,qBAAqB,EAC3B,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,IAAI,EAAC,MAAM,YAEV,aAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,IAR9C,qBAAqB,CASlB;aACV,CACF,CAAC;IACN,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;IAE5B,MAAM,uBAAuB,GAA4C;QACvE,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,MAAM;QACpB,SAAS,EAAE,MAAM;QACjB,cAAc,EAAE,aAAa;QAC7B,eAAe,EAAE,MAAM;QACvB,cAAc,EAAE,MAAM;KACvB,CAAC;IAEF,MAAM,UAAU,GAAG,MAAA,uBAAuB,CAAC,MAAM,CAAC,mCAAI,SAAS,CAAC;IAEhE,OAAO,CACL,eAAK,SAAS,EAAC,8CAA8C,aAC3D,aAAI,SAAS,EAAC,8BAA8B,YAAE,aAAa,CAAC,QAAQ,CAAC,qBAAqB,CAAC,GAAM,EACjG,MAAC,KAAK,IACJ,WAAW,EAAE,KAAK,EAClB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,qBAAqB,EAC9B,SAAS,EAAC,oCAAoC,aAE9C,MAAC,KAAK,CAAC,OAAO,IAAC,EAAE,EAAC,IAAI,aACpB,KAAC,IAAI,IAAC,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,UAAU,KAAK,aAAa,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAAE,EAAE,iBAAc,0BAA0B,GAAG,EAC9J,SAAS,IACI,EAChB,sBACG,QAAQ,GACP,IACE,IACJ,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { FC, useEffect, useMemo, useState } from 'react';\nimport { Alert, Button, Icon } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\nimport { utilHooks } from '@src/hooks';\nimport { useInitializeSubsDashboard } from '@src/data/hooks';\nimport messages from '../messages';\nimport { manageSubscriptionURL } from '@src/data/constants/app';\nimport '../index.scss';\nimport { Cached, WarningFilled, Cancel, Info } from '@openedx/paragon/icons';\nimport { subscriptionRenewalURL } from '@src/data/constants/app';\n\nexport const SubscriptionInformation: FC = () => {\n const { data: subsData } = useInitializeSubsDashboard();\n const { formatMessage } = useIntl();\n const formatDate = utilHooks.useFormatDate();\n const [infoBody, setInfoBody] = useState('');\n const [infoTitle, setInfoTitle] = useState('');\n const status = subsData?.userSubscription?.status;\n\n useEffect(() => {\n if (!status) {\n setInfoTitle('');\n setInfoBody('');\n return;\n }\n\n switch (status) {\n case 'ACTIVE':\n case 'TRIAL_ACTIVE':\n case 'RENEWAL_PENDING':\n setInfoTitle(formatMessage(messages.activeSubscriptionTitle, {\n subscriptionStatus: status.split('_').map(part => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase()).join(' '),\n planName: subsData?.userSubscription?.planName,\n }));\n setInfoBody(formatMessage(messages.renewalMessage, {\n subscriptionRenewalDate: formatDate(subsData?.userSubscription?.currentPeriodEnd),\n }));\n break;\n case 'CANCEL_PENDING':\n setInfoTitle(formatMessage(messages.cancelledSubscriptionTitle, {\n subscriptionStatus: status.split('_').map(part => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase()).join(' '),\n planName: subsData?.userSubscription?.planName,\n }));\n setInfoBody(formatMessage(messages.cancelledSubscriptionBody, {\n subscriptionRenewalEndDate: formatDate(subsData?.userSubscription?.currentPeriodEnd),\n }));\n break;\n case 'CANCELLED':\n setInfoTitle(formatMessage(messages.cancelledSubscriptionTitle, {\n subscriptionStatus: status.charAt(0).toUpperCase() + status.slice(1).toLowerCase(),\n planName: subsData?.userSubscription?.planName,\n }));\n setInfoBody(formatMessage(messages.cancelledSubscriptionBody, {\n subscriptionRenewalEndDate: formatDate(subsData?.userSubscription?.currentPeriodEnd),\n }));\n break;\n case 'RENEWAL_FAILED': // also known as 'Payment Error' in figma designs\n setInfoTitle(formatMessage(messages.renewalFailedTitle));\n setInfoBody(formatMessage(messages.renewalFailedBody, {\n subscriptionRenewalDate: formatDate(subsData?.userSubscription?.currentPeriodEnd),\n }));\n break;\n }\n }, [formatDate, formatMessage, status, subsData?.userSubscription?.planName, subsData?.userSubscription?.currentPeriodEnd]);\n\n const getSubscriptionAction = useMemo(() => {\n if (status === 'CANCELLED' || status === 'CANCEL_PENDING') {\n return (\n [\n <Button\n key=\"renew-subscription\"\n data-testid=\"renew-button\"\n className=\"renew-button\"\n variant=\"tertiary\"\n href={subscriptionRenewalURL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n role=\"link\"\n >\n {formatMessage(messages.renewSubscriptionButton)}\n </Button>,\n ]\n );\n } else\n return (\n [\n <Button\n key=\"manage-subscription\"\n variant=\"tertiary\"\n data-testid=\"manage-button\"\n href={manageSubscriptionURL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n role=\"link\"\n >\n {formatMessage(messages.manageSubscriptionMessage)}\n </Button>,\n ]\n );\n }, [formatMessage, status]);\n\n const subscriptionStatusIcons: Record<string, typeof Info | undefined> = {\n ACTIVE: Cached,\n TRIAL_ACTIVE: Cached,\n CANCELLED: Cancel,\n RENEWAL_FAILED: WarningFilled,\n RENEWAL_PENDING: Cached,\n CANCEL_PENDING: Cancel,\n };\n\n const bannerIcon = subscriptionStatusIcons[status] ?? undefined;\n\n return (\n <div className=\"container subscription-information py-5 px-4\">\n <h2 className=\"mb-4 my-subscription-heading\">{formatMessage(messages.mySubscriptionHeading)}</h2>\n <Alert\n dismissible={false}\n show={true}\n actions={getSubscriptionAction}\n className=\"subscription-status-alert bg-white\"\n >\n <Alert.Heading as=\"h6\">\n <Icon src={bannerIcon} className={`icon mr-1 ${bannerIcon === WarningFilled ? 'warning-icon text-warning-500' : ''}`} data-testid=\"subscription-status-icon\" />\n {infoTitle}\n </Alert.Heading>\n <p>\n {infoBody}\n </p>\n </Alert>\n </div>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"SubscriptionInformation.js","sourceRoot":"","sources":["../../../../src/containers/SubscriptionInformation/components/SubscriptionInformation.tsx"],"names":[],"mappings":"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","sourcesContent":["import { FC, useEffect, useMemo, useState } from 'react';\nimport { Alert, Button, Icon } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\nimport { utilHooks } from '@src/hooks';\nimport { useInitializeSubsDashboard } from '@src/data/hooks';\nimport messages from '../messages';\nimport { manageSubscriptionURL } from '@src/data/constants/app';\nimport '../index.scss';\nimport { Cached, WarningFilled, Cancel, Info } from '@openedx/paragon/icons';\nimport { subscriptionRenewalURL } from '@src/data/constants/app';\nimport { eventNames, trackSubscriptionEvent } from '@src/tracking/trackers/subscription';\n\nexport const SubscriptionInformation: FC = () => {\n const { data: subsData } = useInitializeSubsDashboard();\n const { formatMessage } = useIntl();\n const formatDate = utilHooks.useFormatDate();\n const [infoBody, setInfoBody] = useState('');\n const [infoTitle, setInfoTitle] = useState('');\n const status = subsData?.userSubscription?.status;\n\n useEffect(() => {\n if (!status) {\n setInfoTitle('');\n setInfoBody('');\n return;\n }\n\n switch (status) {\n case 'ACTIVE':\n case 'TRIAL_ACTIVE':\n case 'RENEWAL_PENDING':\n setInfoTitle(formatMessage(messages.activeSubscriptionTitle, {\n subscriptionStatus: status.split('_').map(part => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase()).join(' '),\n planName: subsData?.userSubscription?.planName,\n }));\n setInfoBody(formatMessage(messages.renewalMessage, {\n subscriptionRenewalDate: formatDate(subsData?.userSubscription?.currentPeriodEnd),\n }));\n break;\n case 'CANCEL_PENDING':\n setInfoTitle(formatMessage(messages.cancelledSubscriptionTitle, {\n subscriptionStatus: status.split('_').map(part => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase()).join(' '),\n planName: subsData?.userSubscription?.planName,\n }));\n setInfoBody(formatMessage(messages.cancelledSubscriptionBody, {\n subscriptionRenewalEndDate: formatDate(subsData?.userSubscription?.currentPeriodEnd),\n }));\n break;\n case 'CANCELLED':\n setInfoTitle(formatMessage(messages.cancelledSubscriptionTitle, {\n subscriptionStatus: status.charAt(0).toUpperCase() + status.slice(1).toLowerCase(),\n planName: subsData?.userSubscription?.planName,\n }));\n setInfoBody(formatMessage(messages.cancelledSubscriptionBody, {\n subscriptionRenewalEndDate: formatDate(subsData?.userSubscription?.currentPeriodEnd),\n }));\n break;\n case 'RENEWAL_FAILED': // also known as 'Payment Error' in figma designs\n setInfoTitle(formatMessage(messages.renewalFailedTitle));\n setInfoBody(formatMessage(messages.renewalFailedBody, {\n subscriptionRenewalDate: formatDate(subsData?.userSubscription?.currentPeriodEnd),\n }));\n break;\n }\n }, [formatDate, formatMessage, status, subsData?.userSubscription?.planName, subsData?.userSubscription?.currentPeriodEnd]);\n\n const getSubscriptionAction = useMemo(() => {\n if (status === 'CANCELLED' || status === 'CANCEL_PENDING') {\n return (\n [\n <Button\n key=\"renew-subscription\"\n data-testid=\"renew-button\"\n className=\"renew-button\"\n variant=\"tertiary\"\n href={subscriptionRenewalURL}\n onClick={() => trackSubscriptionEvent(eventNames.renewSubscriptionClicked, {\n subscription_status: status,\n plan_name: subsData?.userSubscription?.planName,\n })}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n role=\"link\"\n >\n {formatMessage(messages.renewSubscriptionButton)}\n </Button>,\n ]\n );\n } else\n return (\n [\n <Button\n key=\"manage-subscription\"\n variant=\"tertiary\"\n data-testid=\"manage-button\"\n href={manageSubscriptionURL}\n onClick={() => trackSubscriptionEvent(eventNames.manageSubscriptionClicked, {\n subscription_status: status,\n plan_name: subsData?.userSubscription?.planName,\n })}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n role=\"link\"\n >\n {formatMessage(messages.manageSubscriptionMessage)}\n </Button>,\n ]\n );\n }, [formatMessage, status, subsData?.userSubscription?.planName]);\n\n const subscriptionStatusIcons: Record<string, typeof Info | undefined> = {\n ACTIVE: Cached,\n TRIAL_ACTIVE: Cached,\n CANCELLED: Cancel,\n RENEWAL_FAILED: WarningFilled,\n RENEWAL_PENDING: Cached,\n CANCEL_PENDING: Cancel,\n };\n\n const bannerIcon = subscriptionStatusIcons[status] ?? undefined;\n\n return (\n <div className=\"container subscription-information py-5 px-4\">\n <h2 className=\"mb-4 my-subscription-heading\">{formatMessage(messages.mySubscriptionHeading)}</h2>\n <Alert\n dismissible={false}\n show={true}\n actions={getSubscriptionAction}\n className=\"subscription-status-alert bg-white\"\n >\n <Alert.Heading as=\"h6\">\n <Icon src={bannerIcon} className={`icon mr-1 ${bannerIcon === WarningFilled ? 'warning-icon text-warning-500' : ''}`} data-testid=\"subscription-status-icon\" />\n {infoTitle}\n </Alert.Heading>\n <p>\n {infoBody}\n </p>\n </Alert>\n </div>\n );\n};\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const useCourseTrackingEvent: (tracker: (...a: any[]) => any, cardId: string, ...args: any[]) => (e: Event) => void;
|
|
1
|
+
declare const useCourseTrackingEvent: (tracker: (...a: any[]) => any, cardId: string, ...args: any[]) => (e: Event | React.SyntheticEvent) => void;
|
|
2
2
|
export default useCourseTrackingEvent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCourseTrackingEvent.js","sourceRoot":"","sources":["../../src/hooks/useCourseTrackingEvent.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAE5C,MAAM,sBAAsB,GAAG,CAAC,OAA6B,EAAE,MAAc,EAAE,GAAG,IAAW,EAAE,EAAE;;IAC/F,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAC,UAAkB,aAAlB,UAAU,uBAAV,UAAU,CAAU,SAAS,0CAAE,QAAQ,CAAC;IAE1D,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"useCourseTrackingEvent.js","sourceRoot":"","sources":["../../src/hooks/useCourseTrackingEvent.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAE5C,MAAM,sBAAsB,GAAG,CAAC,OAA6B,EAAE,MAAc,EAAE,GAAG,IAAW,EAAE,EAAE;;IAC/F,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAC,UAAkB,aAAlB,UAAU,uBAAV,UAAU,CAAU,SAAS,0CAAE,QAAQ,CAAC;IAE1D,OAAO,CAAC,CAA+B,EAAE,EAAE;QACzC,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,sBAAsB,CAAC","sourcesContent":["import useCourseData from './useCourseData';\n\nconst useCourseTrackingEvent = (tracker: (...a: any[]) => any, cardId: string, ...args: any[]) => {\n const courseData = useCourseData(cardId);\n const courseId = (courseData as any)?.courseRun?.courseId;\n\n return (e: Event | React.SyntheticEvent) => {\n if (courseId) {\n tracker(courseId, ...args)(e);\n }\n };\n};\n\nexport default useCourseTrackingEvent;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useProgramTrackingEvents.js","sourceRoot":"","sources":["../../src/hooks/useProgramTrackingEvents.ts"],"names":[],"mappings":"AAAA,MAAM,uBAAuB,GAAG,CAC9B,OAA6B,EAC7B,SAAiB,EACjB,GAAG,IAAW,EACd,EAAE;IACF,OAAO,CAAC,CAA+B,EAAE,EAAE;QACzC,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,uBAAuB,CAAC","sourcesContent":["const useProgramTrackingEvent = (\n tracker: (...a: any[]) => any,\n programId: string,\n ...args: any[]\n) => {\n return (e: Event | React.SyntheticEvent) => {\n if (programId) {\n tracker(programId, ...args)(e);\n }\n };\n};\n\nexport default useProgramTrackingEvent;\n"]}
|
|
@@ -7,7 +7,7 @@ export const categories = StrictDict({
|
|
|
7
7
|
filter: 'filter',
|
|
8
8
|
});
|
|
9
9
|
export const events = StrictDict({
|
|
10
|
-
|
|
10
|
+
courseCardActionClicked: 'courseCardActionClicked',
|
|
11
11
|
courseImageClicked: 'courseImageClicked',
|
|
12
12
|
courseTitleClicked: 'courseTitleClicked',
|
|
13
13
|
courseOptionsDropdownClicked: 'courseOptionsDropdownClicked',
|
|
@@ -18,23 +18,31 @@ export const events = StrictDict({
|
|
|
18
18
|
leaveSession: 'leaveSession',
|
|
19
19
|
unenrollReason: 'unenrollReason',
|
|
20
20
|
entitlementUnenrollReason: 'entitlementUnenrollReason',
|
|
21
|
+
noCoursesViewClicked: 'noCoursesViewClicked',
|
|
22
|
+
noProgramsViewClicked: 'noProgramsViewClicked',
|
|
23
|
+
courseListPageSelected: 'courseListPageSelected',
|
|
24
|
+
programCardActionClicked: 'programCardActionClicked',
|
|
21
25
|
});
|
|
22
26
|
export const eventNames = StrictDict({
|
|
23
|
-
|
|
24
|
-
courseImageClicked: 'edx.
|
|
25
|
-
courseTitleClicked: 'edx.
|
|
26
|
-
courseOptionsDropdownClicked: 'edx.
|
|
27
|
+
courseCardActionClicked: 'edx.subscription.dashboard.course_card_action.clicked',
|
|
28
|
+
courseImageClicked: 'edx.subscription.dashboard.course_image.clicked',
|
|
29
|
+
courseTitleClicked: 'edx.subscription.dashboard.course_title.clicked',
|
|
30
|
+
courseOptionsDropdownClicked: 'edx.subscription.dashboard.course_options_dropdown.clicked',
|
|
31
|
+
noCoursesViewClicked: 'edx.subscription.dashboard.no_courses_view.clicked',
|
|
32
|
+
noProgramsViewClicked: 'edx.subscription.dashboard.no_programs_view.clicked',
|
|
27
33
|
shareClicked: 'edx.course.share_clicked',
|
|
34
|
+
courseListPageSelected: 'edx.subscription.learner.course.list.page.selected',
|
|
28
35
|
userSettingsChanged: 'edx.user.settings.changed',
|
|
29
36
|
newSession: 'course-dashboard.new-session',
|
|
30
37
|
switchSession: 'course-dashboard.switch-session',
|
|
31
38
|
leaveSession: 'course-dashboard.leave-session',
|
|
32
39
|
unenrollReason: 'unenrollment_reason.selected',
|
|
33
40
|
entitlementUnenrollReason: 'entitlement_unenrollment_reason.selected',
|
|
34
|
-
findCoursesClicked: 'edx.
|
|
35
|
-
purchaseCredit: 'edx.
|
|
41
|
+
findCoursesClicked: 'edx.subscription.dashboard.find_courses_button.clicked',
|
|
42
|
+
purchaseCredit: 'edx.subscription.dashboard.clicked_purchase_credit',
|
|
36
43
|
filterClicked: 'course-dashboard.filter.clicked',
|
|
37
44
|
filterOptionSelected: 'course-dashboard.filter_option.selected',
|
|
45
|
+
programCardActionClicked: 'edx.subscription.dashboard.program_card_action.clicked',
|
|
38
46
|
});
|
|
39
47
|
export const linkNames = StrictDict({
|
|
40
48
|
learnerHomeNavExplore: 'learner_home_nav_explore',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/tracking/constants.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;IACnC,SAAS,EAAE,WAAW;IACtB,cAAc,EAAE,iBAAiB;IACjC,YAAY,EAAE,eAAe;IAC7B,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;CACjB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC;IAC/B,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/tracking/constants.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;IACnC,SAAS,EAAE,WAAW;IACtB,cAAc,EAAE,iBAAiB;IACjC,YAAY,EAAE,eAAe;IAC7B,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;CACjB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC;IAC/B,uBAAuB,EAAE,yBAAyB;IAClD,kBAAkB,EAAE,oBAAoB;IACxC,kBAAkB,EAAE,oBAAoB;IACxC,4BAA4B,EAAE,8BAA8B;IAC5D,YAAY,EAAE,cAAc;IAC5B,mBAAmB,EAAE,qBAAqB;IAC1C,UAAU,EAAE,YAAY;IACxB,aAAa,EAAE,eAAe;IAC9B,YAAY,EAAE,cAAc;IAC5B,cAAc,EAAE,gBAAgB;IAChC,yBAAyB,EAAE,2BAA2B;IACtD,oBAAoB,EAAE,sBAAsB;IAC5C,qBAAqB,EAAE,uBAAuB;IAC9C,sBAAsB,EAAE,wBAAwB;IAChD,wBAAwB,EAAE,0BAA0B;CACrD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;IACnC,uBAAuB,EAAE,uDAAuD;IAChF,kBAAkB,EAAE,iDAAiD;IACrE,kBAAkB,EAAE,iDAAiD;IACrE,4BAA4B,EAAE,4DAA4D;IAC1F,oBAAoB,EAAE,oDAAoD;IAC1E,qBAAqB,EAAE,qDAAqD;IAC5E,YAAY,EAAE,0BAA0B;IACxC,sBAAsB,EAAE,oDAAoD;IAC5E,mBAAmB,EAAE,2BAA2B;IAChD,UAAU,EAAE,8BAA8B;IAC1C,aAAa,EAAE,iCAAiC;IAChD,YAAY,EAAE,gCAAgC;IAC9C,cAAc,EAAE,8BAA8B;IAC9C,yBAAyB,EAAE,0CAA0C;IACrE,kBAAkB,EAAE,wDAAwD;IAC5E,cAAc,EAAE,oDAAoD;IACpE,aAAa,EAAE,iCAAiC;IAChD,oBAAoB,EAAE,yCAAyC;IAC/D,wBAAwB,EAAE,wDAAwD;CACnF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAC;IAClC,qBAAqB,EAAE,0BAA0B;IACjD,6BAA6B,EAAE,mCAAmC;CACnE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,cAAc,CAAC;AAEtC,eAAe,UAAU,CAAC","sourcesContent":["import { StrictDict } from '../utils';\n\nexport const categories = StrictDict({\n dashboard: 'dashboard',\n userEngagement: 'user-engagement',\n searchButton: 'search_button',\n credit: 'credit',\n filter: 'filter',\n});\n\nexport const events = StrictDict({\n courseCardActionClicked: 'courseCardActionClicked',\n courseImageClicked: 'courseImageClicked',\n courseTitleClicked: 'courseTitleClicked',\n courseOptionsDropdownClicked: 'courseOptionsDropdownClicked',\n shareClicked: 'shareClicked',\n userSettingsChanged: 'userSettingsChanged',\n newSession: 'newSession',\n switchSession: 'switchSession',\n leaveSession: 'leaveSession',\n unenrollReason: 'unenrollReason',\n entitlementUnenrollReason: 'entitlementUnenrollReason',\n noCoursesViewClicked: 'noCoursesViewClicked',\n noProgramsViewClicked: 'noProgramsViewClicked',\n courseListPageSelected: 'courseListPageSelected',\n programCardActionClicked: 'programCardActionClicked',\n});\n\nexport const eventNames = StrictDict({\n courseCardActionClicked: 'edx.subscription.dashboard.course_card_action.clicked',\n courseImageClicked: 'edx.subscription.dashboard.course_image.clicked',\n courseTitleClicked: 'edx.subscription.dashboard.course_title.clicked',\n courseOptionsDropdownClicked: 'edx.subscription.dashboard.course_options_dropdown.clicked',\n noCoursesViewClicked: 'edx.subscription.dashboard.no_courses_view.clicked',\n noProgramsViewClicked: 'edx.subscription.dashboard.no_programs_view.clicked',\n shareClicked: 'edx.course.share_clicked',\n courseListPageSelected: 'edx.subscription.learner.course.list.page.selected',\n userSettingsChanged: 'edx.user.settings.changed',\n newSession: 'course-dashboard.new-session',\n switchSession: 'course-dashboard.switch-session',\n leaveSession: 'course-dashboard.leave-session',\n unenrollReason: 'unenrollment_reason.selected',\n entitlementUnenrollReason: 'entitlement_unenrollment_reason.selected',\n findCoursesClicked: 'edx.subscription.dashboard.find_courses_button.clicked',\n purchaseCredit: 'edx.subscription.dashboard.clicked_purchase_credit',\n filterClicked: 'course-dashboard.filter.clicked',\n filterOptionSelected: 'course-dashboard.filter_option.selected',\n programCardActionClicked: 'edx.subscription.dashboard.program_card_action.clicked',\n});\n\nexport const linkNames = StrictDict({\n learnerHomeNavExplore: 'learner_home_nav_explore',\n learnerHomeNavDropdownExplore: 'learner_home_nav_dropdown_explore',\n});\n\nexport const appName = 'learner-home';\n\nexport default eventNames;\n"]}
|
package/dist/tracking/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
declare namespace _default {
|
|
2
2
|
export { course };
|
|
3
|
+
export { program };
|
|
3
4
|
export { credit };
|
|
4
5
|
export { engagement };
|
|
5
6
|
export { entitlements };
|
|
@@ -10,6 +11,7 @@ declare namespace _default {
|
|
|
10
11
|
export default _default;
|
|
11
12
|
export * from "./trackingContext";
|
|
12
13
|
import course from './trackers/course';
|
|
14
|
+
import program from './trackers/program';
|
|
13
15
|
import credit from './trackers/credit';
|
|
14
16
|
import engagement from './trackers/engagement';
|
|
15
17
|
import entitlements from './trackers/entitlements';
|
package/dist/tracking/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import course from './trackers/course';
|
|
2
|
+
import program from './trackers/program';
|
|
2
3
|
import credit from './trackers/credit';
|
|
3
4
|
import engagement from './trackers/engagement';
|
|
4
5
|
import entitlements from './trackers/entitlements';
|
|
@@ -7,6 +8,7 @@ import findCourses from './trackers/findCourses';
|
|
|
7
8
|
import filter from './trackers/filter';
|
|
8
9
|
export default {
|
|
9
10
|
course,
|
|
11
|
+
program,
|
|
10
12
|
credit,
|
|
11
13
|
engagement,
|
|
12
14
|
entitlements,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tracking/index.js"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAC/C,OAAO,YAAY,MAAM,yBAAyB,CAAC;AACnD,OAAO,WAAW,MAAM,wBAAwB,CAAC;AACjD,OAAO,WAAW,MAAM,wBAAwB,CAAC;AACjD,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,eAAe;IACb,MAAM;IACN,MAAM;IACN,UAAU;IACV,YAAY;IACZ,WAAW;IACX,WAAW;IACX,MAAM;CACP,CAAC;AAEF,cAAc,mBAAmB,CAAC","sourcesContent":["import course from './trackers/course';\nimport credit from './trackers/credit';\nimport engagement from './trackers/engagement';\nimport entitlements from './trackers/entitlements';\nimport socialShare from './trackers/socialShare';\nimport findCourses from './trackers/findCourses';\nimport filter from './trackers/filter';\n\nexport default {\n course,\n credit,\n engagement,\n entitlements,\n socialShare,\n findCourses,\n filter,\n};\n\nexport * from './trackingContext';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tracking/index.js"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAC/C,OAAO,YAAY,MAAM,yBAAyB,CAAC;AACnD,OAAO,WAAW,MAAM,wBAAwB,CAAC;AACjD,OAAO,WAAW,MAAM,wBAAwB,CAAC;AACjD,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,eAAe;IACb,MAAM;IACN,OAAO;IACP,MAAM;IACN,UAAU;IACV,YAAY;IACZ,WAAW;IACX,WAAW;IACX,MAAM;CACP,CAAC;AAEF,cAAc,mBAAmB,CAAC","sourcesContent":["import course from './trackers/course';\nimport program from './trackers/program';\nimport credit from './trackers/credit';\nimport engagement from './trackers/engagement';\nimport entitlements from './trackers/entitlements';\nimport socialShare from './trackers/socialShare';\nimport findCourses from './trackers/findCourses';\nimport filter from './trackers/filter';\n\nexport default {\n course,\n program,\n credit,\n engagement,\n entitlements,\n socialShare,\n findCourses,\n filter,\n};\n\nexport * from './trackingContext';\n"]}
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
export function courseEventTracker(eventName: string, courseId: string, options?: [object]): () => void;
|
|
2
2
|
export function courseLinkTracker(eventName: string): callback;
|
|
3
3
|
export function courseOptionsDropdownClicked(courseId: any): () => void;
|
|
4
|
+
export function courseCardExternalActionClicked(courseId: any): () => void;
|
|
4
5
|
export function courseImageClicked(...args: any[]): any;
|
|
5
6
|
export function courseTitleClicked(...args: any[]): any;
|
|
6
|
-
export function
|
|
7
|
+
export function courseCardActionClicked(...args: any[]): any;
|
|
8
|
+
export function noCoursesViewClicked(...args: any[]): any;
|
|
7
9
|
declare namespace _default {
|
|
8
10
|
export { courseImageClicked };
|
|
9
11
|
export { courseOptionsDropdownClicked };
|
|
10
12
|
export { courseTitleClicked };
|
|
11
|
-
export {
|
|
13
|
+
export { courseCardActionClicked };
|
|
14
|
+
export { courseCardExternalActionClicked };
|
|
15
|
+
export { noCoursesViewClicked };
|
|
12
16
|
}
|
|
13
17
|
export default _default;
|
|
@@ -18,14 +18,19 @@ export const courseEventTracker = (eventName, courseId, options = {}) => createE
|
|
|
18
18
|
export const courseLinkTracker = (eventName) => (courseId, href) => (createLinkTracker(module.courseEventTracker(eventName, courseId), href));
|
|
19
19
|
// Non-Link events
|
|
20
20
|
export const courseOptionsDropdownClicked = (courseId) => (module.courseEventTracker(eventNames.courseOptionsDropdownClicked, courseId));
|
|
21
|
+
// For target="_blank" links where the browser should handle navigation.
|
|
22
|
+
export const courseCardExternalActionClicked = (courseId) => (module.courseEventTracker(eventNames.courseCardActionClicked, courseId));
|
|
21
23
|
// Link events (track and then change page location)
|
|
22
24
|
export const courseImageClicked = (...args) => (module.courseLinkTracker(eventNames.courseImageClicked)(...args));
|
|
23
25
|
export const courseTitleClicked = (...args) => (module.courseLinkTracker(eventNames.courseTitleClicked)(...args));
|
|
24
|
-
export const
|
|
26
|
+
export const courseCardActionClicked = (...args) => (module.courseLinkTracker(eventNames.courseCardActionClicked)(...args));
|
|
27
|
+
export const noCoursesViewClicked = (...args) => (module.courseLinkTracker(eventNames.noCoursesViewClicked)(...args));
|
|
25
28
|
export default {
|
|
26
29
|
courseImageClicked,
|
|
27
30
|
courseOptionsDropdownClicked,
|
|
28
31
|
courseTitleClicked,
|
|
29
|
-
|
|
32
|
+
courseCardActionClicked,
|
|
33
|
+
courseCardExternalActionClicked,
|
|
34
|
+
noCoursesViewClicked,
|
|
30
35
|
};
|
|
31
36
|
//# sourceMappingURL=course.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"course.js","sourceRoot":"","sources":["../../../src/tracking/trackers/course.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AAEnC,gBAAgB;AAChB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE,CAAC,kBAAkB,CACzF,SAAS,kBACP,QAAQ,EAAE,UAAU,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,IAAK,OAAO,EAC9D,CAAC;AACF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CAClE,iBAAiB,CAAC,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,CACxE,CAAC;AAEF,kBAAkB;AAClB,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CACxD,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,4BAA4B,EAAE,QAAQ,CAAC,CAC7E,CAAC;AAEF,oDAAoD;AACpD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,CAC7C,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AACpE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,CAC7C,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AACpE,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"course.js","sourceRoot":"","sources":["../../../src/tracking/trackers/course.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AAEnC,gBAAgB;AAChB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE,CAAC,kBAAkB,CACzF,SAAS,kBACP,QAAQ,EAAE,UAAU,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,IAAK,OAAO,EAC9D,CAAC;AACF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CAClE,iBAAiB,CAAC,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,CACxE,CAAC;AAEF,kBAAkB;AAClB,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CACxD,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,4BAA4B,EAAE,QAAQ,CAAC,CAC7E,CAAC;AACF,wEAAwE;AACxE,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAC3D,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CACxE,CAAC;AAEF,oDAAoD;AACpD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,CAC7C,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AACpE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,CAC7C,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AACpE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,CAClD,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AACzE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,CAC/C,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAEtE,eAAe;IACb,kBAAkB;IAClB,4BAA4B;IAC5B,kBAAkB;IAClB,uBAAuB;IACvB,+BAA+B;IAC/B,oBAAoB;CACrB,CAAC","sourcesContent":["import { createEventTracker, createLinkTracker } from '../../data/services/segment/utils';\nimport { categories, eventNames } from '../constants';\nimport * as module from './course';\n\n// Utils/Helpers\n/**\n * Generate a segement event tracker for a given course event.\n * @param {string} eventName - segment event name\n * @param {string} courseId - course run identifier\n * @param {[object]} options - optional event data\n */\nexport const courseEventTracker = (eventName, courseId, options = {}) => createEventTracker(\n eventName,\n { category: categories.dashboard, label: courseId, ...options },\n);\n/**\n * Generate a hook to allow components to provide a courseId and link href and provide\n * a link tracker with defined event name and options, over a set of default optiosn.\n * @param {string} eventName - event name for the click event\n * @return {callback} - component hook returning a link tracking event callback\n */\nexport const courseLinkTracker = (eventName) => (courseId, href) => (\n createLinkTracker(module.courseEventTracker(eventName, courseId), href)\n);\n\n// Non-Link events\nexport const courseOptionsDropdownClicked = (courseId) => (\n module.courseEventTracker(eventNames.courseOptionsDropdownClicked, courseId)\n);\n// For target=\"_blank\" links where the browser should handle navigation.\nexport const courseCardExternalActionClicked = (courseId) => (\n module.courseEventTracker(eventNames.courseCardActionClicked, courseId)\n);\n\n// Link events (track and then change page location)\nexport const courseImageClicked = (...args) => (\n module.courseLinkTracker(eventNames.courseImageClicked)(...args));\nexport const courseTitleClicked = (...args) => (\n module.courseLinkTracker(eventNames.courseTitleClicked)(...args));\nexport const courseCardActionClicked = (...args) => (\n module.courseLinkTracker(eventNames.courseCardActionClicked)(...args));\nexport const noCoursesViewClicked = (...args) => (\n module.courseLinkTracker(eventNames.noCoursesViewClicked)(...args));\n\nexport default {\n courseImageClicked,\n courseOptionsDropdownClicked,\n courseTitleClicked,\n courseCardActionClicked,\n courseCardExternalActionClicked,\n noCoursesViewClicked,\n};\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export function programEventTracker(eventName: string, programId: string, options?: object): () => void;
|
|
2
|
+
export function programLinkTracker(eventName: string): callback;
|
|
3
|
+
export function noProgramsViewClicked(href: any): (e: any) => number;
|
|
4
|
+
declare namespace _default {
|
|
5
|
+
export { noProgramsViewClicked };
|
|
6
|
+
}
|
|
7
|
+
export default _default;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createEventTracker, createLinkTracker } from '../../data/services/segment/utils';
|
|
2
|
+
import { categories, eventNames } from '../constants';
|
|
3
|
+
import * as module from './program';
|
|
4
|
+
// Utils/Helpers
|
|
5
|
+
/**
|
|
6
|
+
* Generate a Segment event tracker for a given program event.
|
|
7
|
+
* @param {string} eventName - Segment event name
|
|
8
|
+
* @param {string} programId - program identifier
|
|
9
|
+
* @param {object} options - optional event data
|
|
10
|
+
*/
|
|
11
|
+
export const programEventTracker = (eventName, programId, options = {}) => createEventTracker(eventName, Object.assign({ category: categories.dashboard, programId }, options));
|
|
12
|
+
/**
|
|
13
|
+
* Generate a hook to allow components to provide a programId and link href and provide
|
|
14
|
+
* a link tracker with defined event name and options, over a set of default optiosn.
|
|
15
|
+
* @param {string} eventName - event name for the click event
|
|
16
|
+
* @return {callback} - component hook returning a link tracking event callback
|
|
17
|
+
*/
|
|
18
|
+
export const programLinkTracker = (eventName) => (programId, href) => (createLinkTracker(module.programEventTracker(eventName, programId, {}), href));
|
|
19
|
+
// Link events (track and then change page location)
|
|
20
|
+
export const noProgramsViewClicked = (href) => (createLinkTracker(createEventTracker(eventNames.noProgramsViewClicked, {
|
|
21
|
+
category: categories.dashboard,
|
|
22
|
+
control: 'no-programs-view-button',
|
|
23
|
+
}), href));
|
|
24
|
+
export default {
|
|
25
|
+
noProgramsViewClicked,
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=program.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program.js","sourceRoot":"","sources":["../../../src/tracking/trackers/program.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,MAAM,MAAM,WAAW,CAAC;AAEpC,gBAAgB;AAChB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE,CAAC,kBAAkB,CAC3F,SAAS,kBACP,QAAQ,EAAE,UAAU,CAAC,SAAS,EAAE,SAAS,IAAK,OAAO,EACxD,CAAC;AACF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CACpE,iBAAiB,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAC9E,CAAC;AAEF,oDAAoD;AACpD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAC7C,iBAAiB,CACf,kBAAkB,CAAC,UAAU,CAAC,qBAAqB,EAAE;IACnD,QAAQ,EAAE,UAAU,CAAC,SAAS;IAC9B,OAAO,EAAE,yBAAyB;CACnC,CAAC,EACF,IAAI,CACL,CAAC,CAAC;AAEL,eAAe;IACb,qBAAqB;CACtB,CAAC","sourcesContent":["import { createEventTracker, createLinkTracker } from '../../data/services/segment/utils';\nimport { categories, eventNames } from '../constants';\nimport * as module from './program';\n\n// Utils/Helpers\n/**\n * Generate a Segment event tracker for a given program event.\n * @param {string} eventName - Segment event name\n * @param {string} programId - program identifier\n * @param {object} options - optional event data\n */\nexport const programEventTracker = (eventName, programId, options = {}) => createEventTracker(\n eventName,\n { category: categories.dashboard, programId, ...options },\n);\n/**\n * Generate a hook to allow components to provide a programId and link href and provide\n * a link tracker with defined event name and options, over a set of default optiosn.\n * @param {string} eventName - event name for the click event\n * @return {callback} - component hook returning a link tracking event callback\n */\nexport const programLinkTracker = (eventName) => (programId, href) => (\n createLinkTracker(module.programEventTracker(eventName, programId, {}), href)\n);\n\n// Link events (track and then change page location)\nexport const noProgramsViewClicked = (href) => (\n createLinkTracker(\n createEventTracker(eventNames.noProgramsViewClicked, {\n category: categories.dashboard,\n control: 'no-programs-view-button',\n }),\n href,\n ));\n\nexport default {\n noProgramsViewClicked,\n};\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const eventNames: {
|
|
2
|
+
programProgressResumeButtonClicked: string;
|
|
3
|
+
programProgressViewCourseButtonClicked: string;
|
|
4
|
+
programProgressUpgradeWithMySubscriptionButtonClicked: string;
|
|
5
|
+
programProgressViewCertificateButtonClicked: string;
|
|
6
|
+
programProgressHelpCenterButtonClicked: string;
|
|
7
|
+
programProgressMyProgramRecordsButtonClicked: string;
|
|
8
|
+
programProgressReturntoDashboardLinkClicked: string;
|
|
9
|
+
};
|
|
10
|
+
export declare const trackProgramProgressResumeCourseButtonClicked: (eventProperties: any) => void;
|
|
11
|
+
export declare const trackProgramProgressViewCourseButtonClicked: (eventProperties: any) => void;
|
|
12
|
+
export declare const trackProgramProgressViewCertificateButtonClicked: (eventProperties: any) => void;
|
|
13
|
+
export declare const trackProgramProgressReturntoDashboardLinkClicked: (eventProperties: any) => void;
|
|
14
|
+
export declare const trackProgramProgressUpgradeWithMySubscriptionButtonClicked: (eventProperties: any) => void;
|
|
15
|
+
export declare const trackProgramProgressHelpCenterButtonClicked: (eventProperties: any) => void;
|
|
16
|
+
export declare const trackProgramProgressMyProgramRecordsButtonClicked: (eventProperties: any) => void;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createEventTracker } from '../../data/services/segment/utils';
|
|
2
|
+
export const eventNames = {
|
|
3
|
+
programProgressResumeButtonClicked: 'edx.program.progress.resume.button.clicked',
|
|
4
|
+
programProgressViewCourseButtonClicked: 'edx.program.progress.view.course.button.clicked',
|
|
5
|
+
programProgressUpgradeWithMySubscriptionButtonClicked: 'edx.program.progress.upgrade.with.my.subscription.button.clicked',
|
|
6
|
+
programProgressViewCertificateButtonClicked: 'edx.program.progress.view.certificate.button.clicked',
|
|
7
|
+
programProgressHelpCenterButtonClicked: 'edx.program.progress.my.help.center.button.clicked',
|
|
8
|
+
programProgressMyProgramRecordsButtonClicked: 'edx.program.progress.my.program.records.button.clicked',
|
|
9
|
+
programProgressReturntoDashboardLinkClicked: 'edx.program.progress.return.to.dashboard.link.clicked',
|
|
10
|
+
};
|
|
11
|
+
// Event tracker for program progress resume button click
|
|
12
|
+
export const trackProgramProgressResumeCourseButtonClicked = (eventProperties) => createEventTracker(eventNames.programProgressResumeButtonClicked, Object.assign({}, eventProperties))();
|
|
13
|
+
// Event tracker for program progress view course button click
|
|
14
|
+
export const trackProgramProgressViewCourseButtonClicked = (eventProperties) => createEventTracker(eventNames.programProgressViewCourseButtonClicked, Object.assign({}, eventProperties))();
|
|
15
|
+
// Event tracker for program progress view certificate button click
|
|
16
|
+
export const trackProgramProgressViewCertificateButtonClicked = (eventProperties) => createEventTracker(eventNames.programProgressViewCertificateButtonClicked, Object.assign({}, eventProperties))();
|
|
17
|
+
// Event tracker for program progress return to dashboard link click
|
|
18
|
+
export const trackProgramProgressReturntoDashboardLinkClicked = (eventProperties) => createEventTracker(eventNames.programProgressReturntoDashboardLinkClicked, Object.assign({}, eventProperties))();
|
|
19
|
+
// Event tracker for program progress upgrade with my subscription button click
|
|
20
|
+
export const trackProgramProgressUpgradeWithMySubscriptionButtonClicked = (eventProperties) => createEventTracker(eventNames.programProgressUpgradeWithMySubscriptionButtonClicked, Object.assign({}, eventProperties))();
|
|
21
|
+
// Event tracker for program progress help center button click
|
|
22
|
+
export const trackProgramProgressHelpCenterButtonClicked = (eventProperties) => createEventTracker(eventNames.programProgressHelpCenterButtonClicked, Object.assign({}, eventProperties))();
|
|
23
|
+
// Event tracker for program progress my program records button click
|
|
24
|
+
export const trackProgramProgressMyProgramRecordsButtonClicked = (eventProperties) => createEventTracker(eventNames.programProgressMyProgramRecordsButtonClicked, Object.assign({}, eventProperties))();
|
|
25
|
+
//# sourceMappingURL=programProgress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"programProgress.js","sourceRoot":"","sources":["../../../src/tracking/trackers/programProgress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,kCAAkC,EAAE,4CAA4C;IAChF,sCAAsC,EAAE,iDAAiD;IACzF,qDAAqD,EAAE,kEAAkE;IACzH,2CAA2C,EAAE,sDAAsD;IACnG,sCAAsC,EAAE,oDAAoD;IAC5F,4CAA4C,EAAE,wDAAwD;IACtG,2CAA2C,EAAE,uDAAuD;CACrG,CAAC;AAEF,yDAAyD;AACzD,MAAM,CAAC,MAAM,6CAA6C,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,kBAAkB,CAClG,UAAU,CAAC,kCAAkC,oBACxC,eAAe,EACrB,EAAE,CAAC;AAEJ,8DAA8D;AAC9D,MAAM,CAAC,MAAM,2CAA2C,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,kBAAkB,CAChG,UAAU,CAAC,sCAAsC,oBAC5C,eAAe,EACrB,EAAE,CAAC;AAEJ,mEAAmE;AACnE,MAAM,CAAC,MAAM,gDAAgD,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,kBAAkB,CACrG,UAAU,CAAC,2CAA2C,oBACjD,eAAe,EACrB,EAAE,CAAC;AAEJ,oEAAoE;AACpE,MAAM,CAAC,MAAM,gDAAgD,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,kBAAkB,CACrG,UAAU,CAAC,2CAA2C,oBACjD,eAAe,EACrB,EAAE,CAAC;AAEJ,+EAA+E;AAC/E,MAAM,CAAC,MAAM,0DAA0D,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,kBAAkB,CAC/G,UAAU,CAAC,qDAAqD,oBAC3D,eAAe,EACrB,EAAE,CAAC;AAEJ,8DAA8D;AAC9D,MAAM,CAAC,MAAM,2CAA2C,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,kBAAkB,CAChG,UAAU,CAAC,sCAAsC,oBAC5C,eAAe,EACrB,EAAE,CAAC;AAEJ,qEAAqE;AACrE,MAAM,CAAC,MAAM,iDAAiD,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,kBAAkB,CACtG,UAAU,CAAC,4CAA4C,oBAClD,eAAe,EACrB,EAAE,CAAC","sourcesContent":["import { createEventTracker } from '@src/data/services/segment/utils';\n\nexport const eventNames = {\n programProgressResumeButtonClicked: 'edx.program.progress.resume.button.clicked',\n programProgressViewCourseButtonClicked: 'edx.program.progress.view.course.button.clicked',\n programProgressUpgradeWithMySubscriptionButtonClicked: 'edx.program.progress.upgrade.with.my.subscription.button.clicked',\n programProgressViewCertificateButtonClicked: 'edx.program.progress.view.certificate.button.clicked',\n programProgressHelpCenterButtonClicked: 'edx.program.progress.my.help.center.button.clicked',\n programProgressMyProgramRecordsButtonClicked: 'edx.program.progress.my.program.records.button.clicked',\n programProgressReturntoDashboardLinkClicked: 'edx.program.progress.return.to.dashboard.link.clicked',\n};\n\n// Event tracker for program progress resume button click\nexport const trackProgramProgressResumeCourseButtonClicked = (eventProperties) => createEventTracker(\n eventNames.programProgressResumeButtonClicked,\n { ...eventProperties },\n)();\n\n// Event tracker for program progress view course button click\nexport const trackProgramProgressViewCourseButtonClicked = (eventProperties) => createEventTracker(\n eventNames.programProgressViewCourseButtonClicked,\n { ...eventProperties },\n)();\n\n// Event tracker for program progress view certificate button click\nexport const trackProgramProgressViewCertificateButtonClicked = (eventProperties) => createEventTracker(\n eventNames.programProgressViewCertificateButtonClicked,\n { ...eventProperties },\n)();\n\n// Event tracker for program progress return to dashboard link click\nexport const trackProgramProgressReturntoDashboardLinkClicked = (eventProperties) => createEventTracker(\n eventNames.programProgressReturntoDashboardLinkClicked,\n { ...eventProperties },\n)();\n\n// Event tracker for program progress upgrade with my subscription button click\nexport const trackProgramProgressUpgradeWithMySubscriptionButtonClicked = (eventProperties) => createEventTracker(\n eventNames.programProgressUpgradeWithMySubscriptionButtonClicked,\n { ...eventProperties },\n)();\n\n// Event tracker for program progress help center button click\nexport const trackProgramProgressHelpCenterButtonClicked = (eventProperties) => createEventTracker(\n eventNames.programProgressHelpCenterButtonClicked,\n { ...eventProperties },\n)();\n\n// Event tracker for program progress my program records button click\nexport const trackProgramProgressMyProgramRecordsButtonClicked = (eventProperties) => createEventTracker(\n eventNames.programProgressMyProgramRecordsButtonClicked,\n { ...eventProperties },\n)();\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const eventNames: {
|
|
2
|
+
paginationPageSelected: string;
|
|
3
|
+
cardTileSelected: string;
|
|
4
|
+
subscriptionBannerViewed: string;
|
|
5
|
+
subscriptionBannerDismissed: string;
|
|
6
|
+
subscriptionBannerActionClicked: string;
|
|
7
|
+
manageSubscriptionClicked: string;
|
|
8
|
+
renewSubscriptionClicked: string;
|
|
9
|
+
};
|
|
10
|
+
export declare const trackSubscriptionEvent: (eventName: string, properties?: Record<string, unknown>) => void;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createEventTracker } from '../../data/services/segment/utils';
|
|
2
|
+
export const eventNames = {
|
|
3
|
+
paginationPageSelected: 'edx.subscription.learner.pagination.page.selected',
|
|
4
|
+
cardTileSelected: 'edx.subscription.learner.card.tile.selected',
|
|
5
|
+
subscriptionBannerViewed: 'edx.subscription.learner.subscription.banner.viewed',
|
|
6
|
+
subscriptionBannerDismissed: 'edx.subscription.learner.subscription.banner.dismissed',
|
|
7
|
+
subscriptionBannerActionClicked: 'edx.subscription.learner.subscription.banner.action.clicked',
|
|
8
|
+
manageSubscriptionClicked: 'edx.subscription.learner.manage.subscription.clicked',
|
|
9
|
+
renewSubscriptionClicked: 'edx.subscription.learner.renew.subscription.clicked',
|
|
10
|
+
};
|
|
11
|
+
export const trackSubscriptionEvent = (eventName, properties = {}) => (createEventTracker(eventName, properties)());
|
|
12
|
+
//# sourceMappingURL=subscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription.js","sourceRoot":"","sources":["../../../src/tracking/trackers/subscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,sBAAsB,EAAE,mDAAmD;IAC3E,gBAAgB,EAAE,6CAA6C;IAC/D,wBAAwB,EAAE,qDAAqD;IAC/E,2BAA2B,EAAE,wDAAwD;IACrF,+BAA+B,EAAE,6DAA6D;IAC9F,yBAAyB,EAAE,sDAAsD;IACjF,wBAAwB,EAAE,qDAAqD;CAChF,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,SAAiB,EAAE,aAAsC,EAAE,EAAE,EAAE,CAAC,CACrG,kBAAkB,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,CAC5C,CAAC","sourcesContent":["import { createEventTracker } from '@src/data/services/segment/utils';\n\nexport const eventNames = {\n paginationPageSelected: 'edx.subscription.learner.pagination.page.selected',\n cardTileSelected: 'edx.subscription.learner.card.tile.selected',\n subscriptionBannerViewed: 'edx.subscription.learner.subscription.banner.viewed',\n subscriptionBannerDismissed: 'edx.subscription.learner.subscription.banner.dismissed',\n subscriptionBannerActionClicked: 'edx.subscription.learner.subscription.banner.action.clicked',\n manageSubscriptionClicked: 'edx.subscription.learner.manage.subscription.clicked',\n renewSubscriptionClicked: 'edx.subscription.learner.renew.subscription.clicked',\n};\n\nexport const trackSubscriptionEvent = (eventName: string, properties: Record<string, unknown> = {}) => (\n createEventTracker(eventName, properties)()\n);\n"]}
|
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useEffect } from 'react';
|
|
2
3
|
import { useProgressiveProfilingQuiz } from '../ProgressiveProfilingQuizProvider';
|
|
3
|
-
import { useIntl } from '@openedx/frontend-base';
|
|
4
|
+
import { getAuthenticatedUser, useIntl } from '@openedx/frontend-base';
|
|
4
5
|
import { Banner } from './Banner';
|
|
5
6
|
import messages from './messages';
|
|
6
7
|
import { PROGRESSIVE_PROFILING_USER_STATUS } from '../data/constants';
|
|
7
8
|
import { trackProgressiveProfilingSearchPageBannerClick } from '../../../tracking/trackers/progressiveProfiling';
|
|
9
|
+
// Prefix is namespaced per-user so a different user (or a cleared/incognito profile) on the
|
|
10
|
+
// same browser is treated as never having seen the auto-opened modal before.
|
|
11
|
+
const AUTO_OPEN_KEY_PREFIX = 'progressiveProfiling.autoOpened.';
|
|
12
|
+
const getAutoOpenKey = () => {
|
|
13
|
+
const user = getAuthenticatedUser();
|
|
14
|
+
if (!(user === null || user === void 0 ? void 0 : user.userId))
|
|
15
|
+
return null;
|
|
16
|
+
return `${AUTO_OPEN_KEY_PREFIX}${user.userId}`;
|
|
17
|
+
};
|
|
8
18
|
/**
|
|
9
19
|
* Single slot entry point.
|
|
10
20
|
* Reads progressive profiling state from context and selects one CTA.
|
|
@@ -13,9 +23,31 @@ export const BannerEntry = () => {
|
|
|
13
23
|
var _a, _b, _c, _d, _e;
|
|
14
24
|
const { openModal, answers, progressiveProfileStatus, } = useProgressiveProfilingQuiz();
|
|
15
25
|
const { formatMessage } = useIntl();
|
|
26
|
+
const hasAttemptedAutoOpen = useRef(false);
|
|
27
|
+
const { status, remainingQuestions } = progressiveProfileStatus || {};
|
|
28
|
+
/*
|
|
29
|
+
Auto-trigger the survey modal the very first time this user (on this browser/device) lands
|
|
30
|
+
on the Search page with a not-started progressive profile. Once opened - regardless of
|
|
31
|
+
whether the user completes, abandons, or closes it - it's flagged as "seen" for that user so
|
|
32
|
+
it never auto-opens again, even if the backend status hasn't caught up yet (e.g. abandoned
|
|
33
|
+
partway through, before any answers were saved).
|
|
34
|
+
*/
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
if (hasAttemptedAutoOpen.current)
|
|
37
|
+
return;
|
|
38
|
+
if (!status || status !== PROGRESSIVE_PROFILING_USER_STATUS.NOT_STARTED)
|
|
39
|
+
return;
|
|
40
|
+
const autoOpenKey = getAutoOpenKey();
|
|
41
|
+
if (!autoOpenKey)
|
|
42
|
+
return; // No authenticated user available yet; try again next render.
|
|
43
|
+
if (localStorage.getItem(autoOpenKey))
|
|
44
|
+
return;
|
|
45
|
+
hasAttemptedAutoOpen.current = true;
|
|
46
|
+
localStorage.setItem(autoOpenKey, 'true');
|
|
47
|
+
openModal();
|
|
48
|
+
}, [status, openModal]);
|
|
16
49
|
if (!progressiveProfileStatus)
|
|
17
50
|
return null;
|
|
18
|
-
const { status, remainingQuestions } = progressiveProfileStatus || {};
|
|
19
51
|
const learningGoal = (_c = (_b = (_a = answers === null || answers === void 0 ? void 0 : answers['learning-goal']) === null || _a === void 0 ? void 0 : _a.selectedValues) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.replaceAll('-', ' ');
|
|
20
52
|
const interests = (_e = (_d = answers === null || answers === void 0 ? void 0 : answers['interests-declared']) === null || _d === void 0 ? void 0 : _d.selectedValues) !== null && _e !== void 0 ? _e : [];
|
|
21
53
|
const formattedInterests = interests.length > 1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BannerEntry.js","sourceRoot":"","sources":["../../../../src/widgets/ProgressiveProfilingQuiz/SearchPageBanners/BannerEntry.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"BannerEntry.js","sourceRoot":"","sources":["../../../../src/widgets/ProgressiveProfilingQuiz/SearchPageBanners/BannerEntry.tsx"],"names":[],"mappings":"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","sourcesContent":["import { FC, ReactNode, useRef, useEffect } from 'react';\nimport { useProgressiveProfilingQuiz } from '../ProgressiveProfilingQuizProvider';\nimport { getAuthenticatedUser, useIntl } from '@openedx/frontend-base';\n\nimport { Banner } from './Banner';\nimport messages from './messages';\nimport { PROGRESSIVE_PROFILING_USER_STATUS } from '../data/constants';\nimport { trackProgressiveProfilingSearchPageBannerClick } from '@src/tracking/trackers/progressiveProfiling';\n\n// Prefix is namespaced per-user so a different user (or a cleared/incognito profile) on the\n// same browser is treated as never having seen the auto-opened modal before.\nconst AUTO_OPEN_KEY_PREFIX = 'progressiveProfiling.autoOpened.';\n\nconst getAutoOpenKey = (): string | null => {\n const user = getAuthenticatedUser();\n if (!user?.userId) return null;\n return `${AUTO_OPEN_KEY_PREFIX}${user.userId}`;\n};\n\n/**\n * Single slot entry point.\n * Reads progressive profiling state from context and selects one CTA.\n */\nexport const BannerEntry: FC = () => {\n const {\n openModal,\n answers,\n progressiveProfileStatus,\n } = useProgressiveProfilingQuiz();\n const { formatMessage } = useIntl();\n const hasAttemptedAutoOpen = useRef(false);\n const { status, remainingQuestions } = progressiveProfileStatus || {};\n\n /*\n Auto-trigger the survey modal the very first time this user (on this browser/device) lands\n on the Search page with a not-started progressive profile. Once opened - regardless of\n whether the user completes, abandons, or closes it - it's flagged as \"seen\" for that user so\n it never auto-opens again, even if the backend status hasn't caught up yet (e.g. abandoned\n partway through, before any answers were saved).\n */\n useEffect(() => {\n if (hasAttemptedAutoOpen.current) return;\n if (!status || status !== PROGRESSIVE_PROFILING_USER_STATUS.NOT_STARTED) return;\n\n const autoOpenKey = getAutoOpenKey();\n if (!autoOpenKey) return; // No authenticated user available yet; try again next render.\n\n if (localStorage.getItem(autoOpenKey)) return;\n\n hasAttemptedAutoOpen.current = true;\n localStorage.setItem(autoOpenKey, 'true');\n openModal();\n }, [status, openModal]);\n\n if (!progressiveProfileStatus) return null;\n\n const learningGoal = answers?.['learning-goal']?.selectedValues?.[0]?.replaceAll('-', ' ');\n const interests = answers?.['interests-declared']?.selectedValues ?? [];\n const formattedInterests = interests.length > 1\n ? `${interests.slice(0, -1).join(', ')} and ${interests.at(-1)}`\n : interests[0];\n\n // Handle button click for the banner and track the click event\n const handleButtonClick = () => {\n openModal();\n trackProgressiveProfilingSearchPageBannerClick({ eventStatus: status });\n };\n\n let title: ReactNode = formatMessage(messages.notStartedTitle);\n let buttonText = formatMessage(messages.notStartedButtonText);\n\n if (status === PROGRESSIVE_PROFILING_USER_STATUS.COMPLETE) {\n title = formatMessage(messages.completeTitle, { learningGoal, interests: formattedInterests, bold: chunks => <strong>{chunks}</strong> });\n buttonText = formatMessage(messages.completeButtonText);\n }\n\n if (status === PROGRESSIVE_PROFILING_USER_STATUS.INCOMPLETE) {\n title = formatMessage(messages.incompleteTitle, { remainingQuestions });\n buttonText = formatMessage(messages.incompleteButtonText);\n }\n\n return <Banner onButtonClick={handleButtonClick} title={title} buttonText={buttonText} />;\n};\n"]}
|
|
@@ -27,7 +27,7 @@ const messages = defineMessages({
|
|
|
27
27
|
},
|
|
28
28
|
completeButtonText: {
|
|
29
29
|
id: 'progressiveProfiling.searchPage.banner.complete.buttonText',
|
|
30
|
-
defaultMessage: '
|
|
30
|
+
defaultMessage: 'Update my goals',
|
|
31
31
|
description: 'Button text to be shown on banner when the progressive profiling quiz is complete',
|
|
32
32
|
},
|
|
33
33
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../src/widgets/ProgressiveProfilingQuiz/SearchPageBanners/messages.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,eAAe,EAAE;QACf,EAAE,EAAE,yDAAyD;QAC7D,cAAc,EAAE,4BAA4B;QAC5C,WAAW,EAAE,sFAAsF;KACpG;IACD,oBAAoB,EAAE;QACpB,EAAE,EAAE,8DAA8D;QAClE,cAAc,EAAE,gBAAgB;QAChC,WAAW,EAAE,4FAA4F;KAC1G;IACD,eAAe,EAAE;QACf,EAAE,EAAE,yDAAyD;QAC7D,cAAc,EAAE,iJAAiJ;QACjK,WAAW,EAAE,+EAA+E;KAC7F;IACD,oBAAoB,EAAE;QACpB,EAAE,EAAE,8DAA8D;QAClE,cAAc,EAAE,yBAAyB;QACzC,WAAW,EAAE,qFAAqF;KACnG;IACD,aAAa,EAAE;QACb,EAAE,EAAE,uDAAuD;QAC3D,cAAc,EAAE,4FAA4F;QAC5G,WAAW,EAAE,6EAA6E;KAC3F;IACD,kBAAkB,EAAE;QAClB,EAAE,EAAE,4DAA4D;QAChE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../src/widgets/ProgressiveProfilingQuiz/SearchPageBanners/messages.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,eAAe,EAAE;QACf,EAAE,EAAE,yDAAyD;QAC7D,cAAc,EAAE,4BAA4B;QAC5C,WAAW,EAAE,sFAAsF;KACpG;IACD,oBAAoB,EAAE;QACpB,EAAE,EAAE,8DAA8D;QAClE,cAAc,EAAE,gBAAgB;QAChC,WAAW,EAAE,4FAA4F;KAC1G;IACD,eAAe,EAAE;QACf,EAAE,EAAE,yDAAyD;QAC7D,cAAc,EAAE,iJAAiJ;QACjK,WAAW,EAAE,+EAA+E;KAC7F;IACD,oBAAoB,EAAE;QACpB,EAAE,EAAE,8DAA8D;QAClE,cAAc,EAAE,yBAAyB;QACzC,WAAW,EAAE,qFAAqF;KACnG;IACD,aAAa,EAAE;QACb,EAAE,EAAE,uDAAuD;QAC3D,cAAc,EAAE,4FAA4F;QAC5G,WAAW,EAAE,6EAA6E;KAC3F;IACD,kBAAkB,EAAE;QAClB,EAAE,EAAE,4DAA4D;QAChE,cAAc,EAAE,iBAAiB;QACjC,WAAW,EAAE,mFAAmF;KACjG;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n notStartedTitle: {\n id: 'progressiveProfiling.searchPage.banner.notStarted.title',\n defaultMessage: 'What do you want to learn?',\n description: 'Title to be shown on banner when the progressive profiling quiz has not been started',\n },\n notStartedButtonText: {\n id: 'progressiveProfiling.searchPage.banner.notStarted.buttonText',\n defaultMessage: 'Share my goals',\n description: 'Button text to be shown on banner when the progressive profiling quiz has not been started',\n },\n incompleteTitle: {\n id: 'progressiveProfiling.searchPage.banner.incomplete.title',\n defaultMessage: 'Answer {remainingQuestions, plural, =0 {# more question} one {# more question} other {# more questions}} and get better course recommendations.',\n description: 'Title to be shown on banner when the progressive profiling quiz is incomplete',\n },\n incompleteButtonText: {\n id: 'progressiveProfiling.searchPage.banner.incomplete.buttonText',\n defaultMessage: 'Finish sharing my goals',\n description: 'Button text to be shown on banner when the progressive profiling quiz is incomplete',\n },\n completeTitle: {\n id: 'progressiveProfiling.searchPage.banner.complete.title',\n defaultMessage: 'Your learning on edX to <bold>{learningGoal}</bold> and you\\'re interested in {interests}.',\n description: 'Title to be shown on banner when the progressive profiling quiz is complete',\n },\n completeButtonText: {\n id: 'progressiveProfiling.searchPage.banner.complete.buttonText',\n defaultMessage: 'Update my goals',\n description: 'Button text to be shown on banner when the progressive profiling quiz is complete',\n },\n});\n\nexport default messages;\n"]}
|
|
@@ -8,6 +8,6 @@ export type ProgressiveProfilingQuizStepKey = typeof PROGRESSIVE_PROFILING_QUIZ_
|
|
|
8
8
|
export declare const PROGRESSIVE_PROFILING_USER_STATUS: {
|
|
9
9
|
readonly INCOMPLETE: "incomplete";
|
|
10
10
|
readonly COMPLETE: "complete";
|
|
11
|
-
readonly NOT_STARTED: "
|
|
11
|
+
readonly NOT_STARTED: "not_started";
|
|
12
12
|
};
|
|
13
13
|
export declare const getProgressiveProfilingStepName: (stepIndex: number) => ProgressiveProfilingQuizStepKey | undefined;
|
|
@@ -7,7 +7,7 @@ export const PROGRESSIVE_PROFILING_QUIZ_STEPS = {
|
|
|
7
7
|
export const PROGRESSIVE_PROFILING_USER_STATUS = {
|
|
8
8
|
INCOMPLETE: 'incomplete',
|
|
9
9
|
COMPLETE: 'complete',
|
|
10
|
-
NOT_STARTED: '
|
|
10
|
+
NOT_STARTED: 'not_started',
|
|
11
11
|
};
|
|
12
12
|
export const getProgressiveProfilingStepName = (stepIndex) => (Object.values(PROGRESSIVE_PROFILING_QUIZ_STEPS)[stepIndex]);
|
|
13
13
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/widgets/ProgressiveProfilingQuiz/data/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,aAAa,EAAE,eAAe;IAC9B,mBAAmB,EAAE,qBAAqB;IAC1C,kBAAkB,EAAE,oBAAoB;IACxC,WAAW,EAAE,aAAa;CAClB,CAAC;AAKX,MAAM,CAAC,MAAM,iCAAiC,GAAG;IAC/C,UAAU,EAAE,YAAY;IACxB,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,aAAa;CAClB,CAAC;AAEX,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,SAAiB,EAA+C,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC","sourcesContent":["export const PROGRESSIVE_PROFILING_QUIZ_STEPS = {\n LEARNING_GOAL: 'learning-goal',\n LEARNING_MOTIVATION: 'learning-motivation',\n INTERESTS_DECLARED: 'interests-declared',\n WORK_STATUS: 'work-status',\n} as const;\n\nexport type ProgressiveProfilingQuizStepKey =\n typeof PROGRESSIVE_PROFILING_QUIZ_STEPS[keyof typeof PROGRESSIVE_PROFILING_QUIZ_STEPS];\n\nexport const PROGRESSIVE_PROFILING_USER_STATUS = {\n INCOMPLETE: 'incomplete',\n COMPLETE: 'complete',\n NOT_STARTED: '
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/widgets/ProgressiveProfilingQuiz/data/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,aAAa,EAAE,eAAe;IAC9B,mBAAmB,EAAE,qBAAqB;IAC1C,kBAAkB,EAAE,oBAAoB;IACxC,WAAW,EAAE,aAAa;CAClB,CAAC;AAKX,MAAM,CAAC,MAAM,iCAAiC,GAAG;IAC/C,UAAU,EAAE,YAAY;IACxB,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,aAAa;CAClB,CAAC;AAEX,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,SAAiB,EAA+C,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC","sourcesContent":["export const PROGRESSIVE_PROFILING_QUIZ_STEPS = {\n LEARNING_GOAL: 'learning-goal',\n LEARNING_MOTIVATION: 'learning-motivation',\n INTERESTS_DECLARED: 'interests-declared',\n WORK_STATUS: 'work-status',\n} as const;\n\nexport type ProgressiveProfilingQuizStepKey =\n typeof PROGRESSIVE_PROFILING_QUIZ_STEPS[keyof typeof PROGRESSIVE_PROFILING_QUIZ_STEPS];\n\nexport const PROGRESSIVE_PROFILING_USER_STATUS = {\n INCOMPLETE: 'incomplete',\n COMPLETE: 'complete',\n NOT_STARTED: 'not_started',\n} as const;\n\nexport const getProgressiveProfilingStepName = (stepIndex: number): ProgressiveProfilingQuizStepKey | undefined => (Object.values(PROGRESSIVE_PROFILING_QUIZ_STEPS)[stepIndex]);\n"]}
|