khamba
Version:
A cli tool for sharing files through local network.
60 lines (59 loc) • 2.95 kB
JavaScript
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;