stones/src/components/auth/login-form.tsx

100 lines
2.7 KiB
TypeScript

"use client";
import { useState } from "react";
import { useRouter } from "next/navigation";
export function LoginForm() {
const router = useRouter();
const [isLoading, setIsLoading] = useState(false);
const [username, setUsername] = useState("");
const [password, setPassword] = useState("");
const [error, setError] = useState("");
async function onSubmit(event: React.FormEvent) {
event.preventDefault();
setIsLoading(true);
setError("");
try {
const response = await fetch("/api/auth/login", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
username,
password,
}),
});
if (!response.ok) {
throw new Error("Login failed");
}
const data = await response.json();
if (data.success) {
// Redirect to the dashboard
router.push("/dashboard");
router.refresh();
} else {
setError("Authentication failed. Please check your credentials and try again.");
}
} catch (error) {
setError("Something went wrong. Please try again.");
} finally {
setIsLoading(false);
}
}
return (
<div className="grid gap-6">
<form onSubmit={onSubmit}>
<div className="grid gap-4">
<div className="grid gap-2">
<label htmlFor="username" className="text-sm font-medium">
Username
</label>
<input
id="username"
placeholder="Username"
type="text"
className="px-3 py-2 border rounded-md"
value={username}
onChange={(e) => setUsername(e.target.value)}
autoCapitalize="none"
autoCorrect="off"
disabled={isLoading}
/>
</div>
<div className="grid gap-2">
<label htmlFor="password" className="text-sm font-medium">
Password
</label>
<input
id="password"
placeholder="Password"
type="password"
className="px-3 py-2 border rounded-md"
value={password}
onChange={(e) => setPassword(e.target.value)}
disabled={isLoading}
/>
</div>
{error && (
<div className="text-red-500 text-sm">
{error}
</div>
)}
<button
type="submit"
className="px-4 py-2 bg-blue-500 text-white rounded-md hover:bg-blue-600 disabled:opacity-50"
disabled={isLoading}
>
{isLoading ? "Signing in..." : "Sign In"}
</button>
</div>
</form>
</div>
);
}