'use client'; import { useEffect, useState } from 'react'; import { UserCircleIcon, EnvelopeIcon, PhoneIcon, BuildingOfficeIcon, KeyIcon, CalendarIcon, ChartBarIcon, ClockIcon, ShieldCheckIcon, ArrowPathIcon, CameraIcon, PhotoIcon } from '@heroicons/react/24/outline'; import { Button, Input } from '@/components/ui'; import { useToast } from '@/components/layout/ToastContext'; interface CustomerProfile { id: string; name: string; email: string; phone: string; company: string; logo_url?: string; portal_last_login: string | null; created_at: string; total_leads: number; converted_leads: number; } export default function PerfilPage() { const toast = useToast(); const [profile, setProfile] = useState(null); const [isLoading, setIsLoading] = useState(true); const [isChangingPassword, setIsChangingPassword] = useState(false); const [isUploadingLogo, setIsUploadingLogo] = useState(false); const [passwordForm, setPasswordForm] = useState({ current_password: '', new_password: '', confirm_password: '', }); const [passwordError, setPasswordError] = useState(null); const [passwordSuccess, setPasswordSuccess] = useState(false); useEffect(() => { fetchProfile(); }, []); const fetchProfile = async () => { try { const token = localStorage.getItem('token'); const res = await fetch('/api/portal/profile', { headers: { 'Authorization': `Bearer ${token}`, }, }); if (!res.ok) throw new Error('Erro ao carregar perfil'); const data = await res.json(); setProfile(data.customer); } catch (error) { console.error('Erro ao carregar perfil:', error); } finally { setIsLoading(false); } }; const handleLogoUpload = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; // Validar tamanho (2MB) if (file.size > 2 * 1024 * 1024) { toast.error('Arquivo muito grande', 'O logo deve ter no máximo 2MB.'); return; } const formData = new FormData(); formData.append('logo', file); setIsUploadingLogo(true); try { const token = localStorage.getItem('token'); const res = await fetch('/api/portal/logo', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, }, body: formData, }); if (!res.ok) throw new Error('Erro ao fazer upload do logo'); const data = await res.json(); setProfile(prev => prev ? { ...prev, logo_url: data.logo_url } : null); toast.success('Logo atualizado', 'Seu logo foi atualizado com sucesso.'); } catch (error) { console.error('Error uploading logo:', error); toast.error('Erro no upload', 'Não foi possível atualizar seu logo.'); } finally { setIsUploadingLogo(false); } }; const handlePasswordChange = async (e: React.FormEvent) => { e.preventDefault(); setPasswordError(null); setPasswordSuccess(false); if (passwordForm.new_password !== passwordForm.confirm_password) { setPasswordError('As senhas não coincidem'); return; } if (passwordForm.new_password.length < 6) { setPasswordError('A nova senha deve ter no mínimo 6 caracteres'); return; } setIsChangingPassword(true); try { const token = localStorage.getItem('token'); const res = await fetch('/api/portal/change-password', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}`, }, body: JSON.stringify({ current_password: passwordForm.current_password, new_password: passwordForm.new_password, }), }); const data = await res.json(); if (!res.ok) throw new Error(data.error || 'Erro ao alterar senha'); setPasswordSuccess(true); setPasswordForm({ current_password: '', new_password: '', confirm_password: '', }); } catch (error: any) { setPasswordError(error.message); } finally { setIsChangingPassword(false); } }; if (isLoading) { return (

Carregando seu perfil...

); } if (!profile) { return (

Ops! Algo deu errado

Não conseguimos carregar suas informações. Por favor, tente novamente mais tarde.

); } return (
{/* Header */}

Meu Perfil

Gerencie suas informações pessoais e segurança da conta.

{/* Coluna da Esquerda: Info do Usuário */}
{/* Card de Informações Básicas */}
{profile.logo_url ? ( {profile.name} ) : ( )} {isUploadingLogo && (
)}

{profile.name}

{profile.company || 'Cliente Aggios'}

Conta Ativa

E-mail

{profile.email}

Telefone

{profile.phone || 'Não informado'}

Membro desde

{new Date(profile.created_at).toLocaleDateString('pt-BR', { day: '2-digit', month: 'long', year: 'numeric' })}

Último Acesso

{profile.portal_last_login ? new Date(profile.portal_last_login).toLocaleString('pt-BR') : 'Primeiro acesso'}

{/* Card de Estatísticas Rápidas */}

Total de Leads

{profile.total_leads}

Leads Convertidos

{profile.converted_leads}

{/* Coluna da Direita: Segurança */}

Segurança

setPasswordForm({ ...passwordForm, current_password: e.target.value })} required />
setPasswordForm({ ...passwordForm, new_password: e.target.value })} required minLength={6} />
setPasswordForm({ ...passwordForm, confirm_password: e.target.value })} required minLength={6} />
{passwordError && (
{passwordError}
)} {passwordSuccess && (
Senha alterada com sucesso!
)}

Precisa de ajuda?

Se você tiver problemas com sua conta ou precisar alterar dados cadastrais, entre em contato com o suporte da agência.

suporte@aggios.app
); }