feat: refactoring, soem work on forms

This commit is contained in:
2026-09-13 23:17:37 +02:00
parent fa07d4cc0b
commit 0dbbe5361a
17 changed files with 260 additions and 116 deletions
+67
View File
@@ -0,0 +1,67 @@
import { useRef, useState } from "preact/hooks";
const mismatchMessage = "Passwords do not match.";
export default function PasswordConfirmationFields() {
const [password, setPassword] = useState("");
const [passwordConfirm, setPasswordConfirm] = useState("");
const confirmInput = useRef<HTMLInputElement>(null);
const passwordsDoNotMatch = passwordConfirm.length > 0 &&
password !== passwordConfirm;
function updatePassword(value: string) {
setPassword(value);
const confirmation = confirmInput.current;
if (confirmation) {
confirmation.setCustomValidity(
confirmation.value && value !== confirmation.value
? mismatchMessage
: "",
);
}
}
function updatePasswordConfirm(value: string) {
setPasswordConfirm(value);
confirmInput.current?.setCustomValidity(
value && password !== value ? mismatchMessage : "",
);
}
return (
<div class="grid grid-cols-2 gap-4">
<input
type="password"
name="password"
placeholder="Password"
class="input min-w-0 flex-1"
autocomplete="new-password"
minLength={8}
required
value={password}
onInput={(event) => updatePassword(event.currentTarget.value)}
/>
<div class="min-w-0 flex-1">
<input
ref={confirmInput}
type="password"
name="passwordConfirm"
placeholder="Confirm"
class="input w-full"
autocomplete="new-password"
minLength={8}
required
value={passwordConfirm}
aria-invalid={passwordsDoNotMatch}
aria-describedby="password-confirm-error"
onInput={(event) => updatePasswordConfirm(event.currentTarget.value)}
/>
{passwordsDoNotMatch && (
<p id="password-confirm-error" class="mt-1 text-sm text-error">
{mismatchMessage}
</p>
)}
</div>
</div>
);
}