From 7859784d97583053d1f91e9a481551d19aba4293 Mon Sep 17 00:00:00 2001 From: RachelElysia <71795832+RachelElysia@users.noreply.github.com> Date: Fri, 18 Jun 2021 10:08:50 -0400 Subject: [PATCH] AuthenticatedRoutes conditionally reroutes api_only user (#1123) * Renders CTA Back to login page if user.api_only * Edge cases: Redirects to log in for !user and redirect to home for !user.api_only --- .../AuthenticatedRoutes.jsx | 27 +++++++++++++++++-- frontend/pages/ApiOnlyUser/ApiOnlyUser.tsx | 23 +++++++++++----- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/frontend/components/AuthenticatedRoutes/AuthenticatedRoutes.jsx b/frontend/components/AuthenticatedRoutes/AuthenticatedRoutes.jsx index e5bdb86a4c..ac060e8efc 100644 --- a/frontend/components/AuthenticatedRoutes/AuthenticatedRoutes.jsx +++ b/frontend/components/AuthenticatedRoutes/AuthenticatedRoutes.jsx @@ -20,7 +20,11 @@ export class AuthenticatedRoutes extends Component { componentWillMount() { const { loading, user } = this.props; - const { redirectToLogin, redirectToPasswordReset } = this; + const { + redirectToLogin, + redirectToPasswordReset, + redirectToApiUserOnly, + } = this; if (!loading && !user) { return redirectToLogin(); @@ -30,6 +34,10 @@ export class AuthenticatedRoutes extends Component { return redirectToPasswordReset(); } + if (user && user.api_only) { + return redirectToApiUserOnly(); + } + return false; } @@ -37,7 +45,11 @@ export class AuthenticatedRoutes extends Component { if (isEqual(this.props, nextProps)) return false; const { loading, user } = nextProps; - const { redirectToLogin, redirectToPasswordReset } = this; + const { + redirectToLogin, + redirectToPasswordReset, + redirectToApiUserOnly, + } = this; if (!loading && !user) { return redirectToLogin(); @@ -47,6 +59,10 @@ export class AuthenticatedRoutes extends Component { return redirectToPasswordReset(); } + if (user && user.api_only) { + return redirectToApiUserOnly(); + } + return false; } @@ -65,6 +81,13 @@ export class AuthenticatedRoutes extends Component { return dispatch(push(RESET_PASSWORD)); }; + redirectToApiUserOnly = () => { + const { dispatch } = this.props; + const { API_ONLY_USER } = paths; + + return dispatch(push(API_ONLY_USER)); + }; + render() { const { children, user } = this.props; diff --git a/frontend/pages/ApiOnlyUser/ApiOnlyUser.tsx b/frontend/pages/ApiOnlyUser/ApiOnlyUser.tsx index f26f1eca6a..eb64847664 100644 --- a/frontend/pages/ApiOnlyUser/ApiOnlyUser.tsx +++ b/frontend/pages/ApiOnlyUser/ApiOnlyUser.tsx @@ -1,7 +1,8 @@ -import React from "react"; +import React, { useEffect } from "react"; import { useDispatch } from "react-redux"; import { push } from "react-router-redux"; - +// @ts-ignore +import { fetchCurrentUser, logoutUser } from "redux/nodes/auth/actions"; import Button from "components/buttons/Button"; import paths from "router/paths"; // @ts-ignore @@ -9,13 +10,23 @@ import fleetLogoText from "../../../assets/images/fleet-logo-text-white.svg"; const baseClass = "api-only-user"; -const ApiOnlyUser = (): JSX.Element | null => { +const ApiOnlyUser = (): JSX.Element => { const dispatch = useDispatch(); - const { LOGIN } = paths; - const handleClick = (event: any) => dispatch(push(LOGIN)); + const { LOGIN, HOME } = paths; + const handleClick = (event: any) => dispatch(logoutUser()); + + useEffect(() => { + dispatch(fetchCurrentUser()).then((user: any) => { + if (!user) { + dispatch(push(LOGIN)); + } else if (user && !user.payload.user.api_only) { + dispatch(push(HOME)); + } + }); + }, []); return ( -