import { useAlert } from '@/components/AlertComponent'; import FilterModal from '@/components/FilterModal'; import LoadingScreen from '@/components/LoadingScreen'; import QualityControlCard from '@/components/QualityControlCard'; import { StatusBar } from 'expo-status-bar'; import api from '@/utils/api'; import { ClipboardCheck, Filter, Plus } from 'lucide-react-native'; import React, { useCallback, useEffect, useState } from 'react'; import { RefreshControl, ScrollView, Text, TouchableOpacity, View } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import { Place, QualityControlItem } from '@/types/types'; import { useRouter, useFocusEffect } from 'expo-router'; export default function QualityControlScreen() { const router = useRouter(); const alert = useAlert(); const [qualityControls, setQualityControls] = useState([]); const [isLoading, setIsLoading] = useState(true); const [refreshing, setRefreshing] = useState(false); // Filters state const [isFilterVisible, setIsFilterVisible] = useState(false); const [places, setPlaces] = useState([]); const [filterRange, setFilterRange] = useState<{ startDate: string | null; endDate: string | null }>({ startDate: null, endDate: null }); const [filterPlace, setFilterPlace] = useState(null); const activeFiltersCount = (filterRange.startDate ? 1 : 0) + (filterPlace ? 1 : 0); const fetchPlaces = async () => { try { const response = await api.get('/construction-site/get-construction-sites'); if (response.data?.success) { setPlaces(response.data.constructionSites || []); } } catch (error) { console.error('Errore nel recupero dei cantieri:', error); } }; const fetchQualityControls = async (currentRange = filterRange, currentPlace = filterPlace, isSilent = false) => { try { if (!refreshing && !isSilent) setIsLoading(true); const rangeParam = currentRange.startDate ? currentRange : null; // The API expects 'constructionSite' which is likely the ID. The filterPlace stores the ID or the Place object? // According to PlaceFilter and InvoiceScreen, currentPlace is the selectedPlaceId. const params = { range: rangeParam, constructionSite: currentPlace }; const response = await api.post('/quality-control/list', { params }); if (response.data?.success) { setQualityControls(response.data.result || []); } } catch (error) { console.error('Errore nel recupero dei controlli qualità:', error); alert.showAlert('error', 'Errore', 'Impossibile recuperare i dati. Riprova più tardi.'); } finally { setIsLoading(false); setRefreshing(false); } }; useEffect(() => { fetchPlaces(); }, []); useFocusEffect( useCallback(() => { fetchQualityControls(filterRange, filterPlace, true); }, [filterRange, filterPlace]) ); const onRefresh = () => { setRefreshing(true); fetchQualityControls(); }; if (isLoading && !refreshing) { return ; } return ( {/* Header */} Lista dei controlli di qualità Controlli di Qualità } > {qualityControls.length === 0 ? ( Nessun controllo registrato ) : ( {qualityControls.map((item, index) => ( ))} )} {/* FAB Add */} router.push('/quality/add')} className="absolute bottom-[6.5rem] right-6 w-16 h-16 bg-white border border-[#1071C2] rounded-full shadow-lg items-center justify-center active:scale-90" > {/* FAB Filter */} setIsFilterVisible(true)} className="absolute bottom-8 right-6 w-16 h-16 bg-[#1071C2] rounded-full shadow-lg items-center justify-center active:scale-90" > {activeFiltersCount > 0 && ( {activeFiltersCount} )} {/* Filter Modal */} { setFilterRange(range); setFilterPlace(place); setIsFilterVisible(false); fetchQualityControls(range, place); }} onReset={() => { setFilterRange({ startDate: null, endDate: null }); setFilterPlace(null); setIsFilterVisible(false); fetchQualityControls({ startDate: null, endDate: null }, null); }} onClose={() => setIsFilterVisible(false)} /> ); }