← 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>
  );
}