import { useAlert } from '@/components/AlertComponent'; import MachineCard from '@/components/MachineCard'; import FilterModal from '@/components/FilterModal'; import LoadingScreen from '@/components/LoadingScreen'; import QrScanModal from '@/components/QrScanModal'; import { StatusBar } from 'expo-status-bar'; import api from '@/utils/api'; import { formatTime } from '@/utils/dateTime'; import { CarFront, CheckCircle2, Filter, QrCode } from 'lucide-react-native'; import React, { useEffect, useState } from 'react'; import { RefreshControl, ScrollView, Text, TouchableOpacity, View } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import { MachineAttendanceItem } from '@/types/types'; export default function MachineScreen() { const alert = useAlert(); const [showScanner, setShowScanner] = useState(false); const [lastScan, setLastScan] = useState<{ type: string; time: string; site: string } | null>(null); const [attendances, setAttendances] = useState([]); const [isLoading, setIsLoading] = useState(true); const [refreshing, setRefreshing] = useState(false); // Filters state const [isFilterVisible, setIsFilterVisible] = useState(false); const [filterRange, setFilterRange] = useState<{ startDate: string | null; endDate: string | null }>({ startDate: null, endDate: null }); const [filterMachine, setFilterMachine] = useState(null); const activeFiltersCount = (filterRange.startDate ? 1 : 0) + (filterMachine ? 1 : 0); const fetchAttendances = async (currentRange = filterRange, currentMachine = filterMachine) => { try { if (!refreshing) setIsLoading(true); const rangeParam = currentRange.startDate ? currentRange : null; const params = { range: rangeParam, machine: currentMachine }; const response = await api.post('/machine-attendance/list', { params }); if (response.data?.success) { setAttendances(response.data.data || []); } } catch (error) { console.error('Errore nel recupero degli utilizzi macchine:', error); alert.showAlert('error', 'Errore', 'Impossibile recuperare i dati. Riprova più tardi.'); } finally { setIsLoading(false); setRefreshing(false); } }; useEffect(() => { fetchAttendances(); setLastScan(null); }, []); const onRefresh = () => { setRefreshing(true); fetchAttendances(); setLastScan(null); }; const handleStartScan = () => { setShowScanner(true); }; const onScan = async (data: string) => { console.log('Scanned data:', data); try { const response = await api.post('/machine-attendance/in', { uuid: data }); if (response.data?.success) { console.log('Scan data sent successfully:', response.data); fetchAttendances(); setLastScan({ type: response.data.type, time: formatTime(response.data.time), site: response.data.site }); } else { alert.showAlert('error', 'Errore', response.data?.message || 'Impossibile registrare operazione.'); } } catch (error) { console.error('Errore nell\'invio dei dati di scansione:', error); alert.showAlert('error', 'Errore', 'Impossibile registrare operazione. Riprova più tardi.'); return; } }; if (isLoading && !refreshing) { return ; } return ( {/* Header */} Elenco degli utilizzi dei mezzi Macchine } > {/* Feedback Card */} {lastScan ? ( {lastScan.type} Registrata {lastScan.site} alle {lastScan.time} ) : null} {/* Scanner Section */} Scansione QR Code Scansiona Codice Posiziona il codice QR davanti alla fotocamera per registrare l'ingresso o l'uscita dalla macchina {/* History using MachineCard component */} Ultimi Utilizzi {attendances.length === 0 ? ( Nessun utilizzo registrato ) : ( {attendances.map((item, index) => ( ))} )} {/* 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 */} setIsFilterVisible(false)} onApply={(range, place, supplier, machine) => { setFilterRange(range); setFilterMachine(machine); setIsFilterVisible(false); fetchAttendances(range, machine); }} onReset={() => { const emptyRange = { startDate: null, endDate: null }; setFilterRange(emptyRange); setFilterMachine(null); setIsFilterVisible(false); fetchAttendances(emptyRange, null); }} /> {/* Scanner Modal */} setShowScanner(false)} onScan={onScan} /> ); }