fix(requestlist): hide the remove from *arr button when no service exists (#1457)

This PR hide the "Remove from *arr" button in the request list when the service of the request
doesn't exist anymore.

fix #1449
This commit is contained in:
Gauthier
2025-03-12 08:28:31 +01:00
committed by GitHub
parent 9891a7577c
commit 33e7a153aa
2 changed files with 63 additions and 25 deletions

View File

@@ -17,9 +17,10 @@ import {
TrashIcon, TrashIcon,
XMarkIcon, XMarkIcon,
} from '@heroicons/react/24/solid'; } from '@heroicons/react/24/solid';
import { MediaRequestStatus } from '@server/constants/media'; import { MediaRequestStatus, MediaType } from '@server/constants/media';
import type { MediaRequest } from '@server/entity/MediaRequest'; import type { MediaRequest } from '@server/entity/MediaRequest';
import type { NonFunctionProperties } from '@server/interfaces/api/common'; import type { NonFunctionProperties } from '@server/interfaces/api/common';
import type { RadarrSettings, SonarrSettings } from '@server/lib/settings';
import type { MovieDetails } from '@server/models/Movie'; import type { MovieDetails } from '@server/models/Movie';
import type { TvDetails } from '@server/models/Tv'; import type { TvDetails } from '@server/models/Tv';
import Link from 'next/link'; import Link from 'next/link';
@@ -293,9 +294,16 @@ const RequestItemError = ({
interface RequestItemProps { interface RequestItemProps {
request: NonFunctionProperties<MediaRequest> & { profileName?: string }; request: NonFunctionProperties<MediaRequest> & { profileName?: string };
revalidateList: () => void; revalidateList: () => void;
radarrData?: RadarrSettings[];
sonarrData?: SonarrSettings[];
} }
const RequestItem = ({ request, revalidateList }: RequestItemProps) => { const RequestItem = ({
request,
revalidateList,
radarrData,
sonarrData,
}: RequestItemProps) => {
const settings = useSettings(); const settings = useSettings();
const { ref, inView } = useInView({ const { ref, inView } = useInView({
triggerOnce: true, triggerOnce: true,
@@ -390,6 +398,23 @@ const RequestItem = ({ request, revalidateList }: RequestItemProps) => {
iOSPlexUrl4k: requestData?.media?.iOSPlexUrl4k, iOSPlexUrl4k: requestData?.media?.iOSPlexUrl4k,
}); });
const serviceExists = () => {
if (title?.mediaInfo) {
if (title?.mediaInfo.mediaType === MediaType.MOVIE) {
return (
radarrData?.find((radarr) => radarr.id === request.serverId) !==
undefined
);
} else {
return (
sonarrData?.find((sonarr) => sonarr.id === request.serverId) !==
undefined
);
}
}
return false;
};
if (!title && !error) { if (!title && !error) {
return ( return (
<div <div
@@ -697,28 +722,30 @@ const RequestItem = ({ request, revalidateList }: RequestItemProps) => {
)} )}
{requestData.status !== MediaRequestStatus.PENDING && {requestData.status !== MediaRequestStatus.PENDING &&
hasPermission(Permission.MANAGE_REQUESTS) && ( hasPermission(Permission.MANAGE_REQUESTS) && (
<> <ConfirmButton
<ConfirmButton onClick={() => deleteRequest()}
onClick={() => deleteRequest()} confirmText={intl.formatMessage(globalMessages.areyousure)}
confirmText={intl.formatMessage(globalMessages.areyousure)} className="w-full"
className="w-full" >
> <TrashIcon />
<TrashIcon /> <span>{intl.formatMessage(messages.deleterequest)}</span>
<span>{intl.formatMessage(messages.deleterequest)}</span> </ConfirmButton>
</ConfirmButton> )}
<ConfirmButton {hasPermission(Permission.MANAGE_REQUESTS) &&
onClick={() => deleteMediaFile()} title?.mediaInfo?.serviceId &&
confirmText={intl.formatMessage(globalMessages.areyousure)} serviceExists() && (
className="w-full" <ConfirmButton
> onClick={() => deleteMediaFile()}
<TrashIcon /> confirmText={intl.formatMessage(globalMessages.areyousure)}
<span> className="w-full"
{intl.formatMessage(messages.removearr, { >
arr: request.type === 'movie' ? 'Radarr' : 'Sonarr', <TrashIcon />
})} <span>
</span> {intl.formatMessage(messages.removearr, {
</ConfirmButton> arr: request.type === 'movie' ? 'Radarr' : 'Sonarr',
</> })}
</span>
</ConfirmButton>
)} )}
{requestData.status === MediaRequestStatus.PENDING && {requestData.status === MediaRequestStatus.PENDING &&
hasPermission(Permission.MANAGE_REQUESTS) && ( hasPermission(Permission.MANAGE_REQUESTS) && (

View File

@@ -17,6 +17,8 @@ import {
FunnelIcon, FunnelIcon,
} from '@heroicons/react/24/solid'; } from '@heroicons/react/24/solid';
import type { RequestResultsResponse } from '@server/interfaces/api/requestInterfaces'; import type { RequestResultsResponse } from '@server/interfaces/api/requestInterfaces';
import { Permission } from '@server/lib/permissions';
import type { RadarrSettings, SonarrSettings } from '@server/lib/settings';
import Link from 'next/link'; import Link from 'next/link';
import { useRouter } from 'next/router'; import { useRouter } from 'next/router';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
@@ -51,7 +53,7 @@ const RequestList = () => {
const { user } = useUser({ const { user } = useUser({
id: Number(router.query.userId), id: Number(router.query.userId),
}); });
const { user: currentUser } = useUser(); const { user: currentUser, hasPermission } = useUser();
const [currentFilter, setCurrentFilter] = useState<Filter>(Filter.PENDING); const [currentFilter, setCurrentFilter] = useState<Filter>(Filter.PENDING);
const [currentSort, setCurrentSort] = useState<Sort>('added'); const [currentSort, setCurrentSort] = useState<Sort>('added');
const [currentSortDirection, setCurrentSortDirection] = const [currentSortDirection, setCurrentSortDirection] =
@@ -62,6 +64,13 @@ const RequestList = () => {
const pageIndex = page - 1; const pageIndex = page - 1;
const updateQueryParams = useUpdateQueryParams({ page: page.toString() }); const updateQueryParams = useUpdateQueryParams({ page: page.toString() });
const { data: radarrData } = useSWR<RadarrSettings[]>(
hasPermission(Permission.ADMIN) ? '/api/v1/settings/radarr' : null
);
const { data: sonarrData } = useSWR<SonarrSettings[]>(
hasPermission(Permission.ADMIN) ? '/api/v1/settings/sonarr' : null
);
const { const {
data, data,
error, error,
@@ -245,6 +254,8 @@ const RequestList = () => {
<RequestItem <RequestItem
request={request} request={request}
revalidateList={() => revalidate()} revalidateList={() => revalidate()}
radarrData={radarrData}
sonarrData={sonarrData}
/> />
</div> </div>
); );