import AttendanceCard from '@/components/AttendanceCard'; import LoadingScreen from '@/components/LoadingScreen'; import api from '@/utils/api'; import { AuthContext } from '@/utils/authContext'; import { useRouter } from 'expo-router'; import { StatusBar } from 'expo-status-bar'; import { FileText, QrCode, User } from 'lucide-react-native'; import React, { useContext, useEffect, useState } from 'react'; import { RefreshControl, ScrollView, Text, TouchableOpacity, View } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; export default function HomeScreen() { const router = useRouter(); const { user } = useContext(AuthContext); const [isLoading, setIsLoading] = useState(true); const [refreshing, setRefreshing] = useState(false); const [updates, setUpdates] = useState([]); const [attendances, setAttendances] = useState([]); const fetchDashboardData = async () => { try { if (!refreshing) setIsLoading(true); const params = { range: null, place: null }; // Parallel requests for journal and attendance data const [journalRes, attendanceRes] = await Promise.all([ api.post('/journal/list', { params }), api.post('/attendance/list', { params }) ]); // Select first element of journal (slice 0,1) if (journalRes.data?.success) { setUpdates(journalRes.data.result.slice(0, 1)); } // Select first 2 elements of attendances (slice 0,2) if (attendanceRes.data?.success) { setAttendances(attendanceRes.data.result.slice(0, 2)); } } catch (error) { console.error('Errore nel recupero dei dati della dashboard:', error); } finally { setIsLoading(false); setRefreshing(false); } }; useEffect(() => { fetchDashboardData(); }, []); const onRefresh = () => { setRefreshing(true); fetchDashboardData(); }; if (isLoading && !refreshing) { return ( ); } return ( {/* Custom Banner */} IP Costruzioni SRL Ciao {user?.firstName} {/* Profile Avatar */} router.push('/profile')}> {/* Scrollable Content */} } > {/* Quick Actions */} Azioni Rapide router.push('/attendance')} className="flex-1 bg-white p-6 rounded-3xl shadow-sm items-center justify-center gap-4 border border-gray-100 active:scale-[0.98]" > Nuova Presenza router.push('/journal/add')} className="flex-1 bg-white p-6 rounded-3xl shadow-sm items-center justify-center gap-4 border border-gray-100 active:scale-[0.98]" > Nuovo{'\n'} Giornale {/* Journal */} Giornale di Cantiere {updates.map((item, index) => ( {item.place_name} {item.place_address} {item.date} ))} {!isLoading && updates.length === 0 && ( Nessun aggiornamento recente )} {isLoading && updates.length === 0 && ( Caricamento... )} {/* Attendance */} Presenze {attendances.map((item, index) => ( ))} {!isLoading && attendances.length === 0 && ( Nessuna presenza recente )} {isLoading && attendances.length === 0 && ( Caricamento... )} ); }