import React, { useState, useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { Card, Button, Typography, Spin, Alert, Space } from 'antd'; import { NotifAlert } from '../../../components/Global/ToastNotif'; import { ArrowLeftOutlined, FilePdfOutlined, FileImageOutlined, DownloadOutlined } from '@ant-design/icons'; import { useBreadcrumb } from '../../../layout/LayoutBreadcrumb'; import { getBrandById } from '../../../api/master-brand'; import { downloadFile, getFile, getFileUrl, getFolderFromFileType, } from '../../../api/file-uploads'; const { Title } = Typography; const ViewFilePage = () => { const params = useParams(); const { id, fileType, fileName } = params; const navigate = useNavigate(); const { setBreadcrumbItems } = useBreadcrumb(); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [brandData, setBrandData] = useState(null); const [actualFileName, setActualFileName] = useState(''); const [pdfBlobUrl, setPdfBlobUrl] = useState(null); const [pdfLoading, setPdfLoading] = useState(false); const isFromEdit = window.location.pathname.includes('/edit/'); let fallbackId = id; let fallbackFileType = fileType; let fallbackFileName = fileName; if (!fileName || !fileType || !id) { const urlParts = window.location.pathname.split('/'); const viewIndex = urlParts.indexOf('view'); const editIndex = urlParts.indexOf('edit'); const actionIndex = viewIndex !== -1 ? viewIndex : editIndex; if (actionIndex !== -1 && urlParts.length > actionIndex + 4) { fallbackId = urlParts[actionIndex + 1]; fallbackFileType = urlParts[actionIndex + 3]; fallbackFileName = decodeURIComponent(urlParts[actionIndex + 4]); } } useEffect(() => { setPdfBlobUrl(null); setPdfLoading(false); setError(null); const fetchData = async () => { const token = localStorage.getItem('token'); if (!token) { navigate('/signin'); return; } try { const actualId = fallbackId || id; const actualFileName = fallbackFileName || fileName; const brandResponse = await getBrandById(actualId); if (brandResponse && brandResponse.statusCode === 200) { setBrandData(brandResponse.data); } const decodedFileName = decodeURIComponent(actualFileName); setActualFileName(decodedFileName); const fileExtension = decodedFileName.split('.').pop().toLowerCase(); if (fileExtension === 'pdf') { setPdfLoading(true); const folder = getFolderFromFileType('pdf'); try { const blobData = await getFile(folder, decodedFileName); const blobUrl = window.URL.createObjectURL(blobData); setPdfBlobUrl(blobUrl); } catch (pdfError) { setError('Failed to load PDF file: ' + (pdfError.message || pdfError)); setPdfBlobUrl(null); } finally { setPdfLoading(false); } } setLoading(false); } catch (error) { setError('Failed to load data'); setLoading(false); } }; fetchData(); return () => { if (pdfBlobUrl) { window.URL.revokeObjectURL(pdfBlobUrl); } }; }, [id, fileName, fileType, navigate]); useEffect(() => { if (brandData) { const breadcrumbItems = [ { title: • Master }, { title: navigate('/master/brand-device')}>Brand Device } ]; if (isFromEdit) { breadcrumbItems.push({ title: navigate(`/master/brand-device/edit/${fallbackId || id}`)}>Edit Brand Device }); } else { breadcrumbItems.push({ title: navigate(`/master/brand-device/view/${fallbackId || id}`)}>View Brand Device }); } breadcrumbItems.push({ title: View Document }); setBreadcrumbItems(breadcrumbItems); } }, [brandData, id, isFromEdit, fallbackId, navigate, setBreadcrumbItems]); const handleBack = () => { if (isFromEdit) { const savedPhase = localStorage.getItem(`brand_device_edit_${fallbackId || id}_last_phase`); if (savedPhase) { localStorage.removeItem(`brand_device_edit_${fallbackId || id}_last_phase`); } const targetPhase = savedPhase ? parseInt(savedPhase) : 1; navigate(`/master/brand-device/edit/${fallbackId || id}`, { state: { phase: targetPhase, fromFileViewer: true }, replace: true }); } else { navigate(`/master/brand-device/view/${fallbackId || id}`, { state: { phase: 1 }, replace: true }); } }; const renderContent = () => { if (error) { return ( ); } const displayFileName = actualFileName || 'Loading...'; const fileExtension = displayFileName.split('.').pop().toLowerCase(); const isImage = ['jpg', 'jpeg', 'png', 'gif'].includes(fileExtension); const isPdf = fileExtension === 'pdf'; if (loading) { return (
{isImage ? (
Loading image...
) : isPdf ? (
Loading PDF...
) : (
Loading file...
)}
); } if (isImage) { return (
{actualFileName} setError('Failed to load image')} />
); } if (isPdf) { const displayUrl = pdfBlobUrl || getFileUrl(getFolderFromFileType(fallbackFileType || fileType), actualFileName); return (
{pdfBlobUrl ? (