Skip to content

Commit 0c621cc

Browse files
alangstorijuma
andauthored
feat: hide xpert if user is in control variation (#86)
* feat: hide xpert if user is in control variation * fix: Update src/widgets/Xpert.jsx Co-authored-by: Marcos Rigoli <rigoli82@gmail.com> * fix: Update src/widgets/Xpert.jsx Co-authored-by: Marcos Rigoli <rigoli82@gmail.com> --------- Co-authored-by: Marcos Rigoli <rigoli82@gmail.com>
1 parent da97401 commit 0c621cc

File tree

2 files changed

+60
-20
lines changed

2 files changed

+60
-20
lines changed

src/widgets/Xpert.jsx

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import PropTypes from 'prop-types';
22
import { useEffect, useMemo } from 'react';
33
import { useDispatch, useSelector } from 'react-redux';
4+
import { useModel } from '@src/generic/model-store'; // eslint-disable-line import/no-unresolved
45

56
import { updateSidebarIsOpen, getLearningAssistantChatSummary } from '../data/thunks';
67
import ToggleXpert from '../components/ToggleXpertButton';
78
import Sidebar from '../components/Sidebar';
8-
import { ExperimentsProvider } from '../experiments';
9+
import { OPTIMIZELY_AUDIT_TRIAL_LENGTH_EXPERIMENT_VARIATION_KEYS } from '../data/optimizely';
10+
import { ExperimentsProvider, useAuditTrialExperimentDecision } from '../experiments';
911
import { CourseInfoProvider } from '../context';
1012

1113
const Xpert = ({
@@ -15,6 +17,15 @@ const Xpert = ({
1517
isUpgradeEligible,
1618
}) => {
1719
const dispatch = useDispatch();
20+
21+
const {
22+
isStaff,
23+
} = useModel('courseHomeMeta', courseId);
24+
25+
useEffect(() => {
26+
dispatch(getLearningAssistantChatSummary(courseId));
27+
}, [dispatch, courseId]);
28+
1829
const courseInfo = useMemo(
1930
() => ({ courseId, unitId, isUpgradeEligible }),
2031
[courseId, unitId, isUpgradeEligible],
@@ -29,27 +40,36 @@ const Xpert = ({
2940
dispatch(updateSidebarIsOpen(isOpen));
3041
};
3142

32-
useEffect(() => {
33-
dispatch(getLearningAssistantChatSummary(courseId));
34-
}, [dispatch, courseId]);
43+
const [decision] = useAuditTrialExperimentDecision();
44+
const { enabled: experimentEnabled, variationKey } = decision || {};
45+
46+
// if a user is not part of the experiment, not part of the control, or not eligible for upgrade, they should
47+
// still see xpert
48+
const shouldDisplayXpert = (
49+
!experimentEnabled
50+
|| !(variationKey === OPTIMIZELY_AUDIT_TRIAL_LENGTH_EXPERIMENT_VARIATION_KEYS.CONTROL)
51+
|| isStaff
52+
);
3553

3654
return isEnabled ? (
3755
<CourseInfoProvider value={courseInfo}>
3856
<ExperimentsProvider>
39-
<>
40-
<ToggleXpert
41-
courseId={courseId}
42-
isOpen={sidebarIsOpen}
43-
setIsOpen={setSidebarIsOpen}
44-
contentToolsEnabled={contentToolsEnabled}
45-
/>
46-
<Sidebar
47-
courseId={courseId}
48-
isOpen={sidebarIsOpen}
49-
setIsOpen={setSidebarIsOpen}
50-
unitId={unitId}
51-
/>
52-
</>
57+
{ shouldDisplayXpert ? (
58+
<>
59+
<ToggleXpert
60+
courseId={courseId}
61+
isOpen={sidebarIsOpen}
62+
setIsOpen={setSidebarIsOpen}
63+
contentToolsEnabled={contentToolsEnabled}
64+
/>
65+
<Sidebar
66+
courseId={courseId}
67+
isOpen={sidebarIsOpen}
68+
setIsOpen={setSidebarIsOpen}
69+
unitId={unitId}
70+
/>
71+
</>
72+
) : null }
5373
</ExperimentsProvider>
5474
</CourseInfoProvider>
5575
) : null;

src/widgets/Xpert.test.jsx

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ import React from 'react';
22

33
import { screen, waitFor } from '@testing-library/react';
44
import userEvent from '@testing-library/user-event';
5+
import { useModel } from '@src/generic/model-store'; // eslint-disable-line import/no-unresolved
56

67
import * as api from '../data/api';
78
import Xpert from './Xpert';
89

910
import * as surveyMonkey from '../utils/surveyMonkey';
1011
import { render, createRandomResponseForTesting } from '../utils/utils.test';
11-
import { usePromptExperimentDecision } from '../experiments';
12+
import { useAuditTrialExperimentDecision, usePromptExperimentDecision } from '../experiments';
13+
import { OPTIMIZELY_AUDIT_TRIAL_LENGTH_EXPERIMENT_VARIATION_KEYS } from '../data/optimizely';
1214

1315
jest.mock('@edx/frontend-platform/analytics');
1416
jest.mock('@edx/frontend-platform/auth', () => ({
@@ -18,12 +20,18 @@ jest.mock('@edx/frontend-platform/auth', () => ({
1820
jest.mock('../experiments', () => ({
1921
ExperimentsProvider: ({ children }) => children,
2022
usePromptExperimentDecision: jest.fn(),
23+
useAuditTrialExperimentDecision: jest.fn(() => [{
24+
enabled: true,
25+
variationKey: 'test',
26+
}]),
2127
}));
2228

2329
jest.mock('../utils/scroll', () => ({
2430
scrollToBottom: jest.fn(),
2531
}));
2632

33+
useModel.mockImplementation(() => ({ isStaff: false }));
34+
2735
const initialState = {
2836
learningAssistant: {
2937
currentMessage: '',
@@ -73,7 +81,6 @@ test('doesn\'t load if not enabled', async () => {
7381

7482
// button to open chat should not be in the DOM
7583
await waitFor(() => expect(screen.queryByTestId('toggle-button')).not.toBeInTheDocument());
76-
// expect(screen.queryByTestId('toggle-button')).not.toBeVisible();
7784
await waitFor(() => (expect(screen.queryByTestId('action-message')).not.toBeInTheDocument()));
7885
});
7986
test('initial load displays correct elements', async () => {
@@ -349,3 +356,16 @@ test('survey monkey survey should appear after closing sidebar', async () => {
349356
expect(survey).toHaveBeenCalledTimes(1);
350357
survey.mockRestore();
351358
});
359+
test('Xpert is not rendered for control group', async () => {
360+
useAuditTrialExperimentDecision.mockReturnValue([{
361+
enabled: true,
362+
variationKey: OPTIMIZELY_AUDIT_TRIAL_LENGTH_EXPERIMENT_VARIATION_KEYS.CONTROL,
363+
}]);
364+
365+
render(
366+
<Xpert courseId={courseId} contentToolsEnabled={false} unitId={unitId} />,
367+
{ preloadedState: initialState },
368+
);
369+
370+
await waitFor(() => expect(screen.queryByTestId('toggle-button')).not.toBeInTheDocument());
371+
});

0 commit comments

Comments
 (0)