import { useRef, useState } from 'react'; import { imgUrl, uploadImage } from '../../api.js'; /** * Besuch einer Stadt eintragen oder bearbeiten: Zeitraum, Begleitung, Notizen, Fotos. * Fotos werden beim Hochladen auf dem Server von Metadaten (GPS usw.) befreit. * onSave(body) / onDelete() liefern bei Erfolg den neuen Stand (truthy). */ // pageError: Fehlermeldung der Seite (z. B. vom Speichern) – im Dialog anzeigen, sonst läge sie verdeckt dahinter export default function VisitDialog({ ref, city, visit, onSave, onDelete, onLivedThere, busy, pageError }) { const today = new Date().toISOString().slice(0, 10); const [form, setForm] = useState(() => ({ dateFrom: visit?.dateFrom || today, dateTo: visit?.dateTo || '', companions: visit?.companions || '', notes: visit?.notes || '', photos: visit?.photos || [], // Anreise: '' automatisch, 'home' von zuhause, 'continued' vom vorherigen Ort weitergereist (Rundreise) arrival: visit?.continued == null ? '' : visit.continued ? 'continued' : 'home', })); const [uploading, setUploading] = useState(0); const [error, setError] = useState(null); const fileInput = useRef(null); const field = (name) => ({ value: form[name], onChange: (e) => setForm((f) => ({ ...f, [name]: e.target.value })) }); async function addPhotos(files) { setError(null); for (const file of files) { setUploading((n) => n + 1); try { const name = await uploadImage(file); setForm((f) => ({ ...f, photos: [...f.photos, name] })); } catch (e) { setError(`${file.name}: ${e.message}`); } finally { setUploading((n) => n - 1); } } } async function submit(e) { e.preventDefault(); const { arrival, ...rest } = form; const continued = arrival === '' ? null : arrival === 'continued'; if (await onSave({ ...rest, dateTo: form.dateTo || null, continued })) ref.current.close(); } async function remove() { if (!window.confirm(`Besuch in ${city.name} löschen?`)) return; if (await onDelete()) ref.current.close(); } return (

{visit ? 'Besuch bearbeiten' : 'Besuch eintragen'} – {city.name}

„Bis“ leer lassen für einen einzelnen Tag.