diff --git a/src/client/actions/airdcpp.actions.tsx b/src/client/actions/airdcpp.actions.tsx index f2c633c..1b24986 100644 --- a/src/client/actions/airdcpp.actions.tsx +++ b/src/client/actions/airdcpp.actions.tsx @@ -10,8 +10,9 @@ import { AIRDCPP_HUB_SEARCHES_SENT, AIRDCPP_RESULT_DOWNLOAD_INITIATED, AIRDCPP_DOWNLOAD_PROGRESS_TICK, + AIRDCPP_BUNDLES_FETCHED, } from "../constants/action-types"; -import { isNil } from "lodash"; +import { each, isNil } from "lodash"; import axios from "axios"; interface SearchData { @@ -51,7 +52,6 @@ export const search = (data: SearchData) => async (dispatch) => { type: AIRDCPP_SEARCH_RESULTS_RECEIVED, results, }); - SocketService.disconnect(); return results; }; @@ -59,12 +59,25 @@ export const downloadAirDCPPItem = (instanceId: string, resultId: string, comicObjectId: string): void => async (dispatch) => { try { + if (!SocketService.isConnected()) { + await SocketService.connect("admin", "password", true); + } let bundleDBImportResult = {}; - await SocketService.connect("admin", "password", true); const downloadResult = await SocketService.post( `search/${instanceId}/results/${resultId}/download`, ); + let bundleId; + let directoryIds; + if (!isNil(downloadResult.bundle_info)) { + bundleId = downloadResult.bundle_info.id; + } + if (!isNil(downloadResult.directory_download_ids)) { + directoryIds = downloadResult.directory_download_ids.map( + (item) => item.id, + ); + } + if (!isNil(downloadResult)) { bundleDBImportResult = await axios({ method: "POST", @@ -75,8 +88,9 @@ export const downloadAirDCPPItem = data: { resultId, comicObjectId, - downloadResult, searchInstanceId: instanceId, + bundleId, + directoryIds, }, }); dispatch({ @@ -85,18 +99,18 @@ export const downloadAirDCPPItem = bundleDBImportResult, }); } - - SocketService.disconnect(); } catch (error) { throw error; } }; export const getDownloadProgress = - (fileId: string, directoryId?: string): void => + (comicObjectId: string): void => async (dispatch) => { try { - await SocketService.connect("admin", "password", true); + if (!SocketService.isConnected()) { + await SocketService.connect("admin", "password", true); + } SocketService.addListener( `queue`, "queue_bundle_tick", @@ -111,3 +125,39 @@ export const getDownloadProgress = throw error; } }; + +export const getBundlesForComic = + (comicObjectId: string) => async (dispatch) => { + try { + if (!SocketService.isConnected()) { + await SocketService.connect("admin", "password", true); + } + const bundles = await SocketService.get("queue/bundles/0/500"); + const comicObject = await axios({ + method: "POST", + url: "http://localhost:3000/api/import/getComicBookById", + headers: { + "Content-Type": "application/json; charset=utf-8", + }, + data: { + id: `${comicObjectId}`, + }, + }); + // get only the bundles applicable for the comic + const filteredBundles = []; + comicObject.data.acquisition.directconnect.map(({ bundleId }) => { + each(bundles, (bundle) => { + if (bundle.id === bundleId) { + filteredBundles.push(bundle); + } + }); + }); + + dispatch({ + type: AIRDCPP_BUNDLES_FETCHED, + bundles: filteredBundles, + }); + } catch (error) { + throw error; + } + }; diff --git a/src/client/components/ComicDetail.tsx b/src/client/components/ComicDetail.tsx index 2b9ad13..5c2bd15 100644 --- a/src/client/components/ComicDetail.tsx +++ b/src/client/components/ComicDetail.tsx @@ -52,9 +52,6 @@ export const ComicDetail = ({}: ComicDetailProps): ReactElement => { (state: RootState) => state.comicInfo.comicBookDetail, ); - const bundleMetadata = useSelector( - (state: RootState) => state.comicInfo.downloadResult, - ); const { comicObjectId } = useParams<{ comicObjectId: string }>(); const dispatch = useDispatch(); const toggleActionDropdown = () => diff --git a/src/client/components/DownloadsPanel.tsx b/src/client/components/DownloadsPanel.tsx index be5370a..102a483 100644 --- a/src/client/components/DownloadsPanel.tsx +++ b/src/client/components/DownloadsPanel.tsx @@ -1,8 +1,11 @@ import React, { useEffect, ReactElement } from "react"; -import { getDownloadProgress } from "../actions/airdcpp.actions"; +import { + getDownloadProgress, + getBundlesForComic, +} from "../actions/airdcpp.actions"; import { useDispatch, useSelector } from "react-redux"; import { RootState } from "threetwo-ui-typings"; -import { isNil } from "lodash"; +import { isNil, map } from "lodash"; import prettyBytes from "pretty-bytes"; interface IDownloadsPanelProps { @@ -15,37 +18,60 @@ export const DownloadsPanel = ( const downloadProgressTick = useSelector( (state: RootState) => state.airdcpp.downloadProgressData, ); + const bundles = useSelector((state: RootState) => state.airdcpp.bundles); const dispatch = useDispatch(); + // useEffect(() => { + // dispatch(getDownloadProgress(props.data._id)); + // }, [dispatch]); + useEffect(() => { - dispatch(getDownloadProgress("12312")); + dispatch(getBundlesForComic(props.data._id)); }, [dispatch]); - return !isNil(downloadProgressTick) ? ( + + const ProgressTick = (props) => (
- {JSON.stringify(downloadProgressTick)} + {JSON.stringify(props.downloadProgressTick)} - {(parseInt(downloadProgressTick.downloaded_bytes) / - parseInt(downloadProgressTick.size)) * - 100} - % + {(parseInt(props.downloaded_bytes) / parseInt(props.size)) * 100}%
-
{downloadProgressTick.name}
+
{props.name}
- {prettyBytes(downloadProgressTick.downloaded_bytes)} of - {prettyBytes(downloadProgressTick.size)} + {prettyBytes(props.downloaded_bytes)} of + {prettyBytes(props.size)}
- {prettyBytes(downloadProgressTick.speed)} per second. Time left: - {parseInt(downloadProgressTick.seconds_left) / 60} + {prettyBytes(props.speed)} per second. Time left: + {parseInt(props.seconds_left) / 60}
-
{downloadProgressTick.target}
+
{props.target}
- ) : null; + ); + + const Bundles = (props) => { + return ( +
+
+ {!isNil(props.data) && + props.data && + map(props.data, (bundle) => ( + <> +
{bundle.name}
+
{bundle.target}
+
{bundle.size}
+ + ))} +
+
+ ); + }; + + return !isNil(bundles) ? : null; }; export default DownloadsPanel; diff --git a/src/client/constants/action-types.ts b/src/client/constants/action-types.ts index 1128b13..199ad5d 100644 --- a/src/client/constants/action-types.ts +++ b/src/client/constants/action-types.ts @@ -1,4 +1,3 @@ - export const CV_API_CALL_IN_PROGRESS = "CV_SEARCH_IN_PROGRESS"; export const CV_SEARCH_FAILURE = "CV_SEARCH_FAILURE"; export const CV_SEARCH_SUCCESS = "CV_SEARCH_SUCCESS"; @@ -39,4 +38,5 @@ export const AIRDCPP_SEARCH_RESULTS_RECEIVED = export const AIRDCPP_HUB_SEARCHES_SENT = "AIRDCPP_HUB_SEARCHES_SENT"; export const AIRDCPP_RESULT_DOWNLOAD_INITIATED = "AIRDCPP_RESULT_DOWNLOAD_INITIATED"; +export const AIRDCPP_BUNDLES_FETCHED = "AIRDCPP_BUNDLES_FETCHED"; export const AIRDCPP_DOWNLOAD_PROGRESS_TICK = "AIRDCPP_DOWNLOAD_PROGRESS_TICK"; diff --git a/src/client/reducers/airdcpp.reducer.ts b/src/client/reducers/airdcpp.reducer.ts index 117243a..229436e 100644 --- a/src/client/reducers/airdcpp.reducer.ts +++ b/src/client/reducers/airdcpp.reducer.ts @@ -4,6 +4,7 @@ import { AIRDCPP_HUB_SEARCHES_SENT, AIRDCPP_RESULT_DOWNLOAD_INITIATED, AIRDCPP_DOWNLOAD_PROGRESS_TICK, + AIRDCPP_BUNDLES_FETCHED, } from "../constants/action-types"; import { LOCATION_CHANGE } from "connected-react-router"; @@ -50,6 +51,12 @@ function airdcppReducer(state = initialState, action) { ...state, downloadProgressData: action.downloadProgressData, }; + case AIRDCPP_BUNDLES_FETCHED: + console.log(action) + return { + ...state, + bundles: action.bundles, + }; case LOCATION_CHANGE: return { initialState,