story-generator/src/components/header/ProfileMenu.tsx
Lucas Santana 7430ae15a8 feat: adiciona menu de perfil no header
- Cria componente ProfileMenu com dropdown
- Implementa navegação contextual baseada no role do usuário
- Adiciona opções de acesso ao dashboard, perfil e logout
- Atualiza Header para mostrar/esconder botões baseado no estado de autenticação
- Adiciona detecção de clique fora do menu para fechá-lo
2024-12-20 13:45:29 -03:00

98 lines
2.9 KiB
TypeScript

import React from 'react';
import { useNavigate } from 'react-router-dom';
import { LogOut, Settings, LayoutDashboard } from 'lucide-react';
import { useAuth } from '../../hooks/useAuth';
export function ProfileMenu() {
const { user, userRole, signOut } = useAuth();
const navigate = useNavigate();
const [isOpen, setIsOpen] = React.useState(false);
const menuRef = React.useRef<HTMLDivElement>(null);
// Fecha o menu quando clicar fora dele
React.useEffect(() => {
function handleClickOutside(event: MouseEvent) {
if (menuRef.current && !menuRef.current.contains(event.target as Node)) {
setIsOpen(false);
}
}
document.addEventListener('mousedown', handleClickOutside);
return () => document.removeEventListener('mousedown', handleClickOutside);
}, []);
const getDashboardPath = () => {
switch (userRole) {
case 'school':
return '/dashboard';
case 'teacher':
return '/professor';
case 'student':
return '/aluno';
default:
return '/';
}
};
const getProfilePath = () => {
switch (userRole) {
case 'school':
return '/dashboard/configuracoes';
case 'teacher':
return '/professor/perfil';
case 'student':
return '/aluno/perfil';
default:
return '/';
}
};
return (
<div className="relative" ref={menuRef}>
<button
onClick={() => setIsOpen(!isOpen)}
className="w-10 h-10 rounded-full bg-purple-100 flex items-center justify-center hover:bg-purple-200 transition"
>
<span className="text-lg font-medium text-purple-600">
{user?.user_metadata?.name?.[0]?.toUpperCase() || user?.email?.[0]?.toUpperCase()}
</span>
</button>
{isOpen && (
<div className="absolute right-0 mt-2 w-48 bg-white rounded-lg shadow-lg py-1 border border-gray-200">
<button
onClick={() => {
navigate(getDashboardPath());
setIsOpen(false);
}}
className="w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 flex items-center gap-2"
>
<LayoutDashboard className="h-4 w-4" />
Acessar Dashboard
</button>
<button
onClick={() => {
navigate(getProfilePath());
setIsOpen(false);
}}
className="w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 flex items-center gap-2"
>
<Settings className="h-4 w-4" />
Meu Perfil
</button>
<hr className="my-1" />
<button
onClick={signOut}
className="w-full px-4 py-2 text-left text-sm text-red-600 hover:bg-gray-100 flex items-center gap-2"
>
<LogOut className="h-4 w-4" />
Sair
</button>
</div>
)}
</div>
);
}