/* Bonyan ERP — login (دخول مستقل: اسم مستخدم + كلمة مرور يمنحها المدير) */ function LoginScreen({ onLogin }) { const D = window.BnyData; const I = window.BnyIcon; const { Button } = window.BonyanDesignSystem_ad3ca0; const [u, setU] = React.useState(""); const [p, setP] = React.useState(""); const [show, setShow] = React.useState(false); const [err, setErr] = React.useState(""); const [busy, setBusy] = React.useState(false); const live = !!window.BnyConfigured; const submit = async (e) => { if (e) e.preventDefault(); if (busy) return; setErr(""); // الوضع المباشر: مصادقة Supabase (اسم المستخدم يُحوَّل لإيميل تلقائيًا) if (live && window.BnyAuth) { setBusy(true); try { const user = await window.BnyAuth.login(u, p); onLogin(user); } catch (ex) { // ميّز بين «بيانات خاطئة» و«فشل اتصال/إعداد» — الرسالة العامة تخفي السبب const status = ex && ex.status; const code = ex && (ex.code || ex.name); const msg = String((ex && ex.message) || ex || ""); console.error("Bonyan login error:", ex); if (code === "tenant_expired") { setErr(msg); // اشتراك منتهٍ/موقوف — رسالة واضحة من الخادم } else if (status === 400 || code === "invalid_credentials") { setErr("اسم المستخدم أو كلمة المرور غير صحيحة"); } else if (/fetch|network|load failed|cors/i.test(msg) || status === 0) { setErr("تعذّر الاتصال بالخادم. افتح الصفحة عبر Live Server (عنوان http://) لا كملف، وتأكّد من الإنترنت."); } else { setErr("خطأ غير متوقّع: " + msg + " — راجع Console (F12)."); } } finally { setBusy(false); } return; } // الوضع التجريبي: تحقّق محلي من قائمة المستخدمين const found = D.users.find((x) => (x.username || "").toLowerCase() === u.trim().toLowerCase() && x.password === p); if (found) onLogin({ ...found, perms: [...found.perms] }); else setErr("اسم المستخدم أو كلمة المرور غير صحيحة"); }; const label = { fontSize: 13, fontWeight: 500, color: "var(--text-strong)", marginBottom: 6, display: "block" }; return (