Skip to content

Commit 1ce13a4

Browse files
authored
fix: tour interactions (#695)
1 parent c965b6a commit 1ce13a4

2 files changed

Lines changed: 65 additions & 32 deletions

File tree

src/learning-header/site-language/components/ProductTour/useSiteLanguageTour.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@ const hasSeenSiteLanguageTourKey = 'hasSeenSiteLanguageTour';
1010

1111
const useSiteLanguageTour = () => {
1212
const { formatMessage } = useIntl();
13-
const { showCoursewareTour } = useSelector(state => state.tours);
13+
const {
14+
showExistingUserCourseHomeTour = false,
15+
showNewUserCourseHomeModal = false,
16+
showNewUserCourseHomeTour = false,
17+
toursEnabled = false,
18+
} = useSelector(state => state.tours) || {};
19+
1420
const [isTourEnabled, setIsTourEnabled] = useState(false);
1521

1622
const closeTour = useCallback(() => {
@@ -34,11 +40,13 @@ const useSiteLanguageTour = () => {
3440
}), [isTourEnabled, closeTour, formatMessage]);
3541

3642
useEffect(() => {
37-
setIsTourEnabled(
38-
!showCoursewareTour
39-
&& global.localStorage.getItem(hasSeenSiteLanguageTourKey) !== 'true',
40-
);
41-
}, [showCoursewareTour]);
43+
const shouldEnableTour = toursEnabled
44+
&& !showExistingUserCourseHomeTour
45+
&& !showNewUserCourseHomeModal
46+
&& !showNewUserCourseHomeTour
47+
&& global.localStorage.getItem(hasSeenSiteLanguageTourKey) !== 'true';
48+
setIsTourEnabled(shouldEnableTour);
49+
}, [toursEnabled, showExistingUserCourseHomeTour, showNewUserCourseHomeModal, showNewUserCourseHomeTour]);
4250

4351
return {
4452
siteLanguageTour,

src/learning-header/site-language/components/ProductTour/useSiteLanguageTour.test.js

Lines changed: 51 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,20 @@ jest.mock('react-redux', () => ({
1515

1616
describe('useSiteLanguageTour', () => {
1717
const mockFormatMessage = jest.fn((msg) => msg.defaultMessage);
18+
const mockToursState = {
19+
showExistingUserCourseHomeTour: false,
20+
showNewUserCourseHomeModal: false,
21+
showNewUserCourseHomeTour: false,
22+
toursEnabled: true,
23+
};
1824

1925
beforeEach(() => {
2026
initializeMockApp();
2127
useIntl.mockReturnValue({
2228
formatMessage: mockFormatMessage,
2329
});
2430
useSelector.mockReturnValue({
25-
showCoursewareTour: false,
31+
...mockToursState,
2632
});
2733
global.localStorage.clear();
2834
});
@@ -32,44 +38,61 @@ describe('useSiteLanguageTour', () => {
3238
jest.clearAllMocks();
3339
});
3440

35-
it('enables tour when not seen before and courseware tour is not showing', () => {
36-
useSelector.mockReturnValue({
37-
showCoursewareTour: false,
38-
});
41+
it('enables tour when not seen before, base tours are not showing, and base tours are loaded', () => {
3942
const { result } = renderHook(() => useSiteLanguageTour());
4043
expect(result.current.siteLanguageTour.enabled).toBe(true);
4144
});
4245

43-
it('disables tour when already seen', () => {
44-
global.localStorage.setItem('hasSeenSiteLanguageTour', 'true');
45-
const { result } = renderHook(() => useSiteLanguageTour());
46+
it('does not show tour until base tours are successfully loaded', () => {
47+
useSelector.mockReturnValue({
48+
...mockToursState,
49+
toursEnabled: false,
50+
});
51+
const { result, rerender } = renderHook(() => useSiteLanguageTour());
4652
expect(result.current.siteLanguageTour.enabled).toBe(false);
47-
});
4853

49-
it('disables tour when courseware tour is showing', () => {
54+
// Simulate tours being loaded
5055
useSelector.mockReturnValue({
51-
showCoursewareTour: true,
56+
...mockToursState,
57+
toursEnabled: true,
5258
});
59+
rerender();
60+
expect(result.current.siteLanguageTour.enabled).toBe(true);
61+
});
62+
63+
it('disables tour when already seen', () => {
64+
global.localStorage.setItem('hasSeenSiteLanguageTour', 'true');
5365
const { result } = renderHook(() => useSiteLanguageTour());
5466
expect(result.current.siteLanguageTour.enabled).toBe(false);
5567
});
5668

57-
it('re-enables tour when courseware tour stops showing', () => {
58-
const { result, rerender } = renderHook(() => useSiteLanguageTour());
69+
describe('disables tour when base tours are showing ', () => {
70+
it('existing user course home tour', () => {
71+
useSelector.mockReturnValue({
72+
...mockToursState,
73+
showExistingUserCourseHomeTour: true,
74+
});
75+
const { result } = renderHook(() => useSiteLanguageTour());
76+
expect(result.current.siteLanguageTour.enabled).toBe(false);
77+
});
5978

60-
// Initially, courseware tour is showing
61-
useSelector.mockReturnValue({
62-
showCoursewareTour: true,
79+
it('new user course home modal', () => {
80+
useSelector.mockReturnValue({
81+
...mockToursState,
82+
showNewUserCourseHomeModal: true,
83+
});
84+
const { result } = renderHook(() => useSiteLanguageTour());
85+
expect(result.current.siteLanguageTour.enabled).toBe(false);
6386
});
64-
rerender();
65-
expect(result.current.siteLanguageTour.enabled).toBe(false);
6687

67-
// Courseware tour stops showing
68-
useSelector.mockReturnValue({
69-
showCoursewareTour: false,
88+
it('new user course home tour', () => {
89+
useSelector.mockReturnValue({
90+
...mockToursState,
91+
showNewUserCourseHomeTour: true,
92+
});
93+
const { result } = renderHook(() => useSiteLanguageTour());
94+
expect(result.current.siteLanguageTour.enabled).toBe(false);
7095
});
71-
rerender();
72-
expect(result.current.siteLanguageTour.enabled).toBe(true);
7396
});
7497

7598
it('closeTour sets localStorage and disables tour', () => {
@@ -92,13 +115,15 @@ describe('useSiteLanguageTour', () => {
92115
});
93116
expect(result.current.siteLanguageTour.enabled).toBe(false);
94117

95-
// Try to trigger a re-render by changing courseware tour state
118+
// Try to trigger a re-render by changing tour state
96119
useSelector.mockReturnValue({
97-
showCoursewareTour: true,
120+
...mockToursState,
121+
showExistingUserCourseHomeTour: true,
98122
});
99123
rerender();
100124
useSelector.mockReturnValue({
101-
showCoursewareTour: false,
125+
...mockToursState,
126+
showExistingUserCourseHomeTour: false,
102127
});
103128
rerender();
104129

0 commit comments

Comments
 (0)