Can delete account
This commit is contained in:
parent
fc58e65ea1
commit
6a399ac52a
@ -11,6 +11,7 @@ import { PasswordForgottenRoute } from "./routes/auth/PasswordForgottenRoute";
|
|||||||
import { ResetPasswordRoute } from "./routes/auth/ResetPasswordRoute";
|
import { ResetPasswordRoute } from "./routes/auth/ResetPasswordRoute";
|
||||||
import { BaseAuthenticatedPage } from "./widgets/BaseAuthenticatedPage";
|
import { BaseAuthenticatedPage } from "./widgets/BaseAuthenticatedPage";
|
||||||
import { BaseLoginPage } from "./widgets/BaseLoginpage";
|
import { BaseLoginPage } from "./widgets/BaseLoginpage";
|
||||||
|
import { DeleteAccountRoute } from "./routes/DeleteAccountRoute";
|
||||||
|
|
||||||
interface AuthContext {
|
interface AuthContext {
|
||||||
signedIn: boolean;
|
signedIn: boolean;
|
||||||
@ -33,6 +34,8 @@ export function App(): React.ReactElement {
|
|||||||
return (
|
return (
|
||||||
<AuthContextK.Provider value={context}>
|
<AuthContextK.Provider value={context}>
|
||||||
<Routes>
|
<Routes>
|
||||||
|
<Route path="delete_account" element={<DeleteAccountRoute />} />
|
||||||
|
|
||||||
{signedIn ? (
|
{signedIn ? (
|
||||||
<Route path="*" element={<BaseAuthenticatedPage />}>
|
<Route path="*" element={<BaseAuthenticatedPage />}>
|
||||||
<Route path="profile" element={<ProfileRoute />} />
|
<Route path="profile" element={<ProfileRoute />} />
|
||||||
|
@ -19,6 +19,10 @@ export enum ReplacePasswordResponse {
|
|||||||
TooManyRequests,
|
TooManyRequests,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface DeleteAccountTokenInfo {
|
||||||
|
email: string;
|
||||||
|
}
|
||||||
|
|
||||||
export class UserApi {
|
export class UserApi {
|
||||||
/**
|
/**
|
||||||
* Get current user information
|
* Get current user information
|
||||||
@ -89,4 +93,30 @@ export class UserApi {
|
|||||||
method: "GET",
|
method: "GET",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check delete account token
|
||||||
|
*/
|
||||||
|
static async CheckDeleteAccountToken(
|
||||||
|
token: string
|
||||||
|
): Promise<DeleteAccountTokenInfo> {
|
||||||
|
return (
|
||||||
|
await APIClient.exec({
|
||||||
|
uri: "/user/check_delete_token",
|
||||||
|
method: "POST",
|
||||||
|
jsonData: { token: token },
|
||||||
|
})
|
||||||
|
).data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete account
|
||||||
|
*/
|
||||||
|
static async DeleteAccount(token: string): Promise<void> {
|
||||||
|
await APIClient.exec({
|
||||||
|
uri: "/user/delete_account",
|
||||||
|
method: "POST",
|
||||||
|
jsonData: { token: token },
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
80
geneit_app/src/routes/DeleteAccountRoute.tsx
Normal file
80
geneit_app/src/routes/DeleteAccountRoute.tsx
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
import { Button, Typography } from "@mui/material";
|
||||||
|
import { Link, useLocation, useNavigate } from "react-router-dom";
|
||||||
|
import { useAlert } from "../widgets/AlertDialogProvider";
|
||||||
|
import { useConfirm } from "../widgets/ConfirmDialogProvider";
|
||||||
|
import { DeleteAccountTokenInfo, UserApi } from "../api/UserApi";
|
||||||
|
import React from "react";
|
||||||
|
import { AsyncWidget } from "../widgets/AsyncWidget";
|
||||||
|
import { AuthApi } from "../api/AuthApi";
|
||||||
|
|
||||||
|
export function DeleteAccountRoute(): React.ReactElement {
|
||||||
|
const alert = useAlert();
|
||||||
|
const confirm = useConfirm();
|
||||||
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
const { hash } = useLocation();
|
||||||
|
const token = hash.substring(1);
|
||||||
|
|
||||||
|
const [info, setInfo] = React.useState<DeleteAccountTokenInfo>();
|
||||||
|
|
||||||
|
const checkToken = async () => {
|
||||||
|
setInfo(await UserApi.CheckDeleteAccountToken(token));
|
||||||
|
};
|
||||||
|
|
||||||
|
const doDelete = async () => {
|
||||||
|
try {
|
||||||
|
if (
|
||||||
|
!(await confirm.confirm(
|
||||||
|
"Voulez-vous vraiment supprimer votre compte ?",
|
||||||
|
undefined,
|
||||||
|
"Supprimer mon compte"
|
||||||
|
))
|
||||||
|
)
|
||||||
|
return;
|
||||||
|
|
||||||
|
await UserApi.DeleteAccount(token);
|
||||||
|
AuthApi.RemoveAuthToken();
|
||||||
|
|
||||||
|
await alert.alert("Votre compte a été supprimé avec succès !");
|
||||||
|
|
||||||
|
navigate("/");
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
alert.alert("Echec de la suppression du compte !");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<AsyncWidget
|
||||||
|
errMsg="Echec de la validation du jeton de suppression de compte !"
|
||||||
|
load={checkToken}
|
||||||
|
loadKey={token}
|
||||||
|
build={() => (
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
height: "100vh",
|
||||||
|
backgroundColor: "#b23c17",
|
||||||
|
color: "white",
|
||||||
|
display: "flex",
|
||||||
|
justifyContent: "center",
|
||||||
|
alignItems: "center",
|
||||||
|
flexDirection: "column",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Typography variant="h3">Suppression de compte</Typography>
|
||||||
|
<p>{info?.email}</p>
|
||||||
|
<p>
|
||||||
|
Voulez-vous vraiment supprimer votre compte ? Cette opération est
|
||||||
|
irréversible !
|
||||||
|
</p>
|
||||||
|
<Button onClick={doDelete} color="inherit">
|
||||||
|
Supprimer mon compte
|
||||||
|
</Button>
|
||||||
|
<Link to="/" style={{ color: "inherit", textDecoration: "none" }}>
|
||||||
|
<Button color="inherit">Annuler</Button>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
@ -274,7 +274,7 @@ function DeleteAccountButton(): React.ReactElement {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div style={{ textAlign: "center" }}>
|
<div style={{ textAlign: "center", margin: "15px 0px" }}>
|
||||||
<Button onClick={requestDelete} color="error">
|
<Button onClick={requestDelete} color="error">
|
||||||
Supprimer mon compte
|
Supprimer mon compte
|
||||||
</Button>
|
</Button>
|
||||||
|
Loading…
Reference in New Issue
Block a user