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;