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 } 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";
// 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 === "/";
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;