import { useAlert } from '@/components/AlertComponent'; import LoadingScreen from '@/components/LoadingScreen'; import api from '@/utils/api'; import { Image } from 'expo-image'; import ImageView from "react-native-image-viewing"; import { useLocalSearchParams, useRouter, useFocusEffect } from 'expo-router'; import { ChevronLeft, ImageIcon, Users, HardHat, MapPin, Calendar as CalendarIcon, Briefcase, TextAlignStart, CheckCircle2, Wrench, Pencil } from 'lucide-react-native'; import React, { useCallback, useEffect, useState } from 'react'; import { Dimensions, RefreshControl, ScrollView, Text, TouchableOpacity, View } from 'react-native'; import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context'; import { StatusBar } from 'expo-status-bar'; export default function ActivityDetailScreen() { const router = useRouter(); const alert = useAlert(); const params = useLocalSearchParams(); const insets = useSafeAreaInsets(); const [activityData, setActivityData] = useState(null); const [placeName, setPlaceName] = useState(''); const [photos, setPhotos] = useState<{uri: string}[]>([]); // Labor states const [operatorLabor, setOperatorLabor] = useState([]); const [subcontractorLabor, setSubcontractorLabor] = useState([]); const [otherOperatorLabor, setOtherOperatorLabor] = useState([]); const [equipmentLabor, setEquipmentLabor] = useState([]); const [isLoading, setIsLoading] = useState(true); const [refreshing, setRefreshing] = useState(false); // Image Viewer states const [isVisible, setIsVisible] = useState(false); const [currentIndex, setCurrentIndex] = useState(0); const fetchDetails = useCallback(async (isRefreshing = false) => { try { if (!isRefreshing) setIsLoading(true); const paramsData = JSON.stringify({ id: params.id }); const [activityRes, subactivitiesRes] = await Promise.all([ api.post('/activity/get-activity-data', { params: paramsData }), api.get('/subactivity/get-subactivities') ]); if (activityRes.data?.success) { const data = activityRes.data; setActivityData(data.activity); setPhotos(data.attachments || []); setOperatorLabor(data.operator_labor || []); setSubcontractorLabor(data.subcontractor_labor || []); setOtherOperatorLabor(data.other_operator_labor || []); setEquipmentLabor(data.materials || []); if (subactivitiesRes.data?.success) { const subactivities = subactivitiesRes.data.subactivities; const match = subactivities.find((s: any) => s.id === data.activity.id_subactivity); if (match) { setPlaceName(match.label); } else { setPlaceName('Cantiere Non Specificato'); } } } else { alert.showAlert('error', 'Errore', 'Impossibile caricare i dettagli dell\'attività.'); } } catch (error) { console.error('Errore nel recupero del dettaglio attività:', error); alert.showAlert('error', 'Errore', 'Si è verificato un errore di rete.'); } finally { setIsLoading(false); setRefreshing(false); } }, [params.id]); useFocusEffect( useCallback(() => { if (params.id) { fetchDetails(true); } }, [params.id, fetchDetails]) ); const onRefresh = () => { setRefreshing(true); fetchDetails(true); }; if (isLoading && !refreshing) { return ; } // Calculate dimensions for the grid layout of photos const windowWidth = Dimensions.get('window').width; const padding = 40; const gap = 8; const itemSize = (windowWidth - padding - (gap * 2)) / 3; const imageSource = photos.map(photo => ({ uri: photo.uri })); const renderLaborSection = (title: string, icon: React.ReactNode, laborData: any[]) => { if (!laborData || laborData.length === 0) return null; return ( {icon} {title} {laborData.map((labor, idx) => ( {labor.name} {labor.hours}h {labor.minutes}m {labor.sync && ( )} ))} ); }; return ( {/* Header */} router.back()} className="p-2 -ml-2 rounded-full active:bg-gray-100 w-12 items-center justify-center"> Dettaglio Attività router.push(`/activity/add?id=${params.id}`)} className="p-2 -mr-2 active:bg-gray-100 rounded-full w-12 items-center justify-center"> } > {/* General Info */} Cantiere {placeName} Data {activityData?.date ? new Date(activityData.date).toLocaleDateString('it-IT') : '-'} Descrizione {activityData?.description || 'Nessuna descrizione.'} {/* Labor and Materials Sections */} {renderLaborSection('Operai', , operatorLabor)} {renderLaborSection('Subappaltatori', , subcontractorLabor)} {renderLaborSection('Operai Distaccati', , otherOperatorLabor)} {renderLaborSection('Attrezzature', , equipmentLabor)} {/* Photos */} Allegati {photos.length === 0 ? ( Nessun allegato presente per questa attività. ) : ( {photos.map((item, index) => ( { setCurrentIndex(index); setIsVisible(true); }} style={{ width: itemSize }} className="mb-2" > ))} )} setIsVisible(false)} swipeToCloseEnabled={true} doubleTapToZoomEnabled={true} presentationStyle="overFullScreen" /> ); }