/* eslint-disable react-hooks/exhaustive-deps */ import React, { useEffect, useState } from 'react'; import useSWR from 'swr'; import { SmallLoadingSpinner } from '../../Common/LoadingSpinner'; import type { ServiceCommonServer, ServiceCommonServerWithDetails, } from '../../../../server/interfaces/api/serviceInterfaces'; import { defineMessages, useIntl } from 'react-intl'; import { formatBytes } from '../../../utils/numberHelpers'; const messages = defineMessages({ advancedoptions: 'Advanced Options', destinationserver: 'Destination Server', qualityprofile: 'Quality Profile', rootfolder: 'Root Folder', animenote: '* This series is an anime.', default: '(Default)', loadingprofiles: 'Loading profiles…', loadingfolders: 'Loading folders…', }); export type RequestOverrides = { server?: number; profile?: number; folder?: string; }; interface AdvancedRequesterProps { type: 'movie' | 'tv'; is4k: boolean; isAnime?: boolean; defaultOverrides?: RequestOverrides; onChange: (overrides: RequestOverrides) => void; } const AdvancedRequester: React.FC = ({ type, is4k = false, isAnime = false, defaultOverrides, onChange, }) => { const intl = useIntl(); const { data, error } = useSWR( `/api/v1/service/${type === 'movie' ? 'radarr' : 'sonarr'}`, { refreshInterval: 0, refreshWhenHidden: false, revalidateOnFocus: false, revalidateOnMount: true, } ); const [selectedServer, setSelectedServer] = useState( defaultOverrides?.server !== undefined && defaultOverrides?.server >= 0 ? defaultOverrides?.server : null ); const [selectedProfile, setSelectedProfile] = useState( defaultOverrides?.profile ?? -1 ); const [selectedFolder, setSelectedFolder] = useState( defaultOverrides?.folder ?? '' ); const { data: serverData, isValidating, } = useSWR( selectedServer !== null ? `/api/v1/service/${ type === 'movie' ? 'radarr' : 'sonarr' }/${selectedServer}` : null, { refreshInterval: 0, refreshWhenHidden: false, revalidateOnFocus: false, } ); useEffect(() => { let defaultServer = data?.find( (server) => server.isDefault && is4k === server.is4k ); if (!defaultServer && (data ?? []).length > 0) { defaultServer = data?.[0]; } if ( defaultServer && defaultServer.id !== selectedServer && (!defaultOverrides || defaultOverrides.server === null) ) { setSelectedServer(defaultServer.id); } }, [data]); useEffect(() => { if (serverData) { const defaultProfile = serverData.profiles.find( (profile) => profile.id === (isAnime ? serverData.server.activeAnimeProfileId : serverData.server.activeProfileId) ); const defaultFolder = serverData.rootFolders.find( (folder) => folder.path === (isAnime ? serverData.server.activeAnimeDirectory : serverData.server.activeDirectory) ); if ( defaultProfile && defaultProfile.id !== selectedProfile && (!defaultOverrides || defaultOverrides.profile === null) ) { setSelectedProfile(defaultProfile.id); } if ( defaultFolder && defaultFolder.path !== selectedFolder && (!defaultOverrides || defaultOverrides.folder === null) ) { setSelectedFolder(defaultFolder?.path ?? ''); } } }, [serverData]); useEffect(() => { if ( defaultOverrides && defaultOverrides.server !== null && defaultOverrides.server !== undefined ) { setSelectedServer(defaultOverrides.server); } if ( defaultOverrides && defaultOverrides.profile !== null && defaultOverrides.profile !== undefined ) { setSelectedProfile(defaultOverrides.profile); } if ( defaultOverrides && defaultOverrides.folder !== null && defaultOverrides.folder !== undefined ) { setSelectedFolder(defaultOverrides.folder); } }, [ defaultOverrides?.server, defaultOverrides?.folder, defaultOverrides?.profile, ]); useEffect(() => { if (selectedServer !== null) { onChange({ folder: selectedFolder !== '' ? selectedFolder : undefined, profile: selectedProfile !== -1 ? selectedProfile : undefined, server: selectedServer ?? undefined, }); } }, [selectedFolder, selectedServer, selectedProfile]); if (!data && !error) { return (
); } if (!data || selectedServer === null) { return null; } return ( <>
{intl.formatMessage(messages.advancedoptions)}
{isAnime && (
{intl.formatMessage(messages.animenote)}
)}
); }; export default AdvancedRequester;