import React, { useState, useEffect } from "react"; import { BrowserRouter, Routes, Route, Navigate, useNavigate, useLocation, } from "react-router-dom"; import { Navbar } from "./components/Navbar"; import { Home } from "./pages/Home"; import { Dashboard } from "./pages/Dashboard"; import { Login } from "./pages/Login"; import { Register } from "./pages/Register"; import { ProfessionalRegister } from "./pages/ProfessionalRegister"; import { TeamPage } from "./pages/Team"; import EventDetails from "./pages/EventDetails"; import Finance from "./pages/Finance"; import { SettingsPage } from "./pages/Settings"; import { CourseManagement } from "./pages/CourseManagement"; import { InspirationPage } from "./pages/Inspiration"; import { UserApproval } from "./pages/UserApproval"; import { AccessCodes } from "./pages/AccessCodes"; import { PrivacyPolicy } from "./pages/PrivacyPolicy"; import { TermsOfUse } from "./pages/TermsOfUse"; import { LGPD } from "./pages/LGPD"; import { AuthProvider, useAuth } from "./contexts/AuthContext"; import { DataProvider, useData } from "./contexts/DataContext"; import { UserRole } from "./types"; import { verifyAccessCode } from "./services/apiService"; import { Button } from "./components/Button"; import { X } from "lucide-react"; import { ShieldAlert } from "lucide-react"; import ProfessionalStatement from "./pages/ProfessionalStatement"; import { ProfilePage } from "./pages/Profile"; import { ImportData } from "./pages/ImportData"; import { LoadingScreen } from "./components/LoadingScreen"; // Componente de acesso negado const AccessDenied: React.FC = () => { const navigate = useNavigate(); return (

Acesso Negado

Você não tem permissão para acessar esta página.

); }; // Componente de rota protegida por código de acesso interface AccessCodeProtectedRouteProps { children: React.ReactNode; type: 'client' | 'professional'; } const AccessCodeProtectedRoute: React.FC = ({ children, type }) => { const [showAccessCodeModal, setShowAccessCodeModal] = useState(false); const [accessCode, setAccessCode] = useState(""); const [codeError, setCodeError] = useState(""); const [isValidated, setIsValidated] = useState(false); useEffect(() => { const checkAccess = () => { if (type === 'client') { const isValidated = sessionStorage.getItem('accessCodeValidated'); const accessData = sessionStorage.getItem('accessCodeData'); if (!isValidated || !accessData) { setShowAccessCodeModal(true); return; } setIsValidated(true); } else if (type === 'professional') { const isValidated = sessionStorage.getItem('professionalAccessValidated'); const accessData = sessionStorage.getItem('professionalAccessData'); if (!isValidated || !accessData) { setShowAccessCodeModal(true); return; } setIsValidated(true); } }; checkAccess(); }, [type]); const handleVerifyCode = async () => { if (accessCode.trim() === "") { setCodeError("Por favor, digite o código de acesso"); return; } try { const res = await verifyAccessCode(accessCode.toUpperCase()); if (res.data && res.data.valid) { // Marcar na sessão que o código foi validado if (type === 'client') { sessionStorage.setItem('accessCodeValidated', 'true'); sessionStorage.setItem('accessCodeData', JSON.stringify({ code: accessCode.toUpperCase(), empresa_id: res.data.empresa_id, empresa_nome: res.data.empresa_nome })); } else if (type === 'professional') { sessionStorage.setItem('professionalAccessValidated', 'true'); sessionStorage.setItem('professionalAccessData', JSON.stringify({ code: accessCode.toUpperCase() })); } setShowAccessCodeModal(false); setIsValidated(true); // Se tem empresa e é cliente, atualizar URL com parâmetros if (type === 'client' && res.data.empresa_id) { window.history.replaceState({}, '', `${window.location.pathname}?empresa_id=${res.data.empresa_id}&empresa_nome=${encodeURIComponent(res.data.empresa_nome || '')}`); } } else { setCodeError(res.data?.error || "Código de acesso inválido ou expirado"); } } catch (e) { setCodeError("Erro ao verificar código"); } }; const resetCodeForm = () => { setAccessCode(""); setCodeError(""); }; // Se ainda não foi validado, mostrar modal de código if (!isValidated) { return (
{/* Modal de código de acesso */} {showAccessCodeModal && (
setShowAccessCodeModal(false)} >
e.stopPropagation()} >

Código de Acesso

Digite o código de acesso fornecido pela empresa para continuar com o cadastro.

{ setAccessCode(e.target.value.toUpperCase()); resetCodeForm(); }} onKeyPress={(e) => e.key === "Enter" && handleVerifyCode()} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-[#B9CF33] focus:border-transparent uppercase" placeholder="Digite o código" autoFocus /> {codeError && (

{codeError}

)}

Atenção: O código de acesso é fornecido pela empresa e tem validade definida pela empresa.

)} {/* Conteúdo de fundo quando modal não está visível */} {!showAccessCodeModal && (

Acesso Restrito

Esta página requer um código de acesso válido para continuar.

)}
); } return <>{children}; }; // Componente de rota protegida interface ProtectedRouteProps { children: React.ReactNode; allowedRoles?: UserRole[]; } const ProtectedRoute: React.FC = ({ children, allowedRoles, }) => { const { user } = useAuth(); if (!user) { return ; } if ( allowedRoles && allowedRoles.length > 0 && !allowedRoles.includes(user.role) ) { return ; } return <>{children}; }; // Wrapper para páginas que usam o sistema antigo de navegação const PageWrapper: React.FC<{ children: React.ReactNode }> = ({ children }) => { const navigate = useNavigate(); const location = useLocation(); const handleNavigate = (page: string) => { navigate(`/${page}`); }; const getCurrentPage = () => { const path = location.pathname.substring(1) || "home"; return path; }; return (
{children}
); }; // Navbar simplificada apenas para Home const SimpleNavbar: React.FC = () => { return ( ); }; // Componente Home com roteamento (com Navbar simplificada) const HomeWithRouter: React.FC = () => { const navigate = useNavigate(); const { user } = useAuth(); return (
navigate(user ? "/painel" : "/entrar")} />
); }; // Componente de Login com redirecionamento const LoginWithRouter: React.FC = () => { const navigate = useNavigate(); const { user } = useAuth(); if (user) { return ; } return ( navigate(`/${page}`)} /> ); }; // Componente de Registro com redirecionamento const RegisterWithRouter: React.FC = () => { const navigate = useNavigate(); const { user } = useAuth(); if (user) { return ; } return ( navigate(`/${page}`)} /> ); }; // Componente de Cadastro de Profissional com redirecionamento const ProfessionalRegisterWithRouter: React.FC = () => { const navigate = useNavigate(); const { user } = useAuth(); if (user) { return ; } return ( navigate(`/${page}`)} /> ); }; // Footer component const Footer: React.FC = () => { const navigate = useNavigate(); return ( ); }; const AppContent: React.FC = () => { const location = useLocation(); const showFooter = location.pathname === "/"; const { isLoading: isAuthLoading } = useAuth(); if (isAuthLoading) { return ; } return ( <> {/* Rotas Públicas */} } /> } /> } /> } /> (window.location.href = `/${page}`)} /> } /> (window.location.href = `/${page}`)} /> } /> (window.location.href = `/${page}`)} /> } /> {/* Rotas Protegidas - Todos os usuários autenticados */} } /> } /> } /> } /> {/* Rota de solicitação de evento - Clientes e Administradores */} } /> {/* Rotas Administrativas - Apenas gestão */} } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* Rota padrão - redireciona para home */} } /> ); }; function App() { return ( ); } export default App;