216 lines
11 KiB
JavaScript
216 lines
11 KiB
JavaScript
// /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;
|
||
let APP_BASE_PATH = '';
|
||
|
||
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); // <--- ДОБАВЛЕНО
|
||
if (window.location.pathname.startsWith('/battleclub')) {
|
||
APP_BASE_PATH = '/battleclub';
|
||
}
|
||
const getApiUrl = (path) => `${window.location.origin}${APP_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.'); // <--- ДОБАВЛЕНО
|
||
} |