@edx/frontend-app-subscription-learner-dashboard 1.60.0 → 1.62.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/RecommendationsRailsPanel/RecommendationsRow.js +25 -3
- package/dist/containers/RecommendationsRailsPanel/RecommendationsRow.js.map +1 -1
- package/dist/tracking/constants.js +6 -0
- package/dist/tracking/constants.js.map +1 -1
- package/dist/widgets/LearnerDashboardFooter/Footer.js +8 -3
- package/dist/widgets/LearnerDashboardFooter/Footer.js.map +1 -1
- package/dist/widgets/LearnerDashboardFooter/LinkList.d.ts +2 -0
- package/dist/widgets/LearnerDashboardFooter/LinkList.js +7 -2
- package/dist/widgets/LearnerDashboardFooter/LinkList.js.map +1 -1
- package/dist/widgets/LearnerDashboardFooter/SocialLinks.js +6 -13
- package/dist/widgets/LearnerDashboardFooter/SocialLinks.js.map +1 -1
- package/dist/widgets/ProgressiveProfilingQuiz/data/api/fetchSkills.js +1 -0
- package/dist/widgets/ProgressiveProfilingQuiz/data/api/fetchSkills.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,24 +1,46 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useMemo } from 'react';
|
|
2
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
3
3
|
import { useIntl } from '@openedx/frontend-base';
|
|
4
4
|
import { usePopularCoursesAndProgramsData } from '../../hooks/usePopularCoursesAndPrograms';
|
|
5
5
|
import { useAlgoliaSearch } from '../../utils/algoliaUtils';
|
|
6
6
|
import { PRODUCT_TYPE_COURSE } from '../../constants';
|
|
7
|
-
import { Alert } from '@openedx/paragon';
|
|
7
|
+
import { Alert, Pagination } from '@openedx/paragon';
|
|
8
|
+
import { useViewport } from '../../utils';
|
|
8
9
|
import messages from './messages';
|
|
9
10
|
import './index.scss';
|
|
10
11
|
import { Recommendations } from './Recommendations';
|
|
11
12
|
export const RecommendationsRow = ({ skill }) => {
|
|
12
13
|
const { formatMessage } = useIntl();
|
|
13
14
|
const [searchClient] = useAlgoliaSearch();
|
|
15
|
+
const [pageNumber, setPageNumber] = useState(1);
|
|
16
|
+
const { isMobile, isTablet } = useViewport();
|
|
17
|
+
const isPaginated = isMobile || isTablet;
|
|
14
18
|
const { data: recommendationsData = [], isError, isLoading, } = usePopularCoursesAndProgramsData(searchClient, true, PRODUCT_TYPE_COURSE, skill);
|
|
15
19
|
const hasrecommendationsData = useMemo(() => recommendationsData.length > 0, [recommendationsData]);
|
|
20
|
+
const itemsPerPage = isMobile
|
|
21
|
+
? 1
|
|
22
|
+
: isTablet
|
|
23
|
+
? 2
|
|
24
|
+
: recommendationsData.length;
|
|
25
|
+
const numPages = isPaginated
|
|
26
|
+
? Math.ceil(recommendationsData.length / itemsPerPage)
|
|
27
|
+
: 1;
|
|
28
|
+
const displayedRecommendations = useMemo(() => {
|
|
29
|
+
if (!isPaginated) {
|
|
30
|
+
return recommendationsData;
|
|
31
|
+
}
|
|
32
|
+
const startIndex = (pageNumber - 1) * itemsPerPage;
|
|
33
|
+
return recommendationsData.slice(startIndex, startIndex + itemsPerPage);
|
|
34
|
+
}, [isPaginated, itemsPerPage, pageNumber, recommendationsData]);
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
setPageNumber(1);
|
|
37
|
+
}, [isMobile, isTablet, recommendationsData.length]);
|
|
16
38
|
if (isError) {
|
|
17
39
|
return (_jsx("div", { className: "recommendation-courses-container mt-5 mb-3", "data-testid": "recommendation-courses-panel", children: _jsx(Alert, { variant: "danger", "data-testid": "recommendation-courses-error", children: formatMessage(messages.recommendationsErrorText) }) }));
|
|
18
40
|
}
|
|
19
41
|
if (isLoading) {
|
|
20
42
|
return (_jsx("p", { "data-testid": "recommendation-courses-loading", role: "status", "aria-live": "polite", children: formatMessage(messages.recommendationsLoadingText) }));
|
|
21
43
|
}
|
|
22
|
-
return (_jsx("div", { className: "recommendation-courses-container mt-3 mb-3", "data-testid": "recommendation-courses-panel", children: hasrecommendationsData && (_jsxs(_Fragment, { children: [_jsxs("h3", { className: "recommendations-header", children: [formatMessage(messages.recommendationsHeader), " ", _jsx("span", { className: "recommendations-skill", children: skill })] }), _jsx(Recommendations, { items:
|
|
44
|
+
return (_jsx("div", { className: "recommendation-courses-container mt-3 mb-3", "data-testid": "recommendation-courses-panel", children: hasrecommendationsData && (_jsxs(_Fragment, { children: [_jsxs("h3", { className: "recommendations-header", children: [formatMessage(messages.recommendationsHeader), " ", _jsx("span", { className: "recommendations-skill", children: skill })] }), _jsx(Recommendations, { items: displayedRecommendations }), isPaginated && numPages > 1 && (_jsx("div", { className: "d-flex justify-content-center align-items-center", children: _jsx(Pagination, { variant: isMobile ? 'reduced' : 'secondary', paginationLabel: `Recommended courses for ${skill}`, className: "mx-auto mb-2", pageCount: numPages, onPageSelect: setPageNumber }) }))] })) }));
|
|
23
45
|
};
|
|
24
46
|
//# sourceMappingURL=RecommendationsRow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecommendationsRow.js","sourceRoot":"","sources":["../../../src/containers/RecommendationsRailsPanel/RecommendationsRow.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAM,OAAO,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"RecommendationsRow.js","sourceRoot":"","sources":["../../../src/containers/RecommendationsRailsPanel/RecommendationsRow.tsx"],"names":[],"mappings":"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","sourcesContent":["import { FC, useEffect, useMemo, useState } from 'react';\nimport { useIntl } from '@openedx/frontend-base';\nimport { usePopularCoursesAndProgramsData } from '@src/hooks/usePopularCoursesAndPrograms';\nimport { useAlgoliaSearch } from '@src/utils/algoliaUtils';\nimport { PRODUCT_TYPE_COURSE } from '@src/constants';\nimport { Alert, Pagination } from '@openedx/paragon';\nimport { useViewport } from '@src/utils';\nimport messages from './messages';\nimport './index.scss';\nimport { Recommendations } from './Recommendations';\n\nexport const RecommendationsRow: FC<{ skill: string }> = ({ skill }) => {\n const { formatMessage } = useIntl();\n const [searchClient] = useAlgoliaSearch();\n const [pageNumber, setPageNumber] = useState(1);\n const { isMobile, isTablet } = useViewport();\n const isPaginated = isMobile || isTablet;\n\n const {\n data: recommendationsData = [],\n isError,\n isLoading,\n } = usePopularCoursesAndProgramsData(searchClient, true, PRODUCT_TYPE_COURSE, skill);\n\n const hasrecommendationsData = useMemo(\n () => recommendationsData.length > 0,\n [recommendationsData]\n );\n\n const itemsPerPage = isMobile\n ? 1\n : isTablet\n ? 2\n : recommendationsData.length;\n\n const numPages = isPaginated\n ? Math.ceil(recommendationsData.length / itemsPerPage)\n : 1;\n\n const displayedRecommendations = useMemo(() => {\n if (!isPaginated) {\n return recommendationsData;\n }\n\n const startIndex = (pageNumber - 1) * itemsPerPage;\n return recommendationsData.slice(startIndex, startIndex + itemsPerPage);\n }, [isPaginated, itemsPerPage, pageNumber, recommendationsData]);\n\n useEffect(() => {\n setPageNumber(1);\n }, [isMobile, isTablet, recommendationsData.length]);\n\n if (isError) {\n return (\n <div className=\"recommendation-courses-container mt-5 mb-3\" data-testid=\"recommendation-courses-panel\">\n <Alert variant=\"danger\" data-testid=\"recommendation-courses-error\">\n {formatMessage(messages.recommendationsErrorText)}\n </Alert>\n </div>\n );\n }\n\n if (isLoading) {\n return (\n <p\n data-testid=\"recommendation-courses-loading\"\n role=\"status\"\n aria-live=\"polite\"\n >\n {formatMessage(messages.recommendationsLoadingText)}\n </p>\n );\n }\n\n return (\n <div className=\"recommendation-courses-container mt-3 mb-3\" data-testid=\"recommendation-courses-panel\">\n {hasrecommendationsData && (\n <>\n <h3 className=\"recommendations-header\">{formatMessage(messages.recommendationsHeader)} <span className=\"recommendations-skill\">{skill}</span></h3>\n <Recommendations items={displayedRecommendations} />\n {isPaginated && numPages > 1 && (\n <div className=\"d-flex justify-content-center align-items-center\">\n <Pagination\n variant={isMobile ? 'reduced' : 'secondary'}\n paginationLabel={`Recommended courses for ${skill}`}\n className=\"mx-auto mb-2\"\n pageCount={numPages}\n onPageSelect={setPageNumber}\n />\n </div>\n )}\n </>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -5,6 +5,7 @@ export const categories = StrictDict({
|
|
|
5
5
|
searchButton: 'search_button',
|
|
6
6
|
credit: 'credit',
|
|
7
7
|
filter: 'filter',
|
|
8
|
+
footer: 'footer',
|
|
8
9
|
});
|
|
9
10
|
export const events = StrictDict({
|
|
10
11
|
courseCardActionClicked: 'courseCardActionClicked',
|
|
@@ -42,6 +43,11 @@ export const eventNames = StrictDict({
|
|
|
42
43
|
purchaseCredit: 'edx.subscription.dashboard.clicked_purchase_credit',
|
|
43
44
|
filterClicked: 'course-dashboard.filter.clicked',
|
|
44
45
|
filterOptionSelected: 'course-dashboard.filter_option.selected',
|
|
46
|
+
footerLogoClicked: 'edx.bi.footer.logo.clicked',
|
|
47
|
+
footerSocialLinkClicked: 'edx.bi.footer.social_link.clicked',
|
|
48
|
+
footerEdxLinksClicked: 'edx.bi.footer.edx_links.clicked',
|
|
49
|
+
footerConnectLinksClicked: 'edx.bi.footer.connect_links.clicked',
|
|
50
|
+
footerLegalLinksClicked: 'edx.bi.footer.legal_links.clicked',
|
|
45
51
|
programCardActionClicked: 'edx.subscription.dashboard.program_card_action.clicked',
|
|
46
52
|
});
|
|
47
53
|
export const linkNames = StrictDict({
|
|
@@ -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,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"]}
|
|
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;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,iBAAiB,EAAE,4BAA4B;IAC/C,uBAAuB,EAAE,mCAAmC;IAC5D,qBAAqB,EAAE,iCAAiC;IACxD,yBAAyB,EAAE,qCAAqC;IAChE,uBAAuB,EAAE,mCAAmC;IAC5D,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 footer: 'footer',\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 footerLogoClicked: 'edx.bi.footer.logo.clicked',\n footerSocialLinkClicked: 'edx.bi.footer.social_link.clicked',\n footerEdxLinksClicked: 'edx.bi.footer.edx_links.clicked',\n footerConnectLinksClicked: 'edx.bi.footer.connect_links.clicked',\n footerLegalLinksClicked: 'edx.bi.footer.legal_links.clicked',\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"]}
|
|
@@ -6,6 +6,8 @@ import SocialIconLinks from './SocialLinks';
|
|
|
6
6
|
import footerMessages from './messages';
|
|
7
7
|
import LinkList from './LinkList';
|
|
8
8
|
import { useEffect, useState } from 'react';
|
|
9
|
+
import { createEventTracker } from '../../data/services/segment/utils';
|
|
10
|
+
import { categories, eventNames } from '../../tracking/constants';
|
|
9
11
|
const MARKETING_BASE_URL = 'https://edx.org';
|
|
10
12
|
export default function Footer() {
|
|
11
13
|
const intl = useIntl();
|
|
@@ -13,7 +15,10 @@ export default function Footer() {
|
|
|
13
15
|
useEffect(() => {
|
|
14
16
|
setUtmSource(window.location.hostname);
|
|
15
17
|
}, []);
|
|
16
|
-
|
|
18
|
+
const handleFooterLinkClick = (href, eventName) => {
|
|
19
|
+
createEventTracker(eventName, { category: categories.footer, label: href })();
|
|
20
|
+
};
|
|
21
|
+
return (_jsxs("div", { className: "footer py-5.5 bg-primary-500", children: [_jsxs("div", { className: "d-flex flex-column flex-lg-row gap-4 align-items-start justify-content-between mb-4.5", children: [_jsx("a", { href: "https://edx.org", "aria-label": intl.formatMessage(footerMessages['footer.logo.ariaLabel']), onClick: () => handleFooterLinkClick('https://edx.org', eventNames.footerLogoClicked), children: _jsx("img", { className: "footer__logo-main", src: footerLogo, alt: intl.formatMessage(footerMessages['footer.logo.altText']) }) }), _jsx(SocialIconLinks, {})] }), _jsxs("div", { className: "d-flex flex-column flex-md-row gap-4", children: [_jsx("div", { className: "d-flex flex-column flex-fill", children: _jsx(LinkList, { className: "area-2", title: "edX", onLinkClick: handleFooterLinkClick, trackingEventName: eventNames.footerEdxLinksClicked, links: [
|
|
17
22
|
{
|
|
18
23
|
href: `${MARKETING_BASE_URL}/about-us`,
|
|
19
24
|
title: intl.formatMessage(footerMessages['footer.edxLinks.about']),
|
|
@@ -46,7 +51,7 @@ export default function Footer() {
|
|
|
46
51
|
href: `https://press.edx.org/`,
|
|
47
52
|
title: intl.formatMessage(footerMessages['footer.edxLinks.news']),
|
|
48
53
|
},
|
|
49
|
-
] }) }), _jsx("div", { className: "d-flex flex-column flex-fill", children: _jsx(LinkList, { className: "area-4", title: intl.formatMessage(footerMessages['footer.connectLinks.heading']), links: [
|
|
54
|
+
] }) }), _jsx("div", { className: "d-flex flex-column flex-fill", children: _jsx(LinkList, { className: "area-4", title: intl.formatMessage(footerMessages['footer.connectLinks.heading']), onLinkClick: handleFooterLinkClick, trackingEventName: eventNames.footerConnectLinksClicked, links: [
|
|
50
55
|
{
|
|
51
56
|
href: 'https://www.edx.org/resources',
|
|
52
57
|
title: intl.formatMessage(footerMessages['footer.connectLinks.blog']),
|
|
@@ -68,7 +73,7 @@ export default function Footer() {
|
|
|
68
73
|
title: intl.formatMessage(footerMessages['footer.connectLinks.mediaKit']),
|
|
69
74
|
hidden: intl.locale === 'es',
|
|
70
75
|
},
|
|
71
|
-
] }) }), _jsx("div", { className: "d-flex flex-column flex-fill", children: _jsx(LinkList, { className: "area-3", title: intl.formatMessage(footerMessages['footer.legalLinks.heading']), links: [
|
|
76
|
+
] }) }), _jsx("div", { className: "d-flex flex-column flex-fill", children: _jsx(LinkList, { className: "area-3", title: intl.formatMessage(footerMessages['footer.legalLinks.heading']), onLinkClick: handleFooterLinkClick, trackingEventName: eventNames.footerLegalLinksClicked, links: [
|
|
72
77
|
{
|
|
73
78
|
href: `${MARKETING_BASE_URL}/edx-terms-service`,
|
|
74
79
|
title: intl.formatMessage(footerMessages['footer.legalLinks.termsOfService']),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Footer.js","sourceRoot":"","sources":["../../../src/widgets/LearnerDashboardFooter/Footer.tsx"],"names":[],"mappings":";AAAA,OAAO,cAAc,CAAC;AACtB,OAAO,UAAU,MAAM,6BAA6B,CAAC;AAErD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,eAAe,MAAM,eAAe,CAAC;AAC5C,OAAO,cAAc,MAAM,YAAY,CAAC;AACxC,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;AAE7C,MAAM,CAAC,OAAO,UAAU,MAAM;IAC5B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEtD,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,eAAK,SAAS,EAAC,8BAA8B,aAC3C,eAAK,SAAS,EAAC,uFAAuF,aACpG,YACE,IAAI,EAAC,iBAAiB,gBACV,IAAI,CAAC,aAAa,CAC5B,cAAc,CAAC,uBAAuB,CAAC,CACxC,YAED,cACE,SAAS,EAAC,mBAAmB,EAC7B,GAAG,EAAE,UAAU,EACf,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,GAC9D,GACA,EACJ,KAAC,eAAe,KAAG,IACf,EACN,eAAK,SAAS,EAAC,sCAAsC,aACnD,cAAK,SAAS,EAAC,8BAA8B,YAC3C,KAAC,QAAQ,IACP,SAAS,EAAC,QAAQ,EAClB,KAAK,EAAC,KAAK,EACX,KAAK,EAAE;gCACL;oCACE,IAAI,EAAE,GAAG,kBAAkB,WAAW;oCACtC,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,uBAAuB,CAAC,CACxC;iCACF;gCACD;oCACE,IAAI,EAAE,wFAAwF,SAAS,EAAE;oCACzG,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,0BAA0B,CAAC,CAC3C;iCACF;gCACD;oCACE,IAAI,EAAE,GAAG,kBAAkB,oBAAoB;oCAC/C,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,4BAA4B,CAAC,CAC7C;oCACD,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI;iCAC7B;gCACD;oCACE,IAAI,EAAE,qBAAqB;oCAC3B,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,yBAAyB,CAAC,CAC1C;oCACD,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI;iCAC7B;gCACD;oCACE,IAAI,EAAE,kCAAkC;oCACxC,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,4BAA4B,CAAC,CAC7C;oCACD,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI;iCAC7B;gCACD;oCACE,IAAI,EAAE,GAAG,kBAAkB,UAAU;oCACrC,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,yBAAyB,CAAC,CAC1C;oCACD,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI;iCAC7B;gCACD;oCACE,IAAI,EAAE,wBAAwB;oCAC9B,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,sBAAsB,CAAC,CACvC;iCACF;6BACF,GACD,GACE,EACN,cAAK,SAAS,EAAC,8BAA8B,YAC3C,KAAC,QAAQ,IACP,SAAS,EAAC,QAAQ,EAClB,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,6BAA6B,CAAC,CAC9C,EACD,KAAK,EAAE;gCACL;oCACE,IAAI,EAAE,+BAA+B;oCACrC,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,0BAA0B,CAAC,CAC3C;iCACF;gCACD;oCACE,IAAI,EAAE,4CAA4C;oCAClD,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,6BAA6B,CAAC,CAC9C;iCACF;gCACD;oCACE,IAAI,EAAE,yBAAyB;oCAC/B,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,0BAA0B,CAAC,CAC3C;iCACF;gCACD;oCACE,IAAI,EAAE,GAAG,kBAAkB,kBAAkB;oCAC7C,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,8BAA8B,CAAC,CAC/C;iCACF;gCACD;oCACE,IAAI,EAAE,GAAG,kBAAkB,YAAY;oCACvC,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,8BAA8B,CAAC,CAC/C;oCACD,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI;iCAC7B;6BACF,GACD,GACE,EACN,cAAK,SAAS,EAAC,8BAA8B,YAC3C,KAAC,QAAQ,IACP,SAAS,EAAC,QAAQ,EAClB,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,2BAA2B,CAAC,CAC5C,EACD,KAAK,EAAE;gCACL;oCACE,IAAI,EAAE,GAAG,kBAAkB,oBAAoB;oCAC/C,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,kCAAkC,CAAC,CACnD;iCACF;gCACD;oCACE,IAAI,EAAE,GAAG,kBAAkB,qBAAqB;oCAChD,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,iCAAiC,CAAC,CAClD;iCACF;gCACD;oCACE,IAAI,EAAE,GAAG,kBAAkB,6BAA6B;oCACxD,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,gCAAgC,CAAC,CACjD;iCACF;gCACD;oCACE,IAAI,EAAE,GAAG,kBAAkB,gBAAgB;oCAC3C,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,8BAA8B,CAAC,CAC/C;iCACF;gCACD;oCACE,IAAI,EAAE,GAAG,kBAAkB,aAAa;oCACxC,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,mCAAmC,CAAC,CACpD;oCACD,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI;iCAC7B;gCACD;oCACE,IAAI,EAAE,GAAG,kBAAkB,2BAA2B;oCACtD,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,iCAAiC,CAAC,CAClD;iCACF;gCACD;oCACE,IAAI,EAAE,GAAG,kBAAkB,UAAU;oCACrC,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,2BAA2B,CAAC,CAC5C;oCACD,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI;iCAC7B;gCACD;oCACE,IAAI,EAAE,GAAG;oCACT,KAAK,EAAE,IAAI,CAAC,aAAa,CACvB,cAAc,CAAC,kCAAkC,CAAC,CACnD;iCACF;6BACF,GACD,GACE,EACN,cAAK,SAAS,EAAC,wCAAwC,GAEjD,IACF,EAEN,cAAK,SAAS,EAAC,iCAAiC,YAC9C,eAAK,SAAS,EAAC,sCAAsC,aACnD,YAAG,SAAS,EAAC,oBAAoB,YAC9B,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,GACrD,EACJ,YAAG,SAAS,EAAC,oBAAoB,YAC9B,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,GACvD,IACA,GACF,IACF,CACP,CAAC;AACJ,CAAC","sourcesContent":["import './index.scss';\nimport footerLogo from '../../assets/footerLogo.svg';\n\nimport { useIntl } from '@openedx/frontend-base';\nimport SocialIconLinks from './SocialLinks';\nimport footerMessages from './messages';\nimport LinkList from './LinkList';\nimport { useEffect, useState } from 'react';\n\nconst MARKETING_BASE_URL = 'https://edx.org';\n\nexport default function Footer() {\n const intl = useIntl();\n const [utmSource, setUtmSource] = useState('edx.org');\n\n useEffect(() => {\n setUtmSource(window.location.hostname);\n }, []);\n\n return (\n <div className=\"footer py-5.5 bg-primary-500\">\n <div className=\"d-flex flex-column flex-lg-row gap-4 align-items-start justify-content-between mb-4.5\">\n <a\n href=\"https://edx.org\"\n aria-label={intl.formatMessage(\n footerMessages['footer.logo.ariaLabel'],\n )}\n >\n <img\n className=\"footer__logo-main\"\n src={footerLogo}\n alt={intl.formatMessage(footerMessages['footer.logo.altText'])}\n />\n </a>\n <SocialIconLinks />\n </div>\n <div className=\"d-flex flex-column flex-md-row gap-4\">\n <div className=\"d-flex flex-column flex-fill\">\n <LinkList\n className=\"area-2\"\n title=\"edX\"\n links={[\n {\n href: `${MARKETING_BASE_URL}/about-us`,\n title: intl.formatMessage(\n footerMessages['footer.edxLinks.about'],\n ),\n },\n {\n href: `https://business.edx.org/?utm_campaign=edX.org+Referral&utm_medium=Footer&utm_source=${utmSource}`,\n title: intl.formatMessage(\n footerMessages['footer.edxLinks.business'],\n ),\n },\n {\n href: `${MARKETING_BASE_URL}/affiliate-program`,\n title: intl.formatMessage(\n footerMessages['footer.edxLinks.affiliates'],\n ),\n hidden: intl.locale === 'es',\n },\n {\n href: 'http://open.edx.org',\n title: intl.formatMessage(\n footerMessages['footer.edxLinks.openEdx'],\n ),\n hidden: intl.locale === 'es',\n },\n {\n href: 'https://www.edx.org/learn/devops',\n title: intl.formatMessage(\n footerMessages['footer.legalLinks.advisory'],\n ),\n hidden: intl.locale === 'es',\n },\n {\n href: `${MARKETING_BASE_URL}/careers`,\n title: intl.formatMessage(\n footerMessages['footer.edxLinks.careers'],\n ),\n hidden: intl.locale === 'es',\n },\n {\n href: `https://press.edx.org/`,\n title: intl.formatMessage(\n footerMessages['footer.edxLinks.news'],\n ),\n },\n ]}\n />\n </div>\n <div className=\"d-flex flex-column flex-fill\">\n <LinkList\n className=\"area-4\"\n title={intl.formatMessage(\n footerMessages['footer.connectLinks.heading'],\n )}\n links={[\n {\n href: 'https://www.edx.org/resources',\n title: intl.formatMessage(\n footerMessages['footer.connectLinks.blog'],\n ),\n },\n {\n href: 'https://courses.edx.org/support/contact_us',\n title: intl.formatMessage(\n footerMessages['footer.connectLinks.contact'],\n ),\n },\n {\n href: 'https://support.edx.org',\n title: intl.formatMessage(\n footerMessages['footer.connectLinks.help'],\n ),\n },\n {\n href: `${MARKETING_BASE_URL}/policy/security`,\n title: intl.formatMessage(\n footerMessages['footer.connectLinks.security'],\n ),\n },\n {\n href: `${MARKETING_BASE_URL}/media-kit`,\n title: intl.formatMessage(\n footerMessages['footer.connectLinks.mediaKit'],\n ),\n hidden: intl.locale === 'es',\n },\n ]}\n />\n </div>\n <div className=\"d-flex flex-column flex-fill\">\n <LinkList\n className=\"area-3\"\n title={intl.formatMessage(\n footerMessages['footer.legalLinks.heading'],\n )}\n links={[\n {\n href: `${MARKETING_BASE_URL}/edx-terms-service`,\n title: intl.formatMessage(\n footerMessages['footer.legalLinks.termsOfService'],\n ),\n },\n {\n href: `${MARKETING_BASE_URL}/edx-privacy-policy`,\n title: intl.formatMessage(\n footerMessages['footer.legalLinks.privacyPolicy'],\n ),\n },\n {\n href: `${MARKETING_BASE_URL}/edx-privacy-policy/cookies`,\n title: intl.formatMessage(\n footerMessages['footer.legalLinks.cookiePolicy'],\n ),\n },\n {\n href: `${MARKETING_BASE_URL}/accessibility`,\n title: intl.formatMessage(\n footerMessages['footer.legalLinks.a11yPolicy'],\n ),\n },\n {\n href: `${MARKETING_BASE_URL}/trademarks`,\n title: intl.formatMessage(\n footerMessages['footer.legalLinks.trademarkPolicy'],\n ),\n hidden: intl.locale === 'es',\n },\n {\n href: `${MARKETING_BASE_URL}/modern-slavery-statement`,\n title: intl.formatMessage(\n footerMessages['footer.legalLinks.modernSlavery'],\n ),\n },\n {\n href: `${MARKETING_BASE_URL}/sitemap`,\n title: intl.formatMessage(\n footerMessages['footer.legalLinks.sitemap'],\n ),\n hidden: intl.locale === 'es',\n },\n {\n href: `#`,\n title: intl.formatMessage(\n footerMessages['footer.legalLinks.privacyChoices'],\n ),\n },\n ]}\n />\n </div>\n <div className=\"d-none d-md-flex flex-column flex-fill\">\n {/* language selector not implemented */}\n </div>\n </div>\n\n <div className=\"mt-4.5 d-flex align-items-start\">\n <div className=\"d-flex flex-column align-items-start\">\n <p className=\"x-small text-white\">\n {intl.formatMessage(footerMessages['footer.copyRight'])}\n </p>\n <p className=\"x-small text-white\">\n {intl.formatMessage(footerMessages['footer.copyRightCn'])}\n </p>\n </div>\n </div>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Footer.js","sourceRoot":"","sources":["../../../src/widgets/LearnerDashboardFooter/Footer.tsx"],"names":[],"mappings":"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","sourcesContent":["import './index.scss';\nimport footerLogo from '../../assets/footerLogo.svg';\n\nimport { useIntl } from '@openedx/frontend-base';\nimport SocialIconLinks from './SocialLinks';\nimport footerMessages from './messages';\nimport LinkList from './LinkList';\nimport { useEffect, useState } from 'react';\nimport { createEventTracker } from '../../data/services/segment/utils';\nimport { categories, eventNames } from '../../tracking/constants';\n\nconst MARKETING_BASE_URL = 'https://edx.org';\n\nexport default function Footer() {\n const intl = useIntl();\n const [utmSource, setUtmSource] = useState('edx.org');\n\n useEffect(() => {\n setUtmSource(window.location.hostname);\n }, []);\n\n const handleFooterLinkClick = (href, eventName) => {\n createEventTracker(eventName, { category: categories.footer, label: href })();\n };\n\n return (\n <div className=\"footer py-5.5 bg-primary-500\">\n <div className=\"d-flex flex-column flex-lg-row gap-4 align-items-start justify-content-between mb-4.5\">\n <a\n href=\"https://edx.org\"\n aria-label={intl.formatMessage(\n footerMessages['footer.logo.ariaLabel'],\n )}\n onClick={() => handleFooterLinkClick('https://edx.org', eventNames.footerLogoClicked)}\n >\n <img\n className=\"footer__logo-main\"\n src={footerLogo}\n alt={intl.formatMessage(footerMessages['footer.logo.altText'])}\n />\n </a>\n <SocialIconLinks />\n </div>\n <div className=\"d-flex flex-column flex-md-row gap-4\">\n <div className=\"d-flex flex-column flex-fill\">\n <LinkList\n className=\"area-2\"\n title=\"edX\"\n onLinkClick={handleFooterLinkClick}\n trackingEventName={eventNames.footerEdxLinksClicked}\n links={[\n {\n href: `${MARKETING_BASE_URL}/about-us`,\n title: intl.formatMessage(\n footerMessages['footer.edxLinks.about'],\n ),\n },\n {\n href: `https://business.edx.org/?utm_campaign=edX.org+Referral&utm_medium=Footer&utm_source=${utmSource}`,\n title: intl.formatMessage(\n footerMessages['footer.edxLinks.business'],\n ),\n },\n {\n href: `${MARKETING_BASE_URL}/affiliate-program`,\n title: intl.formatMessage(\n footerMessages['footer.edxLinks.affiliates'],\n ),\n hidden: intl.locale === 'es',\n },\n {\n href: 'http://open.edx.org',\n title: intl.formatMessage(\n footerMessages['footer.edxLinks.openEdx'],\n ),\n hidden: intl.locale === 'es',\n },\n {\n href: 'https://www.edx.org/learn/devops',\n title: intl.formatMessage(\n footerMessages['footer.legalLinks.advisory'],\n ),\n hidden: intl.locale === 'es',\n },\n {\n href: `${MARKETING_BASE_URL}/careers`,\n title: intl.formatMessage(\n footerMessages['footer.edxLinks.careers'],\n ),\n hidden: intl.locale === 'es',\n },\n {\n href: `https://press.edx.org/`,\n title: intl.formatMessage(\n footerMessages['footer.edxLinks.news'],\n ),\n },\n ]}\n />\n </div>\n <div className=\"d-flex flex-column flex-fill\">\n <LinkList\n className=\"area-4\"\n title={intl.formatMessage(\n footerMessages['footer.connectLinks.heading'],\n )}\n onLinkClick={handleFooterLinkClick}\n trackingEventName={eventNames.footerConnectLinksClicked}\n links={[\n {\n href: 'https://www.edx.org/resources',\n title: intl.formatMessage(\n footerMessages['footer.connectLinks.blog'],\n ),\n },\n {\n href: 'https://courses.edx.org/support/contact_us',\n title: intl.formatMessage(\n footerMessages['footer.connectLinks.contact'],\n ),\n },\n {\n href: 'https://support.edx.org',\n title: intl.formatMessage(\n footerMessages['footer.connectLinks.help'],\n ),\n },\n {\n href: `${MARKETING_BASE_URL}/policy/security`,\n title: intl.formatMessage(\n footerMessages['footer.connectLinks.security'],\n ),\n },\n {\n href: `${MARKETING_BASE_URL}/media-kit`,\n title: intl.formatMessage(\n footerMessages['footer.connectLinks.mediaKit'],\n ),\n hidden: intl.locale === 'es',\n },\n ]}\n />\n </div>\n <div className=\"d-flex flex-column flex-fill\">\n <LinkList\n className=\"area-3\"\n title={intl.formatMessage(\n footerMessages['footer.legalLinks.heading'],\n )}\n onLinkClick={handleFooterLinkClick}\n trackingEventName={eventNames.footerLegalLinksClicked}\n links={[\n {\n href: `${MARKETING_BASE_URL}/edx-terms-service`,\n title: intl.formatMessage(\n footerMessages['footer.legalLinks.termsOfService'],\n ),\n },\n {\n href: `${MARKETING_BASE_URL}/edx-privacy-policy`,\n title: intl.formatMessage(\n footerMessages['footer.legalLinks.privacyPolicy'],\n ),\n },\n {\n href: `${MARKETING_BASE_URL}/edx-privacy-policy/cookies`,\n title: intl.formatMessage(\n footerMessages['footer.legalLinks.cookiePolicy'],\n ),\n },\n {\n href: `${MARKETING_BASE_URL}/accessibility`,\n title: intl.formatMessage(\n footerMessages['footer.legalLinks.a11yPolicy'],\n ),\n },\n {\n href: `${MARKETING_BASE_URL}/trademarks`,\n title: intl.formatMessage(\n footerMessages['footer.legalLinks.trademarkPolicy'],\n ),\n hidden: intl.locale === 'es',\n },\n {\n href: `${MARKETING_BASE_URL}/modern-slavery-statement`,\n title: intl.formatMessage(\n footerMessages['footer.legalLinks.modernSlavery'],\n ),\n },\n {\n href: `${MARKETING_BASE_URL}/sitemap`,\n title: intl.formatMessage(\n footerMessages['footer.legalLinks.sitemap'],\n ),\n hidden: intl.locale === 'es',\n },\n {\n href: `#`,\n title: intl.formatMessage(\n footerMessages['footer.legalLinks.privacyChoices'],\n ),\n },\n ]}\n />\n </div>\n <div className=\"d-none d-md-flex flex-column flex-fill\">\n {/* language selector not implemented */}\n </div>\n </div>\n\n <div className=\"mt-4.5 d-flex align-items-start\">\n <div className=\"d-flex flex-column align-items-start\">\n <p className=\"x-small text-white\">\n {intl.formatMessage(footerMessages['footer.copyRight'])}\n </p>\n <p className=\"x-small text-white\">\n {intl.formatMessage(footerMessages['footer.copyRightCn'])}\n </p>\n </div>\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -14,6 +14,8 @@ export interface LinkItem {
|
|
|
14
14
|
export interface LinkListProps extends HTMLAttributes<HTMLDivElement> {
|
|
15
15
|
title: string;
|
|
16
16
|
links?: LinkItem[];
|
|
17
|
+
onLinkClick?: (href: string, eventName: string) => void;
|
|
18
|
+
trackingEventName?: string;
|
|
17
19
|
}
|
|
18
20
|
declare const LinkList: React.FC<LinkListProps>;
|
|
19
21
|
export default LinkList;
|
|
@@ -12,7 +12,7 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
12
12
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
13
|
import { Button } from '@openedx/paragon';
|
|
14
14
|
const LinkList = (_a) => {
|
|
15
|
-
var { title: listTitle, links = [] } = _a, props = __rest(_a, ["title", "links"]);
|
|
15
|
+
var { title: listTitle, links = [], onLinkClick, trackingEventName } = _a, props = __rest(_a, ["title", "links", "onLinkClick", "trackingEventName"]);
|
|
16
16
|
return (_jsxs("div", Object.assign({ className: "d-flex flex-column flex-fill" }, props, { children: [_jsx("h2", { className: "footer__section-title text-white mb-2 small", children: listTitle }), _jsx("ul", { className: "list-unstyled p-0 m-0 footer__links", children: links.map((_a) => {
|
|
17
17
|
var { title, href, hidden } = _a, linkProps = __rest(_a, ["title", "href", "hidden"]);
|
|
18
18
|
if (hidden) {
|
|
@@ -21,7 +21,12 @@ const LinkList = (_a) => {
|
|
|
21
21
|
if (!href) {
|
|
22
22
|
return (_jsx("li", { children: _jsx(Button, Object.assign({}, linkProps, { children: title })) }, title));
|
|
23
23
|
}
|
|
24
|
-
|
|
24
|
+
const handleClick = () => {
|
|
25
|
+
if (onLinkClick && trackingEventName) {
|
|
26
|
+
onLinkClick(href, trackingEventName);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
return (_jsx("li", { children: _jsx("a", { className: "text-white x-small", href: href, onClick: handleClick, children: title }) }, `${href}${title}`));
|
|
25
30
|
}) })] })));
|
|
26
31
|
};
|
|
27
32
|
export default LinkList;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinkList.js","sourceRoot":"","sources":["../../../src/widgets/LearnerDashboardFooter/LinkList.tsx"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"LinkList.js","sourceRoot":"","sources":["../../../src/widgets/LearnerDashboardFooter/LinkList.tsx"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAsB1C,MAAM,QAAQ,GAA4B,CAAC,EAM1C,EAAE,EAAE;QANsC,EACzC,KAAK,EAAE,SAAS,EAChB,KAAK,GAAG,EAAE,EACV,WAAW,EACX,iBAAiB,OAElB,EADI,KAAK,cALiC,sDAM1C,CADS;IACJ,OAAA,CACJ,6BAAK,SAAS,EAAC,8BAA8B,IAAK,KAAK,eACrD,aAAI,SAAS,EAAC,6CAA6C,YAAE,SAAS,GAAM,EAC5E,aAAI,SAAS,EAAC,qCAAqC,YAChD,KAAK,CAAC,GAAG,CAAC,CAAC,EAAqC,EAAE,EAAE;wBAAzC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,OAAgB,EAAX,SAAS,cAAnC,2BAAqC,CAAF;oBAC7C,IAAI,MAAM,EAAE,CAAC;wBACX,OAAO,IAAI,CAAC;oBACd,CAAC;oBAED,IAAI,CAAC,IAAI,EAAE,CAAC;wBACV,OAAO,CACL,uBACE,KAAC,MAAM,oBAAK,SAAS,cAAG,KAAK,IAAU,IADhC,KAAK,CAET,CACN,CAAC;oBACJ,CAAC;oBAED,MAAM,WAAW,GAAG,GAAG,EAAE;wBACvB,IAAI,WAAW,IAAI,iBAAiB,EAAE,CAAC;4BACrC,WAAW,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;wBACvC,CAAC;oBACH,CAAC,CAAC;oBAEF,OAAO,CACL,uBACE,YACE,SAAS,EAAC,oBAAoB,EAC9B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,WAAW,YAEnB,KAAK,GACJ,IAPG,GAAG,IAAI,GAAG,KAAK,EAAE,CAQrB,CACN,CAAC;gBACJ,CAAC,CAAC,GACC,KACD,CACP,CAAA;CAAA,CAAC;AAEF,eAAe,QAAQ,CAAC","sourcesContent":["import React, { HTMLAttributes } from 'react';\nimport { Button } from '@openedx/paragon';\n\ntype ButtonComponentProps = React.ComponentProps<typeof Button>;\n\nexport interface LinkItem {\n title: string,\n href?: string,\n hidden?: boolean,\n onClick?: ButtonComponentProps['onClick'],\n variant?: ButtonComponentProps['variant'],\n size?: ButtonComponentProps['size'],\n id?: ButtonComponentProps['id'],\n className?: ButtonComponentProps['className'],\n}\n\nexport interface LinkListProps extends HTMLAttributes<HTMLDivElement> {\n title: string,\n links?: LinkItem[],\n onLinkClick?: (href: string, eventName: string) => void,\n trackingEventName?: string,\n}\n\nconst LinkList: React.FC<LinkListProps> = ({\n title: listTitle,\n links = [],\n onLinkClick,\n trackingEventName,\n ...props\n}) => (\n <div className=\"d-flex flex-column flex-fill\" {...props}>\n <h2 className=\"footer__section-title text-white mb-2 small\">{listTitle}</h2>\n <ul className=\"list-unstyled p-0 m-0 footer__links\">\n {links.map(({ title, href, hidden, ...linkProps }) => {\n if (hidden) {\n return null;\n }\n\n if (!href) {\n return (\n <li key={title}>\n <Button {...linkProps}>{title}</Button>\n </li>\n );\n }\n\n const handleClick = () => {\n if (onLinkClick && trackingEventName) {\n onLinkClick(href, trackingEventName);\n }\n };\n\n return (\n <li key={`${href}${title}`}>\n <a\n className=\"text-white x-small\"\n href={href}\n onClick={handleClick}\n >\n {title}\n </a>\n </li>\n );\n })}\n </ul>\n </div>\n);\n\nexport default LinkList;\n"]}
|
|
@@ -4,10 +4,8 @@ import facebook from '../../assets/facebook.svg';
|
|
|
4
4
|
import twitter from '../../assets/twitter.svg';
|
|
5
5
|
import linkedin from '../../assets/linkedin.svg';
|
|
6
6
|
import reddit from '../../assets/reddit.svg';
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
FOOTER_LINK: 'edx.bi.footer.link',
|
|
10
|
-
};
|
|
7
|
+
import { createEventTracker } from '../../data/services/segment/utils';
|
|
8
|
+
import { categories, eventNames } from '../../tracking/constants';
|
|
11
9
|
const socialIconLinks = [
|
|
12
10
|
{
|
|
13
11
|
title: 'Facebook',
|
|
@@ -31,15 +29,10 @@ const socialIconLinks = [
|
|
|
31
29
|
},
|
|
32
30
|
];
|
|
33
31
|
export default function SocialIconLinks() {
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
const properties = {
|
|
38
|
-
category: 'outbound_link',
|
|
39
|
-
label,
|
|
40
|
-
};
|
|
41
|
-
sendTrackEvent(eventName, properties);
|
|
32
|
+
const handleSocialLinkClick = (event) => {
|
|
33
|
+
const platform = event.currentTarget.getAttribute('title');
|
|
34
|
+
createEventTracker(eventNames.footerSocialLinkClicked, { category: categories.footer, label: platform })();
|
|
42
35
|
};
|
|
43
|
-
return (_jsx("ul", { className: "mb-0 d-flex gap-3 list-unstyled", children: socialIconLinks.map(({ title, url, icon }) => (_jsx("li", { children: _jsx("a", { href: url, title: title, "aria-label": title, target: "_blank", rel: "noopener noreferrer", onClick:
|
|
36
|
+
return (_jsx("ul", { className: "mb-0 d-flex gap-3 list-unstyled", children: socialIconLinks.map(({ title, url, icon }) => (_jsx("li", { children: _jsx("a", { href: url, title: title, "aria-label": title, target: "_blank", rel: "noopener noreferrer", onClick: handleSocialLinkClick, className: "text-decoration-none text-white", children: _jsx("img", { src: icon, alt: title, "aria-hidden": "true" }) }) }, url))) }));
|
|
44
37
|
}
|
|
45
38
|
//# sourceMappingURL=SocialLinks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SocialLinks.js","sourceRoot":"","sources":["../../../src/widgets/LearnerDashboardFooter/SocialLinks.tsx"],"names":[],"mappings":";AACA,OAAO,cAAc,CAAC;AAEtB,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AACjD,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAC/C,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AACjD,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"SocialLinks.js","sourceRoot":"","sources":["../../../src/widgets/LearnerDashboardFooter/SocialLinks.tsx"],"names":[],"mappings":";AACA,OAAO,cAAc,CAAC;AAEtB,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AACjD,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAC/C,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AACjD,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAQlE,MAAM,eAAe,GAAqB;IACxC;QACE,KAAK,EAAE,UAAU;QACjB,GAAG,EAAE,oCAAoC;QACzC,IAAI,EAAE,QAAQ;KACf;IACD;QACE,KAAK,EAAE,sBAAsB;QAC7B,GAAG,EAAE,+BAA+B;QACpC,IAAI,EAAE,OAAO;KACd;IACD;QACE,KAAK,EAAE,UAAU;QACjB,GAAG,EAAE,sCAAsC;QAC3C,IAAI,EAAE,QAAQ;KACf;IACD;QACE,KAAK,EAAE,QAAQ;QACf,GAAG,EAAE,8BAA8B;QACnC,IAAI,EAAE,MAAM;KACb;CACF,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,eAAe;IACrC,MAAM,qBAAqB,GAAG,CAC5B,KAA0C,EAC1C,EAAE;QACF,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC3D,kBAAkB,CAChB,UAAU,CAAC,uBAAuB,EAClC,EAAE,QAAQ,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CACjD,EAAE,CAAC;IACN,CAAC,CAAC;IAEF,OAAO,CACL,aAAI,SAAS,EAAC,iCAAiC,YAC5C,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAC7C,uBACE,YACE,IAAI,EAAE,GAAG,EACT,KAAK,EAAE,KAAK,gBACA,KAAK,EACjB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,OAAO,EAAE,qBAAqB,EAC9B,SAAS,EAAC,iCAAiC,YAE3C,cAAK,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,iBAAc,MAAM,GAAG,GAC/C,IAXG,GAAG,CAYP,CACN,CAAC,GACC,CACN,CAAC;AACJ,CAAC","sourcesContent":["import React from 'react';\nimport './index.scss';\n\nimport facebook from '../../assets/facebook.svg';\nimport twitter from '../../assets/twitter.svg';\nimport linkedin from '../../assets/linkedin.svg';\nimport reddit from '../../assets/reddit.svg';\nimport { createEventTracker } from '../../data/services/segment/utils';\nimport { categories, eventNames } from '../../tracking/constants';\n\ninterface SocialIconLink {\n title: string,\n url: string,\n icon: string,\n}\n\nconst socialIconLinks: SocialIconLink[] = [\n {\n title: 'Facebook',\n url: 'https://www.facebook.com/EdxOnline',\n icon: facebook,\n },\n {\n title: 'X (formerly Twitter)',\n url: 'https://twitter.com/edXOnline',\n icon: twitter,\n },\n {\n title: 'LinkedIn',\n url: 'https://www.linkedin.com/company/edx',\n icon: linkedin,\n },\n {\n title: 'Reddit',\n url: 'https://www.reddit.com/r/edx',\n icon: reddit,\n },\n];\n\nexport default function SocialIconLinks() {\n const handleSocialLinkClick = (\n event: React.MouseEvent<HTMLAnchorElement>,\n ) => {\n const platform = event.currentTarget.getAttribute('title');\n createEventTracker(\n eventNames.footerSocialLinkClicked,\n { category: categories.footer, label: platform }\n )();\n };\n\n return (\n <ul className=\"mb-0 d-flex gap-3 list-unstyled\">\n {socialIconLinks.map(({ title, url, icon }) => (\n <li key={url}>\n <a\n href={url}\n title={title}\n aria-label={title}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={handleSocialLinkClick}\n className=\"text-decoration-none text-white\"\n >\n <img src={icon} alt={title} aria-hidden=\"true\" />\n </a>\n </li>\n ))}\n </ul>\n );\n}\n"]}
|
|
@@ -29,6 +29,7 @@ export const fetchSkills = (searchClient) => __awaiter(void 0, void 0, void 0, f
|
|
|
29
29
|
query: '',
|
|
30
30
|
facets: [FACET_SKILLS],
|
|
31
31
|
hitsPerPage: 0,
|
|
32
|
+
facetFilters: [['b2c_subscription_inclusion:true']],
|
|
32
33
|
},
|
|
33
34
|
});
|
|
34
35
|
const skillCounts = (_a = facets === null || facets === void 0 ? void 0 : facets[FACET_SKILLS]) !== null && _a !== void 0 ? _a : {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchSkills.js","sourceRoot":"","sources":["../../../../../src/widgets/ProgressiveProfilingQuiz/data/api/fetchSkills.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAIvC,oFAAoF;AACpF,MAAM,YAAY,GAAG,cAAc,CAAC;AAEpC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,YAA0B,EACC,EAAE;;IAC7B,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,0BAAoC,CAAC;IAE3E,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,iBAAiB,CAAC;YACtD,SAAS;YACT,YAAY,EAAE;gBACZ,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,CAAC,YAAY,CAAC;gBACtB,WAAW,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"fetchSkills.js","sourceRoot":"","sources":["../../../../../src/widgets/ProgressiveProfilingQuiz/data/api/fetchSkills.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAIvC,oFAAoF;AACpF,MAAM,YAAY,GAAG,cAAc,CAAC;AAEpC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,YAA0B,EACC,EAAE;;IAC7B,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,0BAAoC,CAAC;IAE3E,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,iBAAiB,CAAC;YACtD,SAAS;YACT,YAAY,EAAE;gBACZ,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,CAAC,YAAY,CAAC;gBACtB,WAAW,EAAE,CAAC;gBACd,YAAY,EAAE,CAAC,CAAC,iCAAiC,CAAC,CAAC;aACpD;SACF,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,YAAY,CAAC,mCAAI,EAAE,CAAC;QACjD,OAAO,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;aAC/B,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;aAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,QAAQ,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAA,CAAC","sourcesContent":["import { getAppConfig, logError } from '@openedx/frontend-base';\nimport { SearchClient } from 'algoliasearch';\n\nimport { appId } from '@src/constants';\n\nimport { SkillWithCount } from '../types';\n\n// Facet attribute name in ALGOLIA_PRODUCT_INDEX_NAME — update if the index changes.\nconst FACET_SKILLS = 'skills.skill';\n\n/**\n * Fetches every distinct skill value present across the whole product index\n * (programs and courses combined), with each skill's matching record count.\n * Used to populate the quiz's skills-based question options.\n *\n * @param searchClient Algolia client from useAlgoliaSearch()\n * @returns Skill values with counts, sorted by descending count\n */\nexport const fetchSkills = async (\n searchClient: SearchClient,\n): Promise<SkillWithCount[]> => {\n const indexName = getAppConfig(appId).ALGOLIA_PRODUCT_INDEX_NAME as string;\n\n try {\n const { facets } = await searchClient.searchSingleIndex({\n indexName,\n searchParams: {\n query: '',\n facets: [FACET_SKILLS],\n hitsPerPage: 0,\n facetFilters: [['b2c_subscription_inclusion:true']],\n },\n });\n\n const skillCounts = facets?.[FACET_SKILLS] ?? {};\n return Object.entries(skillCounts)\n .map(([value, count]) => ({ value, count }))\n .sort((a, b) => b.count - a.count);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n logError(err);\n return [];\n }\n};\n"]}
|