Skip to content

Commit 052786b

Browse files
authored
Merge pull request #6798 from topcoder-platform/PROD-3881_universal_nav
PROD-3881 universal nav
2 parents 20fe02e + c1018ce commit 052786b

File tree

3 files changed

+64
-30
lines changed

3 files changed

+64
-30
lines changed

__tests__/shared/components/__snapshots__/TopcoderFooter.jsx.snap

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
exports[`Matches shallow shapshot 1`] = `
44
<div
5-
id="uninav-footerNav"
5+
id="uninav-footerNav-0"
66
/>
77
`;
+28-13
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,50 @@
11
/* global tcUniNav */
2-
import React, { useEffect, useRef } from 'react';
2+
import React, { useEffect, useMemo, useRef } from 'react';
33
import { getSubPageConfiguration } from '../../utils/url';
44

5-
const footerElId = 'uninav-footerNav';
5+
let counter = 0;
6+
const footerElIdTmpl = 'uninav-footerNav';
67

78
export default function TopcoderFooter() {
89
const footerRef = useRef();
910
const footerInitialized = useRef(false);
11+
const footerElId = useRef(`${footerElIdTmpl}-${counter}`);
1012

11-
useEffect(() => {
12-
if (footerInitialized.current) {
13-
return;
13+
const navType = useMemo(() => {
14+
if (typeof window === 'undefined') {
15+
return '';
1416
}
1517

16-
footerInitialized.current = true;
18+
let { type } = getSubPageConfiguration();
1719

18-
let { fullFooter } = getSubPageConfiguration();
20+
const sessionNavType = sessionStorage.getItem('uni-nav[navType]');
21+
if (sessionNavType && (sessionNavType === 'tool' || sessionNavType === 'marketing')) {
22+
type = sessionNavType;
23+
}
1924

2025
// If url contains navTool url parameter. Overwrite settings with parameter.
2126
const url = new URL(window.location.href);
2227
const urlParams = new URLSearchParams(url.search);
23-
const navToolParam = urlParams.get('navTool');
24-
if (navToolParam) {
25-
fullFooter = navToolParam !== 'tool';
28+
if (urlParams.get('navTool')) {
29+
type = urlParams.get('navTool');
30+
}
31+
32+
return type;
33+
}, []);
34+
35+
useEffect(() => {
36+
if (footerInitialized.current) {
37+
return;
2638
}
2739

28-
tcUniNav('init', footerElId, {
29-
fullFooter,
40+
footerInitialized.current = true;
41+
counter += 1;
42+
43+
tcUniNav('init', footerElId.current, {
44+
fullFooter: navType !== 'tool',
3045
type: 'footer',
3146
});
3247
}, []);
3348

34-
return <div id={footerElId} ref={footerRef} />;
49+
return <div id={footerElId.current} ref={footerRef} />;
3550
}

src/shared/containers/TopcoderHeader.jsx

+35-16
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
/* global tcUniNav */
2-
import React, { useEffect, useRef } from 'react';
2+
import React, { useEffect, useMemo, useRef } from 'react';
33
import PT from 'prop-types';
44
import { connect } from 'react-redux';
55
import { config } from 'topcoder-react-utils';
66
import _ from 'lodash';
77
import { getInitials, getSubPageConfiguration } from '../utils/url';
88

9-
const headerElId = 'uninav-headerNav';
9+
let counter = 0;
10+
const headerElIdTmpl = 'uninav-headerNav';
1011

1112
const TopcoderHeader = ({ auth }) => {
1213
const uniNavInitialized = useRef(false);
@@ -15,6 +16,32 @@ const TopcoderHeader = ({ auth }) => {
1516
const isAuthenticated = !!authToken;
1617
const authURLs = config.HEADER_AUTH_URLS;
1718
const headerRef = useRef();
19+
const headerElId = useRef(`${headerElIdTmpl}-${counter}`);
20+
21+
const navType = useMemo(() => {
22+
if (typeof window === 'undefined') {
23+
return '';
24+
}
25+
26+
let { type } = getSubPageConfiguration();
27+
28+
// if there's a stored nav type in session storage, retrieve it and overwrite type
29+
const sessionNavType = sessionStorage.getItem('uni-nav[navType]');
30+
if (sessionNavType && (sessionNavType === 'tool' || sessionNavType === 'marketing')) {
31+
type = sessionNavType;
32+
}
33+
34+
// If url contains navTool url parameter. Overwrite settings with parameter.
35+
const url = new URL(window.location.href);
36+
const urlParams = new URLSearchParams(url.search);
37+
if (urlParams.get('navTool')) {
38+
type = urlParams.get('navTool');
39+
}
40+
41+
// store nav type for current session
42+
sessionStorage.setItem('uni-nav[navType]', type);
43+
return type;
44+
}, []);
1845

1946
const navigationUserInfo = {
2047
...user,
@@ -27,21 +54,13 @@ const TopcoderHeader = ({ auth }) => {
2754
}
2855

2956
uniNavInitialized.current = true;
57+
counter += 1;
3058

3159
const regSource = window.location.pathname.split('/')[1];
3260
const retUrl = encodeURIComponent(window.location.href);
3361

34-
let { type } = getSubPageConfiguration();
35-
36-
// If url contains navTool url parameter. Overwrite settings with parameter.
37-
const url = new URL(window.location.href);
38-
const urlParams = new URLSearchParams(url.search);
39-
if (urlParams.get('navTool')) {
40-
type = urlParams.get('navTool');
41-
}
42-
43-
tcUniNav('init', headerElId, {
44-
type,
62+
tcUniNav('init', headerElId.current, {
63+
type: navType,
4564
toolName: getSubPageConfiguration().toolName,
4665
toolRoot: getSubPageConfiguration().toolRoot,
4766
signOut: () => {
@@ -54,15 +73,15 @@ const TopcoderHeader = ({ auth }) => {
5473
window.location = `${authURLs.location.replace('%S', retUrl).replace('member?', '#!/member?')}&mode=signUp&regSource=${regSource}`;
5574
},
5675
});
57-
}, []);
76+
}, [navType]);
5877

5978
useEffect(() => {
60-
tcUniNav('update', headerElId, {
79+
tcUniNav('update', headerElId.current, {
6180
user: isAuthenticated ? navigationUserInfo : null,
6281
});
6382
}, [isAuthenticated, navigationUserInfo]);
6483

65-
return <div id={headerElId} ref={headerRef} />;
84+
return <div id={headerElId.current} ref={headerRef} />;
6685
};
6786

6887
TopcoderHeader.defaultProps = {

0 commit comments

Comments
 (0)