"use client"; import { useState, useEffect } from 'react'; import Link from 'next/link'; import { usePathname, useRouter } from 'next/navigation'; import { useToast } from '@/contexts/ToastContext'; import { useConfirm } from '@/contexts/ConfirmContext'; export default function AdminLayout({ children, }: { children: React.ReactNode; }) { const [isSidebarOpen, setIsSidebarOpen] = useState(true); const [user, setUser] = useState<{ name: string; email: string; avatar?: string | null } | null>(null); const [showAvatarModal, setShowAvatarModal] = useState(false); const [isUploading, setIsUploading] = useState(false); const pathname = usePathname(); const router = useRouter(); const { success, error } = useToast(); const { confirm } = useConfirm(); useEffect(() => { const fetchUser = async () => { try { const response = await fetch('/api/auth/me'); if (response.ok) { const data = await response.json(); setUser(data.user); } } catch (error) { console.error('Erro ao buscar dados do usuário:', error); } }; fetchUser(); }, []); const handleLogout = async () => { try { await fetch('/api/auth/logout', { method: 'POST' }); router.push('/acesso'); } catch (error) { console.error('Erro ao fazer logout:', error); // Fallback: clear cookie manually document.cookie = "auth_token=; path=/; expires=Thu, 01 Jan 1970 00:00:01 GMT"; router.push('/acesso'); } }; const handleAvatarUpload = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; setIsUploading(true); try { const formData = new FormData(); formData.append('avatar', file); const response = await fetch('/api/auth/avatar', { method: 'POST', body: formData, }); if (response.ok) { const data = await response.json(); setUser(data.user); setShowAvatarModal(false); success('Foto atualizada com sucesso!'); } else { const errorData = await response.json(); error(errorData.error || 'Erro ao fazer upload'); } } catch (err) { console.error('Erro ao fazer upload:', err); error('Erro ao fazer upload do avatar'); } finally { setIsUploading(false); } }; const handleRemoveAvatar = async () => { const confirmed = await confirm({ title: 'Remover Foto', message: 'Deseja remover sua foto de perfil?', confirmText: 'Remover', cancelText: 'Cancelar', type: 'warning', }); if (!confirmed) return; try { const response = await fetch('/api/auth/avatar', { method: 'DELETE' }); if (response.ok) { const data = await response.json(); setUser(data.user); setShowAvatarModal(false); success('Foto removida com sucesso!'); } } catch (err) { console.error('Erro ao remover avatar:', err); error('Erro ao remover avatar'); } }; const menuItems = [ { icon: 'ri-dashboard-line', label: 'Dashboard', href: '/admin' }, { icon: 'ri-briefcase-line', label: 'Projetos', href: '/admin/projetos' }, { icon: 'ri-tools-line', label: 'Serviços', href: '/admin/servicos' }, { icon: 'ri-pages-line', label: 'Páginas', href: '/admin/paginas' }, { icon: 'ri-message-3-line', label: 'Mensagens', href: '/admin/mensagens' }, { icon: 'ri-user-settings-line', label: 'Usuários', href: '/admin/usuarios' }, { icon: 'ri-settings-3-line', label: 'Configurações', href: '/admin/configuracoes' }, ]; return (
{/* Sidebar */} {/* Main Content */}
{/* Header */}

{user?.name || 'Carregando...'}

{user?.email || ''}

{/* Page Content */}
{children}
{/* Avatar Modal */} {showAvatarModal && (
setShowAvatarModal(false)}>
e.stopPropagation()}>

Foto de Perfil

{user?.avatar ? ( {user.name} ) : (
)}
{user?.avatar && ( )}

Formatos: JPEG, PNG, WEBP • Tamanho máximo: 5MB

)}
); }