import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { AddSeriesOptions, setAddSeriesOption, useAddSeriesOptions, } from 'AddSeries/addSeriesOptionsStore'; import { useSelect } from 'App/Select/SelectContext'; import AppState from 'App/State/AppState'; 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 { cancelLookupSeries, importSeries, lookupUnsearchedSeries, setImportSeriesValue, } from 'Store/Actions/importSeriesActions'; import { InputChanged } from 'typings/inputs'; import translate from 'Utilities/String/translate'; import styles from './ImportSeriesFooter.css'; type MixedType = 'mixed'; function ImportSeriesFooter() { const dispatch = useDispatch(); const { monitor: defaultMonitor, qualityProfileId: defaultQualityProfileId, seriesType: defaultSeriesType, seasonFolder: defaultSeasonFolder, } = useAddSeriesOptions(); const { isLookingUpSeries, isImporting, items, importError } = useSelector( (state: AppState) => state.importSeries ); 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 { 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.isPopulated) { 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) => { dispatch( // @ts-expect-error - actions are not typed setImportSeriesValue({ id, [name]: value, }) ); }); }, [getSelectedIds, dispatch] ); const handleLookupPress = useCallback(() => { dispatch(lookupUnsearchedSeries()); }, [dispatch]); const handleCancelLookupPress = useCallback(() => { dispatch(cancelLookupSeries()); }, [dispatch]); const handleImportPress = useCallback(() => { dispatch(importSeries({ ids: getSelectedIds() })); }, [getSelectedIds, dispatch]); 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.responseJSON) ? ( importError.responseJSON.map((error, index) => { return
  • {error.errorMessage}
  • ; }) ) : (
  • {JSON.stringify(importError.responseJSON)}
  • )}
} position={tooltipPositions.RIGHT} /> ) : null}
); } export default ImportSeriesFooter;