bc/public/js/auth.js

212 lines
11 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// /public/js/auth.js
// Эта функция будет вызвана из main.js и получит необходимые зависимости
export function initAuth(dependencies) {
console.log('[Auth.js] initAuth called. Dependencies received:', !!dependencies); // <--- ДОБАВЛЕНО
const { socket, clientState, ui } = dependencies;
const { loginForm, registerForm, logoutButton } = ui.elements;
console.log('[Auth.js DOM Check] loginForm in initAuth:', loginForm); // <--- ДОБАВЛЕНО
console.log('[Auth.js DOM Check] registerForm in initAuth:', registerForm); // <--- ДОБАВЛЕНО
console.log('[Auth.js DOM Check] logoutButton in initAuth:', logoutButton); // <--- ДОБАВЛЕНО
const getApiUrl = (path) => `${window.location.origin}${base_path}${path}`;
console.log('[Auth.js] API URLs will be relative to:', window.location.origin); // <--- ДОБАВЛЕНО
const JWT_TOKEN_KEY = 'jwtToken';
async function handleAuthResponse(response, formType) {
console.log(`[Auth.js handleAuthResponse] Handling response for form: ${formType}. Response status: ${response.status}`); // <--- ДОБАВЛЕНО
const regButton = registerForm ? registerForm.querySelector('button') : null;
const loginButton = loginForm ? loginForm.querySelector('button') : null;
try {
const data = await response.json();
console.log(`[Auth.js handleAuthResponse] Parsed data for ${formType}:`, data); // <--- ДОБАВЛЕНО
if (response.ok && data.success && data.token) {
console.log(`[Auth.js handleAuthResponse] ${formType} successful. Token received.`); // <--- ДОБАВЛЕНО
localStorage.setItem(JWT_TOKEN_KEY, data.token);
clientState.isLoggedIn = true;
clientState.loggedInUsername = data.username;
clientState.myUserId = data.userId;
console.log('[Auth.js handleAuthResponse] Client state updated:', JSON.parse(JSON.stringify(clientState))); // <--- ДОБАВЛЕНО
ui.setAuthMessage('');
ui.showGameSelectionScreen(data.username);
console.log('[Auth.js handleAuthResponse] Disconnecting and reconnecting socket with new token.'); // <--- ДОБАВЛЕНО
if (socket.connected) {
socket.disconnect();
}
socket.auth = { token: data.token };
socket.connect();
} else {
console.warn(`[Auth.js handleAuthResponse] ${formType} failed or token missing. Message: ${data.message}`); // <--- ДОБАВЛЕНО
clientState.isLoggedIn = false;
clientState.loggedInUsername = '';
clientState.myUserId = null;
localStorage.removeItem(JWT_TOKEN_KEY);
ui.setAuthMessage(data.message || 'Ошибка сервера.', true);
}
} catch (error) {
console.error(`[Auth.js handleAuthResponse] Error processing ${formType} response JSON or other:`, error); // <--- ДОБАВЛЕНО
clientState.isLoggedIn = false;
clientState.loggedInUsername = '';
clientState.myUserId = null;
localStorage.removeItem(JWT_TOKEN_KEY);
ui.setAuthMessage('Произошла ошибка сети или ответа сервера. Попробуйте снова.', true);
} finally {
console.log(`[Auth.js handleAuthResponse] Re-enabling buttons for ${formType}.`); // <--- ДОБАВЛЕНО
if (regButton) regButton.disabled = false;
if (loginButton) loginButton.disabled = false;
}
}
// --- Обработчики событий DOM ---
if (registerForm) {
console.log('[Auth.js] Attaching submit listener to registerForm.'); // <--- ДОБАВЛЕНО
registerForm.addEventListener('submit', async (e) => {
e.preventDefault();
console.log('[Auth.js] Register form submitted.'); // <--- ДОБАВЛЕНО
const usernameInput = document.getElementById('register-username');
const passwordInput = document.getElementById('register-password');
if (!usernameInput || !passwordInput) {
console.error('[Auth.js] Register form username or password input not found!'); // <--- ДОБАВЛЕНО
return;
}
const username = usernameInput.value;
const password = passwordInput.value;
console.log(`[Auth.js] Attempting to register with username: "${username}", password length: ${password.length}`); // <--- ДОБАВЛЕНО
const regButton = registerForm.querySelector('button');
const loginButton = loginForm ? loginForm.querySelector('button') : null;
if (regButton) regButton.disabled = true;
if (loginButton) loginButton.disabled = true; // Блокируем обе кнопки на время запроса
ui.setAuthMessage('Регистрация...');
const apiUrl = getApiUrl('/auth/register');
console.log('[Auth.js] Sending register request to:', apiUrl); // <--- ДОБАВЛЕНО
try {
const response = await fetch(apiUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password }),
});
console.log('[Auth.js] Received response from register request.'); // <--- ДОБАВЛЕНО
await handleAuthResponse(response, 'register');
if (response.ok && clientState.isLoggedIn && registerForm) {
console.log('[Auth.js] Registration successful, resetting register form.'); // <--- ДОБАВЛЕНО
registerForm.reset();
}
} catch (error) {
console.error('[Auth.js] Network error during registration fetch:', error); // <--- ДОБАВЛЕНО
ui.setAuthMessage('Ошибка сети при регистрации. Пожалуйста, проверьте ваше подключение.', true);
if (regButton) regButton.disabled = false;
if (loginButton) loginButton.disabled = false;
}
});
} else {
console.warn('[Auth.js] registerForm element not found, listener not attached.'); // <--- ДОБАВЛЕНО
}
if (loginForm) {
console.log('[Auth.js] Attaching submit listener to loginForm.'); // <--- ДОБАВЛЕНО
loginForm.addEventListener('submit', async (e) => {
e.preventDefault();
console.log('[Auth.js] Login form submitted.'); // <--- ДОБАВЛЕНО
const usernameInput = document.getElementById('login-username');
const passwordInput = document.getElementById('login-password');
if (!usernameInput || !passwordInput) {
console.error('[Auth.js] Login form username or password input not found!'); // <--- ДОБАВЛЕНО
return;
}
const username = usernameInput.value;
const password = passwordInput.value;
console.log(`[Auth.js] Attempting to login with username: "${username}", password length: ${password.length}`); // <--- ДОБАВЛЕНО
const loginButton = loginForm.querySelector('button');
const regButton = registerForm ? registerForm.querySelector('button') : null;
if (loginButton) loginButton.disabled = true;
if (regButton) regButton.disabled = true;
ui.setAuthMessage('Вход...');
const apiUrl = getApiUrl('/auth/login');
console.log('[Auth.js] Sending login request to:', apiUrl); // <--- ДОБАВЛЕНО
try {
const response = await fetch(apiUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password }),
});
console.log('[Auth.js] Received response from login request.'); // <--- ДОБАВЛЕНО
await handleAuthResponse(response, 'login');
// Форма логина обычно не сбрасывается или перенаправляется немедленно,
// это делает showGameSelectionScreen
} catch (error) {
console.error('[Auth.js] Network error during login fetch:', error); // <--- ДОБАВЛЕНО
ui.setAuthMessage('Ошибка сети при входе. Пожалуйста, проверьте ваше подключение.', true);
if (loginButton) loginButton.disabled = false;
if (regButton) regButton.disabled = false;
}
});
} else {
console.warn('[Auth.js] loginForm element not found, listener not attached.'); // <--- ДОБАВЛЕНО
}
if (logoutButton) {
console.log('[Auth.js] Attaching click listener to logoutButton.'); // <--- ДОБАВЛЕНО
logoutButton.addEventListener('click', () => {
console.log('[Auth.js] Logout button clicked.'); // <--- ДОБАВЛЕНО
logoutButton.disabled = true;
if (clientState.isLoggedIn && clientState.isInGame && clientState.currentGameId) {
if (clientState.currentGameState &&
clientState.currentGameState.gameMode === 'pvp' &&
!clientState.currentGameState.isGameOver) {
console.log('[Auth.js] Player is in an active PvP game. Emitting playerSurrender.');
socket.emit('playerSurrender');
}
else if (clientState.currentGameState &&
clientState.currentGameState.gameMode === 'ai' &&
!clientState.currentGameState.isGameOver) {
console.log('[Auth.js] Player is in an active AI game. Emitting leaveAiGame.');
socket.emit('leaveAiGame');
}
}
console.log('[Auth.js] Removing JWT token from localStorage.'); // <--- ДОБАВЛЕНО
localStorage.removeItem(JWT_TOKEN_KEY);
clientState.isLoggedIn = false;
clientState.loggedInUsername = '';
clientState.myUserId = null;
console.log('[Auth.js] Client state reset for logout.'); // <--- ДОБАВЛЕНО
ui.showAuthScreen();
ui.setAuthMessage("Вы успешно вышли из системы.");
console.log('[Auth.js] Disconnecting and reconnecting socket after logout.'); // <--- ДОБАВЛЕНО
if (socket.connected) {
socket.disconnect();
}
socket.auth = { token: null };
socket.connect(); // Это вызовет 'connect' в main.js, который затем вызовет showAuthScreen
});
} else {
console.warn('[Auth.js] logoutButton element not found, listener not attached.'); // <--- ДОБАВЛЕНО
}
console.log('[Auth.js] initAuth finished.'); // <--- ДОБАВЛЕНО
}