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
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);
|
|
|