improved login

This commit is contained in:
2025-07-16 07:39:40 -05:00
parent 5e263ef1b8
commit 9390e2a5e8
+65 -42
View File
@@ -5,67 +5,90 @@ import { Card } from "@/components/ui/card";
import { Input } from "@/components/ui/input"; import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label"; import { Label } from "@/components/ui/label";
import axios from "axios"; import axios from "axios";
import { useState } from "react";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { useRef, useState } from "react";
export default function Login() { export default function Login() {
const [username, setUsername] = useState(""); const formRef = useRef<HTMLFormElement>(null);
const [password, setPassword] = useState("");
const [error, setError] = useState(""); const [error, setError] = useState("");
const [canSubmit, setCanSubmit] = useState(false);
const router = useRouter(); const router = useRouter();
const login = () => { const login = () => {
setError(""); setError("");
axios({
method: "post", const form = formRef.current;
url: "/api/auth", if (!form) return;
data: {
username, const username = (form.elements.namedItem("username") as HTMLInputElement)
password, ?.value;
}, const password = (form.elements.namedItem("password") as HTMLInputElement)
}) ?.value;
if (!username || !password) return;
axios
.post("/api/auth", { username, password })
.then((r) => { .then((r) => {
Cookies.set("session_id", r.data.sessionId); Cookies.set("session_id", r.data.sessionId);
router.replace("/dashboard"); router.replace("/dashboard");
}) })
.catch((e) => { .catch((e) => {
setError(e.response.data.message); setError(e.response?.data?.message || "Login failed");
}); });
}; };
const handleInput = () => {
const form = formRef.current;
if (!form) return;
const username = (form.elements.namedItem("username") as HTMLInputElement)
?.value;
const password = (form.elements.namedItem("password") as HTMLInputElement)
?.value;
setCanSubmit(!!username && !!password);
};
return ( return (
<div className="min-h-screen flex items-center justify-center"> <div className="min-h-screen flex items-center justify-center">
<Card className="h-max w-[25rem] px-8 pb-8 gap-3"> <Card className="h-max w-[25rem] px-8 pb-8">
<h1 className="text-4xl font-bold text-center mt-5">Login</h1> <form ref={formRef} onSubmit={(e) => e.preventDefault()} className="flex flex-col gap-2">
<Label>Username</Label> <h1 className="text-4xl font-bold text-center mt-5">Login</h1>
<Input
placeholder="Enter your username" <Label>Username</Label>
onInput={(e) => { <Input
setUsername((e.target as any).value); name="username"
}} autoComplete="username"
/> placeholder="Enter your username"
<Label className="mt-1">Password</Label> onInput={handleInput}
<Input />
placeholder="Enter your password"
type="password" <Label className="mt-2">Password</Label>
onInput={(e) => { <Input
setPassword((e.target as any).value); name="password"
}} autoComplete="current-password"
onKeyDown={(e) => { type="password"
if (e.key == "Enter" && username != "" && password != "") { placeholder="Enter your password"
login(); onInput={handleInput}
} onKeyDown={(e) => {
}} if (e.key === "Enter" && canSubmit) {
/> login();
{error ? <Label className="text-destructive">{error}</Label> : ""} }
<Button }}
className="w-max mx-auto mt-3" />
onClick={login}
disabled={username == "" || password == ""} {error && <Label className="text-destructive">{error}</Label>}
>
Login <Button
</Button> className="w-max mx-auto mt-3"
onClick={login}
disabled={!canSubmit}
>
Login
</Button>
</form>
</Card> </Card>
</div> </div>
); );