Switch to version 2: added src/app/login/page.tsx

This commit is contained in:
2026-03-09 19:57:28 +00:00
parent 5d897b1f36
commit f7b97635bd

158
src/app/login/page.tsx Normal file
View File

@@ -0,0 +1,158 @@
"use client";
import { useState } from "react";
import { useRouter } from "next/navigation";
import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
import NavbarLayoutFloatingInline from "@/components/navbar/NavbarLayoutFloatingInline";
import Link from "next/link";
import { Heart } from "lucide-react";
export default function LoginPage() {
const router = useRouter();
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [error, setError] = useState("");
const [isLoading, setIsLoading] = useState(false);
const navItems = [
{ name: "Home", id: "/" },
{ name: "Browse Animals", id: "/animals" },
{ name: "About", id: "/about" },
{ name: "Login", id: "/login" },
];
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
setError("");
setIsLoading(true);
try {
const response = await fetch("/api/auth/login", {
method: "POST", headers: { "Content-Type": "application/json" },
body: JSON.stringify({ email, password }),
});
if (!response.ok) {
const data = await response.json();
setError(data.message || "Login failed. Please try again.");
setIsLoading(false);
return;
}
const data = await response.json();
localStorage.setItem("authToken", data.token);
localStorage.setItem("user", JSON.stringify(data.user));
router.push("/dashboard");
} catch (err) {
setError("An error occurred. Please try again.");
setIsLoading(false);
}
};
return (
<ThemeProvider
defaultButtonVariant="bounce-effect"
defaultTextAnimation="reveal-blur"
borderRadius="pill"
contentWidth="compact"
sizing="largeSmallSizeMediumTitles"
background="noise"
cardStyle="soft-shadow"
primaryButtonStyle="radial-glow"
secondaryButtonStyle="solid"
headingFontWeight="normal"
>
<div id="nav" data-section="nav">
<NavbarLayoutFloatingInline
navItems={navItems}
brandName="PawsHome"
button={{ text: "Start Adoption", href: "/animals" }}
animateOnLoad={true}
/>
</div>
<div className="min-h-screen flex items-center justify-center px-4 py-20">
<div className="w-full max-w-md">
<div className="bg-card rounded-lg shadow-lg p-8">
<div className="flex justify-center mb-6">
<Heart className="w-8 h-8 text-primary-cta" />
</div>
<h1 className="text-3xl font-bold text-center text-foreground mb-2">
Welcome Back
</h1>
<p className="text-center text-foreground/70 mb-8">
Log in to your PawsHome account
</p>
{error && (
<div className="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded mb-6">
{error}
</div>
)}
<form onSubmit={handleSubmit} className="space-y-4">
<div>
<label
htmlFor="email"
className="block text-sm font-medium text-foreground mb-2"
>
Email Address
</label>
<input
id="email"
type="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
placeholder="you@example.com"
required
className="w-full px-4 py-2 border border-accent rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-cta bg-background text-foreground placeholder-foreground/50"
/>
</div>
<div>
<label
htmlFor="password"
className="block text-sm font-medium text-foreground mb-2"
>
Password
</label>
<input
id="password"
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
placeholder="••••••••"
required
className="w-full px-4 py-2 border border-accent rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-cta bg-background text-foreground placeholder-foreground/50"
/>
</div>
<button
type="submit"
disabled={isLoading}
className="w-full bg-primary-cta hover:bg-primary-cta/90 text-white font-semibold py-2 rounded-lg transition-colors disabled:opacity-50"
>
{isLoading ? "Logging in..." : "Log In"}
</button>
</form>
<div className="mt-6 text-center">
<p className="text-foreground/70">
Don't have an account?{" "}
<Link href="/signup" className="text-primary-cta hover:underline">
Sign up
</Link>
</p>
</div>
<div className="mt-4 text-center">
<Link href="/forgot-password" className="text-sm text-primary-cta hover:underline">
Forgot your password?
</Link>
</div>
</div>
</div>
</div>
</ThemeProvider>
);
}