import iconRescan from '/img/icon-rescan.svg'; import iconDownload from '/img/icon-download.svg'; import iconAdd from '/img/icon-add.svg'; import iconSubstract from '/img/icon-substract.svg'; import iconGridView from '/img/icon-gridview.svg'; import iconListView from '/img/icon-listview.svg'; import { Fragment, useEffect, useState } from 'react'; import { useOutletContext, useSearchParams } from 'react-router-dom'; import { ConfigType } from './Home'; import loadDownloadQueue from '../api/loader/loadDownloadQueue'; import { OutletContextType } from './Base'; import Pagination, { PaginationType } from '../components/Pagination'; import { ViewStylesEnum, ViewStylesType } from '../configuration/constants/ViewStyle'; import updateDownloadQueue from '../api/actions/updateDownloadQueue'; import updateTaskByName from '../api/actions/updateTaskByName'; import Notifications from '../components/Notifications'; import ScrollToTopOnNavigate from '../components/ScrollToTop'; import Button from '../components/Button'; import DownloadListItem from '../components/DownloadListItem'; import loadDownloadAggs, { DownloadAggsType } from '../api/loader/loadDownloadAggs'; import { useUserConfigStore } from '../stores/UserConfigStore'; import updateUserConfig, { UserConfigType } from '../api/actions/updateUserConfig'; import { ApiResponseType } from '../functions/APIClient'; import deleteDownloadQueueByFilter from '../api/actions/deleteDownloadQueueByFilter'; import updateDownloadQueueByFilter, { DownloadQueueStatus, } from '../api/actions/updateDownloadQueueByFilter'; type Download = { auto_start: boolean; channel_id: string; channel_indexed: boolean; channel_name: string; duration: string; message?: string; published: string | null; status: string; timestamp: number | null; title: string; vid_thumb_url: string; vid_type: string; youtube_id: string; _index: string; _score: number; }; export type DownloadResponseType = { data?: Download[]; config?: ConfigType; paginate?: PaginationType; }; const Download = () => { const [searchParams, setSearchParams] = useSearchParams(); const { userConfig, setUserConfig } = useUserConfigStore(); const { currentPage, setCurrentPage } = useOutletContext() as OutletContextType; const channelFilterFromUrl = searchParams.get('channel'); const ignoredOnlyParam = searchParams.get('ignored'); const vidTypeFilterFromUrl = searchParams.get('vid-type'); const errorFilterFromUrl = searchParams.get('error'); const [refreshNonce, setRefreshNonce] = useState(0); const [showHiddenForm, setShowHiddenForm] = useState(false); const [addAsAutoStart, setAddAsAutoStart] = useState(false); const [addAsFlat, setAddAsFlat] = useState(false); const [addAsForce, setAddAsForce] = useState(false); const [showQueueActions, setShowQueueActions] = useState(false); const [searchInput, setSearchInput] = useState(''); const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); const [downloadPending, setDownloadPending] = useState(false); const [rescanPending, setRescanPending] = useState(false); const [lastVideoCount, setLastVideoCount] = useState(0); const [downloadQueueText, setDownloadQueueText] = useState(''); const [downloadResponse, setDownloadResponse] = useState>(); const [downloadAggsResponse, setDownloadAggsResponse] = useState>(); const { data: downloadResponseData } = downloadResponse ?? {}; const { data: downloadAggsResponseData } = downloadAggsResponse ?? {}; const downloadList = downloadResponseData?.data; const pagination = downloadResponseData?.paginate; const channelAggsList = downloadAggsResponseData?.buckets; const downloadCount = pagination?.total_hits; const channel_filter_name = downloadResponseData?.data?.length && downloadResponseData?.data?.length > 0 ? downloadResponseData?.data[0].channel_name : ''; const viewStyle = userConfig.view_style_downloads; const gridItems = userConfig.grid_items; const showIgnored = ignoredOnlyParam !== null ? ignoredOnlyParam === 'true' : userConfig.show_ignored_only; const showIgnoredFilter = showIgnored ? 'ignore' : 'pending'; const isGridView = viewStyle === ViewStylesEnum.Grid; const gridView = isGridView ? `boxed-${gridItems}` : ''; const gridViewGrid = isGridView ? `grid-${gridItems}` : ''; const handleUserConfigUpdate = async (config: Partial) => { const updatedUserConfig = await updateUserConfig(config); const { data: updatedUserConfigData } = updatedUserConfig; if (updatedUserConfigData) { setUserConfig(updatedUserConfigData); } }; const refreshDownloadQueue = () => { setRefreshNonce(current => current + 1); }; useEffect(() => { (async () => { const videosResponse = await loadDownloadQueue( currentPage, channelFilterFromUrl, vidTypeFilterFromUrl, errorFilterFromUrl, showIgnored, searchInput, ); const { data: channelResponseData } = videosResponse ?? {}; const videoCount = channelResponseData?.paginate?.total_hits; if (videoCount && lastVideoCount !== videoCount) { setLastVideoCount(videoCount); } setDownloadResponse(videosResponse); })(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [ channelFilterFromUrl, vidTypeFilterFromUrl, errorFilterFromUrl, currentPage, showIgnored, searchInput, refreshNonce, ]); useEffect(() => { (async () => { const downloadAggs = await loadDownloadAggs(showIgnored); setDownloadAggsResponse(downloadAggs); })(); }, [lastVideoCount, showIgnored]); const handleBulkStatusUpdate = async (status: DownloadQueueStatus) => { await updateDownloadQueueByFilter( showIgnoredFilter, channelFilterFromUrl, vidTypeFilterFromUrl, errorFilterFromUrl, status, ); refreshDownloadQueue(); }; return ( <> TA | Downloads

Downloads {channelFilterFromUrl && ` for ${channel_filter_name}`}

{ if (!isDone) { setRescanPending(false); setDownloadPending(false); refreshDownloadQueue(); } }} />
{ setRescanPending(!rescanPending); await updateTaskByName('update_subscribed'); }} src={iconRescan} alt="rescan-icon" />

Rescan subscriptions

{ setDownloadPending(!downloadPending); await updateTaskByName('download_pending'); }} src={iconDownload} alt="download-icon" />

Start download

{ setShowHiddenForm(!showHiddenForm); }} src={iconAdd} alt="add-icon" />

Add to download queue

{showHiddenForm && (
setAddAsFlat(!addAsFlat)} /> {addAsFlat ? ( ) : ( )}
Fast add
setAddAsForce(!addAsForce)} /> {addAsForce ? ( ) : ( )}
Re-Download
setAddAsAutoStart(!addAsAutoStart)} /> {addAsAutoStart ? ( ) : ( )}
Auto Download