import { useDocuments, useDownload, useFolders } from '../hooks/swrHooks' import { IDocument, IDocumentFolder } from '../interfaces/documents' import { Box, Breadcrumbs, Button, CircularProgress, Divider, IconButton, Link, List, ListItemButton, SxProps } from '@mui/material' import { Cancel, Close, Download, Folder, InsertDriveFile, Upload, UploadFile } from '@mui/icons-material' import React, { useEffect, useRef, useState } from 'react' import DocumentService from '../services/DocumentService' import { mutate } from 'swr' import FileViewer from './modals/FileViewer' interface FolderProps { folder: IDocumentFolder; index: number; handleFolderClick: (folder: IDocumentFolder) => void; } interface DocumentProps { doc: IDocument; index: number; handleDocumentClick: (index: number) => void; } const FileItemStyle: SxProps = { cursor: 'pointer', display: 'flex', width: '100%', flexDirection: 'row', gap: '8px', alignItems: 'center', padding: '8px' } function ItemFolder({ folder, handleFolderClick, ...props }: FolderProps) { return ( handleFolderClick(folder)} > {folder.name} ) } const handleSave = async (file: Blob, filename: string) => { const link = document.createElement('a') link.href = window.URL.createObjectURL(file) link.download = filename link.click() link.remove() window.URL.revokeObjectURL(link.href) } function ItemDocument({ doc, index, handleDocumentClick, ...props }: DocumentProps) { const [shouldFetch, setShouldFetch] = useState(false) const { file, isLoading } = useDownload(shouldFetch ? doc?.document_folder_id : null, shouldFetch ? doc?.id : null) useEffect(() => { if (shouldFetch) { if (file) { handleSave(file, doc.name) setShouldFetch(false) } } }, [shouldFetch, file]) return ( handleDocumentClick(index)} {...props} > {doc.name} { if (!isLoading) { setShouldFetch(true) } }} sx={{ ml: 'auto' }} > {isLoading ? : } ) } export default function FolderViewer() { const [currentFolder, setCurrentFolder] = useState(null) const [breadcrumbs, setBreadcrumbs] = useState([]) const { folders, isLoading: foldersLoading } = useFolders() const { documents, isLoading: documentsLoading } = useDocuments(currentFolder?.id) const [uploadProgress, setUploadProgress] = useState(0) const [isUploading, setIsUploading] = useState(false) const fileInputRef = useRef(null) const [fileViewerModal, setFileViewerModal] = useState(false) const [currentFileNo, setCurrentFileNo] = useState(-1) const [dragOver, setDragOver] = useState(false) const [filesToUpload, setFilesToUpload] = useState([]) const handleFolderClick = (folder: IDocumentFolder) => { setCurrentFolder(folder) setBreadcrumbs((prev) => [...prev, folder]) } const handleDocumentClick = async (index: number) => { setCurrentFileNo(index) setFileViewerModal(true) } const handleBreadcrumbClick = (index: number) => { const newBreadcrumbs = breadcrumbs.slice(0, index + 1); setBreadcrumbs(newBreadcrumbs) setCurrentFolder(newBreadcrumbs[newBreadcrumbs.length - 1]) } const handleUploadClick = () => { if (fileInputRef.current) { fileInputRef.current.click() } } const handleDragOver = (e: React.DragEvent) => { e.preventDefault() setDragOver(true) } const handleDragLeave = () => { setDragOver(false) } const handleDrop = (e: React.DragEvent) => { e.preventDefault() setDragOver(false) const files = Array.from(e.dataTransfer.files) setFilesToUpload((prevFiles) => [...prevFiles, ...files]) } const handleFileInput = (e: React.ChangeEvent) => { const files = Array.from(e.target.files || []) setFilesToUpload((prevFiles) => [...prevFiles, ...files]) } const uploadFiles = async () => { setIsUploading(true) if (filesToUpload.length > 0 && currentFolder && currentFolder.id) { const formData = new FormData() for (const file of filesToUpload) { formData.append('files', file) } try { await DocumentService.uploadFiles(currentFolder.id, formData, setUploadProgress); setIsUploading(false); setFilesToUpload([]); mutate(`/info/documents/${currentFolder.id}`); } catch (error) { console.error(error); setIsUploading(false); } } } if (foldersLoading || documentsLoading) { return ( ) } return ( { setCurrentFolder(null) setBreadcrumbs([]) }} sx={{ cursor: 'pointer' }} > Главная {breadcrumbs.map((breadcrumb, index) => ( handleBreadcrumbClick(index)} sx={{ cursor: 'pointer' }} > {breadcrumb.name} ))} {currentFolder && 0 ? '1px dashed gray' : 'none', borderRadius: '8px', p: '16px' }}> {filesToUpload.length > 0 && <> } {filesToUpload.length > 0 && {filesToUpload.map((file, index) => ( {file.name} { setFilesToUpload(prev => { return prev.filter((_, i) => i != index) }) }}> ))} } } {currentFolder ? ( documents?.map((doc: IDocument, index: number) => (
{index < documents.length - 1 && }
)) ) : ( folders?.map((folder: IDocumentFolder, index: number) => (
{index < folders.length - 1 && }
)) )}
) }