bc/public/js/auth.js

127 lines
6.9 KiB
JavaScript
Raw 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 (для приложения 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.');
}