import {useEffect, useState} from 'react'; import clsx from 'clsx'; import {FilePreviewProps} from './file-preview-props'; import {DefaultFilePreview} from './default-file-preview'; import {ProgressCircle} from '@common/ui/progress/progress-circle'; import {useFileEntryUrls} from '@common/uploads/hooks/file-entry-urls'; import {useTrans} from '@common/i18n/use-trans'; import {Trans} from '@common/i18n/trans'; import {apiClient} from '@common/http/query-client'; const FIVE_MB = 5242880; export function TextFilePreview(props: FilePreviewProps) { const {entry, className} = props; const {trans} = useTrans(); const [tooLarge, setTooLarge] = useState(false); const [isLoading, setIsLoading] = useState(true); const [isFailed, setIsFailed] = useState(false); const [contents, setContents] = useState(null); const {previewUrl} = useFileEntryUrls(entry); useEffect(() => { if (!entry) return; if (!previewUrl) { setIsFailed(true); } else if (entry.file_size! >= FIVE_MB) { setTooLarge(true); setIsLoading(false); } else { getFileContents(previewUrl) .then(response => { setContents(response.data); }) .catch(() => { setIsFailed(true); }) .finally(() => { setIsLoading(false); }); } }, [entry, previewUrl]); if (isLoading) { return ( ); } if (tooLarge) { return ( } /> ); } if (isFailed) { return ( } /> ); } return (
      
{`${contents}`}
); } function getFileContents(src: string) { return apiClient.get(src, { responseType: 'text', // required for s3 presigned url to work withCredentials: false, headers: { Accept: 'text/plain', }, }); }