// ════════════════════════════════════════════════════════════════ // 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 (
{/* mini-wordmark on top */}
Symbiosis .DataHub
{/* center */}
вход в систему

С возвращением

Войдите в свою рабочую область Symbiosis.DataHub. Доступ только по приглашению. Если у вас его ещё нет, запросите у super-admin.

setEmail(e.target.value)} placeholder="ваш@email.ru" style={fieldStyle} /> setPassword(e.target.value)} placeholder="минимум 12 символов" style={fieldStyle} /> {error && (
{error}
)}
Нет учётной записи? Symbiosis.DataHub работает только по приглашению — обратитесь к super-admin (Орлов Е.В.) для получения доступа.
{/* mock helper */}
демо-вход: любой пароль подойдёт; смените email чтобы войти как другая роль (см. словарь в Tweaks)
); } function Field({ label, children }) { return ( ); } const fieldStyle = { width: '100%', padding: '10px 12px', fontSize: 14, fontFamily: 'var(--font-sans)', background: 'var(--surface-elevated)', color: 'var(--text-primary)', border: '1px solid var(--border-default)', borderRadius: 'var(--radius-md)', outline: 'none', transition: 'border-color .15s', }; window.LoginPage = LoginPage; window.AuthField = Field; window.authFieldStyle = fieldStyle;