107 lines
3.5 KiB
JavaScript
107 lines
3.5 KiB
JavaScript
// Theme toggle
|
|
(function initTheme(){
|
|
const saved = localStorage.lb_theme || 'dark';
|
|
document.documentElement.setAttribute('data-theme', saved);
|
|
document.getElementById('themeSwitch').checked = (saved==='light');
|
|
document.getElementById('themeSwitch').addEventListener('change', ()=>{
|
|
const t = document.getElementById('themeSwitch').checked ? 'light' : 'dark';
|
|
document.documentElement.setAttribute('data-theme', t);
|
|
localStorage.lb_theme = t;
|
|
});
|
|
})();
|
|
|
|
// Password toggle
|
|
document.getElementById('passwordToggle').addEventListener('click', function() {
|
|
const passwordInput = document.getElementById('password');
|
|
const icon = this.querySelector('i');
|
|
|
|
if (passwordInput.type === 'password') {
|
|
passwordInput.type = 'text';
|
|
icon.className = 'fas fa-eye-slash';
|
|
} else {
|
|
passwordInput.type = 'password';
|
|
icon.className = 'fas fa-eye';
|
|
}
|
|
});
|
|
|
|
// Login form
|
|
document.getElementById('loginForm').addEventListener('submit', async function(e) {
|
|
e.preventDefault();
|
|
|
|
const username = document.getElementById('username').value.trim();
|
|
const password = document.getElementById('password').value;
|
|
const loginButton = document.getElementById('loginButton');
|
|
const buttonText = document.getElementById('buttonText');
|
|
const loadingSpinner = document.getElementById('loadingSpinner');
|
|
const errorMessage = document.getElementById('errorMessage');
|
|
|
|
// Validation
|
|
if (!username || !password) {
|
|
showError('Пожалуйста, заполните все поля');
|
|
return;
|
|
}
|
|
|
|
// Show loading state
|
|
loginButton.disabled = true;
|
|
buttonText.textContent = 'Вход...';
|
|
loadingSpinner.classList.add('show');
|
|
hideError();
|
|
|
|
try {
|
|
const response = await fetch('/api/auth/login', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({
|
|
username: username,
|
|
password: password
|
|
})
|
|
});
|
|
|
|
if (response.ok) {
|
|
const data = await response.json();
|
|
|
|
// Store token in localStorage
|
|
localStorage.setItem('access_token', data.access_token);
|
|
|
|
// Redirect to main page
|
|
window.location.href = '/';
|
|
} else {
|
|
const errorData = await response.json();
|
|
showError(errorData.detail || 'Ошибка входа в систему');
|
|
}
|
|
} catch (error) {
|
|
console.error('Login error:', error);
|
|
showError('Ошибка соединения с сервером');
|
|
} finally {
|
|
// Reset loading state
|
|
loginButton.disabled = false;
|
|
buttonText.textContent = 'Войти';
|
|
loadingSpinner.classList.remove('show');
|
|
}
|
|
});
|
|
|
|
function showError(message) {
|
|
const errorMessage = document.getElementById('errorMessage');
|
|
errorMessage.textContent = message;
|
|
errorMessage.classList.add('show');
|
|
}
|
|
|
|
function hideError() {
|
|
const errorMessage = document.getElementById('errorMessage');
|
|
errorMessage.classList.remove('show');
|
|
}
|
|
|
|
// Auto-focus on username field
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
document.getElementById('username').focus();
|
|
});
|
|
|
|
// Handle Enter key in password field
|
|
document.getElementById('password').addEventListener('keypress', function(e) {
|
|
if (e.key === 'Enter') {
|
|
document.getElementById('loginForm').dispatchEvent(new Event('submit'));
|
|
}
|
|
});
|