Skip to content

Commit 960647c

Browse files
committed
Revert "fix: pr requests"
This reverts commit 86fd293.
1 parent 44c7978 commit 960647c

File tree

8 files changed

+225
-4
lines changed

8 files changed

+225
-4
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import React from 'react';
2+
3+
import { StrictDict } from 'utils';
4+
import track from 'tracking';
5+
import { reduxHooks } from 'hooks';
6+
7+
import * as module from './hooks';
8+
9+
export const state = StrictDict({
10+
showModal: (val) => React.useState(val), // eslint-disable-line
11+
});
12+
13+
const { modalOpened, modalClosed, modalCTAClicked } = track.enterpriseDashboard;
14+
15+
export const useEnterpriseDashboardHook = () => {
16+
const [showModal, setShowModal] = module.state.showModal(true);
17+
const dashboard = reduxHooks.useEnterpriseDashboardData();
18+
19+
const trackOpened = modalOpened(dashboard.enterpriseUUID);
20+
const trackClose = modalClosed(dashboard.enterpriseUUID, 'Cancel button');
21+
const trackEscape = modalClosed(dashboard.enterpriseUUID, 'Escape');
22+
23+
const handleCTAClick = modalCTAClicked(dashboard.enterpriseUUID, dashboard.url);
24+
const handleClose = () => {
25+
trackClose();
26+
setShowModal(false);
27+
};
28+
const handleEscape = () => {
29+
trackEscape();
30+
setShowModal(false);
31+
};
32+
33+
React.useEffect(() => {
34+
if (dashboard && dashboard.label) {
35+
trackOpened();
36+
}
37+
}, []); // eslint-disable-line
38+
39+
return {
40+
showModal,
41+
handleCTAClick,
42+
handleClose,
43+
handleEscape,
44+
dashboard,
45+
};
46+
};
47+
48+
export default useEnterpriseDashboardHook;
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import { MockUseState } from 'testUtils';
2+
import { reduxHooks } from 'hooks';
3+
import track from 'tracking';
4+
5+
import * as hooks from './hooks';
6+
7+
jest.mock('hooks', () => ({
8+
reduxHooks: {
9+
useEnterpriseDashboardData: jest.fn(),
10+
},
11+
}));
12+
jest.mock('tracking', () => {
13+
const modalOpenedEvent = jest.fn();
14+
const modalClosedEvent = jest.fn();
15+
const modalCTAClickedEvent = jest.fn();
16+
return {
17+
__esModule: true,
18+
default: {
19+
enterpriseDashboard: {
20+
modalOpenedEvent,
21+
modalClosedEvent,
22+
modalCTAClickedEvent,
23+
modalOpened: jest.fn(() => modalOpenedEvent),
24+
modalClosed: jest.fn(() => modalClosedEvent),
25+
modalCTAClicked: jest.fn(() => modalCTAClickedEvent),
26+
},
27+
},
28+
};
29+
});
30+
31+
const state = new MockUseState(hooks);
32+
33+
const enterpriseDashboardData = { label: 'edX, Inc.', url: '/edx-dashboard' };
34+
35+
describe('EnterpriseDashboard hooks', () => {
36+
reduxHooks.useEnterpriseDashboardData.mockReturnValue({ ...enterpriseDashboardData });
37+
38+
describe('state values', () => {
39+
state.testGetter(state.keys.showModal);
40+
});
41+
42+
describe('behavior', () => {
43+
let out;
44+
45+
beforeEach(() => {
46+
state.mock();
47+
out = hooks.useEnterpriseDashboardHook();
48+
});
49+
afterEach(state.restore);
50+
51+
test('useEnterpriseDashboardHook to return dashboard data from redux hooks', () => {
52+
expect(out.dashboard).toMatchObject(enterpriseDashboardData);
53+
});
54+
55+
test('modal initializes to shown when rendered and closes on click', () => {
56+
state.expectInitializedWith(state.keys.showModal, true);
57+
out.handleClose();
58+
expect(state.values.showModal).toEqual(false);
59+
});
60+
61+
test('modal initializes to shown when rendered and closes on escape', () => {
62+
state.expectInitializedWith(state.keys.showModal, true);
63+
out.handleEscape();
64+
expect(state.values.showModal).toEqual(false);
65+
});
66+
67+
test('CTA click tracks modalCTAClicked', () => {
68+
out.handleCTAClick();
69+
expect(track.enterpriseDashboard.modalCTAClicked).toHaveBeenCalledWith(
70+
enterpriseDashboardData.enterpriseUUID,
71+
enterpriseDashboardData.url,
72+
);
73+
});
74+
});
75+
});

src/plugin-slots/DashboardModalSlot/README.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,6 @@ const config = {
2222
type: DIRECT_PLUGIN,
2323
priority: 60,
2424
RenderWidget: DashboardModal,
25-
content: {
26-
store,
27-
},
2825
},
2926
},
3027
],

