khamba
Version:
A cli tool for sharing files through local network.
61 lines (60 loc) • 3.05 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 } 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 { $receiverTransferProgress } from '../../../stores/fileHandlerStore.js';
import { $baseInfo } from '../../../stores/baseStore.js';
const SingleFileTransfer = ({ index, downloadIndex, state, error, fileInfo, peerInfo, isStartedTransferring, isTransferComplete, onSingleDownloadComplete, longestNameLength, }) => {
const receiverTransferProgress = useStore($receiverTransferProgress);
const baseInfo = useStore($baseInfo);
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(baseInfo.MY_ID, 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) {
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: receiverTransferProgress[fileInfo.fileId] ?? 0 })),
React.createElement(CustomTask, { label: label, state: taskState[state] }),
error && React.createElement(Text, { color: "red" },
"\u2800",
error)));
};
export default SingleFileTransfer;