import { useEffect, useState } from "react"; import { Navigate, useNavigate } from "react-router-dom"; import { useTranslation } from "react-i18next"; import { useAuth } from "../auth"; import { api, ApiError } from "../api"; import { useToast } from "../toast"; import BrandMark from "../components/BrandMark"; import Icon from "../components/Icon"; import PasswordInput from "../components/PasswordInput"; import PasswordRules from "../components/PasswordRules"; import { DEFAULT_POLICY, meetsPolicy } from "../passwordPolicy"; export default function ChangePassword() { const { user, aktualisieren } = useAuth(); const { t } = useTranslation(); const toast = useToast(); const navigate = useNavigate(); const [current, setCurrent] = useState(""); const [next, setNext] = useState(""); const [repeat, setRepeat] = useState(""); const [policy, setPolicy] = useState(DEFAULT_POLICY); const [fehler, setFehler] = useState(null); const [busy, setBusy] = useState(false); useEffect(() => { // Fällt der Abruf aus, bleibt die Vorgabe stehen – verbindlich prüft // ohnehin der Server, hier geht es nur um die Anzeige. api.getPolicy().then(setPolicy).catch(() => {}); }, []); if (!user) return ; const forced = user.must_change_password; const wegenRichtlinie = user.must_change_password_reason === "policy"; const regelnErfuellt = meetsPolicy(policy, next, t); const bereit = regelnErfuellt && next === repeat && current.length > 0; async function onSubmit(e) { e.preventDefault(); setFehler(null); if (next !== repeat) { setFehler(t("changepw.mismatch")); return; } setBusy(true); try { const updated = await api.changePassword(current, next); aktualisieren(updated); toast(t("changepw.saved")); navigate("/"); } catch (err) { setFehler(err instanceof ApiError ? err.message : t("server.unreachable")); } finally { setBusy(false); } } return (

{t("changepw.title")}

{forced && (
{wegenRichtlinie ? t("changepw.policyHint") : t("changepw.forcedHint")}
)} {fehler && (
{fehler}
)} {repeat && next !== repeat && ( {t("changepw.mismatch")} )}
); }