You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

73 lines
2.1 KiB

import PropTypes from "prop-types";
import React, { Component } from "react";
import { connect } from "react-redux";
import { Redirect, Route } from "react-router-dom";
import { Loader } from "semantic-ui-react";
import { sendGetSelfUserRequest } from "../../actions/user/saga.actions";
const propTypes = {
userToken: PropTypes.string.isRequired,
selfUser: PropTypes.object.isRequired,
isSendingUserRequest: PropTypes.bool.isRequired,
path: PropTypes.string.isRequired,
component: PropTypes.oneOfType([PropTypes.element, PropTypes.func])
.isRequired,
dispatch: PropTypes.func.isRequired
};
class PrivateRoute extends Component {
componentWillMount() {
const { dispatch, userToken, selfUser } = this.props;
// If the user token exists and the self user object isn't loaded, dispatch
if (userToken && Object.keys(selfUser).length === 0) {
dispatch(sendGetSelfUserRequest());
}
}
render() {
const {
userToken,
selfUser,
isSendingUserRequest,
component,
...rest
} = this.props;
// If the user token exists and
// * self user object isn't loaded yet or
// * we are still sending user request
// show loading spinner
if (
userToken && (Object.keys(selfUser).length === 0 || isSendingUserRequest)
) {
return <Loader active />;
}
// If the user exists but they aren't a client or provider yet, confirm-registration
if (
userToken &&
Object.keys(selfUser).length &&
(!selfUser.client || !selfUser.provider)
) {
return <Redirect to="/user/complete-registration" />;
}
return (
<Route
{...rest}
render={props => {
if (!!userToken) return React.createElement(component, props);
return <Redirect to="/auth/login" />;
}}
/>
);
}
}
PrivateRoute.propTypes = propTypes;
const mapStateToProps = state => ({
userToken: state.auth.userToken,
selfUser: state.user.selfUser,
isSendingUserRequest: state.user.isSendingUserRequest
});
export default connect(mapStateToProps)(PrivateRoute);