import React, { useState, useMemo } from 'react' import DraggablePlaceCard from './DraggablePlaceCard' import { Search, Plus, Filter, Map, X, SlidersHorizontal } from 'lucide-react' export default function PlacesPanel({ places, categories, tags, assignments, tripId, onAddPlace, onEditPlace, hasMapKey, onSearchMaps, }) { const [search, setSearch] = useState('') const [selectedCategory, setSelectedCategory] = useState('') const [selectedTags, setSelectedTags] = useState([]) const [showFilters, setShowFilters] = useState(false) // Get set of assigned place IDs (for any day) const assignedPlaceIds = useMemo(() => { const ids = new Set() Object.values(assignments || {}).forEach(dayAssignments => { dayAssignments.forEach(a => { if (a.place?.id) ids.add(a.place.id) }) }) return ids }, [assignments]) const filteredPlaces = useMemo(() => { return places.filter(place => { if (search) { const q = search.toLowerCase() if (!place.name.toLowerCase().includes(q) && !place.address?.toLowerCase().includes(q) && !place.description?.toLowerCase().includes(q)) { return false } } if (selectedCategory && place.category_id !== parseInt(selectedCategory)) { return false } if (selectedTags.length > 0) { const placeTags = (place.tags || []).map(t => t.id) if (!selectedTags.every(tagId => placeTags.includes(tagId))) { return false } } return true }) }, [places, search, selectedCategory, selectedTags]) const toggleTag = (tagId) => { setSelectedTags(prev => prev.includes(tagId) ? prev.filter(id => id !== tagId) : [...prev, tagId] ) } const clearFilters = () => { setSearch('') setSelectedCategory('') setSelectedTags([]) } const hasActiveFilters = search || selectedCategory || selectedTags.length > 0 return (
{/* Header */}

Places ({filteredPlaces.length}{filteredPlaces.length !== places.length ? `/${places.length}` : ''})

{hasMapKey && ( )}
{/* Search */}
setSearch(e.target.value)} placeholder="Search places..." className="w-full pl-8 pr-3 py-1.5 text-sm border border-slate-200 rounded-lg focus:ring-2 focus:ring-slate-900 focus:border-transparent transition-all" /> {search && ( )}
{/* Filters */} {showFilters && (
{/* Category filter */} {categories.length > 0 && ( )} {/* Tag filters */} {tags.length > 0 && (
{tags.map(tag => ( ))}
)} {hasActiveFilters && ( )}
)}
{/* Add place button */}
{/* Places list */}
{filteredPlaces.length === 0 ? (
{places.length === 0 ? ( <>

No places yet

Add places and drag them to days

) : ( <>

No matches found

Try adjusting your filters

)}
) : ( filteredPlaces.map(place => ( )) )}
) }