diff --git a/src/containers/EnterpriseDashboardModal/hooks.js b/src/containers/EnterpriseDashboardModal/hooks.js index 2812eb0..7fb28d0 100644 --- a/src/containers/EnterpriseDashboardModal/hooks.js +++ b/src/containers/EnterpriseDashboardModal/hooks.js @@ -9,12 +9,12 @@ export const state = StrictDict({ export const useEnterpriseDashboardHook = () => { const [showModal, setShowModal] = module.state.showModal(true); - const { mostRecentDashboard } = appHooks.useEnterpriseDashboardData(); + const dashboard = appHooks.useEnterpriseDashboardData(); const handleClick = () => setShowModal(false); return { showModal, handleClick, - mostRecentDashboard, + dashboard, }; }; diff --git a/src/containers/EnterpriseDashboardModal/hooks.test.js b/src/containers/EnterpriseDashboardModal/hooks.test.js index 43183bb..d58f40f 100644 --- a/src/containers/EnterpriseDashboardModal/hooks.test.js +++ b/src/containers/EnterpriseDashboardModal/hooks.test.js @@ -11,9 +11,7 @@ jest.mock('data/redux', () => ({ const state = new MockUseState(hooks); -const enterpriseDashboardData = { - mostRecentDashboard: { label: 'edX, Inc.', url: '/edx-dashboard' }, -}; +const enterpriseDashboardData = { label: 'edX, Inc.', url: '/edx-dashboard' }; describe('EnterpriseDashboard hooks', () => { appHooks.useEnterpriseDashboardData.mockReturnValue({ ...enterpriseDashboardData }); @@ -32,7 +30,7 @@ describe('EnterpriseDashboard hooks', () => { afterEach(state.restore); test('useEnterpriseDashboardHook to return dashboard data from redux hooks', () => { - expect(out.mostRecentDashboard).toMatchObject(enterpriseDashboardData.mostRecentDashboard); + expect(out.dashboard).toMatchObject(enterpriseDashboardData); }); test('modal initializes to shown when rendered and closes on click', () => { diff --git a/src/containers/EnterpriseDashboardModal/index.jsx b/src/containers/EnterpriseDashboardModal/index.jsx index 2908a5e..aaf6375 100644 --- a/src/containers/EnterpriseDashboardModal/index.jsx +++ b/src/containers/EnterpriseDashboardModal/index.jsx @@ -14,8 +14,11 @@ export const EnterpriseDashboardModal = () => { const { showModal, handleClick, - mostRecentDashboard, + dashboard, } = useEnterpriseDashboardHook(); + if (!dashboard) { + return null; + } return ( { >

{formatMessage(messages.enterpriseDialogHeader, { - label: mostRecentDashboard.label, + label: dashboard.label, })}

{formatMessage(messages.enterpriseDialogBody, { - label: mostRecentDashboard.label, + label: dashboard.label, })}

- diff --git a/src/containers/EnterpriseDashboardModal/index.test.jsx b/src/containers/EnterpriseDashboardModal/index.test.jsx index d036bdd..41a1e2e 100644 --- a/src/containers/EnterpriseDashboardModal/index.test.jsx +++ b/src/containers/EnterpriseDashboardModal/index.test.jsx @@ -11,7 +11,7 @@ jest.mock('./hooks', () => ({ describe('EnterpriseDashboard', () => { test('snapshot', () => { const hookData = { - mostRecentDashboard: { label: 'edX, Inc.', url: '/edx-dashboard' }, + dashboard: { label: 'edX, Inc.', url: '/edx-dashboard' }, showDialog: false, handleClick: jest.fn().mockName('useEnterpriseDashboardHook.handleClick'), }; diff --git a/src/containers/LearnerDashboardHeader/AuthenticatedUserDropdown.jsx b/src/containers/LearnerDashboardHeader/AuthenticatedUserDropdown.jsx index 0ce8321..71845a9 100644 --- a/src/containers/LearnerDashboardHeader/AuthenticatedUserDropdown.jsx +++ b/src/containers/LearnerDashboardHeader/AuthenticatedUserDropdown.jsx @@ -13,7 +13,8 @@ export const AuthenticatedUserDropdown = ({ username }) => { const { formatMessage } = useIntl(); const { authenticatedUser } = React.useContext(AppContext); const { profileImage } = authenticatedUser; - const { availableDashboards } = appHooks.useEnterpriseDashboardData(); + const dashboard = appHooks.useEnterpriseDashboardData(); + console.log({ dashboard }); return ( <> @@ -25,7 +26,7 @@ export const AuthenticatedUserDropdown = ({ username }) => { SWITCH DASHBOARD Personal - {availableDashboards && availableDashboards.map((dashboard) => ( + {!!dashboard && ( { > {dashboard.label} {formatMessage(messages.dashboard)} - ))} + )} {formatMessage(messages.profile)} diff --git a/src/containers/SelectSessionModal/constants.js b/src/containers/SelectSessionModal/constants.js new file mode 100644 index 0000000..df33eac --- /dev/null +++ b/src/containers/SelectSessionModal/constants.js @@ -0,0 +1,2 @@ +/* eslint-disable import/prefer-default-export */ +export const LEAVE_OPTION = 'leave'; diff --git a/src/containers/SelectSessionModal/hooks.js b/src/containers/SelectSessionModal/hooks.js index 8737eaa..85c070a 100644 --- a/src/containers/SelectSessionModal/hooks.js +++ b/src/containers/SelectSessionModal/hooks.js @@ -7,6 +7,7 @@ import { StrictDict } from 'utils'; import { hooks as appHooks, thunkActions } from 'data/redux'; import * as module from './hooks'; +import { LEAVE_OPTION } from './constants'; import messages from './messages'; export const state = StrictDict({ @@ -19,6 +20,7 @@ export const useSelectSessionModalData = () => { const { entitlementessions, isFulfilled, + uuid, } = appHooks.useCardEntitlementData(selectedCardId); const { title: courseTitle } = appHooks.useCardCourseData(selectedCardId); const { formatMessage } = useIntl(); @@ -38,9 +40,12 @@ export const useSelectSessionModalData = () => { const updateCallback = appHooks.useUpdateSelectSessionModalCallback; const handleSelection = ({ target: { value } }) => setSelectedSession(value); - const handleSubmit = () => dispatch( - thunkActions.app.updateEntitlementSession(selectedCardId, selectedSession), - ); + const handleSubmit = () => { + if (selectedSession === LEAVE_OPTION) { + return dispatch(thunkActions.requests.leaveEntitlementSession({ uuid })); + } + return dispatch(thunkActions.requests.updateEntitlementEnrollment({ uuid, courseId: selectedSession })); + }; return { showModal: selectedCardId != null, diff --git a/src/containers/SelectSessionModal/hooks.test.js b/src/containers/SelectSessionModal/hooks.test.js index 5cf3a87..3a01647 100644 --- a/src/containers/SelectSessionModal/hooks.test.js +++ b/src/containers/SelectSessionModal/hooks.test.js @@ -5,6 +5,7 @@ import { useIntl } from '@edx/frontend-platform/i18n'; import { MockUseState } from 'testUtils'; import { hooks as appHooks, thunkActions } from 'data/redux'; +import { LEAVE_OPTION } from './constants'; import messages from './messages'; import * as hooks from './hooks'; @@ -23,14 +24,16 @@ jest.mock('data/redux', () => ({ }, }, thunkActions: { - app: { - updateEntitlementSession: jest.fn((...args) => ({ updateEntitlementSession: args })), + requests: { + updateEntitlementEnrollment: jest.fn((...args) => ({ updateEntitlementSession: args })), + leaveEntitlementSession: jest.fn((...args) => ({ leaveEntitlementSession: args })), }, }, })); const state = new MockUseState(hooks); const selectedCardId = 'test-selected-card-id'; +const uuid = 'test-uuid'; const selectSessionData = { cardId: selectedCardId, @@ -43,6 +46,7 @@ const entitlementData = { { startDate: '3/4/2000', endDate: '3/4/2020', cardId: 'session-id-3' }, ], isFullfilled: false, + uuid, }; const cardCourseData = { @@ -107,10 +111,14 @@ describe('SelectSessionModal hooks', () => { state.mockVal(state.keys.selectedSession, testValue); runHook({}); expect(out.handleSubmit()).toEqual(dispatch( - thunkActions.app.updateEntitlementSession( - selectedCardId, - testValue, - ), + thunkActions.requests.updateEntitlementEnrollment({ courseId: testValue, uuid }), + )); + }); + it('dispatches leaveEntitlementSession if LEAVE_OPTION is selected', () => { + state.mockVal(state.keys.selectedSession, LEAVE_OPTION); + runHook({}); + expect(out.handleSubmit()).toEqual(dispatch( + thunkActions.requests.leaveEntitlementSession({ uuid }), )); }); }); diff --git a/src/containers/SelectSessionModal/index.jsx b/src/containers/SelectSessionModal/index.jsx index 206912d..ee4b48b 100644 --- a/src/containers/SelectSessionModal/index.jsx +++ b/src/containers/SelectSessionModal/index.jsx @@ -12,6 +12,7 @@ import { nullMethod } from 'hooks'; import { dateFormatter } from 'utils'; import useSelectSessionModalData from './hooks'; +import { LEAVE_OPTION } from './constants'; import messages from './messages'; export const SelectSessionModal = () => { @@ -53,7 +54,7 @@ export const SelectSessionModal = () => { ))} {showLeaveOption && ( - + {formatMessage(messages.leaveSessionOption)} )}