← back to Omega Watches 2
src/app/login/page.tsx
87 lines
"use client";
import { useState } from "react";
import { useRouter } from "next/navigation";
export default function LoginPage() {
const [username, setUsername] = useState("");
const [password, setPassword] = useState("");
const [error, setError] = useState("");
const [loading, setLoading] = useState(false);
const router = useRouter();
async function handleSubmit(e: React.FormEvent) {
e.preventDefault();
setLoading(true);
setError("");
try {
const res = await fetch("/api/auth/login", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ username, password }),
});
const data = await res.json();
if (data.success) {
localStorage.setItem("omega_token", data.data.token);
localStorage.setItem("omega_user", JSON.stringify(data.data));
router.push("/");
} else {
setError(data.error?.message || "Login failed");
}
} catch {
setError("Network error");
} finally {
setLoading(false);
}
}
return (
<div className="flex min-h-screen items-center justify-center bg-navy-950">
<div className="w-full max-w-md">
<div className="mb-8 text-center">
<div className="mb-2 text-4xl font-bold text-omega-400">OMEGA</div>
<div className="text-sm tracking-widest text-gray-400">
WATCHES 2.0 — ENTERPRISE CONTROL PLANE
</div>
</div>
<form onSubmit={handleSubmit} className="card space-y-4 border-navy-700 bg-navy-900">
<h2 className="text-lg font-semibold text-gray-100">Sign In</h2>
{error && (
<div className="rounded bg-red-900/30 p-3 text-sm text-red-300">
{error}
</div>
)}
<div>
<label className="mb-1 block text-sm text-gray-400">Username</label>
<input
type="text"
value={username}
onChange={(e) => setUsername(e.target.value)}
className="input"
required
autoFocus
/>
</div>
<div>
<label className="mb-1 block text-sm text-gray-400">Password</label>
<input
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
className="input"
required
/>
</div>
<button type="submit" disabled={loading} className="btn-primary w-full">
{loading ? "Authenticating..." : "Sign In"}
</button>
<p className="text-center text-xs text-gray-500">
Dual-Ledger Price Tracking System
</p>
</form>
</div>
</div>
);
}