2026-03-24 20:03:34 +03:00
|
|
|
import {
|
|
|
|
|
selectFormValid,
|
|
|
|
|
selectStatusIsLoading,
|
|
|
|
|
useAuthStore,
|
|
|
|
|
} from "../../model";
|
2026-03-24 19:30:45 +03:00
|
|
|
import type { SubmitEvent, ChangeEvent } from "react";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Login form component
|
|
|
|
|
*/
|
2026-03-12 21:07:00 +03:00
|
|
|
export function LoginForm() {
|
2026-03-24 19:30:45 +03:00
|
|
|
const { formData, setEmail, setPassword, login } = useAuthStore();
|
|
|
|
|
|
|
|
|
|
const formValid = useAuthStore(selectFormValid);
|
2026-03-24 20:03:34 +03:00
|
|
|
const isLoading = useAuthStore(selectStatusIsLoading);
|
|
|
|
|
|
|
|
|
|
const disabled = !formValid || isLoading;
|
2026-03-24 19:30:45 +03:00
|
|
|
|
|
|
|
|
const handleEmailChange = (e: ChangeEvent<HTMLInputElement>) => {
|
|
|
|
|
setEmail(e.target.value);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const handlePasswordChange = (e: ChangeEvent<HTMLInputElement>) => {
|
|
|
|
|
setPassword(e.target.value);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const handleSubmit = (e: SubmitEvent<HTMLFormElement>) => {
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
login();
|
|
|
|
|
};
|
|
|
|
|
|
2026-03-12 21:07:00 +03:00
|
|
|
return (
|
2026-03-24 19:30:45 +03:00
|
|
|
<form aria-label="Login form" onSubmit={handleSubmit}>
|
|
|
|
|
<input
|
|
|
|
|
type="email"
|
|
|
|
|
aria-label="Email"
|
|
|
|
|
value={formData?.email?.value ?? ""}
|
|
|
|
|
onChange={handleEmailChange}
|
|
|
|
|
/>
|
|
|
|
|
<input
|
|
|
|
|
type="password"
|
|
|
|
|
aria-label="Password"
|
|
|
|
|
value={formData?.password?.value ?? ""}
|
|
|
|
|
onChange={handlePasswordChange}
|
|
|
|
|
/>
|
2026-03-24 20:03:34 +03:00
|
|
|
<button type="submit" disabled={disabled}>
|
2026-03-24 19:30:45 +03:00
|
|
|
Login
|
|
|
|
|
</button>
|
|
|
|
|
</form>
|
2026-03-12 21:07:00 +03:00
|
|
|
);
|
|
|
|
|
}
|