// /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.'); // <--- ДОБАВЛЕНО }