149 lines
5.2 KiB
TypeScript
149 lines
5.2 KiB
TypeScript
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<void> => {
|
|
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<void> => {
|
|
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<void> => {
|
|
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<void> => {
|
|
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;
|
|
}
|
|
}; |