import { useEffect, useMemo, useState } from "react"; import { useNavigate } from "react-router-dom"; import { toast } from "sonner"; import { ClipboardList, Eye, EyeOff, Loader2, Lock, ShieldCheck, Wrench, X } from "lucide-react"; import { api, apiV26 } from "../../lib/api"; import { useAuthStore } from "../../store/auth"; import type { Project } from "../../lib/types"; // ============================================================ // ورود به سامانه — Casdoor درون‌صفحه‌ای (بدون ریدایرکت) // فرم اصلی: Username / Password → // POST /api/v1/auth/login (بک‌اند با grant_type=password از // Casdoor توکن می‌گیرد و نقش را از جدول users خودمان برمی‌گرداند) // حالت توسعه (فقط ادمین — سوپر یوزر) — چرخه‌ی ۳ مرحله‌ای: // مرحله ۱: درگاه احراز هویت ادمین (نام کاربری/رمز — فقط ادمین رد می‌شود) // مرحله ۲: هاب انتخاب نقش (ادمین / مدیر تدارکات / مدیر پروژه + پروژه) // مرحله ۳: ورود با نقش انتخاب‌شده — ادمین → پنل مدیریت ادمین، // مدیر تدارکات → دفتر، مدیر پروژه → پنل انبار پروژه‌ی خودش // با VITE_ENABLE_DEV_LOGIN=false غیرفعال می‌شود. // ============================================================ const DEV_MODE_ENABLED = import.meta.env.VITE_ENABLE_DEV_LOGIN !== "false"; const DEV_ROLE_LABELS: Record<"pm" | "procurement_manager" | "admin", string> = { procurement_manager: "مدیر تدارکات", admin: "ادمین", pm: "مدیر پروژه", }; export function LoginPage() { const setToken = useAuthStore((s) => s.setToken); const setUser = useAuthStore((s) => s.setUser); const setDevUser = useAuthStore((s) => s.setDevUser); const navigate = useNavigate(); // ---- فرم اصلی (Casdoor) ---- const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [showPassword, setShowPassword] = useState(false); const [loading, setLoading] = useState(false); // ---- پنل حالت توسعه (۳ مرحله) ---- const [devOpen, setDevOpen] = useState(false); const [devStep, setDevStep] = useState<"auth" | "hub">("auth"); const [devAdminUser, setDevAdminUser] = useState(""); const [devAdminPass, setDevAdminPass] = useState(""); const [devAuthLoading, setDevAuthLoading] = useState(false); const [projects, setProjects] = useState([]); const [devRole, setDevRole] = useState<"pm" | "procurement_manager" | "admin">("procurement_manager"); const [devProjectId, setDevProjectId] = useState(""); useEffect(() => { if (DEV_MODE_ENABLED) { void api.projects.list().then(setProjects).catch(() => setProjects([])); } }, []); const devProject = useMemo( () => projects.find((p) => p.id === devProjectId) || null, [projects, devProjectId], ); const submit = async (e: React.FormEvent) => { e.preventDefault(); if (!username.trim() || !password) { toast.error("نام کاربری و رمز عبور را وارد کنید"); return; } setLoading(true); try { const { access_token, user } = await apiV26.auth.login({ username: username.trim(), password, }); if (!user.role) { toast.error("نقش شما هنوز در سیستم تعیین نشده است — با مدیر سیستم تماس بگیرید"); return; } setToken(access_token); setUser(user); toast.success(`خوش آمدید، ${user.display_name}`); // مدیر پروژه → پنل انبار؛ مدیر تدارکات/ادمین → دفتر پیشنهادهای خرید navigate(user.role === "pm" ? "/inventory" : "/"); } catch (err) { toast.error(err instanceof Error ? err.message : "خطا در ورود"); } finally { setLoading(false); } }; // ---- مرحله ۱ حالت توسعه: درگاه ادمین ---- const devAuth = async (e: React.FormEvent) => { e.preventDefault(); if (!devAdminUser.trim() || !devAdminPass) { toast.error("نام کاربری و رمز عبور ادمین را وارد کنید"); return; } setDevAuthLoading(true); try { const { user: adminUser } = await apiV26.auth.login({ username: devAdminUser.trim(), password: devAdminPass, }); if (adminUser.role !== "admin") { toast.error("حالت توسعه فقط برای ادمین (سوپر یوزر) در دسترس است"); return; } setDevStep("hub"); } catch (err) { toast.error(err instanceof Error ? err.message : "خطا در ورود ادمین"); } finally { setDevAuthLoading(false); } }; // ---- مرحله ۳ حالت توسعه: ورود با نقش انتخاب‌شده ---- const devLogin = () => { if (devRole === "pm" && !devProjectId) { toast.error("برای نقش مدیر پروژه، پروژه را انتخاب کنید"); return; } setDevUser(devRole, devRole === "pm" ? devProjectId : null, devRole === "pm" ? devProject?.name || null : null); toast.success(`ورود آزمایشی انجام شد — نقش: ${DEV_ROLE_LABELS[devRole]}`); // ادمین → پنل مدیریت ادمین؛ مدیر تدارکات → دفتر؛ مدیر پروژه → پنل انبار if (devRole === "admin") navigate("/admin"); else if (devRole === "pm") navigate("/inventory"); else navigate("/"); }; const closeDev = () => { setDevOpen(false); setDevStep("auth"); setDevAdminUser(""); setDevAdminPass(""); }; return (
{/* هاله‌ی تزئینی پس‌زمینه */}
{/* ===== Developer Mode (بالا-چپ، جدا از فرم اصلی) ===== */} {DEV_MODE_ENABLED && (
{devOpen && (

{devStep === "auth" ? "مرحله ۱ — درگاه ادمین (سوپر یوزر)" : "مرحله ۲ — انتخاب نقش"}

{devStep === "auth" ? (

ورود به حالت توسعه فقط با حساب ادمین (سوپر یوزر) ممکن است — سپس نقش دلخواه را برای تست انتخاب کنید.

setDevAdminUser(e.target.value)} />
setDevAdminPass(e.target.value)} />
) : (
{devRole === "pm" && (
)}
)}
)}
)} {/* ===== فرم اصلی ورود ===== */}

سامانه تدارکات و انبار

برای ورود، نام کاربری و رمز عبور سازمانی خود را وارد کنید

setUsername(e.target.value)} />
setPassword(e.target.value)} />

ورود از طریق حساب سازمانی (Casdoor) انجام می‌شود. دسترسی شما بر اساس نقش تعیین‌شده توسط مدیر سیستم فعال خواهد شد.

); }