"use client"; import Button from "@/components/atoms/buttons/Button"; import ErrorMessageLogin from "@/components/atoms/errors/ErrorMessageLogin"; import { useAuth } from "@/lib/auth-context"; import { SHOP_INFO } from "@/lib/constants"; import Image from "next/image"; import { useRouter } from "next/navigation"; import { FormEvent, useEffect, useState } from "react"; export default function LoginPasswordPage() { const router = useRouter(); const { setUser } = useAuth(); const [phone, setPhone] = useState(""); const [role, setRole] = useState(""); const [password, setPassword] = useState(""); const [showPassword, setShowPassword] = useState(false); const [isLoading, setIsLoading] = useState(false); const [errors, setErrors] = useState({ password: "", general: "" }); useEffect(() => { const storedPhone = sessionStorage.getItem("login_phone"); const storedRole = sessionStorage.getItem("login_role"); if (!storedPhone || (storedRole !== "manager" && storedRole !== "staff")) { router.replace("/login"); return; } setPhone(storedPhone); setRole(storedRole); }, [router]); const handleSubmit = async (e: FormEvent) => { e.preventDefault(); if (!password.trim()) { setErrors({ password: "Please enter your password", general: "" }); return; } setIsLoading(true); setErrors({ password: "", general: "" }); try { const res = await fetch("/api/login", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ phone, password }), }); if (res.ok) { const userData = await res.json(); if (userData.role) userData.role = userData.role.toLowerCase(); else userData.role = role; setUser(userData); localStorage.setItem("coffee-shop-user", JSON.stringify(userData)); sessionStorage.removeItem("login_phone"); sessionStorage.removeItem("login_role"); router.push(role === "staff" ? "/staff/schedule" : "/manager"); } else { const STATUS_ERROR_MAP: Record = { 400: "Incorrect login details, please try again", 401: "Incorrect password", 403: "Account is locked", 404: "Account does not exist", }; const msg = STATUS_ERROR_MAP[res.status] ?? (res.status >= 500 ? "Server error, please try again later" : "An error occurred, please try again"); setErrors({ password: "", general: msg }); } } catch { setErrors({ password: "", general: "Unable to connect, please try again", }); } finally { setIsLoading(false); } }; if (!phone) return null; return (
{/* Logo & Shop Name */}
{SHOP_INFO.name}

{SHOP_INFO.name}

Manager sign in

{errors.general && }
{/* Phone display */}
{phone}
{/* Password Input */}
{ setPassword(e.target.value); setErrors({ password: "", general: "" }); }} placeholder="Enter password" disabled={isLoading} className={`text-foreground focus:ring-opacity-20 w-full rounded-xl border bg-white px-10 py-3 transition-all duration-150 outline-none placeholder:text-(--color-text-muted) focus:border-(--color-primary) focus:ring-2 focus:ring-(--color-primary) disabled:opacity-60 lg:pl-11 ${errors.password ? "border-red-400" : "border-(--color-border)"}`} />
{errors.password && ( )}
{/* Buttons */}
); }