App component structure refactor
This commit is contained in:
parent
e442179718
commit
fccedac8f2
232
src/App.js
232
src/App.js
@ -1,232 +0,0 @@
|
|||||||
import { ThemeProvider } from 'styled-components';
|
|
||||||
import theme from './utils/theme';
|
|
||||||
import LandingPage from './pages/LandingPage';
|
|
||||||
import Challenges from './pages/Challanges/Challenges';
|
|
||||||
import { BrowserRouter, Route, Routes } from 'react-router-dom';
|
|
||||||
import NavBar from './components/navigation/NavBar';
|
|
||||||
import {
|
|
||||||
CHALLENGE_PAGE,
|
|
||||||
CHALLENGES_PAGE,
|
|
||||||
IS_MOBILE,
|
|
||||||
POLICY_PRIVACY_PAGE,
|
|
||||||
LOGIN_REQUIRED_PAGES,
|
|
||||||
ROOT_URL,
|
|
||||||
CHALLENGE_SECTIONS,
|
|
||||||
} from './utils/globals';
|
|
||||||
import KeyCloakService from './services/KeyCloakService';
|
|
||||||
import React from 'react';
|
|
||||||
import LoggedBar from './components/navigation/LoggedBar';
|
|
||||||
import addUser from './api/addUser';
|
|
||||||
import Loading from './components/generic/Loading';
|
|
||||||
import { FlexColumn } from './utils/containers';
|
|
||||||
import PopupMessage from './components/generic/PopupMessage';
|
|
||||||
import PolicyPrivacy from './pages/PolicyPrivacy';
|
|
||||||
import Challenge from './pages/Challenge';
|
|
||||||
import SESSION_STORAGE from './utils/sessionStorage';
|
|
||||||
|
|
||||||
const App = () => {
|
|
||||||
const [loggedBarVisible, setLoggedBarVisible] = React.useState('100vw');
|
|
||||||
const [loggedBarHover, setLoggedBarHover] = React.useState(false);
|
|
||||||
const [popUpHeader, setPopUpHeader] = React.useState('');
|
|
||||||
const [popUpMessage, setPopUpMessage] = React.useState('');
|
|
||||||
const [confirmPopUpHandler, setConfirmPopUpHandler] = React.useState(null);
|
|
||||||
|
|
||||||
React.useMemo(() => {
|
|
||||||
if (
|
|
||||||
sessionStorage.getItem(SESSION_STORAGE.LOGOUT) ===
|
|
||||||
SESSION_STORAGE.STATIC_VALUE.YES
|
|
||||||
) {
|
|
||||||
const pageName = window.location.pathname.split('/').at(-1);
|
|
||||||
if (LOGIN_REQUIRED_PAGES.includes(pageName)) {
|
|
||||||
window.location.replace(`${ROOT_URL}/challenges`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
|
||||||
sessionStorage.getItem(SESSION_STORAGE.LOGGED) !==
|
|
||||||
SESSION_STORAGE.STATIC_VALUE.YES
|
|
||||||
) {
|
|
||||||
if (KeyCloakService.isLoggedIn()) {
|
|
||||||
sessionStorage.setItem(
|
|
||||||
SESSION_STORAGE.LOGGED,
|
|
||||||
SESSION_STORAGE.STATIC_VALUE.YES
|
|
||||||
);
|
|
||||||
addUser();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
|
||||||
sessionStorage.getItem(SESSION_STORAGE.LOGGED) ===
|
|
||||||
SESSION_STORAGE.STATIC_VALUE.YES &&
|
|
||||||
(window.location.pathname === `${POLICY_PRIVACY_PAGE}/login` ||
|
|
||||||
window.location.pathname === `${POLICY_PRIVACY_PAGE}/register`)
|
|
||||||
) {
|
|
||||||
window.location.replace(`${ROOT_URL}/challenges`);
|
|
||||||
}
|
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
if (
|
|
||||||
sessionStorage.getItem(SESSION_STORAGE.LOGGED) ===
|
|
||||||
SESSION_STORAGE.STATIC_VALUE.YES
|
|
||||||
) {
|
|
||||||
if (!KeyCloakService.isLoggedIn()) {
|
|
||||||
KeyCloakService.doLogin();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, 1500);
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const popUpMessageHandler = (header, message, confirmHandler) => {
|
|
||||||
setPopUpHeader(header);
|
|
||||||
setPopUpMessage(message);
|
|
||||||
if (confirmHandler !== null && confirmHandler !== undefined) {
|
|
||||||
setConfirmPopUpHandler(() => confirmHandler());
|
|
||||||
} else {
|
|
||||||
setConfirmPopUpHandler(null);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const popUpMessageRender = () => {
|
|
||||||
if (popUpHeader !== '' || popUpMessage !== '') {
|
|
||||||
return (
|
|
||||||
<PopupMessage
|
|
||||||
header={popUpHeader}
|
|
||||||
message={popUpMessage}
|
|
||||||
confirmHandler={confirmPopUpHandler}
|
|
||||||
popUpMessageHandler={popUpMessageHandler}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const loggedBarVisibleHandler = React.useCallback(() => {
|
|
||||||
if (loggedBarVisible === '0' && !loggedBarHover)
|
|
||||||
setLoggedBarVisible('100vw');
|
|
||||||
else setLoggedBarVisible('0');
|
|
||||||
}, [loggedBarHover, loggedBarVisible]);
|
|
||||||
|
|
||||||
const renderApp = () => {
|
|
||||||
return (
|
|
||||||
<BrowserRouter>
|
|
||||||
<ThemeProvider theme={theme}>
|
|
||||||
{popUpMessageRender()}
|
|
||||||
<NavBar
|
|
||||||
loggedBarVisibleHandler={loggedBarVisibleHandler}
|
|
||||||
popUpMessageHandler={popUpMessageHandler}
|
|
||||||
/>
|
|
||||||
{!IS_MOBILE() && (
|
|
||||||
<LoggedBar
|
|
||||||
visible={loggedBarVisible}
|
|
||||||
loggedBarVisibleHandler={loggedBarVisibleHandler}
|
|
||||||
loggedBarHoverTrue={() => setLoggedBarHover(true)}
|
|
||||||
loggedBarHoverFalse={() => setLoggedBarHover(false)}
|
|
||||||
username={KeyCloakService.getUsername()}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
<Routes>
|
|
||||||
<Route
|
|
||||||
path={`${CHALLENGE_PAGE}/:challengeId`}
|
|
||||||
element={<Challenge section={CHALLENGE_SECTIONS.LEADERBOARD} />}
|
|
||||||
/>
|
|
||||||
<Route
|
|
||||||
path={`${CHALLENGE_PAGE}/:challengeId/leaderboard`}
|
|
||||||
element={<Challenge section={CHALLENGE_SECTIONS.LEADERBOARD} />}
|
|
||||||
/>
|
|
||||||
<Route
|
|
||||||
path={`${CHALLENGE_PAGE}/:challengeId/allentries`}
|
|
||||||
element={<Challenge section={CHALLENGE_SECTIONS.ALL_ENTRIES} />}
|
|
||||||
/>
|
|
||||||
<Route
|
|
||||||
path={`${CHALLENGE_PAGE}/:challengeId/readme`}
|
|
||||||
element={<Challenge section={CHALLENGE_SECTIONS.README} />}
|
|
||||||
/>
|
|
||||||
<Route
|
|
||||||
path={`${CHALLENGE_PAGE}/:challengeId/howto`}
|
|
||||||
element={
|
|
||||||
<Challenge
|
|
||||||
popUpMessageHandler={popUpMessageHandler}
|
|
||||||
section={CHALLENGE_SECTIONS.HOW_TO}
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
<Route
|
|
||||||
path={`${CHALLENGE_PAGE}/:challengeId/myentries`}
|
|
||||||
element={<Challenge section={CHALLENGE_SECTIONS.MY_ENTRIES} />}
|
|
||||||
/>
|
|
||||||
<Route
|
|
||||||
path={`${CHALLENGE_PAGE}/:challengeId/submit`}
|
|
||||||
element={<Challenge section={CHALLENGE_SECTIONS.SUBMIT} />}
|
|
||||||
/>
|
|
||||||
<Route path={CHALLENGES_PAGE} element={<Challenges />} />
|
|
||||||
<Route
|
|
||||||
path={POLICY_PRIVACY_PAGE}
|
|
||||||
element={
|
|
||||||
<PolicyPrivacy popUpMessageHandler={popUpMessageHandler} />
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
<Route
|
|
||||||
path={`${POLICY_PRIVACY_PAGE}/login`}
|
|
||||||
element={
|
|
||||||
<PolicyPrivacy
|
|
||||||
popUpMessageHandler={popUpMessageHandler}
|
|
||||||
beforeLogin
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
<Route
|
|
||||||
path={`${POLICY_PRIVACY_PAGE}/register`}
|
|
||||||
element={
|
|
||||||
<PolicyPrivacy
|
|
||||||
popUpMessageHandler={popUpMessageHandler}
|
|
||||||
beforeRegister
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
{KeyCloakService.isLoggedIn() ? (
|
|
||||||
<>
|
|
||||||
<Route exact path="/" element={<Challenges />} />
|
|
||||||
<Route element={<Challenges />} />
|
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<Route
|
|
||||||
exact
|
|
||||||
path="/"
|
|
||||||
element={
|
|
||||||
<LandingPage popUpMessageHandler={popUpMessageHandler} />
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
<Route
|
|
||||||
element={
|
|
||||||
<LandingPage popUpMessageHandler={popUpMessageHandler} />
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</Routes>
|
|
||||||
</ThemeProvider>
|
|
||||||
</BrowserRouter>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
if (
|
|
||||||
sessionStorage.getItem(SESSION_STORAGE.LOGGED) ===
|
|
||||||
SESSION_STORAGE.STATIC_VALUE.YES
|
|
||||||
) {
|
|
||||||
if (KeyCloakService.isLoggedIn()) {
|
|
||||||
return renderApp();
|
|
||||||
} else {
|
|
||||||
return (
|
|
||||||
<ThemeProvider theme={theme}>
|
|
||||||
<FlexColumn width="100vw" height="100vh">
|
|
||||||
<Loading />
|
|
||||||
</FlexColumn>
|
|
||||||
</ThemeProvider>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return renderApp();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export default App;
|
|
33
src/App/App.js
Normal file
33
src/App/App.js
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { ThemeProvider } from 'styled-components';
|
||||||
|
import theme from '../utils/theme';
|
||||||
|
import PopUpMessageManager from './components/PopUpMessageManager';
|
||||||
|
import RoutingManager from './components/RoutingManager';
|
||||||
|
import NavigationManager from './components/NavigationManager';
|
||||||
|
import { BrowserRouter } from 'react-router-dom';
|
||||||
|
import startManage from './functions/startManage';
|
||||||
|
import startApp from './functions/startApp';
|
||||||
|
|
||||||
|
const App = () => {
|
||||||
|
React.useMemo(() => {
|
||||||
|
startManage();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const renderApp = React.useCallback(() => {
|
||||||
|
return (
|
||||||
|
<ThemeProvider theme={theme}>
|
||||||
|
<PopUpMessageManager>
|
||||||
|
<BrowserRouter>
|
||||||
|
<NavigationManager>
|
||||||
|
<RoutingManager />
|
||||||
|
</NavigationManager>
|
||||||
|
</BrowserRouter>
|
||||||
|
</PopUpMessageManager>
|
||||||
|
</ThemeProvider>
|
||||||
|
);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return startApp(renderApp);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default App;
|
47
src/App/components/NavigationManager.js
Normal file
47
src/App/components/NavigationManager.js
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import NavBar from '../../components/navigation/NavBar/NavBar';
|
||||||
|
import LoggedBar from '../../components/navigation/LoggedBar';
|
||||||
|
import KeyCloakService from '../../services/KeyCloakService';
|
||||||
|
import { CHILDREN_WITH_PROPS, IS_MOBILE } from '../../utils/globals';
|
||||||
|
|
||||||
|
const NavigationManager = (props) => {
|
||||||
|
const [loggedBarVisible, setLoggedBarVisible] = React.useState('100vw');
|
||||||
|
const [loggedBarHover, setLoggedBarHover] = React.useState(false);
|
||||||
|
const [navOptions, setNavOptions] = React.useState(true);
|
||||||
|
|
||||||
|
const loggedBarVisibleHandler = React.useCallback(() => {
|
||||||
|
if (loggedBarVisible === '0' && !loggedBarHover)
|
||||||
|
setLoggedBarVisible('100vw');
|
||||||
|
else setLoggedBarVisible('0');
|
||||||
|
}, [loggedBarHover, loggedBarVisible]);
|
||||||
|
|
||||||
|
const hideNavOptions = React.useCallback(() => {
|
||||||
|
setNavOptions(false);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const showNavOptions = React.useCallback(() => {
|
||||||
|
setNavOptions(true);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<NavBar
|
||||||
|
loggedBarVisibleHandler={loggedBarVisibleHandler}
|
||||||
|
popUpMessageHandler={props.popUpMessageHandler}
|
||||||
|
navOptions={navOptions}
|
||||||
|
/>
|
||||||
|
{!IS_MOBILE() && (
|
||||||
|
<LoggedBar
|
||||||
|
visible={loggedBarVisible}
|
||||||
|
loggedBarVisibleHandler={loggedBarVisibleHandler}
|
||||||
|
loggedBarHoverTrue={() => setLoggedBarHover(true)}
|
||||||
|
loggedBarHoverFalse={() => setLoggedBarHover(false)}
|
||||||
|
username={KeyCloakService.getUsername()}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
{CHILDREN_WITH_PROPS(props.children, { hideNavOptions, showNavOptions })}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default NavigationManager;
|
41
src/App/components/PopUpMessageManager.js
Normal file
41
src/App/components/PopUpMessageManager.js
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import PopupMessage from '../../components/generic/PopupMessage';
|
||||||
|
import { CHILDREN_WITH_PROPS } from '../../utils/globals';
|
||||||
|
|
||||||
|
const PopUpMessageManager = (props) => {
|
||||||
|
const [popUpHeader, setPopUpHeader] = React.useState('');
|
||||||
|
const [popUpMessage, setPopUpMessage] = React.useState('');
|
||||||
|
const [confirmPopUpHandler, setConfirmPopUpHandler] = React.useState(null);
|
||||||
|
|
||||||
|
const popUpMessageHandler = (header, message, confirmHandler) => {
|
||||||
|
setPopUpHeader(header);
|
||||||
|
setPopUpMessage(message);
|
||||||
|
if (confirmHandler !== null && confirmHandler !== undefined) {
|
||||||
|
setConfirmPopUpHandler(() => confirmHandler());
|
||||||
|
} else {
|
||||||
|
setConfirmPopUpHandler(null);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const popUpMessageRender = () => {
|
||||||
|
if (popUpHeader !== '' || popUpMessage !== '') {
|
||||||
|
return (
|
||||||
|
<PopupMessage
|
||||||
|
header={popUpHeader}
|
||||||
|
message={popUpMessage}
|
||||||
|
confirmHandler={confirmPopUpHandler}
|
||||||
|
popUpMessageHandler={popUpMessageHandler}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{popUpMessageRender()}
|
||||||
|
{CHILDREN_WITH_PROPS(props.children, { popUpMessageHandler })}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default PopUpMessageManager;
|
108
src/App/components/RoutingManager.js
Normal file
108
src/App/components/RoutingManager.js
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
import { Route, Routes } from 'react-router-dom';
|
||||||
|
import {
|
||||||
|
CHALLENGES_PAGE,
|
||||||
|
CHALLENGE_PAGE,
|
||||||
|
CHALLENGE_SECTIONS,
|
||||||
|
POLICY_PRIVACY_PAGE,
|
||||||
|
} from '../../utils/globals';
|
||||||
|
import Challenge from '../../pages/Challenge';
|
||||||
|
import Challenges from '../../pages/Challanges';
|
||||||
|
import PolicyPrivacy from '../../pages/PolicyPrivacy';
|
||||||
|
import LandingPage from '../../pages/LandingPage';
|
||||||
|
import KeyCloakService from '../../services/KeyCloakService';
|
||||||
|
|
||||||
|
const RoutingManager = (props) => {
|
||||||
|
return (
|
||||||
|
<Routes>
|
||||||
|
<Route
|
||||||
|
path={`${CHALLENGE_PAGE}/:challengeId`}
|
||||||
|
element={<Challenge section={CHALLENGE_SECTIONS.LEADERBOARD} />}
|
||||||
|
/>
|
||||||
|
<Route
|
||||||
|
path={`${CHALLENGE_PAGE}/:challengeId/leaderboard`}
|
||||||
|
element={<Challenge section={CHALLENGE_SECTIONS.LEADERBOARD} />}
|
||||||
|
/>
|
||||||
|
<Route
|
||||||
|
path={`${CHALLENGE_PAGE}/:challengeId/allentries`}
|
||||||
|
element={<Challenge section={CHALLENGE_SECTIONS.ALL_ENTRIES} />}
|
||||||
|
/>
|
||||||
|
<Route
|
||||||
|
path={`${CHALLENGE_PAGE}/:challengeId/readme`}
|
||||||
|
element={<Challenge section={CHALLENGE_SECTIONS.README} />}
|
||||||
|
/>
|
||||||
|
<Route
|
||||||
|
path={`${CHALLENGE_PAGE}/:challengeId/howto`}
|
||||||
|
element={
|
||||||
|
<Challenge
|
||||||
|
popUpMessageHandler={props.popUpMessageHandler}
|
||||||
|
section={CHALLENGE_SECTIONS.HOW_TO}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<Route
|
||||||
|
path={`${CHALLENGE_PAGE}/:challengeId/myentries`}
|
||||||
|
element={<Challenge section={CHALLENGE_SECTIONS.MY_ENTRIES} />}
|
||||||
|
/>
|
||||||
|
<Route
|
||||||
|
path={`${CHALLENGE_PAGE}/:challengeId/submit`}
|
||||||
|
element={<Challenge section={CHALLENGE_SECTIONS.SUBMIT} />}
|
||||||
|
/>
|
||||||
|
<Route path={CHALLENGES_PAGE} element={<Challenges />} />
|
||||||
|
<Route
|
||||||
|
path={POLICY_PRIVACY_PAGE}
|
||||||
|
element={
|
||||||
|
<PolicyPrivacy popUpMessageHandler={props.popUpMessageHandler} />
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<Route
|
||||||
|
path={`${POLICY_PRIVACY_PAGE}/login`}
|
||||||
|
element={
|
||||||
|
<PolicyPrivacy
|
||||||
|
popUpMessageHandler={props.popUpMessageHandler}
|
||||||
|
beforeLogin
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<Route
|
||||||
|
path={`${POLICY_PRIVACY_PAGE}/register`}
|
||||||
|
element={
|
||||||
|
<PolicyPrivacy
|
||||||
|
popUpMessageHandler={props.popUpMessageHandler}
|
||||||
|
beforeRegister
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
{KeyCloakService.isLoggedIn() ? (
|
||||||
|
<>
|
||||||
|
<Route exact path="/" element={<Challenges />} />
|
||||||
|
<Route element={<Challenges />} />
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<Route
|
||||||
|
exact
|
||||||
|
path="/"
|
||||||
|
element={
|
||||||
|
<LandingPage
|
||||||
|
popUpMessageHandler={props.popUpMessageHandler}
|
||||||
|
showNavOptions={props.showNavOptions}
|
||||||
|
hideNavOptions={props.hideNavOptions}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<Route
|
||||||
|
element={
|
||||||
|
<LandingPage
|
||||||
|
popUpMessageHandler={props.popUpMessageHandler}
|
||||||
|
showNavOptions={props.showNavOptions}
|
||||||
|
hideNavOptions={props.hideNavOptions}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</Routes>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default RoutingManager;
|
29
src/App/functions/startApp.js
Normal file
29
src/App/functions/startApp.js
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import Loading from '../../components/generic/Loading';
|
||||||
|
import { FlexColumn } from '../../utils/containers';
|
||||||
|
import SESSION_STORAGE from '../../utils/sessionStorage';
|
||||||
|
import KeyCloakService from '../../services/KeyCloakService';
|
||||||
|
import { ThemeProvider } from 'styled-components';
|
||||||
|
import theme from '../../utils/theme';
|
||||||
|
|
||||||
|
const startApp = (renderApp) => {
|
||||||
|
if (
|
||||||
|
sessionStorage.getItem(SESSION_STORAGE.LOGGED) ===
|
||||||
|
SESSION_STORAGE.STATIC_VALUE.YES
|
||||||
|
) {
|
||||||
|
if (KeyCloakService.isLoggedIn()) {
|
||||||
|
return renderApp();
|
||||||
|
} else {
|
||||||
|
return (
|
||||||
|
<ThemeProvider theme={theme}>
|
||||||
|
<FlexColumn width="100vw" height="100vh">
|
||||||
|
<Loading />
|
||||||
|
</FlexColumn>
|
||||||
|
</ThemeProvider>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return renderApp();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default startApp;
|
55
src/App/functions/startManage.js
Normal file
55
src/App/functions/startManage.js
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
import {
|
||||||
|
POLICY_PRIVACY_PAGE,
|
||||||
|
LOGIN_REQUIRED_PAGES,
|
||||||
|
ROOT_URL,
|
||||||
|
} from '../../utils/globals';
|
||||||
|
import addUser from '../../api/addUser';
|
||||||
|
import SESSION_STORAGE from '../../utils/sessionStorage';
|
||||||
|
import KeyCloakService from '../../services/KeyCloakService';
|
||||||
|
|
||||||
|
const startManage = () => {
|
||||||
|
if (
|
||||||
|
sessionStorage.getItem(SESSION_STORAGE.LOGOUT) ===
|
||||||
|
SESSION_STORAGE.STATIC_VALUE.YES
|
||||||
|
) {
|
||||||
|
const pageName = window.location.pathname.split('/').at(-1);
|
||||||
|
if (LOGIN_REQUIRED_PAGES.includes(pageName)) {
|
||||||
|
window.location.replace(`${ROOT_URL}/challenges`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
sessionStorage.getItem(SESSION_STORAGE.LOGGED) !==
|
||||||
|
SESSION_STORAGE.STATIC_VALUE.YES
|
||||||
|
) {
|
||||||
|
if (KeyCloakService.isLoggedIn()) {
|
||||||
|
sessionStorage.setItem(
|
||||||
|
SESSION_STORAGE.LOGGED,
|
||||||
|
SESSION_STORAGE.STATIC_VALUE.YES
|
||||||
|
);
|
||||||
|
addUser();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
sessionStorage.getItem(SESSION_STORAGE.LOGGED) ===
|
||||||
|
SESSION_STORAGE.STATIC_VALUE.YES &&
|
||||||
|
(window.location.pathname === `${POLICY_PRIVACY_PAGE}/login` ||
|
||||||
|
window.location.pathname === `${POLICY_PRIVACY_PAGE}/register`)
|
||||||
|
) {
|
||||||
|
window.location.replace(`${ROOT_URL}/challenges`);
|
||||||
|
}
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
if (
|
||||||
|
sessionStorage.getItem(SESSION_STORAGE.LOGGED) ===
|
||||||
|
SESSION_STORAGE.STATIC_VALUE.YES
|
||||||
|
) {
|
||||||
|
if (!KeyCloakService.isLoggedIn()) {
|
||||||
|
KeyCloakService.doLogin();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 1500);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default startManage;
|
1
src/App/index.js
Normal file
1
src/App/index.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export { default } from './App';
|
@ -0,0 +1,14 @@
|
|||||||
|
import styled from 'styled-components';
|
||||||
|
import { FlexColumn } from '../../../utils/containers';
|
||||||
|
|
||||||
|
const EntireScreenLoadingStyle = styled(FlexColumn)`
|
||||||
|
width: 100%;
|
||||||
|
height: 100vh;
|
||||||
|
z-index: 1000;
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
background-color: ${({ theme }) => theme.colors.white};
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default EntireScreenLoadingStyle;
|
@ -0,0 +1,13 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import EntireScreenLoadingStyle from './EntireScreenLoadingStyle';
|
||||||
|
import Loading from '../Loading';
|
||||||
|
|
||||||
|
const EntireScreenLoading = () => {
|
||||||
|
return (
|
||||||
|
<EntireScreenLoadingStyle>
|
||||||
|
<Loading />
|
||||||
|
</EntireScreenLoadingStyle>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default EntireScreenLoading;
|
0
src/components/generic/EntireScreenLoading/index.js
Normal file
0
src/components/generic/EntireScreenLoading/index.js
Normal file
@ -1,24 +1,29 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import {H1} from '../../utils/fonts';
|
import { H1 } from '../../utils/fonts';
|
||||||
import theme from '../../utils/theme';
|
import theme from '../../utils/theme';
|
||||||
import {Link} from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
|
|
||||||
const LogoStyle = styled(H1)`
|
const LogoStyle = styled(H1)`
|
||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
|
|
||||||
@media (min-width: ${({theme}) => theme.overMobile}) {
|
@media (min-width: ${({ theme }) => theme.overMobile}) {
|
||||||
font-size: 32px;
|
font-size: 32px;
|
||||||
line-height: 32px;
|
line-height: 32px;
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const Logo = () => {
|
const Logo = (props) => {
|
||||||
return (
|
return (
|
||||||
<LogoStyle as={Link} cursor='pointer' to='/' color={theme.colors.green}>
|
<LogoStyle
|
||||||
Gonito
|
as={props.navOptions ? Link : 'span'}
|
||||||
</LogoStyle>
|
cursor="pointer"
|
||||||
);
|
to="/"
|
||||||
|
color={theme.colors.green}
|
||||||
|
>
|
||||||
|
Gonito
|
||||||
|
</LogoStyle>
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default Logo;
|
export default Logo;
|
@ -43,6 +43,7 @@ const NavBar = (props) => {
|
|||||||
const mobileMenuHoverFalse = () => {
|
const mobileMenuHoverFalse = () => {
|
||||||
setMobileMenuHover(false);
|
setMobileMenuHover(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
const toggleNavMenu = () => {
|
const toggleNavMenu = () => {
|
||||||
if (navMenuTranslateY === 'calc(-100vh - 42px)') setNavMenuTranslateY('0');
|
if (navMenuTranslateY === 'calc(-100vh - 42px)') setNavMenuTranslateY('0');
|
||||||
else if (!mobileMenuHover) setNavMenuTranslateY('calc(-100vh - 42px)');
|
else if (!mobileMenuHover) setNavMenuTranslateY('calc(-100vh - 42px)');
|
||||||
@ -51,51 +52,57 @@ const NavBar = (props) => {
|
|||||||
return (
|
return (
|
||||||
<NavBarStyle as="header">
|
<NavBarStyle as="header">
|
||||||
<FlexRow height="100%" alignmentX="space-between" as="nav">
|
<FlexRow height="100%" alignmentX="space-between" as="nav">
|
||||||
<Logo />
|
<Logo navOptions={props.navOptions} />
|
||||||
<MenuButton as="button" onClick={toggleNavMenu} />
|
{props.navOptions && (
|
||||||
<FlexRow as="ul" className="ul-desktop" gap="32px">
|
<>
|
||||||
<FlexRow as={Link} to={CHALLENGES_PAGE} gap="16px">
|
<MenuButton as="button" onClick={toggleNavMenu} />
|
||||||
<Svg width="16px" height="16px" src={cupIco} />
|
<FlexRow as="ul" className="ul-desktop" gap="32px">
|
||||||
<Menu as="li">Challenges</Menu>
|
<FlexRow as={Link} to={CHALLENGES_PAGE} gap="16px">
|
||||||
</FlexRow>
|
<Svg width="16px" height="16px" src={cupIco} />
|
||||||
<FlexRow as={Link} to={POLICY_PRIVACY_PAGE} gap="12px">
|
<Menu as="li">Challenges</Menu>
|
||||||
<Svg size="cover" width="16px" height="16px" src={policyIco} />
|
</FlexRow>
|
||||||
<Menu as="li">Privacy policy</Menu>
|
<FlexRow as={Link} to={POLICY_PRIVACY_PAGE} gap="12px">
|
||||||
</FlexRow>
|
<Svg size="cover" width="16px" height="16px" src={policyIco} />
|
||||||
{!KeyCloakService.isLoggedIn() ? (
|
<Menu as="li">Privacy policy</Menu>
|
||||||
<FlexRow
|
</FlexRow>
|
||||||
as="button"
|
{!KeyCloakService.isLoggedIn() && (
|
||||||
onClick={() =>
|
<FlexRow
|
||||||
props.popUpMessageHandler(
|
as="button"
|
||||||
'Reminder',
|
onClick={() =>
|
||||||
'Remember to check your spam mailbox to confirm your account.',
|
props.popUpMessageHandler(
|
||||||
() => KeyCloakService.doRegister
|
'Reminder',
|
||||||
)
|
'Remember to check your spam mailbox to confirm your account.',
|
||||||
}
|
() => KeyCloakService.doRegister
|
||||||
gap="16px"
|
)
|
||||||
>
|
}
|
||||||
<Svg width="16px" height="16px" src={registerIco} />
|
gap="16px"
|
||||||
<Menu as="li">Register</Menu>
|
>
|
||||||
|
<Svg width="16px" height="16px" src={registerIco} />
|
||||||
|
<Menu as="li">Register</Menu>
|
||||||
|
</FlexRow>
|
||||||
|
)}
|
||||||
|
{KeyCloakService.isLoggedIn() ? (
|
||||||
|
<Svg
|
||||||
|
as="button"
|
||||||
|
onClick={props.loggedBarVisibleHandler}
|
||||||
|
width="32px"
|
||||||
|
height="32px"
|
||||||
|
src={userIco}
|
||||||
|
margin="0 16px 0 0"
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<FlexRow
|
||||||
|
as="button"
|
||||||
|
onClick={KeyCloakService.doLogin}
|
||||||
|
gap="16px"
|
||||||
|
>
|
||||||
|
<Svg width="16px" height="16px" src={loginIco} />
|
||||||
|
<Menu as="li">Sign in</Menu>
|
||||||
|
</FlexRow>
|
||||||
|
)}
|
||||||
</FlexRow>
|
</FlexRow>
|
||||||
) : (
|
</>
|
||||||
''
|
)}
|
||||||
)}
|
|
||||||
{KeyCloakService.isLoggedIn() ? (
|
|
||||||
<Svg
|
|
||||||
as="button"
|
|
||||||
onClick={props.loggedBarVisibleHandler}
|
|
||||||
width="32px"
|
|
||||||
height="32px"
|
|
||||||
src={userIco}
|
|
||||||
margin="0 16px 0 0"
|
|
||||||
/>
|
|
||||||
) : (
|
|
||||||
<FlexRow as="button" onClick={KeyCloakService.doLogin} gap="16px">
|
|
||||||
<Svg width="16px" height="16px" src={loginIco} />
|
|
||||||
<Menu as="li">Sign in</Menu>
|
|
||||||
</FlexRow>
|
|
||||||
)}
|
|
||||||
</FlexRow>
|
|
||||||
</FlexRow>
|
</FlexRow>
|
||||||
<MobileNavMenu
|
<MobileNavMenu
|
||||||
mobileMenuHoverTrue={mobileMenuHoverTrue}
|
mobileMenuHoverTrue={mobileMenuHoverTrue}
|
||||||
|
@ -6,20 +6,30 @@ import Commercial from './components/Commercial/Commercial';
|
|||||||
import Hero from './components/Hero/Hero';
|
import Hero from './components/Hero/Hero';
|
||||||
import Partnerships from './components/Partnerships/Partnerships';
|
import Partnerships from './components/Partnerships/Partnerships';
|
||||||
import LandingPageStyle from './LandingPageStyle';
|
import LandingPageStyle from './LandingPageStyle';
|
||||||
// import MadeByCsi from './components/MadeByCsi/MadeByCsi';
|
import EntireScreenLoading from '../../components/generic/EntireScreenLoading/EntrieScreenLoading';
|
||||||
|
|
||||||
const LandingPage = (props) => {
|
const LandingPage = (props) => {
|
||||||
return (
|
const [show, setShow] = React.useState(false);
|
||||||
<LandingPageStyle as="main">
|
|
||||||
<Hero popUpMessageHandler={props.popUpMessageHandler} />
|
React.useEffect(() => {
|
||||||
<FlexColumn className="LandingPageStyle__main-container">
|
setTimeout(() => {
|
||||||
<Motivation />
|
setShow(true);
|
||||||
<Csi />
|
}, 1000);
|
||||||
<Commercial />
|
}, []);
|
||||||
<Partnerships />
|
|
||||||
</FlexColumn>
|
if (show) {
|
||||||
</LandingPageStyle>
|
return (
|
||||||
);
|
<LandingPageStyle as="main">
|
||||||
|
<Hero popUpMessageHandler={props.popUpMessageHandler} />
|
||||||
|
<FlexColumn className="LandingPageStyle__main-container">
|
||||||
|
<Motivation />
|
||||||
|
<Csi />
|
||||||
|
<Commercial />
|
||||||
|
<Partnerships />
|
||||||
|
</FlexColumn>
|
||||||
|
</LandingPageStyle>
|
||||||
|
);
|
||||||
|
} else return <EntireScreenLoading />;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default LandingPage;
|
export default LandingPage;
|
||||||
|
@ -6,6 +6,7 @@ import cupIco from '../assets/cup_ico.svg';
|
|||||||
import textIco from '../assets/text_ico.svg';
|
import textIco from '../assets/text_ico.svg';
|
||||||
import imageIco from '../assets/image_ico.svg';
|
import imageIco from '../assets/image_ico.svg';
|
||||||
import tabularIco from '../assets/tabular_ico.svg';
|
import tabularIco from '../assets/tabular_ico.svg';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
const ELEMENTS_PER_PAGE = 12;
|
const ELEMENTS_PER_PAGE = 12;
|
||||||
const MINI_DESCRIPTION_LENGTH = 70;
|
const MINI_DESCRIPTION_LENGTH = 70;
|
||||||
@ -119,6 +120,14 @@ const IS_MOBILE = () => {
|
|||||||
return document.body.clientWidth <= 1024;
|
return document.body.clientWidth <= 1024;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const CHILDREN_WITH_PROPS = (propsChildren, props) =>
|
||||||
|
React.Children.map(propsChildren, (child) => {
|
||||||
|
if (React.isValidElement(child)) {
|
||||||
|
return React.cloneElement(child, props);
|
||||||
|
}
|
||||||
|
return child;
|
||||||
|
});
|
||||||
|
|
||||||
export {
|
export {
|
||||||
ELEMENTS_PER_PAGE,
|
ELEMENTS_PER_PAGE,
|
||||||
API,
|
API,
|
||||||
@ -142,4 +151,5 @@ export {
|
|||||||
EVALUATIONS_FORMAT,
|
EVALUATIONS_FORMAT,
|
||||||
PREVIOUS_PAGE,
|
PREVIOUS_PAGE,
|
||||||
NEXT_PAGE,
|
NEXT_PAGE,
|
||||||
|
CHILDREN_WITH_PROPS,
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user