web-campaignpool/components/form/login.tsx

178 lines
5.1 KiB
TypeScript
Raw Normal View History

2025-11-11 02:52:38 +00:00
"use client";
import { useState } from "react";
2025-11-11 06:28:07 +00:00
import Cookies from "js-cookie";
2025-11-11 02:52:38 +00:00
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Button } from "@/components/ui/button";
import { Eye, EyeOff } from "lucide-react";
import Image from "next/image";
import Link from "next/link";
import { useRouter } from "next/navigation";
import Footer from "../landing-page/footer";
import Navbar from "../landing-page/navbar";
const users = [
{
nrp: "1001",
password: "admin123",
role: "admin",
},
{
nrp: "1002",
password: "user123",
role: "user",
},
{
nrp: "1003",
password: "executive123",
role: "executive",
2025-11-11 02:52:38 +00:00
},
{
nrp: "1004",
password: "approve123",
role: "approver",
},
{
nrp: "1005",
password: "coordinator123",
role: "kordinator",
},
2025-11-11 02:52:38 +00:00
];
export default function Login() {
const [showPassword, setShowPassword] = useState(false);
const [nrp, setNrp] = useState("");
const [password, setPassword] = useState("");
const [error, setError] = useState("");
const router = useRouter();
const handleLogin = (e: React.FormEvent) => {
e.preventDefault();
const foundUser = users.find(
2026-04-13 07:47:14 +00:00
(u) => u.nrp === nrp && u.password === password,
2025-11-11 02:52:38 +00:00
);
if (!foundUser) {
setError("NRP atau kata sandi salah!");
return;
}
2025-11-11 06:28:07 +00:00
// ✅ Simpan data user ke cookies agar bisa diakses dari mana saja
Cookies.set("userRole", foundUser.role, { expires: 1 }); // expires 1 day
2025-11-11 02:52:38 +00:00
2025-11-11 06:28:07 +00:00
// ✅ Redirect sesuai role
2025-11-11 02:52:38 +00:00
switch (foundUser.role) {
case "admin":
2026-04-13 07:47:14 +00:00
router.push("/dashboard/admin/user-management");
2025-11-11 02:52:38 +00:00
break;
case "user":
router.push("/dashboard/user");
break;
case "executive":
2025-11-11 02:52:38 +00:00
router.push("/dashboard/supervisor");
break;
case "approver":
router.push("/dashboard/approver");
break;
case "kordinator":
router.push("/dashboard/coordinator");
break;
2025-11-11 02:52:38 +00:00
default:
router.push("/");
}
};
return (
<div className="min-h-screen flex flex-col justify-between bg-white">
<Navbar />
<div className="flex flex-1 items-center justify-center px-6 md:px-20 py-10">
<div className="grid md:grid-cols-2 gap-10 items-center w-full max-w-5xl">
{/* LEFT: FORM */}
<div className="w-full max-w-sm mx-auto">
<h1 className="text-lg font-semibold text-gray-800 mb-6">
Selamat Datang
</h1>
<form className="space-y-4" onSubmit={handleLogin}>
<div>
<Label htmlFor="nrp" className="text-gray-700">
NRP
</Label>
<Input
id="nrp"
value={nrp}
onChange={(e) => setNrp(e.target.value)}
placeholder="Masukkan NRP"
className="mt-1 bg-white border-gray-300 focus:border-yellow-600 focus:ring-yellow-600"
required
/>
</div>
<div className="relative">
<Label htmlFor="password" className="text-gray-700">
Kata Sandi
</Label>
<div className="relative mt-1">
<Input
id="password"
type={showPassword ? "text" : "password"}
value={password}
onChange={(e) => setPassword(e.target.value)}
placeholder="Masukkan kata sandi"
className="pr-10 bg-white border-gray-300 focus:border-yellow-600 focus:ring-yellow-600"
required
/>
<button
type="button"
onClick={() => setShowPassword(!showPassword)}
className="absolute inset-y-0 right-0 flex items-center pr-3 text-gray-500 hover:text-gray-700"
>
{showPassword ? (
<EyeOff className="h-4 w-4" />
) : (
<Eye className="h-4 w-4" />
)}
</button>
</div>
</div>
{error && (
<p className="text-red-600 text-sm font-medium">{error}</p>
)}
<Button
type="submit"
className="w-full bg-yellow-700 hover:bg-yellow-800 text-white font-semibold"
>
Login
</Button>
</form>
<p className="text-center text-sm text-gray-600 mt-4">
Belum punya akun?{" "}
<Link href="/register" className="text-blue-600 hover:underline">
Register
</Link>
</p>
</div>
{/* RIGHT: ILLUSTRATION */}
<div className="hidden md:flex justify-center">
<Image
src="/login.png"
alt="Ilustrasi Login"
width={400}
height={400}
className="object-contain"
/>
</div>
</div>
</div>
<Footer />
</div>
);
}