Merged PR 566: xxxのサンプルページを消し去る

## 概要
[Task3055: xxxのサンプルページを消し去る](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/3055)

- 仮で置いてあったサンプルページ削除
  - タブからも削除
  - ルーティングからも削除
- ログイン成功時、階層とロールに応じて遷移する画面を変更する処理を追加

## レビューポイント
- 遷移先を変更する処理は関数に切り出した方が良いか?
  - ほかで使わないからべた書きでも良いかなと思い、こうしました。

## UIの変更
- Before/Afterのスクショなど
- https://ndstokyo.sharepoint.com/:f:/r/sites/Piranha/Shared%20Documents/General/OMDS/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88/Task3055?csf=1&web=1&e=B0E9Ud

## 動作確認状況
- ローカルで確認

## 補足
- 相談、参考資料などがあれば
This commit is contained in:
saito.k 2023-11-10 02:22:34 +00:00
parent 6d163a9067
commit 4b0110856c
7 changed files with 47 additions and 58 deletions

View File

@ -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={<RouteAuthGuard component={<LicensePage />} />}
/>
<Route
path="/xxx"
element={<RouteAuthGuard component={<SamplePage />} />}
/>
{/* XXX ヘッダーの挙動確認のため仮のページを作成 */}
<Route
path="/account"
element={<RouteAuthGuard component={<AccountPage />} />}

View File

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

View File

@ -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";

View File

@ -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

View File

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

View File

@ -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]

View File

@ -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 (
<div className={styles.wrap}>
<Header />
<UpdateTokenTimer />
<div>
<button
type="button"
className={styles.buttonText}
onClick={() => {
instance.logoutRedirect({ postLogoutRedirectUri: "/" });
dispatch(clearToken());
dispatch(clearUserInfo());
}}
>
sign out
</button>
</div>
<Footer />
</div>
);
};
export default SamplePage;