diff --git a/geneit_app/src/App.tsx b/geneit_app/src/App.tsx
index b83f5f0..dfff5ac 100644
--- a/geneit_app/src/App.tsx
+++ b/geneit_app/src/App.tsx
@@ -8,6 +8,7 @@ import { OIDCCbRoute } from "./routes/auth/OIDCCbRoute";
import { useAtom } from "jotai";
import { BaseAuthenticatedPage } from "./widgets/BaseAuthenticatedPage";
import { PasswordForgottenRoute } from "./routes/auth/PasswordForgottenRoute";
+import { ResetPasswordRoute } from "./routes/auth/ResetPasswordRoute";
/**
* Core app
@@ -27,6 +28,7 @@ function App() {
path="password_forgotten"
element={}
/>
+ } />
} />
)}
diff --git a/geneit_app/src/api/AuthApi.ts b/geneit_app/src/api/AuthApi.ts
index 3ed99a9..40e64e0 100644
--- a/geneit_app/src/api/AuthApi.ts
+++ b/geneit_app/src/api/AuthApi.ts
@@ -1,6 +1,10 @@
import { atom } from "jotai";
import { APIClient } from "./ApiClient";
+export interface CheckResetTokenResponse {
+ name: string;
+}
+
const TokenStateKey = "auth-token";
export class AuthApi {
@@ -73,4 +77,19 @@ export class AuthApi {
jsonData: { mail: mail },
});
}
+
+ /**
+ * Check reset password token
+ */
+ static async CheckResetPasswordToken(
+ token: string
+ ): Promise {
+ return (
+ await APIClient.exec({
+ uri: "/auth/check_reset_password_token",
+ method: "POST",
+ jsonData: { token: token },
+ })
+ ).data;
+ }
}
diff --git a/geneit_app/src/routes/auth/ResetPasswordRoute.tsx b/geneit_app/src/routes/auth/ResetPasswordRoute.tsx
new file mode 100644
index 0000000..1d48918
--- /dev/null
+++ b/geneit_app/src/routes/auth/ResetPasswordRoute.tsx
@@ -0,0 +1,54 @@
+import { Alert, CircularProgress } from "@mui/material";
+import React, { useEffect, useRef } from "react";
+import { useLocation } from "react-router-dom";
+import { AuthApi, CheckResetTokenResponse } from "../../api/AuthApi";
+
+export function ResetPasswordRoute(): React.ReactElement {
+ const [error, setError] = React.useState(null);
+
+ const { hash } = useLocation();
+ const token = hash.substring(1);
+
+ const info = React.useState(null);
+ const checkedToken = useRef(null);
+
+ useEffect(() => {
+ (async () => {
+ if (token === checkedToken.current) return;
+ checkedToken.current = token;
+
+ try {
+ setError(null);
+ await AuthApi.CheckResetPasswordToken(token);
+ } catch (e) {
+ console.error(e);
+ setError(
+ "Echec de validation du jeton de réinitialisation de mot de passe!"
+ );
+ }
+ })();
+ });
+
+ if (error)
+ return (
+
+ {error}
+
+ );
+
+ if (info === null)
+ return (
+ <>
+
+ >
+ );
+
+ return ;
+}
+
+function ResetPasswordForm(p: {
+ token: string;
+ info: CheckResetTokenResponse;
+}): React.ReactElement {
+ return TODO
;
+}
diff --git a/geneit_app/src/widgets/BaseLoginpage.tsx b/geneit_app/src/widgets/BaseLoginpage.tsx
index d5ed048..258a607 100644
--- a/geneit_app/src/widgets/BaseLoginpage.tsx
+++ b/geneit_app/src/widgets/BaseLoginpage.tsx
@@ -4,11 +4,10 @@ import Avatar from "@mui/material/Avatar";
import Box from "@mui/material/Box";
import CssBaseline from "@mui/material/CssBaseline";
import Grid from "@mui/material/Grid";
-import Link from "@mui/material/Link";
import Paper from "@mui/material/Paper";
import Typography from "@mui/material/Typography";
import * as React from "react";
-import { Outlet } from "react-router-dom";
+import { Link, Outlet } from "react-router-dom";
function Copyright(props: any) {
return (
@@ -20,9 +19,15 @@ function Copyright(props: any) {
{...props}
>
{"Copyright © "}
-
+
Pierre HUBERT
- {" "}
+ {" "}
{new Date().getFullYear()}
{"."}
@@ -71,9 +76,11 @@ export function BaseLoginPage() {
-
- GeneIT
-
+
+
+ GeneIT
+
+