src/plugin-slots/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55
* [`widget_sidebar_slot`](./WidgetSidebarSlot/)
66
* [`course_list_slot`](./CourseListSlot/)
77
* [`no_courses_view_slot`](./NoCoursesViewSlot/)
8-
* [`dashboard_modal_slot`](./DashboardModalSlot)
8+
* [`dashboard_modal_slot](./DashboardModalSlot)

src/tracking/constants.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,13 @@ export const events = StrictDict({
2020
leaveSession: 'leaveSession',
2121
unenrollReason: 'unenrollReason',
2222
entitlementUnenrollReason: 'entitlementUnenrollReason',
23+
dashboardModalOpened: 'dashboardModalOpened',
24+
dashboardModalCTAClicked: 'dashboardModalCTAClicked',
25+
dashboardModalClosed: 'dashboardModalClosed',
2326
});
2427

28+
const learnerPortal = 'edx.ui.enterprise.lms.dashboard.learner_portal_modal';
29+
2530
export const eventNames = StrictDict({
2631
enterCourseClicked: 'edx.bi.dashboard.enter_course.clicked',
2732
courseImageClicked: 'edx.bi.dashboard.course_image.clicked',
@@ -34,6 +39,9 @@ export const eventNames = StrictDict({
3439
leaveSession: 'course-dashboard.leave-session',
3540
unenrollReason: 'unenrollment_reason.selected',
3641
entitlementUnenrollReason: 'entitlement_unenrollment_reason.selected',
42+
dashboardModalOpened: `${learnerPortal}.opened`,
43+
dashboardModalCTAClicked: `${learnerPortal}.dashboard_cta.clicked`,
44+
dashboardModalClosed: `${learnerPortal}.closed`,
3745
findCoursesClicked: 'edx.bi.dashboard.find_courses_button.clicked',
3846
purchaseCredit: 'edx.bi.credit.clicked_purchase_credit',
3947
filterClicked: 'course-dashboard.filter.clicked',

src/tracking/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import course from './trackers/course';
22
import credit from './trackers/credit';
33
import engagement from './trackers/engagement';
4+
import enterpriseDashboard from './trackers/enterpriseDashboard';
45
import entitlements from './trackers/entitlements';
56
import socialShare from './trackers/socialShare';
67
import findCourses from './trackers/findCourses';
@@ -10,6 +11,7 @@ export default {
1011
course,
1112
credit,
1213
engagement,
14+
enterpriseDashboard,
1315
entitlements,
1416
socialShare,
1517
findCourses,
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { createEventTracker, createLinkTracker } from 'data/services/segment/utils';
2+
import { eventNames } from '../constants';
3+
4+
/** Enterprise Dashboard events**/
5+
/**
6+
* Creates tracking callback for Enterprise Dashboard Modal open event
7+
* @param {string} enterpriseUUID - enterprise identifier
8+
* @return {func} - Callback that tracks the event when fired.
9+
*/
10+
export const modalOpened = (enterpriseUUID) => () => createEventTracker(
11+
eventNames.dashboardModalOpened,
12+
{ enterpriseUUID },
13+
);
14+
15+
/**
16+
* Creates tracking callback for Enterprise Dashboard Modal Call-to-action click-event
17+
* @param {string} enterpriseUUID - enterprise identifier
18+
* @param {string} href - destination url
19+
* @return {func} - Callback that tracks the event when fired and then loads the passed href.
20+
*/
21+
export const modalCTAClicked = (enterpriseUUID, href) => createLinkTracker(
22+
createEventTracker(
23+
eventNames.dashboardModalCTAClicked,
24+
{ enterpriseUUID },
25+
),
26+
href,
27+
);
28+
29+
/**
30+
* Creates tracking callback for Enterprise Dashboard Modal close event
31+
* @param {string} enterpriseUUID - enterprise identifier
32+
* @param {string} source - close event soruce ("Cancel button" vs "Escape")
33+
* @return {func} - Callback that tracks the event when fired.
34+
*/
35+
export const modalClosed = (enterpriseUUID, source) => createEventTracker(
36+
eventNames.dashboardModalClosed,
37+
{ enterpriseUUID, source },
38+
);
39+
40+
export default {
41+
modalOpened,
42+
modalCTAClicked,
43+
modalClosed,
44+
};
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { createEventTracker } from 'data/services/segment/utils';
2+
import { eventNames } from '../constants';
3+
import * as trackers from './enterpriseDashboard';
4+
5+
jest.mock('data/services/segment/utils', () => ({
6+
createEventTracker: jest.fn(args => ({ createEventTracker: args })),
7+
createLinkTracker: jest.fn((cb, href) => ({ createLinkTracker: { cb, href } })),
8+
}));
9+
10+
const enterpriseUUID = 'test-enterprise-uuid';
11+
const source = 'test-source';
12+
13+
describe('enterpriseDashboard trackers', () => {
14+
describe('modalOpened', () => {
15+
it('creates event tracker for dashboard modal opened event', () => {
16+
expect(trackers.modalOpened(enterpriseUUID, source)()).toEqual(
17+
createEventTracker(
18+
eventNames.dashboardModalOpened,
19+
{ enterpriseUUID, source },
20+
),
21+
);
22+
});
23+
});
24+
describe('modalCTAClicked', () => {
25+
const testHref = 'test-href';
26+
it('creates link tracker for dashboard modal cta click event', () => {
27+
const { cb, href } = trackers.modalCTAClicked(enterpriseUUID, testHref).createLinkTracker;
28+
expect(href).toEqual(testHref);
29+
expect(cb).toEqual(
30+
createEventTracker(
31+
eventNames.dashboardModalCTAClicked,
32+
{ enterpriseUUID, source },
33+
),
34+
);
35+
});
36+
});
37+
describe('modalClosed', () => {
38+
it('creates event tracker for dashboard modal closed event with close source', () => {
39+
expect(trackers.modalClosed(enterpriseUUID, source)).toEqual(
40+
createEventTracker(
41+
eventNames.dashboardModalClosed,
42+
{ enterpriseUUID, source },
43+
),
44+
);
45+
});
46+
});
47+
});

0 commit comments

Comments
 (0)