@edx/frontend-app-subscription-learner-dashboard 1.2.0 → 1.4.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/ProgramDashboard/ProgramProgress/ProgramProgress.d.ts +2 -2
- package/dist/containers/ProgramDashboard/ProgramProgress/ProgramProgress.js +15 -31
- package/dist/containers/ProgramDashboard/ProgramProgress/ProgramProgress.js.map +1 -1
- package/dist/containers/ProgramDashboard/ProgramProgress/ProgramProgressTabs/index.d.ts +3 -0
- package/dist/containers/ProgramDashboard/ProgramProgress/ProgramProgressTabs/index.js +43 -0
- package/dist/containers/ProgramDashboard/ProgramProgress/ProgramProgressTabs/index.js.map +1 -0
- package/dist/containers/ProgramDashboard/ProgramProgress/UpgradeButton/UpgradeAllButton.d.ts +2 -2
- package/dist/containers/ProgramDashboard/ProgramProgress/UpgradeButton/UpgradeAllButton.js +7 -5
- package/dist/containers/ProgramDashboard/ProgramProgress/UpgradeButton/UpgradeAllButton.js.map +1 -1
- package/dist/containers/ProgramDashboard/ProgramProgress/index.d.ts +2 -2
- package/dist/containers/ProgramDashboard/ProgramProgress/index.js +1 -4
- package/dist/containers/ProgramDashboard/ProgramProgress/index.js.map +1 -1
- package/dist/containers/ProgramDashboard/ProgramProgress/messages.d.ts +20 -0
- package/dist/containers/ProgramDashboard/ProgramProgress/messages.js +20 -0
- package/dist/containers/ProgramDashboard/ProgramProgress/messages.js.map +1 -1
- package/dist/data/hooks/index.d.ts +2 -2
- package/dist/data/hooks/index.js +2 -2
- package/dist/data/hooks/index.js.map +1 -1
- package/dist/data/hooks/queryHooks.d.ts +3 -2
- package/dist/data/hooks/queryHooks.js +11 -1
- package/dist/data/hooks/queryHooks.js.map +1 -1
- package/dist/data/services/subs/api.d.ts +1 -0
- package/dist/data/services/subs/api.js +12 -0
- package/dist/data/services/subs/api.js.map +1 -1
- package/dist/data/services/subs/index.d.ts +1 -1
- package/dist/data/services/subs/index.js +1 -1
- package/dist/data/services/subs/index.js.map +1 -1
- package/dist/data/services/subs/urls.d.ts +2 -0
- package/dist/data/services/subs/urls.js +4 -0
- package/dist/data/services/subs/urls.js.map +1 -0
- package/dist/routes.d.ts +12 -2
- package/package.json +1 -1
- package/dist/containers/ProgramDashboard/ProgramProgress/ProgramProgressProvider.d.ts +0 -10
- package/dist/containers/ProgramDashboard/ProgramProgress/ProgramProgressProvider.js +0 -30
- package/dist/containers/ProgramDashboard/ProgramProgress/ProgramProgressProvider.js.map +0 -1
- package/dist/containers/ProgramDashboard/data/api.d.ts +0 -1
- package/dist/containers/ProgramDashboard/data/api.js +0 -18
- package/dist/containers/ProgramDashboard/data/api.js.map +0 -1
|
@@ -1,44 +1,27 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useContext, useEffect, useState } from 'react';
|
|
3
2
|
import { Helmet } from 'react-helmet';
|
|
4
3
|
import { useParams } from 'react-router-dom';
|
|
5
4
|
import { Col, Container, Row } from '@openedx/paragon';
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
5
|
+
import { camelCaseObject } from '@openedx/frontend-base';
|
|
6
|
+
import './index.scss';
|
|
7
|
+
import { useProgramProgressData } from '../../../data/hooks';
|
|
9
8
|
import ProgramProgressHeader from './ProgramProgressHeader';
|
|
10
9
|
import ProgramProgressInfo from './ProgramProgressInfo';
|
|
11
|
-
import './
|
|
10
|
+
import { ProgramProgressTabs } from './ProgramProgressTabs';
|
|
12
11
|
const ProgramProgress = () => {
|
|
13
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
14
|
-
const { programProgressData, setProgramProgressData, } = useContext(ProgramProgressContext);
|
|
15
|
-
const [programProgressEndpointError, setProgramProgressEndpointError] = useState(false);
|
|
16
|
-
const hasProgramProgressData = !!((programProgressData === null || programProgressData === void 0 ? void 0 : programProgressData.courseData)
|
|
17
|
-
&& programProgressData.programData
|
|
18
|
-
&& programProgressData.urls);
|
|
12
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
19
13
|
// Fetch UUID from route params
|
|
20
14
|
const { uuid } = useParams();
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
getProgramProgressData(uuid)
|
|
26
|
-
.then(responseData => {
|
|
27
|
-
setProgramProgressData(camelCaseObject(responseData.data));
|
|
28
|
-
})
|
|
29
|
-
.catch(err => {
|
|
30
|
-
logError(err);
|
|
31
|
-
setProgramProgressEndpointError(true);
|
|
32
|
-
});
|
|
33
|
-
}, [uuid, setProgramProgressData]);
|
|
34
|
-
if (programProgressEndpointError) {
|
|
35
|
-
return (_jsx("div", { children: "Not found page" }));
|
|
36
|
-
}
|
|
15
|
+
const { data, isLoading, error } = useProgramProgressData(uuid);
|
|
16
|
+
const programProgressData = camelCaseObject(data);
|
|
37
17
|
if (!uuid) {
|
|
38
|
-
return
|
|
18
|
+
return _jsx("div", { children: "Invalid URL" });
|
|
19
|
+
}
|
|
20
|
+
if (isLoading) {
|
|
21
|
+
return _jsx("div", { children: "Loading..." });
|
|
39
22
|
}
|
|
40
|
-
if (
|
|
41
|
-
return
|
|
23
|
+
if (error) {
|
|
24
|
+
return _jsx("div", { children: "Error occurred" });
|
|
42
25
|
}
|
|
43
26
|
const programData = programProgressData === null || programProgressData === void 0 ? void 0 : programProgressData.programData;
|
|
44
27
|
const courseData = programProgressData === null || programProgressData === void 0 ? void 0 : programProgressData.courseData;
|
|
@@ -48,7 +31,8 @@ const ProgramProgress = () => {
|
|
|
48
31
|
const allCoursesCompleted = !((_d = courseData.notStarted) === null || _d === void 0 ? void 0 : _d.length)
|
|
49
32
|
&& !((_e = courseData.inProgress) === null || _e === void 0 ? void 0 : _e.length)
|
|
50
33
|
&& ((_f = courseData.completed) === null || _f === void 0 ? void 0 : _f.length);
|
|
51
|
-
|
|
34
|
+
const programType = (_g = programData === null || programData === void 0 ? void 0 : programData.type) !== null && _g !== void 0 ? _g : '';
|
|
35
|
+
return (_jsxs(_Fragment, { children: [_jsx(Helmet, { title: `${programData === null || programData === void 0 ? void 0 : programData.title}` }), _jsxs(Container, { fluid: false, size: "xl", className: "p-4.5", children: [_jsx(ProgramProgressHeader, { programTitle: (_h = programData === null || programData === void 0 ? void 0 : programData.title) !== null && _h !== void 0 ? _h : '', programType: (_j = programData === null || programData === void 0 ? void 0 : programData.type) !== null && _j !== void 0 ? _j : '', authoringOrganizations: programData === null || programData === void 0 ? void 0 : programData.authoringOrganizations }), _jsx(Row, { children: _jsx(Col, { sm: 12, md: 8, children: _jsx(ProgramProgressInfo, { allCoursesCompleted: allCoursesCompleted, totalCoursesInProgram: totalCoursesInProgram, programTitle: (_k = programData === null || programData === void 0 ? void 0 : programData.title) !== null && _k !== void 0 ? _k : '' }) }) }), _jsx(ProgramProgressTabs, { counts: { inProgress: 1, remaining: 2, completed: 0 }, type: programType })] })] }));
|
|
52
36
|
};
|
|
53
37
|
export default ProgramProgress;
|
|
54
38
|
//# sourceMappingURL=ProgramProgress.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProgramProgress.js","sourceRoot":"","sources":["../../../../src/containers/ProgramDashboard/ProgramProgress/ProgramProgress.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"ProgramProgress.js","sourceRoot":"","sources":["../../../../src/containers/ProgramDashboard/ProgramProgress/ProgramProgress.tsx"],"names":[],"mappings":"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","sourcesContent":["import { FC } from 'react';\nimport { Helmet } from 'react-helmet';\nimport { useParams } from 'react-router-dom';\nimport { Col, Container, Row } from '@openedx/paragon';\nimport { camelCaseObject } from '@openedx/frontend-base';\n\nimport './index.scss';\nimport { useProgramProgressData } from '@src/data/hooks';\nimport ProgramProgressHeader from './ProgramProgressHeader';\nimport ProgramProgressInfo from './ProgramProgressInfo';\nimport { ProgramProgressTabs } from './ProgramProgressTabs';\n\nconst ProgramProgress: FC = () => {\n // Fetch UUID from route params\n const { uuid } = useParams() as { uuid: string };\n\n const { data, isLoading, error } = useProgramProgressData(uuid);\n const programProgressData = camelCaseObject(data);\n\n if (!uuid) {\n return <div>Invalid URL</div>;\n }\n\n if (isLoading) {\n return <div>Loading...</div>;\n }\n\n if (error) {\n return <div>Error occurred</div>;\n }\n\n const programData = programProgressData?.programData;\n const courseData = programProgressData?.courseData;\n\n const totalCoursesInProgram = (courseData.notStarted?.length || 0)\n + (courseData.completed?.length || 0)\n + (courseData.inProgress?.length || 0);\n\n const allCoursesCompleted = !courseData.notStarted?.length\n && !courseData.inProgress?.length\n && courseData.completed?.length;\n\n const programType = programData?.type ?? '';\n\n return (\n <>\n <Helmet title={`${programData?.title}`} />\n <Container fluid={false} size=\"xl\" className=\"p-4.5\">\n <ProgramProgressHeader\n programTitle={programData?.title ?? ''}\n programType={programData?.type ?? ''}\n authoringOrganizations={programData?.authoringOrganizations}\n />\n <Row>\n <Col sm={12} md={8}>\n <ProgramProgressInfo\n allCoursesCompleted={allCoursesCompleted}\n totalCoursesInProgram={totalCoursesInProgram}\n programTitle={programData?.title ?? ''}\n />\n </Col>\n </Row>\n\n {/* TODO [TEMP]: Replace the below course count with actual count. For now, returning hardcoded data.\n Action: Revisit when data is being made dynamic.\n */}\n <ProgramProgressTabs counts={{ inProgress: 1, remaining: 2, completed: 0 }} type={programType} />\n </Container>\n </>\n );\n};\n\nexport default ProgramProgress;\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Tabs, Tab } from '@openedx/paragon';
|
|
4
|
+
import { useIntl } from '@openedx/frontend-base';
|
|
5
|
+
import messages from '../messages';
|
|
6
|
+
export const ProgramProgressTabs = ({ type, counts }) => {
|
|
7
|
+
const { inProgress, remaining, completed } = counts;
|
|
8
|
+
const { formatMessage } = useIntl();
|
|
9
|
+
const tabsData = [
|
|
10
|
+
{
|
|
11
|
+
key: 'in-progress',
|
|
12
|
+
title: formatMessage(messages.programProgressInProgressTab),
|
|
13
|
+
count: inProgress,
|
|
14
|
+
panel: _jsx("span", { children: "In progress tab data will be available soon." }),
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
key: 'remaining',
|
|
18
|
+
title: formatMessage(messages.programProgressRemainingTab),
|
|
19
|
+
count: remaining,
|
|
20
|
+
panel: _jsx("span", { children: "Remaining tab data will be available soon." }),
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
key: 'completed',
|
|
24
|
+
title: formatMessage(messages.programProgressCompletedTab),
|
|
25
|
+
count: completed,
|
|
26
|
+
panel: _jsx("span", { children: "Completed tab data will be available soon." }),
|
|
27
|
+
},
|
|
28
|
+
...((type === null || type === void 0 ? void 0 : type.toLowerCase()) === 'micromasters'
|
|
29
|
+
? [{
|
|
30
|
+
key: 'pathways',
|
|
31
|
+
title: formatMessage(messages.programProgressPathwaysTab),
|
|
32
|
+
panel: _jsx("span", { children: "Pathways tab data will be available soon." }),
|
|
33
|
+
}]
|
|
34
|
+
: []),
|
|
35
|
+
];
|
|
36
|
+
const [activeTab, setActiveTab] = useState(tabsData[0].key);
|
|
37
|
+
const handleTabSelect = (tabKey) => {
|
|
38
|
+
if (tabKey)
|
|
39
|
+
setActiveTab(tabKey);
|
|
40
|
+
};
|
|
41
|
+
return (_jsx(Tabs, { id: "program-progress-tabs", activeKey: activeTab, onSelect: handleTabSelect, className: "mb-4", mountOnEnter: true, children: tabsData.map(tab => (_jsx(Tab, { eventKey: tab.key, title: tab.count !== undefined ? `${tab.title} (${tab.count})` : tab.title, children: tab.panel }, tab.key))) }));
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/containers/ProgramDashboard/ProgramProgress/ProgramProgressTabs/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAM,QAAQ,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGjD,OAAO,QAAQ,MAAM,aAAa,CAAC;AAEnC,MAAM,CAAC,MAAM,mBAAmB,GAAiC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;IACpF,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IACpD,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IAEpC,MAAM,QAAQ,GAA8B;QAC1C;YACE,GAAG,EAAE,aAAa;YAClB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,4BAA4B,CAAC;YAC3D,KAAK,EAAE,UAAU;YACjB,KAAK,EAAE,0EAAyD;SACjE;QACD;YACE,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,2BAA2B,CAAC;YAC1D,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,wEAAuD;SAC/D;QACD;YACE,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,2BAA2B,CAAC;YAC1D,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,wEAAuD;SAC/D;QACD,GAAG,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,WAAW,EAAE,MAAK,cAAc;YACxC,CAAC,CAAC,CAAC;oBACC,GAAG,EAAE,UAAU;oBACf,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,0BAA0B,CAAC;oBACzD,KAAK,EAAE,uEAAsD;iBAC9D,CAAC;YACJ,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAS,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAEpE,MAAM,eAAe,GAAG,CAAC,MAAqB,EAAE,EAAE;QAChD,IAAI,MAAM;YAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC;IAEF,OAAO,CACL,KAAC,IAAI,IACH,EAAE,EAAC,uBAAuB,EAC1B,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,eAAe,EACzB,SAAS,EAAC,MAAM,EAChB,YAAY,kBAEX,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CACnB,KAAC,GAAG,IAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,EAAgB,KAAK,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,YAC7G,GAAG,CAAC,KAAK,IADiB,GAAG,CAAC,GAAG,CAE9B,CACP,CAAC,GACG,CACR,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { FC, useState } from 'react';\nimport { Tabs, Tab } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\n\nimport { ProgramProgressTabsProps, ProgramProgressTabItems } from '../../data/types';\nimport messages from '../messages';\n\nexport const ProgramProgressTabs: FC<ProgramProgressTabsProps> = ({ type, counts }) => {\n const { inProgress, remaining, completed } = counts;\n const { formatMessage } = useIntl();\n\n const tabsData: ProgramProgressTabItems[] = [\n {\n key: 'in-progress',\n title: formatMessage(messages.programProgressInProgressTab),\n count: inProgress,\n panel: <span>In progress tab data will be available soon.</span>,\n },\n {\n key: 'remaining',\n title: formatMessage(messages.programProgressRemainingTab),\n count: remaining,\n panel: <span>Remaining tab data will be available soon.</span>,\n },\n {\n key: 'completed',\n title: formatMessage(messages.programProgressCompletedTab),\n count: completed,\n panel: <span>Completed tab data will be available soon.</span>,\n },\n ...(type?.toLowerCase() === 'micromasters'\n ? [{\n key: 'pathways',\n title: formatMessage(messages.programProgressPathwaysTab),\n panel: <span>Pathways tab data will be available soon.</span>,\n }]\n : []),\n ];\n\n const [activeTab, setActiveTab] = useState<string>(tabsData[0].key);\n\n const handleTabSelect = (tabKey: string | null) => {\n if (tabKey) setActiveTab(tabKey);\n };\n\n return (\n <Tabs\n id=\"program-progress-tabs\"\n activeKey={activeTab}\n onSelect={handleTabSelect}\n className=\"mb-4\"\n mountOnEnter\n >\n {tabsData.map(tab => (\n <Tab eventKey={tab.key} key={tab.key} title={tab.count !== undefined ? `${tab.title} (${tab.count})` : tab.title}>\n {tab.panel}\n </Tab>\n ))}\n </Tabs>\n );\n};\n"]}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { useParams } from 'react-router-dom';
|
|
3
3
|
import { Button } from '@openedx/paragon';
|
|
4
|
-
import { FormattedNumber, useIntl } from '@openedx/frontend-base';
|
|
5
|
-
import
|
|
4
|
+
import { FormattedNumber, useIntl, camelCaseObject } from '@openedx/frontend-base';
|
|
5
|
+
import { useProgramProgressData } from '../../../../data/hooks/queryHooks';
|
|
6
6
|
import './index.scss';
|
|
7
|
-
import
|
|
7
|
+
import messages from './messages';
|
|
8
8
|
const UpgradeAllButton = () => {
|
|
9
|
+
const { uuid } = useParams();
|
|
10
|
+
const { data } = useProgramProgressData(uuid);
|
|
11
|
+
const programProgressData = camelCaseObject(data);
|
|
9
12
|
const { formatMessage } = useIntl();
|
|
10
|
-
const { programProgressData } = useContext(ProgramProgressContext);
|
|
11
13
|
const { urls } = programProgressData;
|
|
12
14
|
const getAllRemainingCoursesPrice = () => {
|
|
13
15
|
if (!programProgressData.programData) {
|
package/dist/containers/ProgramDashboard/ProgramProgress/UpgradeButton/UpgradeAllButton.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpgradeAllButton.js","sourceRoot":"","sources":["../../../../../src/containers/ProgramDashboard/ProgramProgress/UpgradeButton/UpgradeAllButton.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"UpgradeAllButton.js","sourceRoot":"","sources":["../../../../../src/containers/ProgramDashboard/ProgramProgress/UpgradeButton/UpgradeAllButton.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEnF,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,cAAc,CAAC;AACtB,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,gBAAgB,GAAO,GAAG,EAAE;IAChC,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,EAAsB,CAAC;IAEjD,MAAM,EAAE,IAAI,EAAE,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,mBAAmB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAElD,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC;IAErC,MAAM,2BAA2B,GAAG,GAAG,EAAE;QACvC,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,EAAE,YAAY,EAAE,GAAG,mBAAmB,CAAC,WAAW,CAAC;QAEzD,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,EACJ,QAAQ,EACR,YAAY,EACZ,yBAAyB,EACzB,YAAY,GACb,GAAG,YAAY,CAAC;YAEjB,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO,CACL,8BACE,eAAM,SAAS,EAAC,YAAY,YAC1B,KAAC,eAAe,IACd,KAAK,EAAE,yBAAyB,EAChC,KAAK,EAAC,UAAU,EAChB,QAAQ,EAAE,QAAQ,EAClB,qBAAqB,EAAE,CAAC,EACxB,qBAAqB,EAAE,CAAC,GACxB,GACG,EACP,yBACE,KAAC,eAAe,IACd,KAAK,EAAE,YAAY,EACnB,KAAK,EAAC,UAAU,EAChB,QAAQ,EAAE,QAAQ,EAClB,qBAAqB,EAAE,CAAC,EACxB,qBAAqB,EAAE,CAAC,GACxB,GACG,IACN,CACJ,CAAC;YACJ,CAAC;YACD,OAAO,CACL,yBACE,KAAC,eAAe,IACd,KAAK,EAAE,YAAY,EACnB,KAAK,EAAC,UAAU,EAChB,QAAQ,EAAE,QAAQ,EAClB,qBAAqB,EAAE,CAAC,EACxB,qBAAqB,EAAE,CAAC,GACxB,GACG,CACR,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,MAAM,IACL,EAAE,EAAC,GAAG,EACN,SAAS,EAAC,oBAAoB,EAC9B,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,YAAY,iBACnB,oBAAoB,EAChC,OAAO,EAAC,OAAO,aAEf,yBACG,aAAa,CAAC,QAAQ,CAAC,oCAAoC,CAAC,GACxD,EACN,2BAA2B,EAAE,IAAI,CAChC,eAAM,SAAS,EAAC,6BAA6B,YAC1C,2BAA2B,EAAE,GACzB,CACR,IACM,CACV,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC","sourcesContent":["import { FC } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { Button } from '@openedx/paragon';\nimport { FormattedNumber, useIntl, camelCaseObject } from '@openedx/frontend-base';\n\nimport { useProgramProgressData } from '@src/data/hooks/queryHooks';\nimport './index.scss';\nimport messages from './messages';\n\nconst UpgradeAllButton: FC = () => {\n const { uuid } = useParams() as { uuid: string };\n\n const { data } = useProgramProgressData(uuid);\n const programProgressData = camelCaseObject(data);\n\n const { formatMessage } = useIntl();\n const { urls } = programProgressData;\n\n const getAllRemainingCoursesPrice = () => {\n if (!programProgressData.programData) {\n return null;\n }\n const { discountData } = programProgressData.programData;\n\n if (discountData) {\n const {\n currency,\n isDiscounted,\n totalInclTaxExclDiscounts,\n totalInclTax,\n } = discountData;\n\n if (isDiscounted) {\n return (\n <>\n <span className=\"list-price\">\n <FormattedNumber\n value={totalInclTaxExclDiscounts}\n style=\"currency\"\n currency={currency}\n maximumFractionDigits={2}\n minimumFractionDigits={2}\n />\n </span>\n <span>\n <FormattedNumber\n value={totalInclTax}\n style=\"currency\"\n currency={currency}\n maximumFractionDigits={2}\n minimumFractionDigits={2}\n />\n </span>\n </>\n );\n }\n return (\n <span>\n <FormattedNumber\n value={totalInclTax}\n style=\"currency\"\n currency={currency}\n maximumFractionDigits={2}\n minimumFractionDigits={2}\n />\n </span>\n );\n }\n return null;\n };\n\n return (\n <Button\n as=\"a\"\n className=\"upgrade-all-button\"\n href={urls && urls.buyButtonUrl}\n data-testid=\"upgrade-all-button\"\n variant=\"brand\"\n >\n <span>\n {formatMessage(messages.upgradeAllRemainingCoursesButtonText)}\n </span>\n {getAllRemainingCoursesPrice() && (\n <span className=\"all-remaining-courses-price\">\n {getAllRemainingCoursesPrice()}\n </span>\n )}\n </Button>\n );\n};\n\nexport default UpgradeAllButton;\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export default
|
|
1
|
+
import ProgramProgress from './ProgramProgress';
|
|
2
|
+
export default ProgramProgress;
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { ProgramProgressContextProvider } from './ProgramProgressProvider';
|
|
3
1
|
import ProgramProgress from './ProgramProgress';
|
|
4
|
-
|
|
5
|
-
export default ProgramProgressWithProvider;
|
|
2
|
+
export default ProgramProgress;
|
|
6
3
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/containers/ProgramDashboard/ProgramProgress/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/containers/ProgramDashboard/ProgramProgress/index.tsx"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAEhD,eAAe,eAAe,CAAC","sourcesContent":["import ProgramProgress from './ProgramProgress';\n\nexport default ProgramProgress;\n"]}
|
|
@@ -49,5 +49,25 @@ declare const messages: {
|
|
|
49
49
|
id: string;
|
|
50
50
|
description: string;
|
|
51
51
|
};
|
|
52
|
+
programProgressInProgressTab: {
|
|
53
|
+
defaultMessage: string;
|
|
54
|
+
id: string;
|
|
55
|
+
description: string;
|
|
56
|
+
};
|
|
57
|
+
programProgressRemainingTab: {
|
|
58
|
+
defaultMessage: string;
|
|
59
|
+
id: string;
|
|
60
|
+
description: string;
|
|
61
|
+
};
|
|
62
|
+
programProgressCompletedTab: {
|
|
63
|
+
defaultMessage: string;
|
|
64
|
+
id: string;
|
|
65
|
+
description: string;
|
|
66
|
+
};
|
|
67
|
+
programProgressPathwaysTab: {
|
|
68
|
+
defaultMessage: string;
|
|
69
|
+
id: string;
|
|
70
|
+
description: string;
|
|
71
|
+
};
|
|
52
72
|
};
|
|
53
73
|
export default messages;
|
|
@@ -50,6 +50,26 @@ const messages = defineMessages({
|
|
|
50
50
|
id: 'program.progress.card.upgrade.button.text',
|
|
51
51
|
description: 'text to display on the progress card for the upgrade button',
|
|
52
52
|
},
|
|
53
|
+
programProgressInProgressTab: {
|
|
54
|
+
defaultMessage: 'In progress',
|
|
55
|
+
id: 'program.progress.in.progress.tab',
|
|
56
|
+
description: 'Label for the "In progress" tab on the program progress page, which lists courses that the user has started but not yet completed.',
|
|
57
|
+
},
|
|
58
|
+
programProgressRemainingTab: {
|
|
59
|
+
defaultMessage: 'Remaining',
|
|
60
|
+
id: 'program.progress.remaining.tab',
|
|
61
|
+
description: 'Label for the "Remaining" tab on the program progress page, which lists courses that the user has not yet started.',
|
|
62
|
+
},
|
|
63
|
+
programProgressCompletedTab: {
|
|
64
|
+
defaultMessage: 'Completed',
|
|
65
|
+
id: 'program.progress.completed.tab',
|
|
66
|
+
description: 'Label for the "Completed" tab on the program progress page, which lists courses that the user has completed.',
|
|
67
|
+
},
|
|
68
|
+
programProgressPathwaysTab: {
|
|
69
|
+
defaultMessage: 'Pathways',
|
|
70
|
+
id: 'program.progress.pathways.tab',
|
|
71
|
+
description: 'Label for the "Pathways" tab on the program progress page, which gives details of how the program can be used to further the learners education. This tab is only shown for MicroMasters programs.',
|
|
72
|
+
},
|
|
53
73
|
});
|
|
54
74
|
export default messages;
|
|
55
75
|
//# sourceMappingURL=messages.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../src/containers/ProgramDashboard/ProgramProgress/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,2BAA2B,EAAE;QAC3B,cAAc,EAAE,cAAc;QAC9B,EAAE,EAAE,+BAA+B;QACnC,WAAW,EAAE,yCAAyC;KACvD;IACD,gBAAgB,EAAE;QAChB,cAAc,EAAE,uBAAuB;QACvC,EAAE,EAAE,qCAAqC;QACzC,WAAW,EAAE,qGAAqG;KACnH;IACD,6BAA6B,EAAE;QAC7B,cAAc,EAAE,kBAAkB;QAClC,EAAE,EAAE,kCAAkC;QACtC,WAAW,EAAE,yEAAyE;KACvF;IACD,2BAA2B,EAAE;QAC3B,cAAc,EAAE,0EAA0E;QAC1F,EAAE,EAAE,gCAAgC;QACpC,WAAW,EAAE,8EAA8E;KAC5F;IACD,+BAA+B,EAAE;QAC/B,cAAc,EAAE,sBAAsB;QACtC,EAAE,EAAE,oCAAoC;QACxC,WAAW,EAAE,sFAAsF;KACpG;IACD,6BAA6B,EAAE;QAC7B,cAAc,EAAE,0KAA0K;QAC1L,EAAE,EAAE,kCAAkC;QACtC,WAAW,EAAE,gFAAgF;KAC9F;IACD,6BAA6B,EAAE;QAC7B,cAAc,EAAE,4BAA4B;QAC5C,EAAE,EAAE,uCAAuC;QAC3C,WAAW,EAAE,oFAAoF;KAClG;IACD,8BAA8B,EAAE;QAC9B,cAAc,EAAE,sDAAsD;QACtE,EAAE,EAAE,wCAAwC;QAC5C,WAAW,EAAE,uFAAuF;KACrG;IACD,+BAA+B,EAAE;QAC/B,cAAc,EAAE,eAAe;QAC/B,EAAE,EAAE,0CAA0C;QAC9C,WAAW,EAAE,mEAAmE;KACjF;IACD,gCAAgC,EAAE;QAChC,cAAc,EAAE,gCAAgC;QAChD,EAAE,EAAE,2CAA2C;QAC/C,WAAW,EAAE,6DAA6D;KAC3E;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n programProgressInstitutions: {\n defaultMessage: 'Institutions',\n id: 'program.progress.institutions',\n description: 'Label text for organization image logos',\n },\n programTypeLabel: {\n defaultMessage: '{programType} program',\n id: 'program.progress.program.type.label',\n description: 'Label displaying the program type (e.g. \"MicroMasters program\", \"Professional Certificate program\")',\n },\n programProgressCompleteHeader: {\n defaultMessage: 'Congratulations!',\n id: 'program.progress.complete.header',\n description: 'header text for the program progress page when all courses are complete',\n },\n programProgressCompleteText: {\n defaultMessage: 'You have successfully completed all the requirements for {programTitle}.',\n id: 'program.progress.complete.text',\n description: 'text to display when a user has completed all of the courses for the program',\n },\n programProgressIncompleteHeader: {\n defaultMessage: 'Your Program Journey',\n id: 'program.progress.incomplete.header',\n description: 'header text to display when the user has remaining incomplete courses in the program',\n },\n programProgressIncompleteText: {\n defaultMessage: 'Track and plan your progress through the {totalCoursesInProgram} courses in this program. To complete the program, you must earn a verified certificate for each course.',\n id: 'program.progress.incomplete.text',\n description: 'text to display when a user has not completed all of the courses for a program',\n },\n programProgressCardEnrollment: {\n defaultMessage: 'Enrolled: {enrollmentInfo}',\n id: 'program.progress.card.enrollment.text',\n description: 'text to display on the progress card related to the enrollment date for the course',\n },\n programProgressCardCertificate: {\n defaultMessage: '<bold>Certificate Status:</bold> {certificateStatus}',\n id: 'program.progress.card.certificate.text',\n description: 'text to display on the progress card related to the certificate status for the course',\n },\n programProgressCardResumeButton: {\n defaultMessage: 'Resume course',\n id: 'program.progress.card.resume.button.text',\n description: 'text to display on the progress card for the resume course button',\n },\n programProgressCardUpgradeButton: {\n defaultMessage: 'Upgrade with your subscription',\n id: 'program.progress.card.upgrade.button.text',\n description: 'text to display on the progress card for the upgrade button',\n },\n});\n\nexport default messages;\n"]}
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../src/containers/ProgramDashboard/ProgramProgress/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,2BAA2B,EAAE;QAC3B,cAAc,EAAE,cAAc;QAC9B,EAAE,EAAE,+BAA+B;QACnC,WAAW,EAAE,yCAAyC;KACvD;IACD,gBAAgB,EAAE;QAChB,cAAc,EAAE,uBAAuB;QACvC,EAAE,EAAE,qCAAqC;QACzC,WAAW,EAAE,qGAAqG;KACnH;IACD,6BAA6B,EAAE;QAC7B,cAAc,EAAE,kBAAkB;QAClC,EAAE,EAAE,kCAAkC;QACtC,WAAW,EAAE,yEAAyE;KACvF;IACD,2BAA2B,EAAE;QAC3B,cAAc,EAAE,0EAA0E;QAC1F,EAAE,EAAE,gCAAgC;QACpC,WAAW,EAAE,8EAA8E;KAC5F;IACD,+BAA+B,EAAE;QAC/B,cAAc,EAAE,sBAAsB;QACtC,EAAE,EAAE,oCAAoC;QACxC,WAAW,EAAE,sFAAsF;KACpG;IACD,6BAA6B,EAAE;QAC7B,cAAc,EAAE,0KAA0K;QAC1L,EAAE,EAAE,kCAAkC;QACtC,WAAW,EAAE,gFAAgF;KAC9F;IACD,6BAA6B,EAAE;QAC7B,cAAc,EAAE,4BAA4B;QAC5C,EAAE,EAAE,uCAAuC;QAC3C,WAAW,EAAE,oFAAoF;KAClG;IACD,8BAA8B,EAAE;QAC9B,cAAc,EAAE,sDAAsD;QACtE,EAAE,EAAE,wCAAwC;QAC5C,WAAW,EAAE,uFAAuF;KACrG;IACD,+BAA+B,EAAE;QAC/B,cAAc,EAAE,eAAe;QAC/B,EAAE,EAAE,0CAA0C;QAC9C,WAAW,EAAE,mEAAmE;KACjF;IACD,gCAAgC,EAAE;QAChC,cAAc,EAAE,gCAAgC;QAChD,EAAE,EAAE,2CAA2C;QAC/C,WAAW,EAAE,6DAA6D;KAC3E;IACD,4BAA4B,EAAE;QAC5B,cAAc,EAAE,aAAa;QAC7B,EAAE,EAAE,kCAAkC;QACtC,WAAW,EAAE,oIAAoI;KAClJ;IACD,2BAA2B,EAAE;QAC3B,cAAc,EAAE,WAAW;QAC3B,EAAE,EAAE,gCAAgC;QACpC,WAAW,EAAE,oHAAoH;KAClI;IACD,2BAA2B,EAAE;QAC3B,cAAc,EAAE,WAAW;QAC3B,EAAE,EAAE,gCAAgC;QACpC,WAAW,EAAE,8GAA8G;KAC5H;IACD,0BAA0B,EAAE;QAC1B,cAAc,EAAE,UAAU;QAC1B,EAAE,EAAE,+BAA+B;QACnC,WAAW,EAAE,oMAAoM;KAClN;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n programProgressInstitutions: {\n defaultMessage: 'Institutions',\n id: 'program.progress.institutions',\n description: 'Label text for organization image logos',\n },\n programTypeLabel: {\n defaultMessage: '{programType} program',\n id: 'program.progress.program.type.label',\n description: 'Label displaying the program type (e.g. \"MicroMasters program\", \"Professional Certificate program\")',\n },\n programProgressCompleteHeader: {\n defaultMessage: 'Congratulations!',\n id: 'program.progress.complete.header',\n description: 'header text for the program progress page when all courses are complete',\n },\n programProgressCompleteText: {\n defaultMessage: 'You have successfully completed all the requirements for {programTitle}.',\n id: 'program.progress.complete.text',\n description: 'text to display when a user has completed all of the courses for the program',\n },\n programProgressIncompleteHeader: {\n defaultMessage: 'Your Program Journey',\n id: 'program.progress.incomplete.header',\n description: 'header text to display when the user has remaining incomplete courses in the program',\n },\n programProgressIncompleteText: {\n defaultMessage: 'Track and plan your progress through the {totalCoursesInProgram} courses in this program. To complete the program, you must earn a verified certificate for each course.',\n id: 'program.progress.incomplete.text',\n description: 'text to display when a user has not completed all of the courses for a program',\n },\n programProgressCardEnrollment: {\n defaultMessage: 'Enrolled: {enrollmentInfo}',\n id: 'program.progress.card.enrollment.text',\n description: 'text to display on the progress card related to the enrollment date for the course',\n },\n programProgressCardCertificate: {\n defaultMessage: '<bold>Certificate Status:</bold> {certificateStatus}',\n id: 'program.progress.card.certificate.text',\n description: 'text to display on the progress card related to the certificate status for the course',\n },\n programProgressCardResumeButton: {\n defaultMessage: 'Resume course',\n id: 'program.progress.card.resume.button.text',\n description: 'text to display on the progress card for the resume course button',\n },\n programProgressCardUpgradeButton: {\n defaultMessage: 'Upgrade with your subscription',\n id: 'program.progress.card.upgrade.button.text',\n description: 'text to display on the progress card for the upgrade button',\n },\n programProgressInProgressTab: {\n defaultMessage: 'In progress',\n id: 'program.progress.in.progress.tab',\n description: 'Label for the \"In progress\" tab on the program progress page, which lists courses that the user has started but not yet completed.',\n },\n programProgressRemainingTab: {\n defaultMessage: 'Remaining',\n id: 'program.progress.remaining.tab',\n description: 'Label for the \"Remaining\" tab on the program progress page, which lists courses that the user has not yet started.',\n },\n programProgressCompletedTab: {\n defaultMessage: 'Completed',\n id: 'program.progress.completed.tab',\n description: 'Label for the \"Completed\" tab on the program progress page, which lists courses that the user has completed.',\n },\n programProgressPathwaysTab: {\n defaultMessage: 'Pathways',\n id: 'program.progress.pathways.tab',\n description: 'Label for the \"Pathways\" tab on the program progress page, which gives details of how the program can be used to further the learners education. This tab is only shown for MicroMasters programs.',\n },\n});\n\nexport default messages;\n"]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { useInitializeLearnerHome, useProgramsListData } from './queryHooks';
|
|
1
|
+
import { useInitializeLearnerHome, useProgramsListData, useProgramProgressData } from './queryHooks';
|
|
2
2
|
import { useUnenrollFromCourse, useUpdateEntitlementEnrollment, useDeleteEntitlementEnrollment, useUpdateEmailSettings, useCreateCreditRequest, useSendConfirmEmail } from './mutationHooks';
|
|
3
|
-
export { useInitializeLearnerHome, useUnenrollFromCourse, useUpdateEntitlementEnrollment, useDeleteEntitlementEnrollment, useUpdateEmailSettings, useCreateCreditRequest, useSendConfirmEmail, useProgramsListData, };
|
|
3
|
+
export { useInitializeLearnerHome, useUnenrollFromCourse, useUpdateEntitlementEnrollment, useDeleteEntitlementEnrollment, useUpdateEmailSettings, useCreateCreditRequest, useSendConfirmEmail, useProgramsListData, useProgramProgressData, };
|
package/dist/data/hooks/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useInitializeLearnerHome, useProgramsListData } from './queryHooks';
|
|
1
|
+
import { useInitializeLearnerHome, useProgramsListData, useProgramProgressData } from './queryHooks';
|
|
2
2
|
import { useUnenrollFromCourse, useUpdateEntitlementEnrollment, useDeleteEntitlementEnrollment, useUpdateEmailSettings, useCreateCreditRequest, useSendConfirmEmail, } from './mutationHooks';
|
|
3
|
-
export { useInitializeLearnerHome, useUnenrollFromCourse, useUpdateEntitlementEnrollment, useDeleteEntitlementEnrollment, useUpdateEmailSettings, useCreateCreditRequest, useSendConfirmEmail, useProgramsListData, };
|
|
3
|
+
export { useInitializeLearnerHome, useUnenrollFromCourse, useUpdateEntitlementEnrollment, useDeleteEntitlementEnrollment, useUpdateEmailSettings, useCreateCreditRequest, useSendConfirmEmail, useProgramsListData, useProgramProgressData, };
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/data/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/data/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACrG,OAAO,EACL,qBAAqB,EACrB,8BAA8B,EAC9B,8BAA8B,EAC9B,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,8BAA8B,EAC9B,8BAA8B,EAC9B,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,GACvB,CAAC","sourcesContent":["import { useInitializeLearnerHome, useProgramsListData, useProgramProgressData } from './queryHooks';\nimport {\n useUnenrollFromCourse,\n useUpdateEntitlementEnrollment,\n useDeleteEntitlementEnrollment,\n useUpdateEmailSettings,\n useCreateCreditRequest,\n useSendConfirmEmail,\n} from './mutationHooks';\n\nexport {\n useInitializeLearnerHome,\n useUnenrollFromCourse,\n useUpdateEntitlementEnrollment,\n useDeleteEntitlementEnrollment,\n useUpdateEmailSettings,\n useCreateCreditRequest,\n useSendConfirmEmail,\n useProgramsListData,\n useProgramProgressData,\n};\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ProgramData } from '@src/containers/ProgramDashboard/data/types';
|
|
1
|
+
import { ProgramData, ProgramProgressData } from '@src/containers/ProgramDashboard/data/types';
|
|
2
2
|
declare const useInitializeLearnerHome: () => {
|
|
3
3
|
data: any;
|
|
4
4
|
error: any;
|
|
@@ -163,4 +163,5 @@ declare const useInitializeLearnerHome: () => {
|
|
|
163
163
|
promise: Promise<any>;
|
|
164
164
|
};
|
|
165
165
|
declare const useProgramsListData: () => import("@tanstack/react-query").UseQueryResult<ProgramData[], Error>;
|
|
166
|
-
|
|
166
|
+
declare const useProgramProgressData: (uuid: string) => import("@tanstack/react-query").UseQueryResult<ProgramProgressData, Error>;
|
|
167
|
+
export { useInitializeLearnerHome, useProgramProgressData, useProgramsListData, };
|
|
@@ -14,6 +14,7 @@ import GlobalDataContext from '../../data/contexts/GlobalDataContext';
|
|
|
14
14
|
import { initializeList, fetchProgramsListData, } from '../../data/services/lms/api';
|
|
15
15
|
import { getTransformedCourseDataObject } from '../../utils/dataTransformers';
|
|
16
16
|
import { learnerDashboardQueryKeys } from './queryKeys';
|
|
17
|
+
import { getProgramProgressData } from '../../data/services/subs';
|
|
17
18
|
const useInitializeLearnerHome = () => {
|
|
18
19
|
const { masqueradeUser } = useMasquerade();
|
|
19
20
|
const queryClient = useQueryClient();
|
|
@@ -61,5 +62,14 @@ const useProgramsListData = () => {
|
|
|
61
62
|
refetchOnWindowFocus: false,
|
|
62
63
|
});
|
|
63
64
|
};
|
|
64
|
-
|
|
65
|
+
const useProgramProgressData = (uuid) => {
|
|
66
|
+
return useQuery({
|
|
67
|
+
queryKey: ['programProgress', uuid],
|
|
68
|
+
queryFn: () => getProgramProgressData(uuid),
|
|
69
|
+
enabled: !!uuid,
|
|
70
|
+
staleTime: 1000 * 60 * 5, // 5 min caching
|
|
71
|
+
retry: 2,
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
export { useInitializeLearnerHome, useProgramProgressData, useProgramsListData, };
|
|
65
75
|
//# sourceMappingURL=queryHooks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryHooks.js","sourceRoot":"","sources":["../../../src/data/hooks/queryHooks.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,iBAAiB,MAAM,sCAAsC,CAAC;AACrE,OAAO,EACL,cAAc,EACd,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"queryHooks.js","sourceRoot":"","sources":["../../../src/data/hooks/queryHooks.ts"],"names":[],"mappings":"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","sourcesContent":["import { useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useContext, useEffect } from 'react';\nimport { useMasquerade } from '@src/data/context';\nimport GlobalDataContext from '@src/data/contexts/GlobalDataContext';\nimport {\n initializeList,\n fetchProgramsListData,\n} from '@src/data/services/lms/api';\nimport { ProgramData, ProgramProgressData } from '@src/containers/ProgramDashboard/data/types';\nimport { getTransformedCourseDataObject } from '@src/utils/dataTransformers';\nimport { learnerDashboardQueryKeys } from './queryKeys';\nimport { getProgramProgressData } from '@src/data/services/subs';\n\nconst useInitializeLearnerHome = () => {\n const { masqueradeUser } = useMasquerade();\n const queryClient = useQueryClient();\n const { setEmailConfirmation, setPlatformSettings } = useContext(GlobalDataContext);\n\n const query = useQuery({\n queryKey: learnerDashboardQueryKeys.initialize(masqueradeUser),\n queryFn: async () => {\n const data = await initializeList(masqueradeUser);\n return {\n ...data,\n coursesByCardId: getTransformedCourseDataObject(data?.courses || []),\n };\n },\n staleTime: 5 * 60 * 1000, // 5 minutes — dashboard data rarely changes while viewing\n retry: (failureCount, error: any) => {\n // Don't retry client errors (4xx) — they won't resolve on retry\n if (error?.response?.status >= 400 && error?.response?.status < 500) return false;\n return failureCount < 3;\n },\n retryOnMount: !masqueradeUser,\n refetchOnMount: !masqueradeUser,\n });\n\n // Populate shell-level GlobalDataProvider so header widgets can access this data\n useEffect(() => {\n if (query.data && !masqueradeUser) {\n if (query.data.emailConfirmation && setEmailConfirmation) {\n setEmailConfirmation(query.data.emailConfirmation);\n }\n if (query.data.platformSettings && setPlatformSettings) {\n setPlatformSettings(query.data.platformSettings);\n }\n }\n }, [masqueradeUser, query.data, setEmailConfirmation, setPlatformSettings]);\n\n // When masquerading fails, fall back to the normal user's cached data\n let { data } = query;\n if (masqueradeUser && query.isError) {\n data = queryClient.getQueryData(learnerDashboardQueryKeys.initialize(undefined));\n }\n\n return { ...query, data };\n};\n\nconst useProgramsListData = () => {\n return useQuery<ProgramData[]>({\n queryKey: ['programsList'],\n queryFn: fetchProgramsListData,\n retry: false,\n refetchOnWindowFocus: false,\n });\n};\n\nconst useProgramProgressData = (uuid: string) => {\n return useQuery<ProgramProgressData>({\n queryKey: ['programProgress', uuid],\n queryFn: () => getProgramProgressData(uuid),\n enabled: !!uuid,\n staleTime: 1000 * 60 * 5, // 5 min caching\n retry: 2,\n });\n};\n\nexport {\n useInitializeLearnerHome,\n useProgramProgressData,\n useProgramsListData,\n};\n"]}
|
|
@@ -7,6 +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 { getAuthenticatedHttpClient } from '@openedx/frontend-base';
|
|
11
|
+
import { programProgressUrl } from './urls';
|
|
10
12
|
export const fetchRecommendedCourses = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
11
13
|
/* TODO [TEMP]: Replace with actual API call to fetch recommended courses data. For now, returning hardcoded data to simulate the API response. Also, built the test case for the same.
|
|
12
14
|
Reason: The API endpoint is not yet available and the data structure is still being finalized.
|
|
@@ -63,4 +65,14 @@ export const fetchRecommendedCourses = () => __awaiter(void 0, void 0, void 0, f
|
|
|
63
65
|
throw error;
|
|
64
66
|
}
|
|
65
67
|
});
|
|
68
|
+
export const getProgramProgressData = (uuid) => __awaiter(void 0, void 0, void 0, function* () {
|
|
69
|
+
try {
|
|
70
|
+
const { data } = yield getAuthenticatedHttpClient().get(programProgressUrl(uuid));
|
|
71
|
+
return data;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.error('Error fetching program progress data:', error);
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
66
78
|
//# sourceMappingURL=api.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/data/services/subs/api.ts"],"names":[],"mappings":";;;;;;;;;AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAS,EAAE;IAChD;;;QAGI;IAEJ,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9G,IAAI,CAAC;QACH,MAAM,SAAS,GAAG;YAChB;gBACE,EAAE,EAAE,CAAC;gBACL,KAAK,EAAE,aAAa,CAAC,+BAA+B,EAAE,EAAE,CAAC;gBACzD,IAAI,EAAE,aAAa,CAAC,mLAAmL,EAAE,GAAG,CAAC;gBAC7M,GAAG,EAAE,sFAAsF;gBAC3F,SAAS,EAAE,8FAA8F;gBACzG,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,QAAQ;aACtB;YACD;gBACE,EAAE,EAAE,CAAC;gBACL,KAAK,EAAE,aAAa,CAAC,+BAA+B,EAAE,EAAE,CAAC;gBACzD,IAAI,EAAE,aAAa,CAAC,2LAA2L,EAAE,GAAG,CAAC;gBACrN,GAAG,EAAE,sFAAsF;gBAC3F,SAAS,EAAE,8FAA8F;gBACzG,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,QAAQ;aACtB;YACD;gBACE,EAAE,EAAE,CAAC;gBACL,KAAK,EAAE,aAAa,CAAC,iBAAiB,EAAE,EAAE,CAAC;gBAC3C,IAAI,EAAE,aAAa,CAAC,oLAAoL,EAAE,GAAG,CAAC;gBAC9M,GAAG,EAAE,wEAAwE;gBAC7E,SAAS,EAAE,gFAAgF;gBAC3F,SAAS,EAAE,IAAI,EAAE,OAAO;gBACxB,OAAO,EAAE,0BAA0B;gBACnC,WAAW,EAAE,WAAW;aACzB;YACD;gBACE,EAAE,EAAE,CAAC;gBACL,KAAK,EAAE,aAAa,CAAC,cAAc,EAAE,EAAE,CAAC;gBACxC,IAAI,EAAE,aAAa,CAAC,2KAA2K,EAAE,GAAG,CAAC;gBACrM,GAAG,EAAE,qEAAqE;gBAC1E,SAAS,EAAE,6EAA6E;gBACxF,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,QAAQ;aACtB;SACF,CAAC;QAEF,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QACnD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAA,CAAC","sourcesContent":["
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/data/services/subs/api.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAE5C,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAS,EAAE;IAChD;;;QAGI;IAEJ,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9G,IAAI,CAAC;QACH,MAAM,SAAS,GAAG;YAChB;gBACE,EAAE,EAAE,CAAC;gBACL,KAAK,EAAE,aAAa,CAAC,+BAA+B,EAAE,EAAE,CAAC;gBACzD,IAAI,EAAE,aAAa,CAAC,mLAAmL,EAAE,GAAG,CAAC;gBAC7M,GAAG,EAAE,sFAAsF;gBAC3F,SAAS,EAAE,8FAA8F;gBACzG,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,QAAQ;aACtB;YACD;gBACE,EAAE,EAAE,CAAC;gBACL,KAAK,EAAE,aAAa,CAAC,+BAA+B,EAAE,EAAE,CAAC;gBACzD,IAAI,EAAE,aAAa,CAAC,2LAA2L,EAAE,GAAG,CAAC;gBACrN,GAAG,EAAE,sFAAsF;gBAC3F,SAAS,EAAE,8FAA8F;gBACzG,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,QAAQ;aACtB;YACD;gBACE,EAAE,EAAE,CAAC;gBACL,KAAK,EAAE,aAAa,CAAC,iBAAiB,EAAE,EAAE,CAAC;gBAC3C,IAAI,EAAE,aAAa,CAAC,oLAAoL,EAAE,GAAG,CAAC;gBAC9M,GAAG,EAAE,wEAAwE;gBAC7E,SAAS,EAAE,gFAAgF;gBAC3F,SAAS,EAAE,IAAI,EAAE,OAAO;gBACxB,OAAO,EAAE,0BAA0B;gBACnC,WAAW,EAAE,WAAW;aACzB;YACD;gBACE,EAAE,EAAE,CAAC;gBACL,KAAK,EAAE,aAAa,CAAC,cAAc,EAAE,EAAE,CAAC;gBACxC,IAAI,EAAE,aAAa,CAAC,2KAA2K,EAAE,GAAG,CAAC;gBACrM,GAAG,EAAE,qEAAqE;gBAC1E,SAAS,EAAE,6EAA6E;gBACxF,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,QAAQ;aACtB;SACF,CAAC;QAEF,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QACnD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAO,IAAY,EAAE,EAAE;IAC3D,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,0BAA0B,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;QAC9D,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAA,CAAC","sourcesContent":["import { getAuthenticatedHttpClient } from '@openedx/frontend-base';\nimport { programProgressUrl } from './urls';\n\nexport const fetchRecommendedCourses = async () => {\n /* TODO [TEMP]: Replace with actual API call to fetch recommended courses data. For now, returning hardcoded data to simulate the API response. Also, built the test case for the same.\n Reason: The API endpoint is not yet available and the data structure is still being finalized.\n Action: Revisit after endpoint is made available.\n */\n\n const optimizedData = (data: string, size: number) => data.length > size ? `${data.slice(0, size)}...` : data;\n\n try {\n const finalData = [\n {\n id: 1,\n title: optimizedData('Essence Mascara Lash Princess', 30),\n body: optimizedData('The Essence Mascara Lash Princess is a popular mascara known for its volumizing and lengthening effects. Achieve dramatic lashes with this long-lasting and cruelty-free formula.', 100),\n url: 'https://cdn.dummyjson.com/product-images/beauty/essence-mascara-lash-princess/1.webp',\n thumbnail: 'https://cdn.dummyjson.com/product-images/beauty/essence-mascara-lash-princess/thumbnail.webp',\n isProgram: false,\n tagText: '',\n footerLabel: 'Course'\n },\n {\n id: 2,\n title: optimizedData('Eyeshadow Palette with Mirror', 30),\n body: optimizedData(\"The Eyeshadow Palette with Mirror offers a versatile range of eyeshadow shades for creating stunning eye looks. With a built-in mirror, it's convenient for on-the-go makeup application.\", 100),\n url: 'https://cdn.dummyjson.com/product-images/beauty/eyeshadow-palette-with-mirror/1.webp',\n thumbnail: 'https://cdn.dummyjson.com/product-images/beauty/eyeshadow-palette-with-mirror/thumbnail.webp',\n isProgram: false,\n tagText: '',\n footerLabel: 'Course'\n },\n {\n id: 3,\n title: optimizedData('Powder Canister', 30),\n body: optimizedData('The Powder Canister is a finely milled setting powder designed to set makeup and control shine. With a lightweight and translucent formula, it provides a smooth and matte finish.', 100),\n url: 'https://cdn.dummyjson.com/product-images/beauty/powder-canister/1.webp',\n thumbnail: 'https://cdn.dummyjson.com/product-images/beauty/powder-canister/thumbnail.webp',\n isProgram: true, // TODO\n tagText: 'Professional Certificate',\n footerLabel: '2 Courses'\n },\n {\n id: 4,\n title: optimizedData('Red Lipstick', 30),\n body: optimizedData('The Red Lipstick is a classic and bold choice for adding a pop of color to your lips. With a creamy and pigmented formula, it provides a vibrant and long-lasting finish.', 100),\n url: 'https://cdn.dummyjson.com/product-images/beauty/red-lipstick/1.webp',\n thumbnail: 'https://cdn.dummyjson.com/product-images/beauty/red-lipstick/thumbnail.webp',\n isProgram: false,\n tagText: '',\n footerLabel: 'Course'\n }\n ];\n\n return finalData;\n } catch (error) {\n console.error('Error fetching cards data:', error);\n throw error;\n }\n};\n\nexport const getProgramProgressData = async (uuid: string) => {\n try {\n const { data } = await getAuthenticatedHttpClient().get(programProgressUrl(uuid));\n return data;\n } catch (error) {\n console.error('Error fetching program progress data:', error);\n throw error;\n }\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { fetchRecommendedCourses } from './api';
|
|
1
|
+
export { fetchRecommendedCourses, getProgramProgressData } from './api';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { fetchRecommendedCourses } from './api';
|
|
1
|
+
export { fetchRecommendedCourses, getProgramProgressData } from './api';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/data/services/subs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,OAAO,CAAC","sourcesContent":["export { fetchRecommendedCourses } from './api';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/data/services/subs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,OAAO,CAAC","sourcesContent":["export { fetchRecommendedCourses, getProgramProgressData } from './api';\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { getSiteConfig } from '@openedx/frontend-base';
|
|
2
|
+
export const getApiUrl = () => (`${getSiteConfig().lmsBaseUrl}/api`);
|
|
3
|
+
export const programProgressUrl = (uuid) => `${getApiUrl()}/dashboard/v0/programs/${encodeURIComponent(uuid)}/progress_details/`;
|
|
4
|
+
//# sourceMappingURL=urls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urls.js","sourceRoot":"","sources":["../../../../src/data/services/subs/urls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,aAAa,EAAE,CAAC,UAAU,MAAM,CAAC,CAAC;AAErE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,SAAS,EAAE,0BAA0B,kBAAkB,CAAC,IAAI,CAAC,oBAAoB,CAAC","sourcesContent":["import { getSiteConfig } from '@openedx/frontend-base';\n\nexport const getApiUrl = () => (`${getSiteConfig().lmsBaseUrl}/api`);\n\nexport const programProgressUrl = (uuid: string) => `${getApiUrl()}/dashboard/v0/programs/${encodeURIComponent(uuid)}/progress_details/`;\n"]}
|
package/dist/routes.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export default routes;
|
|
2
|
-
declare const routes: {
|
|
2
|
+
declare const routes: ({
|
|
3
3
|
id: string;
|
|
4
4
|
path: string;
|
|
5
5
|
loader: typeof authenticatedLoader;
|
|
@@ -9,5 +9,15 @@ declare const routes: {
|
|
|
9
9
|
lazy(): Promise<{
|
|
10
10
|
Component: () => import("react/jsx-runtime").JSX.Element;
|
|
11
11
|
}>;
|
|
12
|
-
}
|
|
12
|
+
} | {
|
|
13
|
+
id: string;
|
|
14
|
+
path: string;
|
|
15
|
+
loader: typeof authenticatedLoader;
|
|
16
|
+
handle: {
|
|
17
|
+
role: string;
|
|
18
|
+
};
|
|
19
|
+
lazy(): Promise<{
|
|
20
|
+
Component: import("react").FC;
|
|
21
|
+
}>;
|
|
22
|
+
})[];
|
|
13
23
|
import { authenticatedLoader } from '@openedx/frontend-base';
|
package/package.json
CHANGED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { ProgramProgressProviderProps, ProgramProgressContextValueType } from '../data/types';
|
|
3
|
-
export type { ProgramProgressProviderProps, ProgramProgressContextValueType };
|
|
4
|
-
export declare const ProgramProgressContext: React.Context<ProgramProgressContextValueType>;
|
|
5
|
-
export declare const ProgramProgressContextProvider: React.FC<ProgramProgressProviderProps>;
|
|
6
|
-
declare const _default: {
|
|
7
|
-
ProgramProgressContextProvider: React.FC<ProgramProgressProviderProps>;
|
|
8
|
-
ProgramProgressContext: React.Context<ProgramProgressContextValueType>;
|
|
9
|
-
};
|
|
10
|
-
export default _default;
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { createContext, useMemo, useState, } from 'react';
|
|
3
|
-
const defaultContextValue = {
|
|
4
|
-
programProgressData: {
|
|
5
|
-
urls: {
|
|
6
|
-
programListingUrl: undefined,
|
|
7
|
-
trackSelectionUrl: undefined,
|
|
8
|
-
commerceApiUrl: undefined,
|
|
9
|
-
buyButtonUrl: undefined,
|
|
10
|
-
programRecordUrl: undefined,
|
|
11
|
-
},
|
|
12
|
-
programData: null,
|
|
13
|
-
courseData: null,
|
|
14
|
-
},
|
|
15
|
-
setProgramProgressData: () => { },
|
|
16
|
-
};
|
|
17
|
-
export const ProgramProgressContext = createContext(defaultContextValue);
|
|
18
|
-
export const ProgramProgressContextProvider = ({ children }) => {
|
|
19
|
-
const [programProgressData, setProgramProgressData] = useState(defaultContextValue.programProgressData);
|
|
20
|
-
const memoValue = useMemo(() => ({
|
|
21
|
-
programProgressData,
|
|
22
|
-
setProgramProgressData,
|
|
23
|
-
}), [programProgressData, setProgramProgressData]);
|
|
24
|
-
return (_jsx(ProgramProgressContext.Provider, { value: memoValue, children: children }));
|
|
25
|
-
};
|
|
26
|
-
export default {
|
|
27
|
-
ProgramProgressContextProvider,
|
|
28
|
-
ProgramProgressContext,
|
|
29
|
-
};
|
|
30
|
-
//# sourceMappingURL=ProgramProgressProvider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ProgramProgressProvider.js","sourceRoot":"","sources":["../../../../src/containers/ProgramDashboard/ProgramProgress/ProgramProgressProvider.tsx"],"names":[],"mappings":";AAAA,OAAc,EACZ,aAAa,EAAE,OAAO,EAAE,QAAQ,GACjC,MAAM,OAAO,CAAC;AAQf,MAAM,mBAAmB,GAAoC;IAC3D,mBAAmB,EAAE;QACnB,IAAI,EAAE;YACJ,iBAAiB,EAAE,SAAS;YAC5B,iBAAiB,EAAE,SAAS;YAC5B,cAAc,EAAE,SAAS;YACzB,YAAY,EAAE,SAAS;YACvB,gBAAgB,EAAE,SAAS;SAC5B;QACD,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,IAAI;KACjB;IACD,sBAAsB,EAAE,GAAG,EAAE,GAAE,CAAC;CACjC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,aAAa,CAAkC,mBAAmB,CAAC,CAAC;AAE1G,MAAM,CAAC,MAAM,8BAA8B,GAA2C,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IACrG,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;IAExG,MAAM,SAAS,GAAG,OAAO,CAAC,GAAoC,EAAE,CAAC,CAAC;QAChE,mBAAmB;QACnB,sBAAsB;KACvB,CAAC,EAAE,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,CAAC,CAAC;IAEnD,OAAO,CACL,KAAC,sBAAsB,CAAC,QAAQ,IAC9B,KAAK,EAAE,SAAS,YAEf,QAAQ,GACuB,CACnC,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe;IACb,8BAA8B;IAC9B,sBAAsB;CACvB,CAAC","sourcesContent":["import React, {\n createContext, useMemo, useState,\n} from 'react';\nimport {\n ProgramProgressProviderProps,\n ProgramProgressContextValueType,\n} from '../data/types';\n\nexport type { ProgramProgressProviderProps, ProgramProgressContextValueType };\n\nconst defaultContextValue: ProgramProgressContextValueType = {\n programProgressData: {\n urls: {\n programListingUrl: undefined,\n trackSelectionUrl: undefined,\n commerceApiUrl: undefined,\n buyButtonUrl: undefined,\n programRecordUrl: undefined,\n },\n programData: null,\n courseData: null,\n },\n setProgramProgressData: () => {},\n};\n\nexport const ProgramProgressContext = createContext<ProgramProgressContextValueType>(defaultContextValue);\n\nexport const ProgramProgressContextProvider: React.FC<ProgramProgressProviderProps> = ({ children }) => {\n const [programProgressData, setProgramProgressData] = useState(defaultContextValue.programProgressData);\n\n const memoValue = useMemo((): ProgramProgressContextValueType => ({\n programProgressData,\n setProgramProgressData,\n }), [programProgressData, setProgramProgressData]);\n\n return (\n <ProgramProgressContext.Provider\n value={memoValue}\n >\n {children}\n </ProgramProgressContext.Provider>\n );\n};\n\nexport default {\n ProgramProgressContextProvider,\n ProgramProgressContext,\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function getProgramProgressData(uuid: string): Promise<any>;
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
import { getAuthenticatedHttpClient, getSiteConfig } from '@openedx/frontend-base';
|
|
11
|
-
export function getProgramProgressData(uuid) {
|
|
12
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
13
|
-
const baseUrl = getSiteConfig().lmsBaseUrl;
|
|
14
|
-
const url = `${baseUrl}/api/dashboard/v0/programs/${encodeURIComponent(uuid)}/progress_details/`;
|
|
15
|
-
return getAuthenticatedHttpClient().get(url);
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=api.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/containers/ProgramDashboard/data/api.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEnF,MAAM,UAAgB,sBAAsB,CAAC,IAAY;;QACvD,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC,UAAU,CAAC;QAC3C,MAAM,GAAG,GAAG,GAAG,OAAO,8BAA8B,kBAAkB,CAAC,IAAI,CAAC,oBAAoB,CAAC;QACjG,OAAO,0BAA0B,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;CAAA","sourcesContent":["import { getAuthenticatedHttpClient, getSiteConfig } from '@openedx/frontend-base';\n\nexport async function getProgramProgressData(uuid: string) {\n const baseUrl = getSiteConfig().lmsBaseUrl;\n const url = `${baseUrl}/api/dashboard/v0/programs/${encodeURIComponent(uuid)}/progress_details/`;\n return getAuthenticatedHttpClient().get(url);\n}\n"]}
|