diff options
author | eug-vs <eug-vs@keemail.me> | 2020-08-07 21:53:48 +0300 |
---|---|---|
committer | eug-vs <eug-vs@keemail.me> | 2020-08-07 21:53:48 +0300 |
commit | d9c74d25ab1f4e13cb980074e188ef6125d2d290 (patch) | |
tree | 83058ec297a5a25f3d5e06a8b6e8c6097a2f0388 /src | |
parent | 5a597796f622407be7ba03f5eb7aeb608c418fc2 (diff) | |
download | which-ui-d9c74d25ab1f4e13cb980074e188ef6125d2d290.tar.gz |
feat: setup initial routing
Diffstat (limited to 'src')
-rw-r--r-- | src/pages/Page.tsx | 46 | ||||
-rw-r--r-- | src/pages/PrivateRoute.tsx | 36 |
2 files changed, 67 insertions, 15 deletions
diff --git a/src/pages/Page.tsx b/src/pages/Page.tsx index 56d7372..62b6b61 100644 --- a/src/pages/Page.tsx +++ b/src/pages/Page.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { makeStyles, useTheme } from '@material-ui/core/styles'; import { useMediaQuery } from '@material-ui/core'; import { SnackbarProvider } from 'notistack'; +import { BrowserRouter, Switch, Route } from 'react-router-dom'; import ProfilePage from './ProfilePage/ProfilePage'; import FeedPage from './FeedPage/FeedPage'; @@ -9,6 +10,7 @@ import AuthPage from './AuthPage/AuthPage'; import HomePage from './HomePage/HomePage'; import NotificationsPage from './NotificationsPage/NotificationsPage'; import { useNavigate } from '../hooks/useNavigate'; +import PrivateRoute from './PrivateRoute'; const useStyles = makeStyles(theme => ({ @@ -22,6 +24,16 @@ const useStyles = makeStyles(theme => ({ } })); + +const urls = { + home: '/', + login: '/login', + registration: '/registration', + profile: '/profile', + feed: '/feed', + notifications: '/notifications' +}; + const Page: React.FC = () => { const { page } = useNavigate(); const classes = useStyles(); @@ -29,21 +41,25 @@ const Page: React.FC = () => { const isMobile = useMediaQuery(theme.breakpoints.down('sm')); return ( - <SnackbarProvider - maxSnack={3} - anchorOrigin={{ - vertical: isMobile ? 'top' : 'bottom', - horizontal: 'right' - }} - > - <div className={classes.root}> - { page.prefix === 'home' && <HomePage />} - { page.prefix === 'profile' && <ProfilePage />} - { page.prefix === 'feed' && <FeedPage /> } - { page.prefix === 'auth' && <AuthPage /> } - { page.prefix === 'notifications' && <NotificationsPage /> } - </div> - </SnackbarProvider> + <BrowserRouter> + <SnackbarProvider + maxSnack={3} + anchorOrigin={{ + vertical: isMobile ? 'top' : 'bottom', + horizontal: 'right' + }} + > + <div className={classes.root}> + <Switch> + <PrivateRoute exact path={urls.home} component={HomePage} /> + <PrivateRoute exact path={urls.login} component={AuthPage} /> + <PrivateRoute exact path={urls.registration} component={AuthPage} /> + <PrivateRoute exact path={urls.feed} component={FeedPage} /> + <PrivateRoute exact path={urls.notifications} component={NotificationsPage} /> + </Switch> + </div> + </SnackbarProvider> + </BrowserRouter> ); }; diff --git a/src/pages/PrivateRoute.tsx b/src/pages/PrivateRoute.tsx new file mode 100644 index 0000000..cdee67b --- /dev/null +++ b/src/pages/PrivateRoute.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import { Redirect, Route } from 'react-router-dom'; +import { useAuth } from '../hooks/useAuth'; + +const urls = { + home: '/', + login: '/login', + registration: '/registration', + profile: '/profile', + feed: '/feed', + notifications: '/notifications' +}; + +const PrivateRoute: React.FC<any> = ({ component: ProtectedComponent, ...rest }) => { + const { isAuthenticated } = useAuth(); + + const getComponent: React.FC<any> = (props) => { + if (props.match.path === urls.login || props.match.path === urls.registration) { + return isAuthenticated() ? ( + <Redirect to={urls.profile} /> + ) : ( + <ProtectedComponent {...props} /> + ); + } + + return isAuthenticated() ? ( + <ProtectedComponent {...props} /> + ) : ( + <Redirect to={{ pathname: urls.login, state: { from: props.location } }} /> + ); + } + + return <Route {...rest} render={getComponent} />; +}; + +export default PrivateRoute; |