"use client"; import { Box, Button, FormControl, FormLabel, TextField, Typography, Select, MenuItem, SelectChangeEvent, } from "@mui/material"; import Header from "../lib/camera/component/hedear"; import odooApi from "../lib/api/odooApi"; import { getAuth, setAuth } from "../lib/api/auth"; import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import { setCookie } from "cookies-next"; import { clearOdooSession } from "../lib/api/clearOdooSession"; // Ambil tipe parameter untuk setAuth agar sesuai tepat dengan definisinya type AuthProps = Parameters[0]; type LoginStatus = { code?: number; description?: string }; type LoginResult = { is_auth?: boolean; reason?: "NOT_FOUND" | "NOT_ACTIVE" | string; user?: unknown; // akan dicast ke AuthProps jika lolos }; type LoginResponse = { status?: LoginStatus; result?: LoginResult }; type Role = "driver" | "dispatch"; const Login = () => { const router = useRouter(); // state input const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [role, setRole] = useState<"" | Role>(""); // state error helperText const [emailError, setEmailError] = useState(false); const [emailErrorMessage, setEmailErrorMessage] = useState(""); const [passwordError, setPasswordError] = useState(false); const [passwordErrorMessage, setPasswordErrorMessage] = useState(""); const [roleError, setRoleError] = useState(false); const [roleErrorMessage, setRoleErrorMessage] = useState(""); const [loading, setLoading] = useState(false); useEffect(() => { void clearOdooSession(process.env.NEXT_PUBLIC_ODOO_API_HOST ?? ""); const token = getAuth(); if (token) router.replace("/"); }, [router]); // useEffect(() => { // const token = getAuth(); // if (token) router.push("/"); // }, [router]); const validateInputs = (e: string, p: string, r: "" | Role) => { let ok = true; if (!e || !/\S+@\S+\.\S+/.test(e)) { setEmailError(true); setEmailErrorMessage("Please enter a valid email address."); ok = false; } else { setEmailError(false); setEmailErrorMessage(""); } if (!p || p.length < 6) { setPasswordError(true); setPasswordErrorMessage("Password must be at least 6 characters long."); ok = false; } else { setPasswordError(false); setPasswordErrorMessage(""); } if (!r) { setRoleError(true); setRoleErrorMessage("Please select a role."); ok = false; } else { setRoleError(false); setRoleErrorMessage(""); } return ok; }; const handleRoleChange = (e: SelectChangeEvent) => { const val = e.target.value as Role | ""; setRole(val); if (val) { setRoleError(false); setRoleErrorMessage(""); } }; const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); // Ambil dari FormData agar sesuai dengan form yang disubmit const fd = new FormData(event.currentTarget); const rawEmail = fd.get("email"); const rawPassword = fd.get("password"); const rawRole = fd.get("role"); const emailStr = typeof rawEmail === "string" ? rawEmail.trim() : ""; const passwordStr = typeof rawPassword === "string" ? rawPassword : ""; const roleStr: "" | Role = rawRole === "driver" || rawRole === "dispatch" ? rawRole : ""; if (!validateInputs(emailStr, passwordStr, roleStr)) return; try { setLoading(true); // Kirim web_role juga (opsional, kalau backend abaikan juga tidak masalah) const res = (await odooApi("POST", "/api/v1/user/login", { email: emailStr, password: passwordStr, web_role: roleStr, })) as unknown as LoginResponse; const auth = res?.result; if (res?.status?.code === 200 && auth?.is_auth) { if (auth.user && typeof auth.user === "object") { setAuth(auth.user as AuthProps); } setCookie("web_role", roleStr, { path: "/", sameSite: "lax" }); router.replace("/"); return; } // Tangani alasan gagal umum switch (auth?.reason) { case "NOT_FOUND": alert("Email tidak ditemukan"); break; case "NOT_ACTIVE": alert("Akun anda belum aktif"); break; default: alert( res?.status?.description || "Login gagal. Periksa email/password." ); } } catch (error) { console.error(error); alert("Gagal login, silahkan coba lagi"); } finally { setLoading(false); } }; return (
Sign in Email setEmail(e.target.value)} /> Password setPassword(e.target.value)} /> {/* Role selection */} Role {roleError && ( {roleErrorMessage || "Please select a role."} )}
); }; export default Login;