maruyama.t e9541e22a2 Merged PR 523: 画面修正(ヘッダー右上にユーザー名を表示)
## 概要
[Task2920: 画面修正](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/2920)

- 元PBI or タスクへのリンク(内容・目的などはそちらにあるはず)
- 何をどう変更したか、追加したライブラリなど
ログイン時に、API(getMyUser)を呼び出し、フラグをtrueにして結果をstateに保存する。
フラグで管理する目的は、ページ遷移時に再度API呼び出しを行わないようにするため。

- このPull Requestでの対象/対象外
サインアウト部分は対象外→別タスクにて対応

- 影響範囲(他の機能にも影響があるか)
既存の各ページのヘッダー部分

## レビューポイント
- component/header配下にSliceを追加すると循環参照になってしまうのを避けるため、feature/login配下にSlice及び各処理を追加した、妥当か。

## UIの変更
- 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/Task2920?csf=1&web=1&e=AQgVug

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

## 補足
- 相談、参考資料などがあれば
2023-10-31 09:02:19 +00:00

83 lines
2.5 KiB
TypeScript

import AppRouter from "AppRouter";
import { BrowserRouter } from "react-router-dom";
import { PublicClientApplication } from "@azure/msal-browser";
import { MsalProvider, useMsal } from "@azure/msal-react";
import { msalConfig } from "common/msalConfig";
import { useEffect, useLayoutEffect } from "react";
import { useDispatch, useSelector } from "react-redux";
import globalAxios, { AxiosError, AxiosResponse } from "axios";
import { clearToken } from "features/auth";
import { useTranslation } from "react-i18next";
import Snackbar from "components/snackbar";
import { selectSnackber } from "features/ui/selectors";
import { closeSnackbar } from "features/ui/uiSlice";
import { UNAUTHORIZED_TO_CONTINUE_ERROR_CODES } from "components/auth/constants";
import { clearUserInfo } from "features/login";
const App = (): JSX.Element => {
const dispatch = useDispatch();
const { instance } = useMsal();
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const [t, i18n] = useTranslation();
const pca = new PublicClientApplication(msalConfig);
useEffect(() => {
const id = globalAxios.interceptors.response.use(
(response: AxiosResponse) => response,
(e: AxiosError<{ code?: string }>) => {
if (
e?.response?.status === 401 &&
e?.response?.data?.code &&
!UNAUTHORIZED_TO_CONTINUE_ERROR_CODES.includes(e.response.data.code)
) {
dispatch(clearToken());
dispatch(clearUserInfo());
instance.logoutRedirect({
postLogoutRedirectUri: "/?logout=true",
});
}
return Promise.reject(e);
}
);
const cleanup = () => {
globalAxios.interceptors.response.eject(id);
};
return cleanup;
}, [dispatch, instance]);
// Language読み取り
useLayoutEffect(() => {
const language = document.cookie
.trim()
.split(";")
.map((x) => x.split("="))
.find((x) => x.length === 2 && x[0] === "language");
if (language) {
i18n.changeLanguage(language[1]);
}
}, [i18n]);
const snackbarInfo = useSelector(selectSnackber);
return (
<>
<Snackbar
isOpen={snackbarInfo.isOpen}
level={snackbarInfo.level}
message={t(snackbarInfo.message)}
duration={snackbarInfo.duration}
onClose={() => {
dispatch(closeSnackbar());
}}
/>
<MsalProvider instance={pca}>
<BrowserRouter>
<AppRouter />
</BrowserRouter>
</MsalProvider>
</>
);
};
export default App;