import { useContext, useEffect, useState } from "react"; import { Button, Modal, Form, Spinner } from "react-bootstrap"; import { AddTorrentResponse, AddTorrentOptions } from "../api-types"; import { AppContext, APIContext } from "../context"; import { ErrorComponent } from "./ErrorComponent"; import { formatBytes } from "../helper/formatBytes"; import { ErrorWithLabel } from "../rqbit-web"; export const FileSelectionModal = (props: { onHide: () => void; listTorrentResponse: AddTorrentResponse | null; listTorrentError: ErrorWithLabel | null; listTorrentLoading: boolean; data: string | File; }) => { let { onHide, listTorrentResponse, listTorrentError, listTorrentLoading, data, } = props; const [selectedFiles, setSelectedFiles] = useState([]); const [uploading, setUploading] = useState(false); const [uploadError, setUploadError] = useState(null); const [unpopularTorrent, setUnpopularTorrent] = useState(false); const [outputFolder, setOutputFolder] = useState(""); const ctx = useContext(AppContext); const API = useContext(APIContext); useEffect(() => { console.log(listTorrentResponse); setSelectedFiles( listTorrentResponse ? listTorrentResponse.details.files.map((_, id) => id) : [] ); setOutputFolder(listTorrentResponse?.output_folder || ""); }, [listTorrentResponse]); const clear = () => { onHide(); setSelectedFiles([]); setUploadError(null); setUploading(false); }; const handleToggleFile = (toggledId: number) => { if (selectedFiles.includes(toggledId)) { setSelectedFiles(selectedFiles.filter((i) => i !== toggledId)); } else { setSelectedFiles([...selectedFiles, toggledId]); } }; const handleUpload = async () => { if (!listTorrentResponse) { return; } setUploading(true); let initialPeers = listTorrentResponse.seen_peers ? listTorrentResponse.seen_peers.slice(0, 32) : null; let opts: AddTorrentOptions = { overwrite: true, only_files: selectedFiles, initial_peers: initialPeers, output_folder: outputFolder, }; if (unpopularTorrent) { opts.peer_opts = { connect_timeout: 20, read_write_timeout: 60, }; } API.uploadTorrent(data, opts) .then( () => { onHide(); ctx.refreshTorrents(); }, (e) => { setUploadError({ text: "Error starting torrent", details: e }); } ) .finally(() => setUploading(false)); }; const getBody = () => { if (listTorrentLoading) { return ; } else if (listTorrentError) { return ; } else if (listTorrentResponse) { return (
Pick the files to download {listTorrentResponse.details.files.map((file, index) => ( handleToggleFile(index)} > ))}
Options Output folder setOutputFolder(e.target.value)} /> setUnpopularTorrent(!unpopularTorrent)} > This might be useful for unpopular torrents with few peers. It will slow down fast torrents though.
); } }; return ( Add torrent {getBody()} {uploading && } ); };