import React, { useState, useRef } from 'react'; import { User as UserIcon, Shield, CreditCard, Mail, Phone, Calendar, ArrowLeft, Camera, Edit2, Save, X, Loader2 } from 'lucide-react'; import { User } from '../types'; interface ProfileViewProps { user: User; onBack: () => void; onUpdateUser?: (updated: User) => void; } export default function ProfileView({ user, onBack, onUpdateUser }: ProfileViewProps) { const [isEditing, setIsEditing] = useState(false); const [name, setName] = useState(user.name); const [whatsapp, setWhatsapp] = useState(user.whatsapp || ''); const [birthDate, setBirthDate] = useState(user.birthDate || ''); const [cpf, setCpf] = useState(user.cpf || ''); const [isSaving, setIsSaving] = useState(false); const [isUploading, setIsUploading] = useState(false); const fileInputRef = useRef(null); const getStatusColor = (status: string) => { switch (status) { case 'ACTIVE': return 'bg-emerald-500/20 text-emerald-400 border-emerald-500/50'; case 'TRIAL': return 'bg-amber-500/20 text-amber-400 border-amber-500/50'; case 'OVERDUE': return 'bg-red-500/20 text-red-400 border-red-500/50'; case 'CANCELED': return 'bg-zinc-800 text-zinc-400 border-zinc-700'; default: return 'bg-zinc-800 text-white border-zinc-700'; } }; const getStatusLabel = (status: string) => { switch (status) { case 'ACTIVE': return 'Assinatura Ativa'; case 'TRIAL': return 'Período de Teste'; case 'OVERDUE': return 'Pagamento Pendente'; case 'CANCELED': return 'Assinatura Cancelada'; default: return status; } }; const handleSave = async () => { setIsSaving(true); try { const token = localStorage.getItem('devflix_token'); const res = await fetch('/api/users/profile', { method: 'PUT', headers: { 'Content-Type': 'application/json', ...(token && { Authorization: `Bearer ${token}` }) }, body: JSON.stringify({ name, whatsapp, birthDate, cpf }) }); const data = await res.json(); if (data.success && onUpdateUser) { onUpdateUser(data.user); setIsEditing(false); } else { alert(data.error || 'Erro ao atualizar perfil'); } } catch (err) { alert('Erro de conexão ao salvar perfil'); } finally { setIsSaving(false); } }; const handleFileChange = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; setIsUploading(true); const formData = new FormData(); formData.append('avatar', file); try { const token = localStorage.getItem('devflix_token'); const res = await fetch('/api/users/avatar', { method: 'POST', headers: { ...(token && { Authorization: `Bearer ${token}` }) }, body: formData }); const data = await res.json(); if (data.success && onUpdateUser) { onUpdateUser({ ...user, avatarUrl: data.avatarUrl }); } else { alert(data.error || 'Erro ao fazer upload da foto'); } } catch (err) { alert('Erro de conexão ao enviar foto'); } finally { setIsUploading(false); } }; return (
{!isEditing ? ( ) : (
)}
{/* Avatar Area */}
fileInputRef.current?.click()}>
{isUploading ? ( ) : user.avatarUrl ? ( Avatar ) : ( )}
{getStatusLabel(user.subscriptionStatus)}
{/* User Info */}
{isEditing ? (
setName(e.target.value)} className="w-full glass-input rounded-lg p-2 text-xl font-bold text-white focus:outline-none focus:border-[#E50914]" />
) : ( <>

{user.name}

{user.role === 'admin' ? 'Administrador do Sistema' : 'Aluno'}

)}

CPF

{isEditing ? (
setCpf(e.target.value.replace(/\D/g, '').replace(/(\d{3})(\d)/, '$1.$2').replace(/(\d{3})(\d)/, '$1.$2').replace(/(\d{3})(\d{1,2})$/, '$1-$2'))} placeholder="000.000.000-00" maxLength={14} className="w-full bg-black/50 border border-white/10 rounded-md p-1.5 text-sm text-white focus:outline-none focus:border-[#E50914]" />
) : (

{user.cpf || 'Não informado'}

)}

Email

{user.email}

WhatsApp

{isEditing ? (
setWhatsapp(e.target.value)} placeholder="(11) 99999-9999" className="w-full bg-black/50 border border-white/10 rounded-md p-1.5 text-sm text-white focus:outline-none focus:border-[#E50914]" />
) : (

{user.whatsapp || 'Não informado'}

)}

Data de Nascimento

{isEditing ? (
setBirthDate(e.target.value)} className="w-full bg-black/50 border border-white/10 rounded-md p-1.5 text-sm text-white focus:outline-none focus:border-[#E50914] [color-scheme:dark]" />
) : (

{user.birthDate ? new Date(user.birthDate).toLocaleDateString('pt-BR') : 'Não informado'}

)}

Membro desde

{user.createdAt ? new Date(user.createdAt).toLocaleDateString('pt-BR') : 'Não disponível'}

CPF

{user.cpf ? user.cpf.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, "$1.$2.$3-$4") : 'Não informado'}

{user.role === 'admin' && (

Acesso Administrativo

Você tem permissão total para gerenciar cursos, alunos e assinaturas.

)}
); }