mirror of
https://github.com/fromchat-messenger/web.git
synced 2026-09-22 19:15:08 +03:00
196 lines
6.5 KiB
TypeScript
196 lines
6.5 KiB
TypeScript
import { loadMessages } from "./chat";
|
|
import type { Headers, ErrorResponse, User, LoginResponse, LoginRequest, RegisterRequest } from "./types";
|
|
import { API_BASE_URL } from "./config";
|
|
|
|
// Authentication and navigation handling
|
|
export let currentUser: User | null = null;
|
|
export let authToken: string | null = null;
|
|
|
|
|
|
// Helper function to get auth headers
|
|
export function getAuthHeaders(): Headers {
|
|
const headers: Headers = {
|
|
'Content-Type': 'application/json',
|
|
};
|
|
if (authToken) {
|
|
headers['Authorization'] = `Bearer ${authToken}`;
|
|
}
|
|
return headers;
|
|
}
|
|
|
|
// Show login form
|
|
export function showLogin() {
|
|
document.getElementById('login-form')!.style.display = 'flex';
|
|
document.getElementById('register-form')!.style.display = 'none';
|
|
document.getElementById('chat-interface')!.style.display = 'none';
|
|
clearAlerts();
|
|
}
|
|
|
|
// Show register form
|
|
export function showRegister() {
|
|
document.getElementById('login-form')!.style.display = 'none';
|
|
document.getElementById('register-form')!.style.display = 'flex';
|
|
document.getElementById('chat-interface')!.style.display = 'none';
|
|
clearAlerts();
|
|
}
|
|
|
|
// Show chat interface
|
|
export function showChat() {
|
|
document.getElementById('login-form')!.style.display = 'none';
|
|
document.getElementById('register-form')!.style.display = 'none';
|
|
document.getElementById('chat-interface')!.style.display = 'block';
|
|
loadMessages();
|
|
}
|
|
|
|
// Clear all alerts
|
|
export function clearAlerts() {
|
|
document.getElementById('login-alerts')!.innerHTML = '';
|
|
document.getElementById('register-alerts')!.innerHTML = '';
|
|
}
|
|
|
|
// Show alert message
|
|
export function showAlert(containerId: string, message: string, type: "success" | "danger" = 'danger') {
|
|
const container = document.getElementById(containerId)!;
|
|
const alertDiv = document.createElement('div');
|
|
alertDiv.className = `alert alert-${type}`;
|
|
alertDiv.textContent = message;
|
|
container.appendChild(alertDiv);
|
|
}
|
|
|
|
// Handle login form submission
|
|
document.getElementById('login-form-element')!.addEventListener('submit', async (e) => {
|
|
e.preventDefault();
|
|
|
|
const usernameElement = document.getElementById('login-username') as HTMLInputElement;
|
|
const passwordElement = document.getElementById('login-password') as HTMLInputElement;
|
|
|
|
const username = usernameElement.value.trim();
|
|
const password = passwordElement.value.trim();
|
|
|
|
if (!username || !password) {
|
|
showAlert('login-alerts', 'Пожалуйста, заполните все поля', 'danger');
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const request: LoginRequest = {
|
|
username: username,
|
|
password: password
|
|
}
|
|
|
|
const response = await fetch(`${API_BASE_URL}/login`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify(request)
|
|
});
|
|
|
|
if (response.ok) {
|
|
const data: LoginResponse = await response.json();
|
|
// Store the JWT token
|
|
authToken = data.token;
|
|
currentUser = data.user;
|
|
showChat();
|
|
loadMessages(); // Start loading messages
|
|
} else {
|
|
const data: ErrorResponse = await response.json();
|
|
showAlert('login-alerts', data.message || 'Неверное имя пользователя или пароль', 'danger');
|
|
}
|
|
} catch (error) {
|
|
showAlert('login-alerts', 'Ошибка соединения с сервером', 'danger');
|
|
}
|
|
});
|
|
|
|
// Handle register form submission
|
|
document.getElementById('register-form-element')!.addEventListener('submit', async (e) => {
|
|
e.preventDefault();
|
|
|
|
const usernameElement = document.getElementById('register-username') as HTMLInputElement;
|
|
const passwordElement = document.getElementById('register-password') as HTMLInputElement;
|
|
const confirmPasswordElement = document.getElementById('register-confirm-password') as HTMLInputElement;
|
|
|
|
const username = usernameElement.value.trim();
|
|
const password = passwordElement.value.trim();
|
|
const confirmPassword = confirmPasswordElement.value.trim();
|
|
|
|
if (!username || !password || !confirmPassword) {
|
|
showAlert('register-alerts', 'Пожалуйста, заполните все поля', 'danger');
|
|
return;
|
|
}
|
|
|
|
if (password !== confirmPassword) {
|
|
showAlert('register-alerts', 'Пароли не совпадают', 'danger');
|
|
return;
|
|
}
|
|
|
|
if (username.length < 3 || username.length > 20) {
|
|
showAlert('register-alerts', 'Имя пользователя должно быть от 3 до 20 символов', 'danger');
|
|
return;
|
|
}
|
|
|
|
if (password.length < 5 || password.length > 50) {
|
|
showAlert('register-alerts', 'Пароль должен быть от 5 до 50 символов', 'danger');
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const request: RegisterRequest = {
|
|
username: username,
|
|
password: password,
|
|
confirm_password: confirmPassword
|
|
}
|
|
|
|
const response = await fetch(`${API_BASE_URL}/register`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify(request)
|
|
});
|
|
|
|
if (response.ok) {
|
|
// Registration successful
|
|
showAlert('register-alerts', 'Регистрация прошла успешно! Теперь вы можете войти.', 'success');
|
|
setTimeout(() => {
|
|
showLogin();
|
|
}, 2000);
|
|
} else {
|
|
const data: ErrorResponse = await response.json();
|
|
showAlert('register-alerts', data.message || 'Ошибка при регистрации', 'danger');
|
|
}
|
|
} catch (error) {
|
|
showAlert('register-alerts', 'Ошибка соединения с сервером', 'danger');
|
|
}
|
|
});
|
|
|
|
// Handle logout
|
|
export async function logout() {
|
|
try {
|
|
await fetch(`${API_BASE_URL}/logout`, {
|
|
method: 'GET',
|
|
headers: getAuthHeaders()
|
|
});
|
|
} catch (error) {
|
|
console.error('Logout error:', error);
|
|
}
|
|
|
|
currentUser = null;
|
|
authToken = null;
|
|
showLogin();
|
|
clearAlerts();
|
|
}
|
|
|
|
// Load chat interface
|
|
export function loadChat() {
|
|
showChat();
|
|
loadMessages();
|
|
}
|
|
|
|
// Check authentication status on page load
|
|
export async function checkAuthStatus() {
|
|
// For JWT, we don't have a persistent token on page load
|
|
// So we'll just show the login form
|
|
showLogin();
|
|
}
|