Polish settings and auth UX

This commit is contained in:
2026-03-27 19:27:18 +01:00
parent f5cede1014
commit 98f51332e6
7 changed files with 195 additions and 45 deletions
+17 -15
View File
@@ -1,30 +1,31 @@
import React, { useMemo, useState } from "react";
import React, { useEffect, useState } from "react";
import { Box, Button, Paper, TextField, Typography } from "@mui/material";
import { Alert, Box, Button, Paper, TextField, Typography } from "@mui/material";
import { useLocation, useNavigate } from "react-router-dom";
import { useNavigate } from "react-router-dom";
import { api } from "../api";
import { useToast } from "../toast";
import { useI18n } from "../i18n/I18nProvider";
function useQuery() {
const { search } = useLocation();
return useMemo(() => new URLSearchParams(search), [search]);
}
export default function ResetPasswordPage() {
const { toast } = useToast();
const { t } = useI18n();
const navigate = useNavigate();
const q = useQuery();
const email = q.get("email") || "";
const token = q.get("token") || "";
const [email, setEmail] = useState("");
const [token, setToken] = useState("");
const [newPassword, setNewPassword] = useState("");
const [loading, setLoading] = useState(false);
useEffect(() => {
const params = new URLSearchParams(window.location.search);
setEmail(params.get("email") || "");
setToken(params.get("token") || "");
}, []);
const missingResetInfo = !email || !token;
return (
<Box
sx={{
@@ -49,7 +50,7 @@ export default function ResetPasswordPage() {
component="form"
onSubmit={(e) => {
e.preventDefault();
if (!email || !token) {
if (missingResetInfo) {
toast(t("missingResetLinkInfo"), "error");
return;
}
@@ -68,14 +69,15 @@ export default function ResetPasswordPage() {
}}
sx={{ display: "flex", flexDirection: "column", gap: 1.5 }}
>
<TextField label={t("profileEmail")} value={email} disabled fullWidth />
{missingResetInfo ? <Alert severity="warning">{t("missingResetLinkInfo")}</Alert> : null}
<TextField label={t("profileEmail")} value={email} onChange={(e) => setEmail(e.target.value)} disabled={!missingResetInfo} fullWidth />
<TextField label={t("profileNewPassword")} type="password" value={newPassword} onChange={(e) => setNewPassword(e.target.value)} fullWidth />
<Box sx={{ display: "flex", justifyContent: "flex-end", gap: 1, mt: 1 }}>
<Button type="button" variant="outlined" onClick={() => navigate("/login")} disabled={loading}>
{t("backToLogin")}
</Button>
<Button type="submit" variant="contained" disabled={loading}>
<Button type="submit" variant="contained" disabled={loading || missingResetInfo}>
{t("updatePassword")}
</Button>
</Box>