import { Machine } from '@/types/types'; import api from '@/utils/api'; 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 MachineFilterProps { selectedMachineId: any; onMachineSelect: (machineId: any) => void; textColor?: string; } export default function MachineFilter({ selectedMachineId, onMachineSelect, textColor }: MachineFilterProps) { const [showPicker, setShowPicker] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const [keyboardHeight, setKeyboardHeight] = useState(0); const [machines, setMachines] = useState([]); useEffect(() => { const fetchMachines = async () => { try { const res = await api.get('/machine-attendance/get-machines'); if (res.data?.success) { setMachines(res.data.machines || []); } } catch (err) { console.error('Error fetching machines:', err); } }; fetchMachines(); }, []); // 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 filteredMachines = useMemo(() => { if (!showPicker) return []; if (!searchQuery.trim()) return machines; const lowerQuery = searchQuery.toLowerCase(); return machines.filter(s => s.label.toLowerCase().includes(lowerQuery)); }, [machines, searchQuery, showPicker]); const selectedMachineLabel = selectedMachineId ? machines.find(s => s.id === selectedMachineId)?.label || 'Macchina Selezionata' : 'Tutte le macchine'; return ( Macchina 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" > {selectedMachineLabel} {selectedMachineId !== null && ( onMachineSelect(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 Macchina 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() === '' ? ( { onMachineSelect(null); setShowPicker(false); }} > Tutte le macchine ) : null )} ListEmptyComponent={() => ( Nessuna macchina trovata per "{searchQuery}" )} renderItem={({ item }) => ( { onMachineSelect(item.id); setShowPicker(false); }} > {item.label} )} /> ); }