Files
cruiseLovers/assets/components/reserva/DocumentoRow.tsx

99 lines
3.2 KiB
TypeScript

import { LoadingSpinner } from '@/assets/components/LoadingSpinner';
import { colors } from '@/assets/styles/colors';
import { downloadDocumento, getLocalDocumentUri } from '@/assets/services/documentSync';
import { Documento } from '@/assets/types';
import styles from '@/styles/screens/reserva/detail.styles';
import { FontAwesome } from '@expo/vector-icons';
import CircleCheckIcon from '@/assets/icons/circle-check-solid.svg';
import * as Sharing from 'expo-sharing';
import { useEffect, useState } from 'react';
import { Alert, Pressable, Text, View } from 'react-native';
type Props = {
documento: Documento;
isLast: boolean;
};
const getDocumentExt = (path: string) => {
const ext = path.split('.').pop()?.toUpperCase() ?? 'DOC';
return ext.length > 4 ? 'DOC' : ext;
};
export function DocumentoRow({ documento, isLast }: Props) {
const [isDownloading, setIsDownloading] = useState(false);
const [isDownloaded, setIsDownloaded] = useState(false);
useEffect(() => {
if (!documento.idDocumento || !documento.caminhoFicheiro) return;
getLocalDocumentUri(documento.idDocumento, documento.caminhoFicheiro).then((uri) => {
setIsDownloaded(!!uri);
});
}, [documento.idDocumento, documento.caminhoFicheiro]);
const fileName =
documento.nome || documento.caminhoFicheiro.split('/').pop() || '---';
const openLocalFile = async (uri: string) => {
const canShare = await Sharing.isAvailableAsync();
if (canShare) {
await Sharing.shareAsync(uri, { UTI: '.pdf', mimeType: 'application/pdf' });
} else {
Alert.alert('Erro', 'Não é possível abrir este ficheiro neste dispositivo.');
}
};
const handlePress = async () => {
if (!documento.idDocumento || !documento.caminhoFicheiro) return;
setIsDownloading(true);
try {
const localUri = await getLocalDocumentUri(documento.idDocumento, documento.caminhoFicheiro);
if (localUri) {
await openLocalFile(localUri);
return;
}
// Ficheiro não está local — fazer download agora
const uri = await downloadDocumento({
idDocumento: documento.idDocumento,
caminhoFicheiro: documento.caminhoFicheiro,
checksum: documento.checksum ?? '',
nome: documento.nome,
});
if (uri) {
setIsDownloaded(true);
await openLocalFile(uri);
} else {
Alert.alert('Erro', 'Não foi possível descarregar o documento. Verifica a tua ligação à internet.');
}
} finally {
setIsDownloading(false);
}
};
return (
<Pressable
onPress={handlePress}
disabled={isDownloading}
style={[styles.documentoRow, isLast && styles.documentoRowLast]}>
<View style={styles.documentoBadge}>
<Text style={styles.documentoBadgeText}>
{getDocumentExt(documento.caminhoFicheiro)}
</Text>
</View>
<Text style={styles.documentoName} numberOfLines={1}>
{fileName}
</Text>
{isDownloading ? (
<LoadingSpinner size="small" />
) : isDownloaded ? (
<CircleCheckIcon width={16} height={16} fill="#13AE45" />
) : (
<FontAwesome name="download" size={16} color={colors.vermelho} />
)}
</Pressable>
);
}