"use client"; import Link from "next/link"; import { useActionState, useState } from "react"; import { passwortAendern, type WechselZustand } from "@/actions/passwort"; import { Button } from "@/components/ui/Button"; import { CONTROL_CLASS, Field } from "@/components/ui/Field"; import { PASSWORT_REGELN, passwortBeanstandung } from "@/lib/passwort"; // Das eigene Passwort wechseln. // // Die Regeln stehen schon beim Tippen da, statt erst nach dem Absenden — beim // erzwungenen Wechsel ist das der erste Bildschirm, den jemand in dieser // Anwendung sieht, und dreimal abgewiesen zu werden ist ein schlechter Anfang. // Abgewiesen oder angenommen wird trotzdem in der Datenbank; hier steht nur // eine Vorabanzeige (lib/passwort.ts). const START: WechselZustand = { fehler: null }; export function PasswortAendernFormular({ erzwungen }: { erzwungen: boolean }) { const [zustand, aktion, laeuft] = useActionState(passwortAendern, START); const [neues, setNeues] = useState(""); const [wiederholung, setWiederholung] = useState(""); // Erst beanstanden, wenn etwas dasteht: ein leeres Feld ist noch kein Fehler. const beanstandung = neues ? passwortBeanstandung(neues) : null; const passtNichtZusammen = wiederholung.length > 0 && neues !== wiederholung; return (
{zustand.fehler && (

{zustand.fehler}

)} {(p) => ( )} {(p) => ( setNeues(e.target.value)} className={CONTROL_CLASS} /> )} {(p) => ( setWiederholung(e.target.value)} className={CONTROL_CLASS} /> )} {/* Gesperrt, solange die Vorabanzeige etwas zu beanstanden hat. Das ist Bequemlichkeit, keine Absicherung — wer die Schaltfläche freischaltet, landet in app_passwort_regeln() und wird dort abgewiesen. */} {/* `Link` und nicht ``: ein gewöhnlicher Verweis auf eine Seite dieser Anwendung lädt das Dokument neu und damit das ganze Bündel — der Weg zurück fühlte sich an wie ein Neustart. eslint-config-next weist das ab, und zu Recht. */} {!erzwungen && ( Zurück zur Anwendung )} ); }