import React, { useState, useEffect } from 'react' import Modal from '../shared/Modal' import CustomSelect from '../shared/CustomSelect' import { mapsApi } from '../../api/client' import { useAuthStore } from '../../store/authStore' import { useToast } from '../shared/Toast' import { Search } from 'lucide-react' import { useTranslation } from '../../i18n' import CustomTimePicker from '../shared/CustomTimePicker' import { CustomDateTimePicker } from '../shared/CustomDateTimePicker' const TRANSPORT_MODES = [ { value: 'walking', labelKey: 'places.transport.walking' }, { value: 'driving', labelKey: 'places.transport.driving' }, { value: 'cycling', labelKey: 'places.transport.cycling' }, { value: 'transit', labelKey: 'places.transport.transit' }, ] const DEFAULT_FORM = { name: '', description: '', address: '', lat: '', lng: '', category_id: '', place_time: '', notes: '', transport_mode: 'walking', reservation_status: 'none', reservation_notes: '', reservation_datetime: '', website: '', } export default function PlaceFormModal({ isOpen, onClose, onSave, place, tripId, categories, onCategoryCreated, }) { const [form, setForm] = useState(DEFAULT_FORM) const [mapsSearch, setMapsSearch] = useState('') const [mapsResults, setMapsResults] = useState([]) const [isSearchingMaps, setIsSearchingMaps] = useState(false) const [newCategoryName, setNewCategoryName] = useState('') const [showNewCategory, setShowNewCategory] = useState(false) const [isSaving, setIsSaving] = useState(false) const toast = useToast() const { t, language } = useTranslation() const { hasMapsKey } = useAuthStore() useEffect(() => { if (place) { setForm({ name: place.name || '', description: place.description || '', address: place.address || '', lat: place.lat || '', lng: place.lng || '', category_id: place.category_id || '', place_time: place.place_time || '', notes: place.notes || '', transport_mode: place.transport_mode || 'walking', reservation_status: place.reservation_status || 'none', reservation_notes: place.reservation_notes || '', reservation_datetime: place.reservation_datetime || '', website: place.website || '', }) } else { setForm(DEFAULT_FORM) } }, [place, isOpen]) const handleChange = (field, value) => { setForm(prev => ({ ...prev, [field]: value })) } const handleMapsSearch = async () => { if (!mapsSearch.trim()) return setIsSearchingMaps(true) try { const result = await mapsApi.search(mapsSearch, language) setMapsResults(result.places || []) } catch (err) { toast.error(t('places.mapsSearchError')) } finally { setIsSearchingMaps(false) } } const handleSelectMapsResult = (result) => { setForm(prev => ({ ...prev, name: result.name || prev.name, address: result.address || prev.address, lat: result.lat || prev.lat, lng: result.lng || prev.lng, google_place_id: result.google_place_id || prev.google_place_id, })) setMapsResults([]) setMapsSearch('') } const handleCreateCategory = async () => { if (!newCategoryName.trim()) return try { const cat = await onCategoryCreated?.({ name: newCategoryName, color: '#6366f1', icon: 'MapPin' }) if (cat) setForm(prev => ({ ...prev, category_id: cat.id })) setNewCategoryName('') setShowNewCategory(false) } catch (err) { toast.error(t('places.categoryCreateError')) } } const handleSubmit = async (e) => { e.preventDefault() if (!form.name.trim()) { toast.error(t('places.nameRequired')) return } setIsSaving(true) try { await onSave({ ...form, lat: form.lat ? parseFloat(form.lat) : null, lng: form.lng ? parseFloat(form.lng) : null, category_id: form.category_id || null, }) onClose() } catch (err) { toast.error(err.message || t('places.saveError')) } finally { setIsSaving(false) } } return (
{/* Place Search */}
{!hasMapsKey && (

{t('places.osmActive')}

)}
setMapsSearch(e.target.value)} onKeyDown={e => e.key === 'Enter' && (e.preventDefault(), handleMapsSearch())} placeholder={t('places.mapsSearchPlaceholder')} className="flex-1 border border-slate-200 rounded-lg px-3 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-slate-400 bg-white" />
{mapsResults.length > 0 && (
{mapsResults.map((result, idx) => ( ))}
)}
{/* Name */}
handleChange('name', e.target.value)} required placeholder={t('places.formNamePlaceholder')} className="form-input" />
{/* Description */}