import { ActionIcon, Box, Group, Skeleton, Stack, Table, TextInput, } from "@mantine/core"; import { useClipboard } from "@mantine/hooks"; import { useModals } from "@mantine/modals"; import { Dispatch, SetStateAction, useEffect, useState } from "react"; import { TbDownload, TbEye, TbLink } from "react-icons/tb"; import useConfig from "../../hooks/config.hook"; import shareService from "../../services/share.service"; import { FileMetaData } from "../../types/File.type"; import { Share } from "../../types/share.type"; import { byteToHumanSizeString } from "../../utils/fileSize.util"; import toast from "../../utils/toast.util"; import TableSortIcon, { TableSort } from "../core/SortIcon"; import showFilePreviewModal from "./modals/showFilePreviewModal"; const FileList = ({ files, setShare, share, isLoading, }: { files?: FileMetaData[]; setShare: Dispatch>; share: Share; isLoading: boolean; }) => { const clipboard = useClipboard(); const config = useConfig(); const modals = useModals(); const [sort, setSort] = useState({ property: undefined, direction: "desc", }); const sortFiles = () => { if (files && sort.property) { const sortedFiles = files.sort((a: any, b: any) => { if (sort.direction === "asc") { return b[sort.property!].localeCompare(a[sort.property!], undefined, { numeric: true, }); } else { return a[sort.property!].localeCompare(b[sort.property!], undefined, { numeric: true, }); } }); setShare({ ...share, files: sortedFiles, }); } }; const copyFileLink = (file: FileMetaData) => { const link = `${config.get("general.appUrl")}/api/shares/${ share.id }/files/${file.id}`; if (window.isSecureContext) { clipboard.copy(link); toast.success("Your file link was copied to the keyboard."); } else { modals.openModal({ title: "File link", children: ( ), }); } }; useEffect(sortFiles, [sort]); return ( {isLoading ? skeletonRows : files!.map((file) => ( ))}
Name Size
{file.name} {byteToHumanSizeString(parseInt(file.size))} {shareService.doesFileSupportPreview(file.name) && ( showFilePreviewModal(share.id, file, modals) } size={25} > )} {!share.hasPassword && ( copyFileLink(file)} > )} { await shareService.downloadFile(share.id, file.id); }} >
); }; const skeletonRows = [...Array(5)].map((c, i) => ( )); export default FileList;