khamba
Version:
A cli tool for sharing files through local network.
42 lines (41 loc) • 2.09 kB
JavaScript
import React, { useMemo } from 'react';
import SelectInput from 'ink-select-input';
import { Box, Text } from 'ink';
import { useStore } from '@nanostores/react';
import { $peersFiles } from '../stores/receiverfileHandlerStore.js';
import { formatBytes } from '../functions/helper.js';
import { $sendingFiles } from '../stores/baseStore.js';
const PeerList = ({ peers, onSelect }) => {
const peersFiles = useStore($peersFiles);
const sendingFiles = useStore($sendingFiles);
const onlySenders = useMemo(() => Object.entries(peers)?.filter(([key, value]) => true), [peers]);
const items = useMemo(() => onlySenders?.map(([key, value]) => {
const selectedPeerFiles = peersFiles[key] ?? {};
const totalFiles = Object.keys(selectedPeerFiles).length;
const totalSize = Object.values(selectedPeerFiles).reduce((acc, item) => acc + (item?.fileSize ?? 0), 0);
const formattedSize = formatBytes(totalSize);
const label = totalFiles > 0
? `${value.name} - ${totalFiles} files | ${formattedSize}`
: `${value.name}`;
return {
label: label,
value: key,
};
}), [onlySenders, peersFiles]);
const handleSelect = (item) => {
if (item)
onSelect(item.value);
};
const isIAmSender = useMemo(() => JSON.stringify(sendingFiles) == '{}', [sendingFiles]);
return (React.createElement(Box, { flexDirection: "column", marginTop: 1, marginLeft: 1 },
items.length > 0 && (React.createElement(Box, { flexDirection: "column", marginBottom: 1 },
React.createElement(Text, null,
"Press",
' ',
React.createElement(Text, { backgroundColor: isIAmSender ? 'green' : '#A855F7' }, "\u2800\u21A9 Enter\u2800"),
' ',
"to select peer"),
React.createElement(Text, null, "Only receiver can select file for now. We are still working on it."))),
React.createElement(SelectInput, { items: items, onSelect: handleSelect })));
};
export default PeerList;