import { useAlert } from '@/components/AlertComponent'; import { Download, FileText, Plus, Search, Calendar as CalendarIcon, ChevronLeft } from 'lucide-react-native'; import React, { useCallback, useEffect, useState } from 'react'; import { RangePickerModal } from '@/components/RangePickerModal'; import { RefreshControl, ScrollView, Text, TextInput, TouchableOpacity, View } from 'react-native'; import { useLocalSearchParams, useRouter } from 'expo-router'; import { ConstructionSite, DocumentItem } from '@/types/types'; import LoadingScreen from '@/components/LoadingScreen'; import api from '@/utils/api'; import dayjs from 'dayjs'; import { formatTimestamp, parseTimestamp } from '@/utils/dateTime'; import { downloadAndShareDocument, uploadDocument } from '@/utils/documentUtils'; import AddDocumentModal from '@/components/AddDocumentModal'; export default function SiteDocumentsScreen() { const router = useRouter(); const alert = useAlert(); const params = useLocalSearchParams(); const [site, setSite] = useState(null); const [documents, setDocuments] = useState([]); const [isLoading, setIsLoading] = useState(true); const [refreshing, setRefreshing] = useState(false); const [showUploadModal, setShowUploadModal] = useState(false); const [isUploading, setIsUploading] = useState(false); // Fetch dei documenti del cantiere const fetchSiteDocuments = useCallback(async (siteId: number, isRefreshing = false) => { try { if (!isRefreshing) setIsLoading(true); // Fetch Documenti const response = await api.get(`/attachment/get-site-attachments`, { params: { siteId } }); setDocuments(response.data); } catch (error) { console.error('Errore nel recupero dei documenti del cantiere:', error); alert.showAlert('error', 'Errore', 'Impossibile recuperare i documenti del cantiere. Riprova più tardi.'); } finally { setIsLoading(false); setRefreshing(false); } }, []); useEffect(() => { if (params.siteData) { try { const jsonString = Array.isArray(params.siteData) ? params.siteData[0] : params.siteData; const parsedSite = JSON.parse(jsonString); setSite(parsedSite); } catch (error) { console.error('Errore nel parsing dei dati del cantiere:', error); } } }, [params.siteData]); useEffect(() => { if (params.id) { setIsLoading(true); fetchSiteDocuments(Number(params.id)); } }, [params.id, fetchSiteDocuments]); const onRefresh = () => { setRefreshing(true); fetchSiteDocuments(Number(params.id)); }; const [searchTerm, setSearchTerm] = useState(''); const [range, setRange] = useState<{ startDate: any; endDate: any }>({ startDate: null, endDate: null }); const [showRangePicker, setShowRangePicker] = useState(false); // Filtraggio Documenti const filteredDocs = documents.filter(doc => { // Filtro Testuale (su nome documento) const matchesSearch = doc.title.toLowerCase().includes(searchTerm.toLowerCase()); if (!matchesSearch) return false; // Filtro Date Range if (range.startDate || range.endDate) { const docDate = parseTimestamp(doc.updated_at); if (range.startDate) { const start = dayjs(range.startDate).startOf('day').toDate(); if (docDate <= start) return false; } if (range.endDate) { const end = dayjs(range.endDate).endOf('day').toDate(); if (docDate >= end) return false; } } return true; }); // Gestione Download e Condivisione Documento const handleDownloadAndShare = async (mimetype: string, fileName: string, fileUrl: string) => { try { await downloadAndShareDocument(mimetype, fileName, fileUrl); } catch (error) { console.error('Errore nel download/condivisione del documento:', error); alert.showAlert('error', 'Errore', 'Impossibile scaricare il documento. Riprova più tardi.'); } }; // Gestione Caricamento Documento const handleUploadDocument = async (file: any, customTitle?: string) => { setIsUploading(true); try { await uploadDocument(file, Number(params.id), customTitle); alert.showAlert('success', 'Successo', 'Documento caricato con successo!'); setShowUploadModal(false); fetchSiteDocuments(Number(params.id), true); } catch (error) { console.error('Errore nel caricamento del documento:', error); alert.showAlert('error', 'Errore', 'Impossibile caricare il documento. Riprova più tardi.'); } finally { setIsUploading(false); } } if (!site || (isLoading && !refreshing)) { return ( ); } return ( {/* Header */} router.back()} className="p-2 -ml-2 rounded-full active:bg-gray-100"> {/* Badge Codice Cantiere */} {site.code && ( {site.code} )} {/* Nome Cantiere con Truncate funzionante */} {site.name} Archivio documenti {/* Search + Date Row (Spostato qui) */} setShowRangePicker(true)} className={`p-4 bg-white rounded-2xl shadow-sm border ${range.startDate ? 'border-[#099499]' : 'border-gray-200'}`} > setShowRangePicker(false)} currentRange={range} onApply={setRange} /> {/* Lista Documenti */} } > {filteredDocs.map((doc) => ( {doc.title} {formatTimestamp(doc.updated_at)} handleDownloadAndShare(doc.mimetype, doc.title, doc.url)} className="p-4 bg-gray-50 rounded-2xl active:bg-gray-100"> ))} {filteredDocs.length === 0 && ( Nessun documento trovato )} {/* FAB (Spostato qui) */} setShowUploadModal(true)} className="absolute bottom-8 right-6 w-16 h-16 bg-[#099499] rounded-full shadow-lg items-center justify-center active:scale-90" > {/* Modale Caricamento Documento */} setShowUploadModal(false)} onUpload={handleUploadDocument} isUploading={isUploading} /> ); }