// /public/js/auth.js (для приложения bc.js) export function initAuth(dependencies) { console.log('[Auth.js] initAuth called for BattleClub.'); const { socket, clientState, ui } = dependencies; const { loginForm, registerForm, logoutButton } = ui.elements; const APP_BASE_PATH = '/battleclub'; // Определяем базовый путь для этого приложения const JWT_TOKEN_KEY = 'jwtToken'; // Функция для формирования полного URL API с учетом базового пути const getApiUrl = (apiPath) => `${window.location.origin}${APP_BASE_PATH}${apiPath}`; async function handleAuthResponse(response, formType) { console.log(`[Auth.js handleAuthResponse] Form: ${formType}, 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:`, data); if (response.ok && data.success && data.token) { localStorage.setItem(JWT_TOKEN_KEY, data.token); clientState.isLoggedIn = true; clientState.loggedInUsername = data.username; clientState.myUserId = data.userId; console.log('[Auth.js handleAuthResponse] Auth successful. Client state updated:', JSON.parse(JSON.stringify(clientState))); ui.setAuthMessage(''); ui.showGameSelectionScreen(data.username); console.log('[Auth.js handleAuthResponse] Reconnecting socket with new token.'); if (socket.connected) { socket.disconnect(); } // Socket.IO клиент (в main.js) уже должен быть настроен с правильным path: '/battleclub/socket.io' socket.auth = { token: data.token }; socket.connect(); } else { console.warn(`[Auth.js handleAuthResponse] Auth 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 response:`, error); clientState.isLoggedIn = false; clientState.loggedInUsername = ''; clientState.myUserId = null; localStorage.removeItem(JWT_TOKEN_KEY); ui.setAuthMessage('Произошла ошибка сети или ответа сервера.', true); } finally { if (regButton) regButton.disabled = false; if (loginButton) loginButton.disabled = false; } } if (registerForm) { registerForm.addEventListener('submit', async (e) => { e.preventDefault(); const username = document.getElementById('register-username').value; const password = document.getElementById('register-password').value; console.log(`[Auth.js] Registering: "${username}"`); if (registerForm.querySelector('button')) registerForm.querySelector('button').disabled = true; if (loginForm && loginForm.querySelector('button')) loginForm.querySelector('button').disabled = true; ui.setAuthMessage('Регистрация...'); try { const response = await fetch(getApiUrl('/auth/register'), { // Используем getApiUrl method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username, password }), }); await handleAuthResponse(response, 'register'); if (response.ok && clientState.isLoggedIn) registerForm.reset(); } catch (error) { console.error('[Auth.js] Network error during registration:', error); ui.setAuthMessage('Ошибка сети при регистрации.', true); if (registerForm.querySelector('button')) registerForm.querySelector('button').disabled = false; if (loginForm && loginForm.querySelector('button')) loginForm.querySelector('button').disabled = false; } }); } if (loginForm) { loginForm.addEventListener('submit', async (e) => { e.preventDefault(); const username = document.getElementById('login-username').value; const password = document.getElementById('login-password').value; console.log(`[Auth.js] Logging in: "${username}"`); if (loginForm.querySelector('button')) loginForm.querySelector('button').disabled = true; if (registerForm && registerForm.querySelector('button')) registerForm.querySelector('button').disabled = true; ui.setAuthMessage('Вход...'); try { const response = await fetch(getApiUrl('/auth/login'), { // Используем getApiUrl method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username, password }), }); await handleAuthResponse(response, 'login'); } catch (error) { console.error('[Auth.js] Network error during login:', error); ui.setAuthMessage('Ошибка сети при входе.', true); if (loginForm.querySelector('button')) loginForm.querySelector('button').disabled = false; if (registerForm && registerForm.querySelector('button')) registerForm.querySelector('button').disabled = false; } }); } if (logoutButton) { logoutButton.addEventListener('click', () => { // ... (ваш существующий код для logout, он не зависит от API URL) ... console.log('[Auth.js] Logout button clicked.'); logoutButton.disabled = true; if (clientState.isLoggedIn && clientState.isInGame && clientState.currentGameId /* ... доп. проверки ... */) { // ... логика playerSurrender / leaveAiGame ... } localStorage.removeItem(JWT_TOKEN_KEY); clientState.isLoggedIn = false; clientState.loggedInUsername = ''; clientState.myUserId = null; ui.showAuthScreen(); ui.setAuthMessage("Вы успешно вышли из системы."); if (socket.connected) socket.disconnect(); socket.auth = { token: null }; socket.connect(); }); } console.log('[Auth.js] initAuth for BattleClub finished.'); }