import React, { useState, useEffect, useRef } from 'react'; import { Camera, Save, Mail, User as UserIcon, Building, Shield, Loader2, CheckCircle2 } from 'lucide-react'; import { getUserById, getTenants, 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 [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(''); 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 || ''); // Fetch tenant info const tenants = await getTenants(); const userTenant = tenants.find(t => t.id === fetchedUser.tenant_id); if (userTenant) { setTenant(userTenant); } } } 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 }); if (success) { setIsSuccess(true); setUser({ ...user, name, bio }); 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`; 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 && ( {tenant?.name ? `Time ${tenant.name}` : 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)} className="block w-full pl-10 pr-3 py-2 border border-zinc-200 dark:border-zinc-800 rounded-lg 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 transition-all sm:text-sm" />

Contate o admin para alterar o e-mail.