import React, { useEffect, useState } from 'react'; import { View, Text, TouchableOpacity, ScrollView, Alert, RefreshControl } from 'react-native'; import { QrCode, CheckCircle2, Nfc } from 'lucide-react-native'; import QrScanModal from '@/components/QrScanModal'; import NfcScanModal from '@/components/NfcScanModal'; import LoadingScreen from '@/components/LoadingScreen'; import api from '@/utils/api'; import { formatDate, formatTime, parseSecondsToTime } from '@/utils/dateTime'; import { AttendanceRecord } from '@/types/types'; import NfcManager from 'react-native-nfc-manager'; export default function AttendanceScreen() { const [scannerType, setScannerType] = useState<'qr' | 'nfc'>('qr'); 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); const checkNfcAvailability = async () => { // if (!ENABLE_NFC) return; try { const isSupported = await NfcManager.isSupported(); if (isSupported) setScannerType('nfc'); } catch (error) { console.warn('NFC non supportato:', error); } }; const fetchAttendances = async () => { try { if (!refreshing) setIsLoading(true); // Fetch today's attendance data from API const response = await api.get('/attendance/list'); setAttendances(response.data); } catch (error) { console.error('Errore nel recupero delle presenze:', error); Alert.alert('Errore', 'Impossibile recuperare le presenze. Riprova più tardi.'); } finally { setIsLoading(false); setRefreshing(false); } }; useEffect(() => { checkNfcAvailability(); fetchAttendances(); setLastScan(null); }, []); const onRefresh = () => { setRefreshing(true); fetchAttendances(); setLastScan(null); }; const handleStartScan = async () => { // Modalità QR Code if (scannerType === 'qr') { setShowScanner(true); return; } // Modalità NFC if (scannerType === 'nfc') { try { const supported = await NfcManager.isSupported(); if (!supported) { Alert.alert('NFC non supportato', 'Il tuo dispositivo non supporta la scansione NFC.'); return; } const enabled = await NfcManager.isEnabled(); if (!enabled) { Alert.alert('NFC disattivato', 'Per favore attiva l\'NFC nelle impostazioni del dispositivo per continuare.', [ { text: 'OK' }, { text: 'Vai alle impostazioni', onPress: () => NfcManager.goToNfcSetting() } ]); return; } setShowScanner(true); } catch (err) { console.warn(err); Alert.alert('Errore', 'Impossibile verificare lo stato dell\'NFC.'); } } }; const onScan = async (data: string) => { console.log('Scanned data:', data); try { // Send scanned data to API const response = await api.post('/attendance/scan', data); if (response) { console.log('Scan data sent successfully:', response.data); // Refresh attendance list fetchAttendances(); // Update last scan feedback setLastScan({ type: response.data.type, time: formatTime(response.data.time), site: response.data.site }); } } catch (error) { console.error('Errore nell\'invio dei dati di scansione:', error); Alert.alert('Errore', 'Impossibile registrare la presenza. Riprova più tardi.'); return; } }; if (isLoading && !refreshing) { return ; } return ( {/* Header */} Gestione Presenze Registra i tuoi movimenti } > {/* Feedback Card */} {lastScan ? ( {lastScan.type} Registrata {lastScan.site} alle {lastScan.time} ) : null} {/* Scanner Section */} Scansione {scannerType === 'qr' ? 'QR Code' : 'NFC'} {scannerType === 'qr' ? : } Scansiona Codice {scannerType === 'qr' ? 'Posiziona il codice QR davanti alla fotocamera per registrare l\'ingresso o l\'uscita dal cantiere' : 'Avvicina il dispositivo NFC per registrare l\'ingresso o l\'uscita dal cantiere' } {/* Mini History */} Ultime Presenze {attendances.length === 0 ? ( Nessuna presenza registrata ) : ( {attendances.map((item, index) => ( {item.site} {formatDate(item.date)} {formatTime(item.in)} - {item.out ? formatTime(item.out) : 'IN CORSO'} {/* TODO: item.time può essere null -> calcolare tempo da in e out? */} {item.time && ( {parseSecondsToTime(item.time)} )} ))} )} {/* Scanner Modal */} {scannerType === 'qr' ? ( setShowScanner(false)} onScan={onScan} /> ) : ( setShowScanner(false)} onScan={onScan} /> )} ); }