diff --git a/console/ui/index.html b/console/ui/index.html index b9de252..09dadd4 100644 --- a/console/ui/index.html +++ b/console/ui/index.html @@ -16,6 +16,7 @@ +
@@ -796,88 +797,6 @@ } } - 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; } - 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 || 'Ошибка входа'); - } - localStorage.setItem('auth_token', token); - localStorage.setItem('auth_env', env); - 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 = token ? jwtEmail(token) : null; - if (email) { - el.textContent = email; - el.title = email; - el.style.fontSize = '0.7rem'; - el.style.minWidth = '60px'; - el.style.padding = '0 8px'; - } else { - el.textContent = 'N'; - el.title = ''; - el.style.fontSize = ''; - el.style.minWidth = ''; - el.style.padding = ''; - } - } - - function doLogout() { - localStorage.removeItem('auth_token'); - localStorage.removeItem('auth_env'); - try { document.getElementById('l-token').value = ''; } catch (_) { } - setUserAvatar(null); - showLoginOverlay(); - } - async function aiCheck(codeId, langId, resultId) { var code = document.getElementById(codeId).value.trim(); var lang = (document.getElementById(langId) ? document.getElementById(langId).value : '') || 'python'; @@ -1085,17 +1004,6 @@ }, 5000); } - function checkAuth() { - var storedToken = localStorage.getItem('auth_token'); - if (!storedToken) { - showLoginOverlay(); - return; - } - setUserAvatar(storedToken); - hideLoginOverlay(); - reloadAll(); - } - checkAuth(); diff --git a/console/ui/js/auth.js b/console/ui/js/auth.js new file mode 100644 index 0000000..b45d8c2 --- /dev/null +++ b/console/ui/js/auth.js @@ -0,0 +1,94 @@ +/* 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; } + 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 || 'Ошибка входа'); + } + localStorage.setItem('auth_token', token); + localStorage.setItem('auth_env', env); + 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 = token ? jwtEmail(token) : null; + if (email) { + el.textContent = email; + el.title = email; + el.style.fontSize = '0.7rem'; + el.style.minWidth = '60px'; + el.style.padding = '0 8px'; + } else { + el.textContent = 'N'; + el.title = ''; + el.style.fontSize = ''; + el.style.minWidth = ''; + el.style.padding = ''; + } +} + +function doLogout() { + localStorage.removeItem('auth_token'); + localStorage.removeItem('auth_env'); + 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(); +}