import { Place } from '@/types/types'; import { ChevronDown, Search, X } from 'lucide-react-native'; import React, { useState, useEffect, useMemo } from 'react'; import { Modal, FlatList, Text, TextInput, TouchableOpacity, View, Keyboard, KeyboardEvent, Platform } from 'react-native'; interface PlaceFilterProps { places: Place[]; selectedPlaceId: any; onPlaceSelect: (placeId: any) => void; textColor?: string; // Optional prop for text color } export default function PlaceFilter({ places, selectedPlaceId, onPlaceSelect, textColor }: PlaceFilterProps) { const [showPicker, setShowPicker] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const [keyboardHeight, setKeyboardHeight] = useState(0); // Keyboard height listener useEffect(() => { const showSubscription = Keyboard.addListener( Platform.OS === 'ios' ? 'keyboardWillShow' : 'keyboardDidShow', (e: KeyboardEvent) => setKeyboardHeight(e.endCoordinates.height) ); const hideSubscription = Keyboard.addListener( Platform.OS === 'ios' ? 'keyboardWillHide' : 'keyboardDidHide', () => setKeyboardHeight(0) ); return () => { showSubscription.remove(); hideSubscription.remove(); }; }, []); // Reset search query every time modal is opened useEffect(() => { if (showPicker) { setSearchQuery(''); } }, [showPicker]); const filteredPlaces = useMemo(() => { if (!showPicker) return []; if (!searchQuery.trim()) return places; const lowerQuery = searchQuery.toLowerCase(); return places.filter(p => p.label.toLowerCase().includes(lowerQuery)); }, [places, searchQuery, showPicker]); const selectedPlaceLabel = selectedPlaceId ? places.find(p => p.id === selectedPlaceId)?.label || 'Cantiere Selezionato' : 'Tutti i cantieri'; return ( Cantiere setShowPicker(true)} className="flex-1 flex-row items-center justify-between bg-white px-5 py-4 rounded-2xl border border-gray-200 shadow-sm" > {selectedPlaceLabel} {selectedPlaceId !== null && ( onPlaceSelect(null)} className="bg-gray-50 p-4 rounded-2xl border border-gray-200 shadow-sm justify-center items-center" > )} {/* Nested Place Picker Modal */} setShowPicker(false)}> setShowPicker(false)} className="flex-1 bg-black/50 justify-end" style={{ paddingBottom: keyboardHeight }} > true}> Seleziona Cantiere setShowPicker(false)} className="p-2 bg-gray-100 rounded-full active:bg-gray-200"> {/* Search Bar */} {searchQuery.length > 0 && ( setSearchQuery('')} className="p-1"> )} item.id.toString()} ListHeaderComponent={() => ( searchQuery.trim() === '' ? ( { onPlaceSelect(null); setShowPicker(false); }} > Tutti i cantieri ) : null )} ListEmptyComponent={() => ( Nessun cantiere trovato per "{searchQuery}" )} initialNumToRender={15} maxToRenderPerBatch={20} windowSize={5} removeClippedSubviews={true} renderItem={({ item }) => ( { onPlaceSelect(item.id); setShowPicker(false); }} > {item.label} )} /> ); }