import React, { useState } from "react"; import PropTypes from "prop-types"; import { Map, List } from "immutable"; import { connect } from "react-redux"; import { prettySize } from "../../utils"; import { fetchTorrents, addTorrent, removeTorrent } from "../../actions/torrents"; const mapStateToProps = state => ({ torrents: state.torrentStore.get("torrents") }); const mapDispatchToProps = { fetchTorrents, addTorrent, removeTorrent }; const TorrentList = props => (
); TorrentList.propTypes = { fetchTorrents: PropTypes.func.isRequired, addTorrent: PropTypes.func.isRequired, removeTorrent: PropTypes.func.isRequired, torrents: PropTypes.instanceOf(List) }; export default connect(mapStateToProps, mapDispatchToProps)(TorrentList); const AddTorrent = props => { const [url, setUrl] = useState(""); const handleSubmit = e => { e.preventDefault(); if (url === "") { return; } props.addTorrent(url); setUrl(""); }; return (
handleSubmit(e)}> setUrl(e.target.value)} />
); }; AddTorrent.propTypes = { addTorrent: PropTypes.func.isRequired }; const Torrents = props => { if (props.torrents.size === 0) { return (

No torrents

); } return (
{props.torrents.map((el, index) => ( ))}
); }; Torrents.propTypes = { removeTorrent: PropTypes.func.isRequired, torrents: PropTypes.instanceOf(List) }; const Torrent = props => { const handleClick = () => { props.removeTorrent(props.data.get("id")); }; const done = props.data.get("is_finished"); var progressStyle = done ? "success" : "info progress-bar-striped progress-bar-animated"; const progressBarClass = "progress-bar bg-" + progressStyle; var percentDone = props.data.get("percent_done"); const started = percentDone !== 0; if (started) { percentDone = Number(percentDone).toFixed(1) + "%"; } // Pretty sizes const downloadedSize = prettySize(props.data.get("downloaded_size")); const totalSize = prettySize(props.data.get("total_size")); const downloadRate = prettySize(props.data.get("download_rate")) + "/s"; return (
{props.data.get("name")} handleClick()} >
{started && (

{downloadedSize} / {totalSize} - {percentDone} - {downloadRate}

)} {!started &&

Download not yet started

}
); }; Torrent.propTypes = { removeTorrent: PropTypes.func.isRequired, data: PropTypes.instanceOf(Map) };