/* auth.js — авторизация */ function showLoginOverlay() { document.getElementById('login-overlay').style.display = 'flex'; } function hideLoginOverlay() { document.getElementById('login-overlay').style.display = 'none'; } async function doLogin() { var btn = document.getElementById('l-btn'); var errEl = document.getElementById('l-error'); var token = (document.getElementById('l-token').value || '').trim(); var env = document.getElementById('l-env').value; if (!token) { errEl.textContent = 'Введите токен или логин'; errEl.style.display = 'block'; return; } var isJWT = token.split('.').length === 3 && !token.includes(' '); if (!isJWT && token.length < 6) { errEl.textContent = 'Логин — не менее 6 символов'; errEl.style.display = 'block'; return; } btn.disabled = true; errEl.style.display = 'none'; try { const res = await fetch(API_BASE + '/auth', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token: token, env: env }) }); if (!res.ok) { const d = await res.json().catch(function () { return {}; }); throw new Error(d.error || 'Ошибка входа'); } const data = await res.json(); localStorage.setItem('auth_token', token); localStorage.setItem('auth_env', env); if (data.email) localStorage.setItem('auth_email', data.email); else localStorage.removeItem('auth_email'); setUserAvatar(token); hideLoginOverlay(); // Проверяем статус NS — если не ready, показываем init overlay try { var sr = await fetch(API_BASE + '/ns/status', { headers: { 'X-Auth-Token': token, 'X-Auth-Env': env } }); var sd = await sr.json(); if (!sd.ready) { pollNSStatus(); return; } } catch (_) { } reloadAll(); } catch (e) { errEl.textContent = e.message; errEl.style.display = 'block'; } finally { btn.disabled = false; } } function jwtEmail(token) { try { var payload = JSON.parse(atob(token.split('.')[1].replace(/-/g,'+').replace(/_/g,'/'))); return payload.email || payload.sub || null; } catch (_) { return null; } } function setUserAvatar(token) { var el = document.getElementById('user-avatar'); if (!el) return; var email = localStorage.getItem('auth_email') || (token ? jwtEmail(token) : null); if (email) { el.textContent = email; el.title = email; el.style.fontSize = '0.75rem'; el.style.minWidth = 'auto'; el.style.padding = '0 10px'; el.style.background = 'none'; el.style.border = '1px solid var(--border)'; el.style.borderRadius = '6px'; el.style.color = 'var(--text-primary)'; el.style.fontWeight = '400'; el.style.width = 'auto'; el.style.height = '30px'; } else { el.textContent = 'N'; el.title = ''; el.style.cssText = ''; } } function doLogout() { localStorage.removeItem('auth_token'); localStorage.removeItem('auth_env'); localStorage.removeItem('auth_email'); try { document.getElementById('l-token').value = ''; } catch (_) { } setUserAvatar(null); showLoginOverlay(); } function checkAuth() { var storedToken = localStorage.getItem('auth_token'); if (!storedToken) { showLoginOverlay(); return; } setUserAvatar(storedToken); hideLoginOverlay(); reloadAll(); }