UNPKG

khamba

Version:

A cli tool for sharing files through local network.

60 lines (59 loc) 2.95 kB
import React, { useEffect, useMemo, useCallback, useRef } from 'react'; import { Box, Text } from 'ink'; import ProgressBar from '../../components/Misc/ProgressBar.js'; import CustomTask from '../../components/Misc/CustomTask.js'; import { logError, logToFile } from '../../functions/log.js'; import { checkEnoughSpace, useFileDownloader, } from '../../functions/useFileDownloader.js'; import { useHashCheck } from '../../functions/useHashCheck.js'; import { adjustStringLength, formatBytes } from '../../functions/helper.js'; import { useStore } from '@nanostores/react'; import { $currTransferProgress } from '../../stores/fileHandlerStore.js'; const SingleFileTransfer = ({ index, downloadIndex, state, error, fileInfo, peerInfo, isStartedTransferring, isTransferComplete, onSingleDownloadComplete, longestNameLength, }) => { const currTransferProgress = useStore($currTransferProgress); const downloadAttempted = useRef(false); const taskState = { DEFAULT: 'pending', TRANSFERRING: 'loading', TRANSFERRED: 'loading', ERROR: 'error', SUCCESS: 'success', }; const startDownload = useCallback(async () => { try { if (downloadAttempted.current) return; downloadAttempted.current = true; const { fileId, fileName, fileSize, fileType } = fileInfo; const { peerIP, peerHttpPort } = peerInfo; // const isNoDuplicationIssue = await checkDuplication(fileId, fileName); // if (!isNoDuplicationIssue) return; const isNoSpaceIssue = await checkEnoughSpace(fileId, fileSize); if (!isNoSpaceIssue) return; await useFileDownloader(peerIP, peerHttpPort, fileId, fileName, fileType, fileSize); await useHashCheck(peerIP, peerHttpPort, fileId, fileName); onSingleDownloadComplete(); } catch (error) { logError(error); } }, [fileInfo, peerInfo, onSingleDownloadComplete]); useEffect(() => { if (downloadIndex === index && !downloadAttempted.current) { logToFile('RERENDER RESTING'); startDownload(); } }, [downloadIndex, index, startDownload]); const label = useMemo(() => { const fileName = adjustStringLength(fileInfo.fileName, longestNameLength); const formattedSize = formatBytes(fileInfo.fileSize); return `⠀${fileName} - ${formattedSize}`; }, [fileInfo, longestNameLength]); return (React.createElement(Box, null, isStartedTransferring && !isTransferComplete && (React.createElement(ProgressBar, { left: 0, percent: currTransferProgress[fileInfo.fileId] ?? 0 })), React.createElement(CustomTask, { label: label, state: taskState[state] }), error && React.createElement(Text, { color: "red" }, "\u2800", error))); }; export default SingleFileTransfer;