import React, { useEffect, useState } from 'react'; import './ProfileView.css'; import { getUserPosition } from '../utils/geo'; function ProfileView({ currentUser, onProfileSaved, onShowSaved, onLogout, onAdminClick }) { const [address, setAddress] = useState(currentUser?.address || ''); const [latitude, setLatitude] = useState( currentUser?.latitude != null ? String(currentUser.latitude) : '' ); const [longitude, setLongitude] = useState( currentUser?.longitude != null ? String(currentUser.longitude) : '' ); const [saving, setSaving] = useState(false); const [geocoding, setGeocoding] = useState(false); const [locating, setLocating] = useState(false); const [feedback, setFeedback] = useState(null); useEffect(() => { setAddress(currentUser?.address || ''); setLatitude(currentUser?.latitude != null ? String(currentUser.latitude) : ''); setLongitude(currentUser?.longitude != null ? String(currentUser.longitude) : ''); setFeedback(null); }, [currentUser?.id]); async function handleSave(e) { e?.preventDefault(); setSaving(true); setFeedback(null); try { const res = await fetch('/api/users/me', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ address: address.trim() || null, latitude: latitude === '' ? null : latitude, longitude: longitude === '' ? null : longitude, }), }); if (!res.ok) { const err = await res.json().catch(() => ({})); throw new Error(err.error || `Error al guardar (HTTP ${res.status})`); } const updated = await res.json(); onProfileSaved?.(updated); setFeedback({ type: 'ok', text: 'Perfil guardado.' }); } catch (err) { setFeedback({ type: 'err', text: err.message || 'Error al guardar' }); } finally { setSaving(false); } } async function handleUseLocation() { setLocating(true); setFeedback(null); try { const pos = await getUserPosition(); setLatitude(String(pos.lat)); setLongitude(String(pos.lon)); setFeedback({ type: 'ok', text: 'Ubicación obtenida — recuerda Guardar.' }); } catch (err) { let msg = 'No se pudo obtener la ubicación'; if (err && typeof err.code === 'number') { if (err.code === 1) msg = 'Permiso de ubicación denegado'; else if (err.code === 2) msg = 'Ubicación no disponible'; else if (err.code === 3) msg = 'La solicitud expiró'; } setFeedback({ type: 'err', text: msg }); } finally { setLocating(false); } } async function handleGeocode() { const q = address.trim(); if (!q) { setFeedback({ type: 'err', text: 'Ingresa una dirección primero.' }); return; } setGeocoding(true); setFeedback(null); try { const res = await fetch(`/api/geocode?q=${encodeURIComponent(q)}`, { credentials: 'include', }); if (!res.ok) { const err = await res.json().catch(() => ({})); throw new Error(err.error || `Error en la búsqueda (HTTP ${res.status})`); } const data = await res.json(); setLatitude(String(data.lat)); setLongitude(String(data.lon)); setFeedback({ type: 'ok', text: `Ubicado: ${data.displayName} — recuerda Guardar.`, }); } catch (err) { setFeedback({ type: 'err', text: err.message || 'Error en la búsqueda' }); } finally { setGeocoding(false); } } const username = currentUser?.username || 'Usuario'; return (

Mi Perfil

Nombre

{username}

{currentUser?.is_admin && ( )}

Tu Ubicación

Guarda tu dirección para ordenar por distancia sin pedir permiso cada vez.

setAddress(e.target.value)} autoComplete="street-address" disabled={saving} />
setLatitude(e.target.value)} disabled={saving} />
setLongitude(e.target.value)} disabled={saving} />
{feedback && (

{feedback.text}

)}
); } export default ProfileView;