import { useCallback, useContext, useEffect, useState } from "react"; 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"; import { Spinner } from "../Spinner"; import { Modal } from "./Modal"; import { ModalBody } from "./ModalBody"; import { ModalFooter } from "./ModalFooter"; import { Button } from "../buttons/Button"; import { FormCheckbox } from "../forms/FormCheckbox"; import { Fieldset } from "../forms/Fieldset"; import { FormInput } from "../forms/FormInput"; import { Form } from "../forms/Form"; 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); // const [Modal, , , closeModal] = useModal({ fullScreen: true }); const selectAll = () => { setSelectedFiles( listTorrentResponse ? listTorrentResponse.details.files.map((_, id) => id) : [] ); }; useEffect(() => { console.log(listTorrentResponse); selectAll(); 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 (
{listTorrentResponse.details.files.map((file, index) => ( handleToggleFile(index)} name={`check-${index}`} /> ))}
setOutputFolder(e.target.value)} /> setUnpopularTorrent(!unpopularTorrent)} help="This might be useful for unpopular torrents with few peers. It will slow down fast torrents though." name="increase_timeouts" />
); } }; return ( {getBody()} {uploading && } ); };