import React, { useCallback, useContext, ReactElement, useEffect, useState, } from "react"; import { search, downloadAirDCPPItem, getBundlesForComic, } from "../../actions/airdcpp.actions"; import { useDispatch, useSelector } from "react-redux"; import { RootState, SearchInstance } from "threetwo-ui-typings"; import ellipsize from "ellipsize"; import { Form, Field } from "react-final-form"; import { isEmpty, isNil, map } from "lodash"; import { AirDCPPSocketContext } from "../../context/AirDCPPSocket"; interface IAcquisitionPanelProps { query: any; comicObjectId: any; comicObject: any; settings: any; } export const AcquisitionPanel = ( props: IAcquisitionPanelProps, ): ReactElement => { const issueName = props.query.issue.name || ""; // const { settings } = props; const sanitizedIssueName = issueName.replace(/[^a-zA-Z0-9 ]/g, " "); // Selectors for picking state const airDCPPSearchResults = useSelector((state: RootState) => { return state.airdcpp.searchResults; }); const isAirDCPPSearchInProgress = useSelector( (state: RootState) => state.airdcpp.isAirDCPPSearchInProgress, ); const searchInfo = useSelector( (state: RootState) => state.airdcpp.searchInfo, ); const searchInstance: SearchInstance = useSelector( (state: RootState) => state.airdcpp.searchInstance, ); // const settings = useSelector((state: RootState) => state.settings.data); const airDCPPConfiguration = useContext(AirDCPPSocketContext); const dispatch = useDispatch(); const [dcppQuery, setDcppQuery] = useState({}); useEffect(() => { if (!isEmpty(airDCPPConfiguration.airDCPPState.settings)) { // AirDC++ search query const dcppSearchQuery = { query: { pattern: `${sanitizedIssueName.replace(/#/g, "")}`, extensions: ["cbz", "cbr", "cb7"], }, hub_urls: map( airDCPPConfiguration.airDCPPState.settings.directConnect.client.hubs, (item) => item.value, ), priority: 5, }; setDcppQuery(dcppSearchQuery); } }, [airDCPPConfiguration]); const getDCPPSearchResults = useCallback( async (searchQuery) => { const manualQuery = { query: { pattern: `${searchQuery.issueName}`, extensions: ["cbz", "cbr", "cb7"], }, hub_urls: map( airDCPPConfiguration.airDCPPState.settings.directConnect.client.hubs, (item) => item.value, ), priority: 5, }; dispatch( search(manualQuery, airDCPPConfiguration.airDCPPState.socket, { username: `${airDCPPConfiguration.airDCPPState.settings.directConnect.client.host.username}`, password: `${airDCPPConfiguration.airDCPPState.settings.directConnect.client.host.password}`, }), ); }, [dispatch, airDCPPConfiguration], ); // download via AirDC++ const downloadDCPPResult = useCallback( (searchInstanceId, resultId, name, size, type) => { dispatch( downloadAirDCPPItem( searchInstanceId, resultId, props.comicObjectId, name, size, type, airDCPPConfiguration.airDCPPState.socket, { username: `${airDCPPConfiguration.airDCPPState.settings.directConnect.client.host.username}`, password: `${airDCPPConfiguration.airDCPPState.settings.directConnect.client.host.password}`, }, ), ); // this is to update the download count badge on the downloads tab dispatch( getBundlesForComic( props.comicObjectId, airDCPPConfiguration.airDCPPState.socket, { username: `${airDCPPConfiguration.airDCPPState.settings.directConnect.client.host.username}`, password: `${airDCPPConfiguration.airDCPPState.settings.directConnect.client.host.password}`, }, ), ); }, [airDCPPConfiguration], ); return ( <>
{!isEmpty(airDCPPConfiguration.airDCPPState.socket) ? (
(
{({ input, meta }) => { return (
Use this to perform a manual search.
); }}
)} /> ) : (
AirDC++ is not configured. Please configure it in{" "} Settings.
)}
{/* AirDC++ search instance details */} {!isNil(searchInfo) && !isNil(searchInstance) && (
{airDCPPConfiguration.airDCPPState.settings.directConnect.client.hubs.map( ({ value }) => ( {value} ), )}
Query:{" "} {searchInfo.query.pattern}
Extensions: {searchInfo.query.extensions.join(", ")}
File type: {searchInfo.query.file_type}
Search Instance: {searchInstance.id}
Owned by {searchInstance.owner}
Expires in: {searchInstance.expires_in}
)} {/* AirDC++ results */}
{!isNil(airDCPPSearchResults) && !isEmpty(airDCPPSearchResults) ? (
{map(airDCPPSearchResults, ({ result }, idx) => { return ( ); })}
Name Type Slots Actions

{result.type.id === "directory" ? ( ) : null}{" "} {ellipsize(result.name, 70)}

{!isNil(result.dupe) ? ( Dupe ) : null} {result.users.user.nicks} {result.users.user.flags.map((flag, idx) => ( {flag} ))}
{result.type.id === "directory" ? "directory" : result.type.str}
{result.slots.free} free {result.slots.total}
downloadDCPPResult( searchInstance.id, result.id, result.name, result.size, result.type, ) } >
) : (
Searching via AirDC++ is still in{" "} alpha. Some searches may take arbitrarily long, or may not work at all. Searches from ADCS hubs are more reliable than NMDCS ones.
)}
); }; export default AcquisitionPanel;