Reputation: 4925
Here is how my app.js
looks like:
import React from 'react';
import StarterScreen from './components/StarterScreen.jsx';
import LoginScreen from './components/LoginScreen.jsx';
import RegisterScreen from './components/RegisterScreen.jsx';
import DisplayScreen from './components/DisplayScreen.jsx';
import 'bootstrap/dist/css/bootstrap.min.css';
import './App.css';
import {BrowserRouter,Route,Switch} from 'react-router-dom';
return function App(){
<div className="App">
<BrowserRouter>
<Switch>
<Route component={StarterScreen} exact path="/"></Route>
<Route component={RegisterScreen} exact path="/register"></Route>
<Route component={LoginScreen} exact path="/login"></Route>
<Route component={DisplayScreen} exact path="/login-props-test"></Route>
</Switch>
</BrowserRouter>
</div>
);
}
export default App;
I have two major objective in the above snippet:
<Route component={DisplayScreen} exact path="/login-props-test"></Route>
.
I know there are ways to pass props while using components like:
<DisplayScreen isLoggedIn={true} />
But how do I pass it in this Route component
element?function checkLogin(props) { if(props.Authentication===true) props.history.push('/login-props-test'); }
I want to pass props.isLoggedIn into this function as well. Any way to execute these two processes?
Upvotes: 0
Views: 507
Reputation: 113
I would follow this approach to protect routes (an reuse the code, which is always good)
First, create a component that will act as a Route wrapper.
import React from "react";
import PropTypes from "prop-types";
import { Route, Redirect } from "react-router-dom";
import { useAuthContext } from "services/auth-provider";
const PrivateRoute = ({ component, ...options }) => {
const { accessToken } = useAuthContext();
if (!accessToken) {
return <Redirect to={{ pathname: "/login" }} />;
}
return <Route {...options} component={component} />;
};
PrivateRoute.defaultProps = {};
PrivateRoute.propTypes = {
component: PropTypes.elementType.isRequired
};
export default PrivateRoute;
Following this approach you can redirect to the login page if they are not authed or the token is invalid (or whatever condition you want to check) and also is fully reusable.
You can then use it like this:
const Router = () => (
<BrowserRouter>
<Switch>
<Route component={StarterScreen} exact path="/"></Route>
<Route component={RegisterScreen} exact path="/register"></Route>
<Route component={LoginScreen} exact path="/login"></Route>
<PrivateRoute component={DisplayScreen} exact path="/login-props-test"></PrivateRoute>
</Switch>
</BrowserRouter>
);
Upvotes: 2
Reputation: 99
just use this instead
import React from 'react';
import StarterScreen from './components/StarterScreen.jsx';
import LoginScreen from './components/LoginScreen.jsx';
import RegisterScreen from './components/RegisterScreen.jsx';
import DisplayScreen from './components/DisplayScreen.jsx';
import 'bootstrap/dist/css/bootstrap.min.css';
import './App.css';
import {BrowserRouter,Route,Switch} from 'react-router-dom';
return (
<div className="App">
<BrowserRouter>
<Switch>
<Route component={()=> <StarterScreen your_prop={here} />} exact path="/"></Route>
<Route component={()=> <RegisterScreen your_prop={here} />} exact path="/register"></Route>
<Route component={()=> <LoginScreen your_prop={here} />} exact path="/login"></Route>
<Route component={()=> <DisplayScreen your_prop={here} />} exact path="/login-props-test"></Route>
</Switch>
</BrowserRouter>
</div>
);
}
export default App;
changed code is:
<Switch>
<Route component={()=> <StarterScreen your_prop={here} />} exact path="/"></Route>
<Route component={()=> <RegisterScreen your_prop={here} />} exact path="/register"></Route>
<Route component={()=> <LoginScreen your_prop={here} />} exact path="/login"></Route>
<Route component={()=> <DisplayScreen your_prop={here} />} exact path="/login-props-test"></Route>
</Switch>
or you can use this as well
<Switch>
<Route exact path="/">
<StarterScreen your_prop={here} />
</Route>
<Route exact path="/register">
<RegisterScreen your_prop={here} />
</Route>
<Route exact path="/login">
<LoginScreen your_prop={here} />
</Route>
<Route exact path="/login-props-test">
<DisplayScreen your_prop={here} />
</Route>
</Switch>
Upvotes: 1