// ════════════════════════════════════════════════════════════════ // LoginPage — публичный экран входа // /login → POST /api/auth/login → session cookie + redirect to / // ════════════════════════════════════════════════════════════════ function LoginPage({ onLoggedIn, onGoToCorpus }) { const [email, setEmail] = React.useState('virtualarch.marketing@gmail.com'); const [password, setPassword] = React.useState(''); const [remember, setRemember] = React.useState(true); const [submitting, setSubmitting] = React.useState(false); const [error, setError] = React.useState(null); async function submit(e) { e.preventDefault(); if (!email || !password) { setError('Заполните email и пароль'); return; } setError(null); setSubmitting(true); // ── API mode: real backend ── if (window.SDH_USE_API && window.SDH_HYDRATE) { try { const resp = await window.SDH_HYDRATE.login(email, password); onLoggedIn && onLoggedIn(resp.id); } catch (err) { const msg = err && err.message ? (err.status === 401 ? 'Неверный email или пароль' : err.message) : 'Ошибка входа'; setError(msg); setSubmitting(false); } return; } // ── Mock mode (default for design preview) ── setTimeout(() => { const user = window.SDH_ADMIN.users.find(u => u.email.toLowerCase() === email.toLowerCase()); if (!user) { setError('Пользователь не найден. Запросите приглашение у super-admin.'); setSubmitting(false); return; } if (user.status !== 'active') { setError('Аккаунт неактивен. Свяжитесь с super-admin.'); setSubmitting(false); return; } onLoggedIn && onLoggedIn(user.id); }, 350); } return (
Войдите в свою рабочую область Symbiosis.DataHub. Доступ только по приглашению. Если у вас его ещё нет, запросите у super-admin.