UNPKG

khamba

Version:

A cli tool for sharing files through local network.

58 lines (57 loc) 3.28 kB
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 FileTransferForReceiver = ({}) => { 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 FileTransferForReceiver;