// Sistema de Autenticação Frontend class AuthManager { constructor() { this.token = localStorage.getItem('token'); this.usuario = JSON.parse(localStorage.getItem('usuario') || 'null'); this.verificandoAuth = false; // Flag para evitar verificações múltiplas console.log('🔧 AuthManager initialized'); console.log('🎫 Token from localStorage:', this.token ? 'EXISTS' : 'MISSING'); console.log('👤 User from localStorage:', this.usuario ? this.usuario.nome : 'MISSING'); // Configurar interceptor IMEDIATAMENTE this.setupFetchInterceptor(); // NÃO verificar auth aqui para evitar múltiplas chamadas // A verificação será feita apenas uma vez após o DOM carregar } // Verificar se está autenticado isAuthenticated() { return !!this.token; } // Obter token getToken() { return this.token; } // Obter dados do usuário getUsuario() { return this.usuario; } // Verificar autenticação no servidor async verificarAuth() { if (this.verificandoAuth) { return; // Evitar verificações múltiplas } if (!this.token) { this.redirectToLogin(); return false; } this.verificandoAuth = true; try { const response = await fetch('/api/auth/verificar', { headers: { 'Authorization': 'Bearer ' + this.token } }); if (response.ok) { const data = await response.json(); if (data.status === 'success') { this.usuario = data.usuario; localStorage.setItem('usuario', JSON.stringify(this.usuario)); this.atualizarInterface(); this.verificandoAuth = false; return true; } } // Token inválido this.verificandoAuth = false; this.logout(); return false; } catch (error) { console.error('Erro ao verificar autenticação:', error); this.verificandoAuth = false; this.logout(); return false; } } // Fazer logout async logout() { try { if (this.token) { await fetch('/api/auth/logout', { method: 'POST', headers: { 'Authorization': 'Bearer ' + this.token } }); } } catch (error) { console.error('Erro no logout:', error); } // Limpar dados locais localStorage.removeItem('token'); localStorage.removeItem('usuario'); this.token = null; this.usuario = null; this.redirectToLogin(); } // Redirecionar para login redirectToLogin() { if (window.location.pathname !== '/login.html' && window.location.pathname !== '/login') { window.location.href = '/login.html'; } } // Atualizar interface com dados do usuário atualizarInterface() { if (this.usuario) { // Atualizar nome do usuário na navbar const userElements = document.querySelectorAll('.user-name'); userElements.forEach(el => { el.textContent = this.usuario.nome; }); // Adicionar informações do usuário na navbar this.adicionarMenuUsuario(); } } // Adicionar menu do usuário na navbar adicionarMenuUsuario() { const navbar = document.querySelector('.navbar-nav'); if (navbar && !document.querySelector('#userMenu')) { const userMenu = document.createElement('li'); userMenu.className = 'nav-item dropdown'; userMenu.id = 'userMenu'; userMenu.innerHTML = ` ${this.usuario.nome}
`; navbar.appendChild(userMenu); } } // Mostrar modal com informações do perfil mostrarPerfil() { const modalHtml = `