Merged PR 444: 画面実装(アカウント削除成功ページ)
## 概要 [Task2715: 画面実装(アカウント削除成功ページ)](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/2715) - 元PBI or タスクへのリンク(内容・目的などはそちらにあるはず) - 何をどう変更したか、追加したライブラリなど ・アカウント削除成功後に、アカウント削除成功ページに遷移するよう実装 ・ログオフ状態にする - このPull Requestでの対象/対象外 - 影響範囲(他の機能にも影響があるか) ## レビューポイント - 特にレビューしてほしい箇所 ・レイアウトやメッセージの文言 ・ログオフ状態にするタイミング →Back to TOP Pageを押下時にログオフ状態になるようにしています ・Delete Accountボタン(ポップアップ上の)押下時のページ遷移のコード ・その他、漏れがないか - 軽微なものや自明なものは記載不要 - 修正範囲が大きい場合などに記載 - 全体的にや仕様を満たしているか等は本当に必要な時のみ記載 ## 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/Task2715?csf=1&web=1&e=0M85t6 ## 動作確認状況 - ローカルで確認 ## 補足 - 相談、参考資料などがあれば
This commit is contained in:
parent
98e207f19f
commit
5cfe069b58
@ -21,6 +21,7 @@ import TypistGroupSettingPage from "pages/TypistGroupSettingPage";
|
|||||||
import WorktypeIdSettingPage from "pages/WorkTypeIdSettingPage";
|
import WorktypeIdSettingPage from "pages/WorkTypeIdSettingPage";
|
||||||
import AccountPage from "pages/AccountPage";
|
import AccountPage from "pages/AccountPage";
|
||||||
import { TemplateFilePage } from "pages/TemplateFilePage";
|
import { TemplateFilePage } from "pages/TemplateFilePage";
|
||||||
|
import { AccountDeleteSuccess } from "pages/AccountPage/accountDeleteSuccess";
|
||||||
|
|
||||||
const AppRouter: React.FC = () => (
|
const AppRouter: React.FC = () => (
|
||||||
<Routes>
|
<Routes>
|
||||||
@ -81,6 +82,8 @@ const AppRouter: React.FC = () => (
|
|||||||
path="/partners"
|
path="/partners"
|
||||||
element={<RouteAuthGuard component={<PartnerPage />} />}
|
element={<RouteAuthGuard component={<PartnerPage />} />}
|
||||||
/>
|
/>
|
||||||
|
<Route path="/accountDeleteSuccess" element={<AccountDeleteSuccess />} />
|
||||||
|
|
||||||
<Route path="*" element={<NotFoundPage />} />
|
<Route path="*" element={<NotFoundPage />} />
|
||||||
</Routes>
|
</Routes>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -0,0 +1,54 @@
|
|||||||
|
import React, { useEffect } from "react";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { getTranslationID } from "translation";
|
||||||
|
import Header from "components/header";
|
||||||
|
import Footer from "components/footer";
|
||||||
|
import styles from "styles/app.module.scss";
|
||||||
|
import { Link } from "react-router-dom";
|
||||||
|
import { clearToken } from "features/auth";
|
||||||
|
import { AppDispatch } from "app/store";
|
||||||
|
import { useDispatch } from "react-redux";
|
||||||
|
|
||||||
|
export const AccountDeleteSuccess: React.FC = (): JSX.Element => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const dispatch: AppDispatch = useDispatch();
|
||||||
|
|
||||||
|
// アカウントの削除完了時に遷移するページなので、遷移と同時にログアウト状態とする
|
||||||
|
useEffect(() => {
|
||||||
|
dispatch(clearToken());
|
||||||
|
}, [dispatch]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={styles.wrap}>
|
||||||
|
<Header />
|
||||||
|
<main className={styles.main}>
|
||||||
|
<div className={styles.mainSmall}>
|
||||||
|
<div>
|
||||||
|
<h1 className={styles.marginBtm1}>
|
||||||
|
{t(getTranslationID("accountDeleteSuccess.label.title"))}
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<dl className={`${styles.formList} ${styles.hasbg}`}>
|
||||||
|
<dt className={styles.formTitle} />
|
||||||
|
<dd className={`${styles.full} ${styles.alignCenter}`}>
|
||||||
|
{t(getTranslationID("accountDeleteSuccess.label.message"))}
|
||||||
|
</dd>
|
||||||
|
<dd className={`${styles.full} ${styles.alignCenter}`}>
|
||||||
|
<Link to="/">
|
||||||
|
{t(
|
||||||
|
getTranslationID(
|
||||||
|
"accountDeleteSuccess.label.backToTopPageLink"
|
||||||
|
)
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
@ -2,18 +2,19 @@ import React, { useCallback } from "react";
|
|||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { AppDispatch } from "app/store";
|
import { AppDispatch } from "app/store";
|
||||||
import { useDispatch, useSelector } from "react-redux";
|
import { useDispatch, useSelector } from "react-redux";
|
||||||
|
import { selectAccountInfo, selectIsLoading } from "features/account";
|
||||||
|
import { deleteAccountAsync } from "features/account/operations";
|
||||||
|
import { useMsal } from "@azure/msal-react";
|
||||||
import styles from "../../styles/app.module.scss";
|
import styles from "../../styles/app.module.scss";
|
||||||
import { getTranslationID } from "../../translation";
|
import { getTranslationID } from "../../translation";
|
||||||
import close from "../../assets/images/close.svg";
|
import close from "../../assets/images/close.svg";
|
||||||
import deleteButton from "../../assets/images/delete.svg";
|
import deleteButton from "../../assets/images/delete.svg";
|
||||||
import { selectAccountInfo, selectIsLoading } from "features/account";
|
|
||||||
import { deleteAccountAsync } from "features/account/operations";
|
|
||||||
|
|
||||||
interface deleteAccountPopupProps {
|
interface DeleteAccountPopupProps {
|
||||||
onClose: () => void;
|
onClose: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const DeleteAccountPopup: React.FC<deleteAccountPopupProps> = (
|
export const DeleteAccountPopup: React.FC<DeleteAccountPopupProps> = (
|
||||||
props
|
props
|
||||||
) => {
|
) => {
|
||||||
const { onClose } = props;
|
const { onClose } = props;
|
||||||
@ -21,6 +22,8 @@ export const DeleteAccountPopup: React.FC<deleteAccountPopupProps> = (
|
|||||||
const dispatch: AppDispatch = useDispatch();
|
const dispatch: AppDispatch = useDispatch();
|
||||||
const isLoading = useSelector(selectIsLoading);
|
const isLoading = useSelector(selectIsLoading);
|
||||||
|
|
||||||
|
const { instance } = useMsal();
|
||||||
|
|
||||||
const accountInfo = useSelector(selectAccountInfo);
|
const accountInfo = useSelector(selectAccountInfo);
|
||||||
|
|
||||||
// ポップアップを閉じる処理
|
// ポップアップを閉じる処理
|
||||||
@ -31,13 +34,21 @@ export const DeleteAccountPopup: React.FC<deleteAccountPopupProps> = (
|
|||||||
onClose();
|
onClose();
|
||||||
}, [isLoading, onClose]);
|
}, [isLoading, onClose]);
|
||||||
|
|
||||||
const onDeleteAccount = useCallback(() => {
|
const onDeleteAccount = useCallback(async () => {
|
||||||
dispatch(
|
const { meta } = await dispatch(
|
||||||
deleteAccountAsync({
|
deleteAccountAsync({
|
||||||
accountId: accountInfo.account.accountId,
|
accountId: accountInfo.account.accountId,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}, [dispatch]);
|
|
||||||
|
// 削除成功後にAccountDeleteSuccess ページに遷移
|
||||||
|
if (meta.requestStatus === "fulfilled") {
|
||||||
|
instance.logoutRedirect({
|
||||||
|
postLogoutRedirectUri: "/accountDeleteSuccess",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
|
}, [instance]);
|
||||||
|
|
||||||
// HTML
|
// HTML
|
||||||
return (
|
return (
|
||||||
@ -74,7 +85,7 @@ export const DeleteAccountPopup: React.FC<deleteAccountPopupProps> = (
|
|||||||
</dd>
|
</dd>
|
||||||
<dd className={`${styles.full} ${styles.alignCenter}`}>
|
<dd className={`${styles.full} ${styles.alignCenter}`}>
|
||||||
<input
|
<input
|
||||||
type="submit"
|
type="button"
|
||||||
name="submit"
|
name="submit"
|
||||||
value={t(
|
value={t(
|
||||||
getTranslationID("deleteAccountPopup.label.deleteButton")
|
getTranslationID("deleteAccountPopup.label.deleteButton")
|
||||||
|
|||||||
@ -468,5 +468,12 @@
|
|||||||
"deleteButton": "(de)Delete account",
|
"deleteButton": "(de)Delete account",
|
||||||
"cancelButton": "(de)Cancel"
|
"cancelButton": "(de)Cancel"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"accountDeleteSuccess": {
|
||||||
|
"label": {
|
||||||
|
"title": "(de)Account Delete Success",
|
||||||
|
"message": "(de)Your account has been deleted. Thank you for using our services.",
|
||||||
|
"backToTopPageLink": "(de)Back to TOP Page"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -468,5 +468,12 @@
|
|||||||
"deleteButton": "Delete account",
|
"deleteButton": "Delete account",
|
||||||
"cancelButton": "Cancel"
|
"cancelButton": "Cancel"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"accountDeleteSuccess": {
|
||||||
|
"label": {
|
||||||
|
"title": "Account Delete Success",
|
||||||
|
"message": "Your account has been deleted. Thank you for using our services.",
|
||||||
|
"backToTopPageLink": "Back to TOP Page"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -468,5 +468,12 @@
|
|||||||
"deleteButton": "(es)Delete account",
|
"deleteButton": "(es)Delete account",
|
||||||
"cancelButton": "(es)Cancel"
|
"cancelButton": "(es)Cancel"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"accountDeleteSuccess": {
|
||||||
|
"label": {
|
||||||
|
"title": "(es)Account Delete Success",
|
||||||
|
"message": "(es)Your account has been deleted. Thank you for using our services.",
|
||||||
|
"backToTopPageLink": "(es)Back to TOP Page"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -468,5 +468,12 @@
|
|||||||
"deleteButton": "(fr)Delete account",
|
"deleteButton": "(fr)Delete account",
|
||||||
"cancelButton": "(fr)Cancel"
|
"cancelButton": "(fr)Cancel"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"accountDeleteSuccess": {
|
||||||
|
"label": {
|
||||||
|
"title": "(fr)Account Delete Success",
|
||||||
|
"message": "(fr)Your account has been deleted. Thank you for using our services.",
|
||||||
|
"backToTopPageLink": "(fr)Back to TOP Page"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user