import { useEffect, useState } from 'react'; import { publicAuthService } from '../services/authService'; import { useNavigate } from 'react-router-dom'; import { motion, AnimatePresence } from 'framer-motion'; import type { Listing } from '../types'; import { User, Package, Settings, ChevronRight, Clock, Eye, ShieldCheck, QrCode, Lock, Bell, RefreshCcw } from 'lucide-react'; import { usePublicAuthStore } from '../store/publicAuthStore'; import api from '../services/api'; import LazyImage from '../components/LazyImage'; import { useWizardStore } from '../store/wizardStore'; import clsx from 'clsx'; interface MfaData { qrCodeUri: string; secret: string; } type TabType = 'listings' | 'security' | 'settings'; export default function ProfilePage() { const { user, logout } = usePublicAuthStore(); const [activeTab, setActiveTab] = useState('listings'); const [listings, setListings] = useState([]); const [loading, setLoading] = useState(true); const [mfaSetupData, setMfaSetupData] = useState(null); const [mfaCode, setMfaCode] = useState(''); const baseUrl = import.meta.env.VITE_BASE_URL; const setRepublishData = useWizardStore(state => state.setRepublishData); const [republishTarget, setRepublishTarget] = useState(null); const navigate = useNavigate(); useEffect(() => { if (!user) { navigate('/login'); return; } loadMyData(); }, [navigate, user]); const handleConfirmRepublish = async () => { if (!republishTarget) return; try { // Buscamos el detalle técnico (Modelo, KM, Puertas, etc.) const res = await api.get(`/listings/${republishTarget.id}`); // Cargamos el Store con toda la data setRepublishData(res.data); // Navegamos al Wizard navigate('/publicar'); } catch (error) { alert("Error al recuperar datos técnicos del aviso"); } finally { setRepublishTarget(null); } }; const loadMyData = async () => { try { const response = await api.get('/listings/my'); setListings(response.data); } catch (error) { console.error("Error al cargar datos del perfil", error); } finally { setLoading(false); } }; const handleSetupMfa = async () => { try { const data = await publicAuthService.setupMfa(); setMfaSetupData(data); } catch (error) { console.error("Error al configurar MFA", error); } }; const handleVerifyAndEnableMfa = async () => { if (mfaCode.length !== 6) return; try { const res = await publicAuthService.verifyMfa(mfaCode); if (res.success) { alert("¡MFA activado con éxito!"); setMfaSetupData(null); setMfaCode(''); } } catch (error) { alert("Error al verificar código."); } }; const handleUpdateOverlay = async (id: number, status: string | null) => { try { await api.patch(`/listings/${id}/overlay`, JSON.stringify(status), { headers: { 'Content-Type': 'application/json' } }); loadMyData(); } catch (error) { alert("Error al actualizar estado"); } }; if (loading) return (
); return (
{/* 1. HEADER REFINADO (Más bajo y elegante) */}
{/* Luces de fondo más tenues */}
{/* Avatar más integrado */}

{user?.username}

Verificado
{listings.filter(l => l.status === 'Published').length} ACTIVAS
Miembro desde 2025
{/* 2. CONTENIDO (Sidebar + Main) */}
{/* SIDEBAR MÁS ESTILIZADO */} {/* CONTENIDO DINÁMICO */}
{activeTab === 'listings' && (

Historial de anuncios

{listings.length === 0 ? (

Sin actividad reciente

) : (
{listings.map(item => (
{/* Contenedor de imagen con tamaño fijo y aspecto cuadrado */}
{item.mainImageUrl ? ( ) : (
)}

{item.title}

{new Date(item.createdAt).toLocaleDateString()} {item.viewCount} vistas

${item.price.toLocaleString()}

{/* BADGE DINÁMICO DE ESTADO */} {item.status === 'Published' ? 'Publicado' : item.status === 'Pending' ? 'En Revisión' : 'Borrador'}
{/* PANEL DE GESTIÓN */}
{['Vendido', 'Reservado', 'Alquilado'].map(status => ( ))}
))}
)}
)} {/* TAB: SEGURIDAD / MFA */} {activeTab === 'security' && (

Protección de Cuenta

Gestiona la seguridad de tu acceso y la verificación en dos pasos.

{/* Card MFA */}

Doble Factor de Autenticación (TOTP)

Añade una capa extra de seguridad usando Google Authenticator o similares.

{!mfaSetupData ? ( ) : (

1. Escanea este código

QR

2. Introduce el código de 6 dígitos

setMfaCode(e.target.value)} placeholder="000000" className="flex-1 bg-slate-50 border-none rounded-xl text-center font-mono font-bold text-xl py-3 focus:ring-2 focus:ring-blue-500 transition-all" />
)}
{/* Card Password Change */}

Cambiar Contraseña

Último cambio: Hace 3 meses

)} {/* TAB: AJUSTES */} {activeTab === 'settings' && (

Ajustes de cuenta

)}
{/* MODAL DE CONFIRMACIÓN */} {republishTarget && (
setRepublishTarget(null)} className="absolute inset-0 bg-slate-900/60 backdrop-blur-sm" />

Republicar Aviso

Se creará una nueva publicación basada en {republishTarget.title}. Podrás editar los datos antes de realizar el pago.

)}
); } // COMPONENTES AUXILIARES PARA LIMPIEZA function SidebarItem({ icon, label, active, onClick }: { icon: any, label: string, active: boolean, onClick: () => void }) { return ( ); } function InputGroup({ label, value, disabled, placeholder }: any) { return (
); }