khamba
Version:
A cli tool for sharing files through local network.
58 lines (57 loc) • 3.28 kB
JavaScript
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { Box, Text } from 'ink';
import { log } from '../../../functions/log.js';
import SingleFileTransferForReceiver from '../../../components/Transfer/Receiver/SingleFileTransferForReceiver.js';
import { findLongestString, formatBytes } from '../../../functions/helper.js';
import { useStore } from '@nanostores/react';
import { $receiverTransferInfo } from '../../../stores/receiverfileHandlerStore.js';
const ReceiverFileTransferFor = ({}) => {
const receiverTransferInfo = useStore($receiverTransferInfo);
const [downloadIndex, setDownloadIndex] = useState(-1);
const [isStartedTransferring, setIsStartedTransferring] = useState(false);
const [isTransferComplete, setIsTransferComplete] = useState(false);
const totalFiles = Object.keys(receiverTransferInfo.files)?.length;
const endTransfer = async () => {
setIsTransferComplete(true);
log('💯 Download Complete 💯');
process.exit(0);
};
const onSingleDownloadComplete = useCallback(() => {
if (downloadIndex >= totalFiles - 1) {
endTransfer();
}
else {
setDownloadIndex(prevIndex => prevIndex + 1);
}
}, [totalFiles, downloadIndex]);
const longestNameLength = useMemo(() => {
const longestLength = findLongestString(Object.values(receiverTransferInfo.files).map(file => file.fileName))?.length ?? Infinity;
return Math.min(longestLength, 30);
}, [receiverTransferInfo.files]);
const sumTotalTransferred = useMemo(() => Object.values(receiverTransferInfo.files).reduce((sum, file) => sum + file.totalTransferred, 0), [JSON.stringify(receiverTransferInfo.files)]);
useEffect(() => {
if (!isStartedTransferring && !isTransferComplete) {
setIsStartedTransferring(true);
setDownloadIndex(0);
}
}, [isStartedTransferring, isTransferComplete]);
return (React.createElement(Box, { borderColor: "green", borderStyle: "bold", paddingX: 1, flexDirection: "column", marginTop: 1 },
React.createElement(Box, { flexDirection: "column" },
React.createElement(Text, { backgroundColor: "green", color: "white", bold: true },
"\u2800",
receiverTransferInfo.peerInfo.peerName,
"\u2800")),
React.createElement(Text, { dimColor: true },
isTransferComplete
? 'Files Transfer Complete 🎉'
: isStartedTransferring
? 'Receiving Files...'
: 'Files',
"\u2800(",
formatBytes(sumTotalTransferred),
"\u2800/\u2800",
formatBytes(receiverTransferInfo.totalFileSize),
")"),
Object.entries(receiverTransferInfo.files).map(([key, value], index) => (React.createElement(SingleFileTransferForReceiver, { key: key, index: index, downloadIndex: downloadIndex, fileId: key, file: value, peerInfo: receiverTransferInfo.peerInfo, isStartedTransferring: isStartedTransferring, isTransferComplete: isTransferComplete, onSingleDownloadComplete: onSingleDownloadComplete, longestNameLength: longestNameLength })))));
};
export default ReceiverFileTransferFor;