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'));
|
||
}
|
||
});
|