import { useAlert } from '@/components/AlertComponent'; import LoadingScreen from '@/components/LoadingScreen'; import api from '@/utils/api'; import { downloadAndShareDocument } from '@/utils/documentUtils'; import { useRouter } from 'expo-router'; import { StatusBar } from 'expo-status-bar'; import { ChevronDown, ChevronLeft, Download, FileText, X } from 'lucide-react-native'; import React, { useEffect, useState } from 'react'; import { Modal, RefreshControl, FlatList, Text, TouchableOpacity, View } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; export default function DocumentsScreen() { const router = useRouter(); const alert = useAlert(); const [documents, setDocuments] = useState([]); const [categories, setCategories] = useState([]); const [selectedCategory, setSelectedCategory] = useState(null); const [isLoading, setIsLoading] = useState(true); const [refreshing, setRefreshing] = useState(false); const [showPicker, setShowPicker] = useState(false); // Fetch document categories const fetchCategories = async () => { try { const response = await api.get('/registry/get-categories'); if (response.data?.success) { setCategories([{ label: 'Tutte le tipologie', value: null }, ...response.data.categories]); } } catch (error) { console.error('Errore nel recupero delle categorie:', error); } }; // Fetch user documents based on selected category const fetchUserDocuments = async (filterValue: any = null) => { try { if (!refreshing) setIsLoading(true); const params = { filter: filterValue }; const response = await api.get(`/registry/list`, { params }); if (response.data?.success) { setDocuments(response.data.result || []); } } catch (error) { console.error('Errore nel recupero dei documenti utente:', error); alert.showAlert('error', 'Errore', 'Impossibile recuperare i documenti. Riprova più tardi.'); } finally { setIsLoading(false); setRefreshing(false); } }; useEffect(() => { const init = async () => { setIsLoading(true); await fetchCategories(); await fetchUserDocuments(selectedCategory); }; init(); }, []); const onRefresh = () => { setRefreshing(true); fetchUserDocuments(selectedCategory); }; const handleCategorySelect = (value: any) => { setSelectedCategory(value); fetchUserDocuments(value); setShowPicker(false); }; if (isLoading && !refreshing) { return ( ); } // Get label for the selected category or default text const selectedLabel = selectedCategory ? categories.find(c => c.value === selectedCategory)?.label : 'Filtra per tipologia...'; return ( {/* Header */} router.back()} className="p-2 rounded-full active:bg-gray-100"> Documenti {/* Select / Dropdown Trigger and Reset */} setShowPicker(true)} className="flex-1 flex-row items-center justify-between bg-white px-5 py-3 rounded-2xl border border-gray-200 shadow-sm" > {selectedLabel} {selectedCategory !== null && ( handleCategorySelect(null)} className="bg-gray-50 p-3.5 rounded-2xl border border-gray-200 shadow-sm justify-center items-center" > )} {/* Documents List */} index.toString()} contentContainerStyle={{ gap: 16, paddingBottom: 100 }} showsVerticalScrollIndicator={false} refreshControl={ } initialNumToRender={10} maxToRenderPerBatch={15} windowSize={5} removeClippedSubviews={true} renderItem={({ item: doc }) => ( {doc.filename} {doc.date} downloadAndShareDocument(doc.mimetype, doc.filename, doc.url)} className="p-4 bg-gray-50 rounded-2xl active:bg-gray-100 flex-shrink-0 border border-gray-100"> )} ListEmptyComponent={() => ( !isLoading ? ( Nessun documento trovato in questa categoria ) : null )} /> {/* Modal Picker (Dropdown Custom) */} setShowPicker(false)}> setShowPicker(false)} className="flex-1 bg-black/50 justify-end" > true}> Filtra per tipologia setShowPicker(false)} className="p-2 bg-gray-100 rounded-full"> index.toString()} initialNumToRender={10} maxToRenderPerBatch={15} windowSize={5} removeClippedSubviews={true} renderItem={({ item: cat }) => ( handleCategorySelect(cat.value)} > {cat.label} )} /> ); }