diff --git a/dictation_client/src/AppRouter.tsx b/dictation_client/src/AppRouter.tsx index 7abc3ca..68d22ed 100644 --- a/dictation_client/src/AppRouter.tsx +++ b/dictation_client/src/AppRouter.tsx @@ -2,7 +2,6 @@ import { Route, Routes } from "react-router-dom"; import TopPage from "pages/TopPage"; import AuthPage from "pages/AuthPage"; import LoginPage from "pages/LoginPage"; -import SamplePage from "pages/SamplePage"; import { AuthErrorPage } from "pages/ErrorPage"; import { NotFoundPage } from "pages/ErrorPage/notFound"; import { RouteAuthGuard } from "components/auth/routeAuthGuard"; @@ -53,11 +52,6 @@ const AppRouter: React.FC = () => ( path="/license" element={} />} /> - } />} - /> - {/* XXX ヘッダーの挙動確認のため仮のページを作成 */} } />} diff --git a/dictation_client/src/components/header/constants.ts b/dictation_client/src/components/header/constants.ts index 66a2665..7dc14fe 100644 --- a/dictation_client/src/components/header/constants.ts +++ b/dictation_client/src/components/header/constants.ts @@ -7,7 +7,6 @@ export const HEADER_MENUS_LICENSE = "License"; export const HEADER_MENUS_DICTATIONS = "Dictations"; export const HEADER_MENUS_WORKFLOW = "Workflow"; export const HEADER_MENUS_PARTNER = "Partners"; -export const HEADER_MENUS_XXX = "XXX"; // XXX 仮のタブ export const HEADER_MENUS: { key: HeaderMenus; @@ -44,7 +43,6 @@ export const HEADER_MENUS: { label: getTranslationID("common.label.headerPartners"), path: "/partners", }, - { key: HEADER_MENUS_XXX, label: "xxx", path: "/xxx" }, // XXX 仮のタブ ]; export const HEADER_NAME = getTranslationID("common.label.headerName"); diff --git a/dictation_client/src/components/header/types.ts b/dictation_client/src/components/header/types.ts index f80bbe9..622b15b 100644 --- a/dictation_client/src/components/header/types.ts +++ b/dictation_client/src/components/header/types.ts @@ -8,8 +8,7 @@ export type HeaderMenus = | "License" | "Dictations" | "Workflow" - | "Partners" - | "XXX"; + | "Partners"; // ログイン後に遷移しうるパス export type LoginedPaths = @@ -18,5 +17,4 @@ export type LoginedPaths = | "/license" | "/dictations" | "/workflow" - | "/partners" - | "/xxx"; + | "/partners"; diff --git a/dictation_client/src/components/header/utils.ts b/dictation_client/src/components/header/utils.ts index 937786e..10aa168 100644 --- a/dictation_client/src/components/header/utils.ts +++ b/dictation_client/src/components/header/utils.ts @@ -20,7 +20,6 @@ export const isLoginPaths = (d: string): d is LoginedPaths => { case "/dictations": case "/workflow": case "/partners": - case "/xxx": return true; default: { // eslint-disable-next-line @typescript-eslint/no-unused-vars diff --git a/dictation_client/src/features/auth/utils.ts b/dictation_client/src/features/auth/utils.ts index edfd3c2..a296ff9 100644 --- a/dictation_client/src/features/auth/utils.ts +++ b/dictation_client/src/features/auth/utils.ts @@ -81,7 +81,9 @@ export const isAdminUser = (): boolean => { if (!token) { return false; } - return token.role.includes(ADMIN_ROLES.ADMIN); + // token.roleを" "で分割して配列にする + const role = token.role.split(" "); + return role.includes(ADMIN_ROLES.ADMIN); }; /** @@ -95,7 +97,9 @@ export const isStandardUser = (): boolean => { if (!token) { return false; } - return token.role.includes(ADMIN_ROLES.STANDARD); + // token.roleを" "で分割して配列にする + const role = token.role.split(" "); + return role.includes(ADMIN_ROLES.STANDARD); }; /** @@ -108,7 +112,9 @@ export const isAuthorUser = (): boolean => { if (!token) { return false; } - return token.role.includes(USER_ROLES.AUTHOR); + // token.roleを" "で分割して配列にする + const role = token.role.split(" "); + return role.includes(USER_ROLES.AUTHOR); }; /** @@ -132,5 +138,8 @@ export const isTypistUser = (): boolean => { if (!token) { return false; } - return token.role.includes(USER_ROLES.TYPIST); + // token.roleを" "で分割して配列にする + const role = token.role.split(" "); + // roleの中に"typist"が含まれているかどうかを返す + return role.includes(USER_ROLES.TYPIST); }; diff --git a/dictation_client/src/pages/LoginPage/index.tsx b/dictation_client/src/pages/LoginPage/index.tsx index e395607..e298c40 100644 --- a/dictation_client/src/pages/LoginPage/index.tsx +++ b/dictation_client/src/pages/LoginPage/index.tsx @@ -1,7 +1,14 @@ import { useMsal } from "@azure/msal-react"; import { AppDispatch } from "app/store"; import { isIdToken } from "common/token"; -import { loadAccessToken, loadRefreshToken } from "features/auth"; +import { + clearToken, + isAdminUser, + isApproveTier, + isStandardUser, + loadAccessToken, + loadRefreshToken, +} from "features/auth"; import { loginAsync, selectLocalStorageKeyforIdToken } from "features/login"; import React, { useCallback, useEffect } from "react"; import Footer from "components/footer"; @@ -10,6 +17,7 @@ import { useTranslation } from "react-i18next"; import { useDispatch, useSelector } from "react-redux"; import { useNavigate } from "react-router-dom"; import { isErrorObject } from "common/errors"; +import { TIERS } from "components/auth/constants"; const LoginPage: React.FC = (): JSX.Element => { const { instance } = useMsal(); @@ -51,7 +59,29 @@ const LoginPage: React.FC = (): JSX.Element => { document.body.appendChild(a); a.click(); document.body.removeChild(a); - navigate("/xxx"); + // 第一~第四階層の管理者はライセンス画面へ遷移 + if ( + isApproveTier([TIERS.TIER1, TIERS.TIER2, TIERS.TIER3, TIERS.TIER4]) && + isAdminUser() + ) { + navigate("/license"); + return; + } + // 第五階層の管理者はユーザー画面へ遷移 + if (isApproveTier([TIERS.TIER5]) && isAdminUser()) { + navigate("/user"); + return; + } + // 一般ユーザーはdictationPageへ遷移 + if (isStandardUser()) { + navigate("/dictations"); + return; + } + // それ以外は認証エラー画面へ遷移 + instance.logoutRedirect({ + postLogoutRedirectUri: "/AuthError", + }); + clearToken(); } }, [dispatch, i18n.language, instance, navigate] diff --git a/dictation_client/src/pages/SamplePage/index.tsx b/dictation_client/src/pages/SamplePage/index.tsx deleted file mode 100644 index b048ff6..0000000 --- a/dictation_client/src/pages/SamplePage/index.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { useMsal } from "@azure/msal-react"; -import { AppDispatch } from "app/store"; -import { UpdateTokenTimer } from "components/auth/updateTokenTimer"; -import Footer from "components/footer"; -import Header from "components/header"; -import { clearToken } from "features/auth"; -import { clearUserInfo } from "features/login"; - -import React from "react"; -import { useDispatch } from "react-redux"; -import styles from "styles/app.module.scss"; - -const SamplePage: React.FC = (): JSX.Element => { - const { instance } = useMsal(); - const dispatch: AppDispatch = useDispatch(); - - return ( -
-
- -
- -
-
- ); -}; - -export default SamplePage;