Redirect to previous path on login - React Router v4 Redirect to previous path on login - React Router v4 reactjs reactjs

Redirect to previous path on login - React Router v4


Following this example you can make a component PrivateRoute to wrap Route and use that whenever you need a route that requires auth.

This is the component code from the example.

const PrivateRoute = ({ component: Component, ...rest }) => (    <Route {...rest} render={props => (            fakeAuth.isAuthenticated ?             (<Component {...props}/>)             :             (              <Redirect to={{                    pathname: '/login',                    state: { from: props.location }                }}              />            )        )}    />)


Previous answers are not detail enough.

Solution:

Router

<BrowserRouter basename={BASE_NAME}>  <Switch>    {publicRouteList()}    <Route exact key="login" path="/login" component={Login} />    {getLoggedRouteList(state.logged)}    <Redirect key="redirect-login" to="/login" />  </Switch></BrowserRouter>

getLoggedRouteList

const getLoggedRouteList = (logged) => {  if (!logged) {    return (      <Route        key="wait-login"        render={props => {          return (            <Redirect              to={{                pathname: '/login',                state: { from: props.location },              }}            />          );        }}      />    );  }  const output = [];  output.push(    /* Here place route list that need logged */  );  return output;}

Login Component

class Login extends React.Component {  login = async param => {    const { location } = this.props;    const { state } = location;    /* Here place request login api */    // go to state.from if set before    if (state && state.from) {      history.replace(state.from);    }    // else go to home    else {      history.replace('/');    }  }}


You can use query strings to accomplish this.

Add dependency query-string to your react app.

Whenever the user is trying to access a protected path, you have to redirect to the log-in screen if the user is not logged in yet. To do this you will do something like this.

history.push('/login');

But we can pass the previous as a query as follows. We can take the previous path using useLocation from react-router

 const lastLocation = useLocation(); history.push(`/login?redirectTo=${lastLocation}`);

Now after successful login, we can get the query string that was passed in the previous path. We can set a default path if the previous path is null.

 const handleSuccessLogin = () => {      const location = useLocation();      const { redirectTo } = queryString.parse(location.search);      history.push(redirectTo == null ? "/apps" : redirectTo); };

Inspired by https://ui.dev/react-router-v4-query-strings/