import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { AddSeriesOptions, setAddSeriesOption, useAddSeriesOptions, } from 'AddSeries/addSeriesOptionsStore'; import { useSelect } from 'App/Select/SelectContext'; import CheckInput from 'Components/Form/CheckInput'; import FormInputGroup from 'Components/Form/FormInputGroup'; import Icon from 'Components/Icon'; import Button from 'Components/Link/Button'; import SpinnerButton from 'Components/Link/SpinnerButton'; import LoadingIndicator from 'Components/Loading/LoadingIndicator'; import PageContentFooter from 'Components/Page/PageContentFooter'; import Popover from 'Components/Tooltip/Popover'; import { icons, inputTypes, kinds, tooltipPositions } from 'Helpers/Props'; import { SeriesMonitor, SeriesType } from 'Series/Series'; import { InputChanged } from 'typings/inputs'; import translate from 'Utilities/String/translate'; import { ImportSeriesItem, startProcessing, stopProcessing, updateImportSeriesItem, useImportSeriesItems, useLookupQueueHasItems, } from './importSeriesStore'; import { useImportSeries } from './useImportSeries'; import styles from './ImportSeriesFooter.css'; type MixedType = 'mixed'; function ImportSeriesFooter() { const { monitor: defaultMonitor, qualityProfileId: defaultQualityProfileId, seriesType: defaultSeriesType, seasonFolder: defaultSeasonFolder, } = useAddSeriesOptions(); const items = useImportSeriesItems(); const isLookingUpSeries = useLookupQueueHasItems(); const [monitor, setMonitor] = useState( defaultMonitor ); const [qualityProfileId, setQualityProfileId] = useState( defaultQualityProfileId ); const [seriesType, setSeriesType] = useState( defaultSeriesType ); const [seasonFolder, setSeasonFolder] = useState( defaultSeasonFolder ); const { selectedCount, getSelectedIds } = useSelect(); const { importSeries, isImporting, importError } = useImportSeries(); const { hasUnsearchedItems, isMonitorMixed, isQualityProfileIdMixed, isSeriesTypeMixed, isSeasonFolderMixed, } = useMemo(() => { let isMonitorMixed = false; let isQualityProfileIdMixed = false; let isSeriesTypeMixed = false; let isSeasonFolderMixed = false; let hasUnsearchedItems = false; items.forEach((item) => { if (item.monitor !== defaultMonitor) { isMonitorMixed = true; } if (item.qualityProfileId !== defaultQualityProfileId) { isQualityProfileIdMixed = true; } if (item.seriesType !== defaultSeriesType) { isSeriesTypeMixed = true; } if (item.seasonFolder !== defaultSeasonFolder) { isSeasonFolderMixed = true; } if (!item.hasSearched) { hasUnsearchedItems = true; } }); return { hasUnsearchedItems: !isLookingUpSeries && hasUnsearchedItems, isMonitorMixed, isQualityProfileIdMixed, isSeriesTypeMixed, isSeasonFolderMixed, }; }, [ defaultMonitor, defaultQualityProfileId, defaultSeasonFolder, defaultSeriesType, items, isLookingUpSeries, ]); const handleInputChange = useCallback( ({ name, value }: InputChanged) => { if (name === 'monitor') { setMonitor(value as SeriesMonitor); } else if (name === 'qualityProfileId') { setQualityProfileId(value as number); } else if (name === 'seriesType') { setSeriesType(value as SeriesType); } else if (name === 'seasonFolder') { setSeasonFolder(value as boolean); } setAddSeriesOption(name as keyof AddSeriesOptions, value); getSelectedIds().forEach((id) => { updateImportSeriesItem({ id, [name]: value, }); }); }, [getSelectedIds] ); const handleLookupPress = useCallback(() => { startProcessing(); }, []); const handleCancelLookupPress = useCallback(() => { stopProcessing(); }, []); const handleImportPress = useCallback(() => { importSeries(getSelectedIds()); }, [importSeries, getSelectedIds]); useEffect(() => { if (isMonitorMixed && monitor !== 'mixed') { setMonitor('mixed'); } else if (!isMonitorMixed && monitor !== defaultMonitor) { setMonitor(defaultMonitor); } }, [defaultMonitor, isMonitorMixed, monitor]); useEffect(() => { if (isQualityProfileIdMixed && qualityProfileId !== 'mixed') { setQualityProfileId('mixed'); } else if ( !isQualityProfileIdMixed && qualityProfileId !== defaultQualityProfileId ) { setQualityProfileId(defaultQualityProfileId); } }, [defaultQualityProfileId, isQualityProfileIdMixed, qualityProfileId]); useEffect(() => { if (isSeriesTypeMixed && seriesType !== 'mixed') { setSeriesType('mixed'); } else if (!isSeriesTypeMixed && seriesType !== defaultSeriesType) { setSeriesType(defaultSeriesType); } }, [defaultSeriesType, isSeriesTypeMixed, seriesType]); useEffect(() => { if (isSeasonFolderMixed && seasonFolder !== 'mixed') { setSeasonFolder('mixed'); } else if (!isSeasonFolderMixed && seasonFolder !== defaultSeasonFolder) { setSeasonFolder(defaultSeasonFolder); } }, [defaultSeasonFolder, isSeasonFolderMixed, seasonFolder]); return (
{translate('Monitor')}
{translate('QualityProfile')}
{translate('SeriesType')}
{translate('SeasonFolder')}
 
{translate('ImportCountSeries', { selectedCount })} {isLookingUpSeries ? ( ) : null} {hasUnsearchedItems ? ( ) : null} {isLookingUpSeries ? ( ) : null} {isLookingUpSeries ? translate('ProcessingFolders') : null} {importError ? ( } title={translate('ImportErrors')} body={
    {Array.isArray(importError.statusBody) ? ( importError.statusBody.map((error, index) => { return
  • {error.errorMessage}
  • ; }) ) : (
  • {JSON.stringify(importError.statusBody)}
  • )}
} position={tooltipPositions.RIGHT} /> ) : null}
); } export default ImportSeriesFooter;