import React, { useState, useEffect, useRef } from 'react'; import { Camera, Save, Mail, User as UserIcon, Building, Shield, Loader2, CheckCircle2, Bell } from 'lucide-react'; import { getUserById, getTenants, getTeams, updateUser, uploadAvatar } from '../services/dataService'; import { User, Tenant } from '../types'; export const UserProfile: React.FC = () => { const [user, setUser] = useState(null); const [tenant, setTenant] = useState(null); const [teamName, setTeamName] = useState(''); const [isLoading, setIsLoading] = useState(false); const [isSuccess, setIsSuccess] = useState(false); const [isUploading, setIsUploading] = useState(false); const fileInputRef = useRef(null); const [name, setName] = useState(''); const [bio, setBio] = useState(''); const [email, setEmail] = useState(''); useEffect(() => { const fetchUserAndTenant = async () => { const storedUserId = localStorage.getItem('ctms_user_id'); if (storedUserId) { try { const fetchedUser = await getUserById(storedUserId); if (fetchedUser) { setUser(fetchedUser); setName(fetchedUser.name); setBio(fetchedUser.bio || ''); setEmail(fetchedUser.email); // Fetch tenant info const tenants = await getTenants(); const userTenant = tenants.find(t => t.id === fetchedUser.tenant_id); if (userTenant) { setTenant(userTenant); } if (fetchedUser.team_id) { const teams = await getTeams(fetchedUser.tenant_id); const userTeam = teams.find(t => t.id === fetchedUser.team_id); if (userTeam) setTeamName(userTeam.name); } } } catch (err) { console.error("Error fetching profile data:", err); } } }; fetchUserAndTenant(); }, []); const handleAvatarClick = () => { fileInputRef.current?.click(); }; const handleFileChange = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file || !user) return; if (file.size > 2 * 1024 * 1024) { alert('Arquivo muito grande. Máximo de 2MB.'); return; } setIsUploading(true); try { const newUrl = await uploadAvatar(user.id, file); if (newUrl) { setUser({ ...user, avatar_url: newUrl }); window.location.reload(); } else { alert('Erro ao fazer upload da imagem.'); } } catch (err) { console.error(err); alert('Erro ao conectar ao servidor.'); } finally { setIsUploading(false); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!user) return; setIsLoading(true); setIsSuccess(false); try { const success = await updateUser(user.id, { name, bio, email }); if (success) { setIsSuccess(true); setUser({ ...user, name, bio, email }); setTimeout(() => setIsSuccess(false), 3000); } else { alert('Erro ao salvar alterações no servidor.'); } } catch (err) { console.error("Submit failed:", err); alert('Erro ao conectar ao servidor.'); } finally { setIsLoading(false); } }; if (!user) return
Carregando perfil...
; const backendUrl = import.meta.env.PROD ? '' : 'http://localhost:3001'; const displayAvatar = user.avatar_url ? (user.avatar_url.startsWith('http') ? user.avatar_url : `${backendUrl}${user.avatar_url}`) : `https://ui-avatars.com/api/?name=${encodeURIComponent(user.name)}&background=random`; const canEditEmail = user.role === 'admin' || user.role === 'super_admin'; return (

Meu Perfil

Gerencie suas informações pessoais e preferências.

{/* Left Column: Avatar & Basic Info */}
{isUploading ? ( ) : ( {user.name} )}

{user.name}

{user.email}

{user.role === 'admin' ? 'Admin' : user.role === 'manager' ? 'Gerente' : user.role === 'super_admin' ? 'Super Admin' : 'Agente'} {user.team_id && ( {teamName || user.team_id} )}

Status da Conta

{user.status === 'active' ? 'Ativo' : 'Inativo'}
{tenant?.name || 'Organização'}
{/* Right Column: Edit Form */}

Informações Pessoais

{isSuccess && ( Salvo com sucesso )}
setName(e.target.value)} disabled={user.role === 'agent'} className={`block w-full pl-10 pr-3 py-2 border border-zinc-200 dark:border-zinc-800 rounded-lg sm:text-sm transition-all ${ user.role === 'agent' ? 'bg-zinc-50 dark:bg-zinc-900/50 text-zinc-500 dark:text-zinc-500 cursor-not-allowed' : 'bg-white dark:bg-zinc-950 text-zinc-900 dark:text-zinc-100 placeholder-zinc-400 dark:placeholder-zinc-600 focus:outline-none focus:ring-2 focus:ring-yellow-400/20 focus:border-yellow-400' }`} />
{user.role === 'agent' && (

Contate um administrador para alterar seu nome.

)}
setEmail(e.target.value)} disabled={!canEditEmail} className={`block w-full pl-10 pr-3 py-2 border border-zinc-200 dark:border-zinc-800 rounded-lg sm:text-sm transition-all ${ !canEditEmail ? 'bg-zinc-50 dark:bg-zinc-900/50 text-zinc-500 dark:text-zinc-500 cursor-not-allowed' : 'bg-white dark:bg-zinc-950 text-zinc-900 dark:text-zinc-100 placeholder-zinc-400 dark:placeholder-zinc-600 focus:outline-none focus:ring-2 focus:ring-brand-yellow/20 focus:border-brand-yellow' }`} />
{!canEditEmail &&

Contate o admin para alterar o e-mail.

}