import api from '@/utils/api'; import { Directory, File, Paths } from 'expo-file-system'; import * as FileSystem from 'expo-file-system/legacy'; import { StorageAccessFramework } from 'expo-file-system/legacy'; import * as Sharing from 'expo-sharing'; import * as Linking from 'expo-linking'; import { Platform } from 'react-native'; /** * Gestisce l'upload di un documento verso il server usando Expo FileSystem * @param file File da caricare (deve avere almeno la proprietà 'uri') * @param siteId ID del sito a cui associare il documento (null per registro generale) * @param customTitle Titolo personalizzato per il documento (opzionale) */ export const uploadDocument = async ( file: any, siteId: number | null, customTitle?: string ): Promise => { if (!file || !file.uri) { throw new Error("File non valido per l'upload."); } if (siteId === null) { console.log("Uploading document:", file, "to registry with title:", customTitle); } else { console.log("Uploading document:", file, "to site:", siteId, "with title:", customTitle); } // TODO: Funzione di upload (manca lato backend) }; /** * Scarica un documento e offre di aprirlo/condividerlo (expo-sharing) * @param attachmentId ID o URL relativo del documento * @param fileName Nome con cui salvare il file * @param fileUrl URL completo del file da scaricare */ export const downloadAndShareDocument = async ( mimetype: string, fileName: string, fileUrl: string ): Promise => { try { // TODO: Gestire meglio il download (attualmente si basa su expo-sharing) if (!fileUrl || !fileName) { throw new Error("Parametri mancanti per il download del documento."); } const destination = new Directory(Paths.cache, 'documents'); destination.exists ? destination.delete() : null; destination.create({ overwrite: true }); const tmpFile = await File.downloadFileAsync(fileUrl, destination); console.log("File temporaneo scaricato in:", tmpFile.uri); const outFile = new File(destination, fileName); await tmpFile.move(outFile); console.log("File spostato in:", outFile.uri); console.log("File type:", mimetype); if (await Sharing.isAvailableAsync()) { await Sharing.shareAsync(outFile.uri, { mimeType: mimetype, dialogTitle: `Scarica ${fileName}`, UTI: 'public.item' }); } else { throw new Error("Condivisione non supportata su questo dispositivo."); } } catch (error) { console.error("Download Error:", error); throw error; } }; // TODO: Test con versione legacy di FileSystem e SAF export const downloadDocumentLegacy = async ( mimetype: string, fileName: string, fileUrl: string ): Promise => { try { if (!fileUrl || !fileName) { throw new Error("Parametri mancanti per il download del documento."); } const path = FileSystem.cacheDirectory + 'documents/'; // Download del file nella directory selezionata const tmpFile = await FileSystem.downloadAsync(fileUrl, path + fileName); console.log("File temporaneo scaricato in:", tmpFile.uri); if (Platform.OS === 'android') { const permission = await StorageAccessFramework.requestDirectoryPermissionsAsync(); if (permission.granted) { // Gets SAF URI from response const safUri = permission.directoryUri; console.log("Selected Directory URI:", safUri); const fileContent = await FileSystem.readAsStringAsync(tmpFile.uri, { encoding: FileSystem.EncodingType.Base64 }); console.log("File letto in Base64, dimensione:", fileContent.length); // Copia il file nella directory SAF selezionata const destUri = await StorageAccessFramework.createFileAsync( safUri, fileName, mimetype ); console.log("Destinazione SAF URI:", destUri); await FileSystem.writeAsStringAsync(destUri, fileContent, { encoding: FileSystem.EncodingType.Base64 }); console.log("File riscritto in SAF."); } } else if (Platform.OS === 'ios') { if (await Sharing.isAvailableAsync()) { await Sharing.shareAsync(tmpFile.uri, { mimeType: mimetype, dialogTitle: `Scarica ${fileName}`, UTI: 'public.item' }); } else { throw new Error("Condivisione non supportata su questo dispositivo."); } } } catch (error) { console.error("Download Error:", error); throw error; } }; // TODO: Test con Linking standard export const downloadDocumentByUrl = async ( fileUrl: string, fileName: string ): Promise => { try { if (!fileUrl || !fileName) { throw new Error("Parametri mancanti per il download del documento."); } Linking.openURL(fileUrl); } catch (error) { console.error("Download Error:", error); throw error; } };