Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ const DuplicateFilesQuickSelectModal = ({ onClose, seriesId, show }: Props) => {
{ locationIds, removeFolder: true },
{
onSuccess: () => {
resetQueries(['release-management']);
resetQueries(['duplicate-files']);
toast.success(
`${locationIds.length} ${locationIds.length === 1 ? 'duplicate file' : 'duplicate files'} deleted!`,
);
Expand Down
2 changes: 1 addition & 1 deletion src/components/Utilities/DuplicateFiles/DuplicatesInfo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ const DuplicatesInfo = ({ file, location }: Props) => {
if (!confirmDelete) return;

await deleteFileLocation({ locationId: location.ID });
invalidateQueries(['release-management', 'series', 'episodes']);
invalidateQueries(['duplicate-files', 'series', 'episodes']);
};

// To re-enable the correct keybinds once the delete confirmation modal closes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ const SeriesPreviewRow = (
);
};

const MultipleReleasesPreviewModal = ({
const ReleaseManagementPreviewModal = ({
allSelected,
mixMatchSelection,
onClose,
Expand Down Expand Up @@ -304,4 +304,4 @@ const MultipleReleasesPreviewModal = ({
);
};

export default MultipleReleasesPreviewModal;
export default ReleaseManagementPreviewModal;
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ import Button from '@/components/Input/Button';
import Checkbox from '@/components/Input/Checkbox';
import ShokoPanel from '@/components/Panels/ShokoPanel';
import ShokoIcon from '@/components/ShokoIcon';
import MultipleReleasesPreviewModal from '@/components/Utilities/ReleaseManagement/MultipleReleasesPreviewModal';
import { useMultipleReleaseSeriesDetailQuery } from '@/core/react-query/release-management/queries';
import ReleaseManagementPreviewModal from '@/components/Utilities/ReleaseManagement/ReleaseManagementPreviewModal';
import { useReleaseManagementSeriesDetailQuery } from '@/core/react-query/release-management/queries';
import toast from '@/core/toast';
import { getAnidbAnimeLink } from '@/core/util';
import useNavigateVoid from '@/hooks/useNavigateVoid';
Expand Down Expand Up @@ -95,7 +95,7 @@ const ReleaseManagementSeriesDetail = () => {
const [mixMatchSelection, setMixMatchSelection] = useImmer<Map<string, number>>(new Map());
const [mixMatchUnassignedCount, setMixMatchUnassignedCount] = useState(0);

const seriesQuery = useMultipleReleaseSeriesDetailQuery(seriesId, includeVariations, seriesId > 0);
const seriesQuery = useReleaseManagementSeriesDetailQuery(seriesId, includeVariations, seriesId > 0);
const series = seriesQuery.data;

useEffect(() => {
Expand Down Expand Up @@ -236,7 +236,7 @@ const ReleaseManagementSeriesDetail = () => {
onClose={toggleManageVariationsModal}
/>

<MultipleReleasesPreviewModal
<ReleaseManagementPreviewModal
selectedSeries={[seriesId]}
show={showPreviewModal}
onClose={togglePreviewModal}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { debounce } from 'lodash';

import { Badge } from '@/components/Badge';
import ShokoIcon from '@/components/ShokoIcon';
import { useMultipleReleaseSeriesQuery } from '@/core/react-query/release-management/queries';
import { useReleaseManagementSeriesQuery } from '@/core/react-query/release-management/queries';
import { getAnidbAnimeLink, handleShiftSelect } from '@/core/util';
import useFlattenListResult from '@/hooks/useFlattenListResult';
import useNavigateVoid from '@/hooks/useNavigateVoid';
Expand Down Expand Up @@ -120,7 +120,7 @@ const SeriesRow = ({
);
};

const MultipleReleasesSeriesList = ({
const ReleaseManagementSeriesList = ({
allSelected,
autoDeleteMode,
setSelectedSeries,
Expand All @@ -132,7 +132,7 @@ const MultipleReleasesSeriesList = ({
const onlyFinishedSeries = searchParams.get('onlyFinishedSeries') === 'true';
const includeVariations = searchParams.get('includeVariations') === 'true';

const { fetchNextPage, ...seriesQuery } = useMultipleReleaseSeriesQuery({
const { fetchNextPage, ...seriesQuery } = useReleaseManagementSeriesQuery({
onlyFinishedSeries,
includeVariations,
onlyWithRedundant: autoDeleteMode,
Expand Down Expand Up @@ -271,4 +271,4 @@ const MultipleReleasesSeriesList = ({
);
};

export default MultipleReleasesSeriesList;
export default ReleaseManagementSeriesList;
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import Checkbox from '@/components/Input/Checkbox';
import ModalPanel from '@/components/Panels/ModalPanel';
import { useMarkVariationMutation } from '@/core/react-query/file/mutations';
import { resetQueries } from '@/core/react-query/queryClient';
import { useMultipleReleaseSeriesDetailQuery } from '@/core/react-query/release-management/queries';
import { useReleaseManagementSeriesDetailQuery } from '@/core/react-query/release-management/queries';
import toast from '@/core/toast';
import { buildEpisodeCoverageString } from '@/core/utilities/releaseManagementHelpers';
import useToggleModalKeybinds from '@/hooks/useToggleModalKeybinds';
Expand All @@ -30,7 +30,7 @@ const ManageVariationsModal = ({ onClose, seriesId, seriesTitle, show }: Props)
useToggleModalKeybinds(show, 'modal');
useToggleModalKeybinds(!show, 'primary');

const seriesQuery = useMultipleReleaseSeriesDetailQuery(seriesId, true, show && seriesId > 0);
const seriesQuery = useReleaseManagementSeriesDetailQuery(seriesId, true, show && seriesId > 0);

const allFiles = seriesQuery.data
? uniqBy(seriesQuery.data.Candidates.flatMap(candidate => candidate.Files), 'VideoLocalID')
Expand Down
37 changes: 25 additions & 12 deletions src/components/Utilities/UtilitySeriesList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,9 @@ import { useToggle } from 'usehooks-ts';

import ShokoIcon from '@/components/ShokoIcon';
import UtilitiesTable from '@/components/Utilities/UtilitiesTable';
import { useDuplicateFilesQuery, useDuplicateFilesSeriesQuery } from '@/core/react-query/duplicate-files/queries';
import { useMissingEpisodesQuery, useMissingEpisodesSeriesQuery } from '@/core/react-query/missing-episodes/queries';
import { resetQueries } from '@/core/react-query/queryClient';
import {
useReleaseManagementSeries,
useReleaseManagementSeriesEpisodes,
} from '@/core/react-query/release-management/queries';
import { getAnidbAnimeLink, getAnidbEpisodeLink } from '@/core/util';
import { getEpisodePrefix } from '@/core/utilities/getEpisodePrefix';
import useFlattenListResult from '@/hooks/useFlattenListResult';
Expand All @@ -20,7 +18,6 @@ import useRowSelection from '@/hooks/useRowSelection';
import DuplicateFilesModal from './DuplicateFiles/DuplicateFilesModal';

import type { UtilityHeaderType } from '@/components/Utilities/constants';
import type { ReleaseManagementItemType } from '@/core/react-query/release-management/types';
import type { EpisodeType } from '@/core/types/api/episode';
import type { ReleaseManagementSeriesType } from '@/core/types/api/series';

Expand Down Expand Up @@ -128,7 +125,7 @@ const duplicatesEpisodeFileCountColumn: UtilityHeaderType<EpisodeType> = {
};

type Props = {
type: ReleaseManagementItemType;
type: 'DuplicateFiles' | 'MissingEpisodes';
setSelectedEpisodes?: (episodes: EpisodeType[]) => void;
setSelectedSeriesId?: (id: number) => void;
setSeriesCount: (count: number) => void;
Expand All @@ -148,27 +145,43 @@ const UtilitySeriesList = (

const [selectedSeries, setSelectedSeries] = useState(0);

const seriesQuery = useReleaseManagementSeries(
type,
const duplicateFilesSeriesQuery = useDuplicateFilesSeriesQuery(
{ collecting: onlyCollecting, onlyFinishedSeries, pageSize: 50 },
type === 'DuplicateFiles',
);
const missingEpisodesSeriesQuery = useMissingEpisodesSeriesQuery(
{ collecting: onlyCollecting, onlyFinishedSeries, pageSize: 50 },
type === 'MissingEpisodes',
);
const seriesQuery = type === 'DuplicateFiles' ? duplicateFilesSeriesQuery : missingEpisodesSeriesQuery;
const [series, seriesCount] = useFlattenListResult(seriesQuery.data);

const episodesQuery = useReleaseManagementSeriesEpisodes(
type,
const duplicateFilesQuery = useDuplicateFilesQuery(
selectedSeries,
{
collecting: onlyCollecting,
includeDataFrom: ['AniDB'],
includeAbsolutePaths: true,
pageSize: 50,
},
selectedSeries > 0 && type === 'DuplicateFiles',
);
const missingEpisodesQuery = useMissingEpisodesQuery(
selectedSeries,
{
collecting: onlyCollecting,
includeDataFrom: ['AniDB'],
includeAbsolutePaths: true,
pageSize: 50,
},
selectedSeries > 0,
selectedSeries > 0 && type === 'MissingEpisodes',
);
const episodesQuery = type === 'DuplicateFiles' ? duplicateFilesQuery : missingEpisodesQuery;
const [episodes, episodeCount] = useFlattenListResult(episodesQuery.data);

useEffect(() => () => {
resetQueries(['release-management', 'series', 'episodes']);
resetQueries(['duplicate-files', 'series', 'episodes']);
resetQueries(['missing-episodes', 'series', 'episodes']);
}, []);

const [showEpisodeModal, toggleEpisodeModal, setEpisodeModal] = useToggle(false);
Expand Down
58 changes: 58 additions & 0 deletions src/core/react-query/duplicate-files/queries.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { useInfiniteQuery } from '@tanstack/react-query';

import { axios } from '@/core/axios';

import type {
DuplicateFilesEpisodesRequestType,
DuplicateFilesSeriesRequestType,
} from '@/core/react-query/duplicate-files/types';
import type { ListResultType } from '@/core/types/api';
import type { EpisodeType } from '@/core/types/api/episode';
import type { ReleaseManagementSeriesType } from '@/core/types/api/series';

export const useDuplicateFilesSeriesQuery = (params: DuplicateFilesSeriesRequestType, enabled = true) =>
useInfiniteQuery<ListResultType<ReleaseManagementSeriesType>>({
queryKey: ['duplicate-files', 'series', params],
queryFn: ({ pageParam }) =>
axios.get(
'DuplicateFiles/Series',
{
params: {
...params,
page: pageParam as number,
},
},
),
initialPageParam: 1,
getNextPageParam: (lastPage, _, lastPageParam: number) => {
if (!params.pageSize || lastPage.Total / params.pageSize <= lastPageParam) return undefined;
return lastPageParam + 1;
},
enabled,
});

export const useDuplicateFilesQuery = (
seriesId: number,
params: DuplicateFilesEpisodesRequestType,
enabled = true,
) =>
useInfiniteQuery<ListResultType<EpisodeType>>({
queryKey: ['duplicate-files', 'series', 'episodes', seriesId, params],
queryFn: ({ pageParam }) =>
axios.get(
`DuplicateFiles/Series/${seriesId}/Episodes`,
{
params: {
...params,
page: pageParam as number,
},
},
),
initialPageParam: 1,
getNextPageParam: (lastPage, _, lastPageParam: number) => {
if (!params.pageSize || lastPage.Total / params.pageSize <= lastPageParam) return undefined;
return lastPageParam + 1;
},
enabled,
staleTime: Infinity,
});
18 changes: 18 additions & 0 deletions src/core/react-query/duplicate-files/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import type { PaginationType } from '@/core/types/api';
import type { DataSourceType } from '@/core/types/api/common';

export type DuplicateFilesSeriesRequestType = {
collecting?: boolean;
ignoreVariations?: boolean;
includeDataFrom?: DataSourceType[];
onlyFinishedSeries?: boolean;
} & PaginationType;

export type DuplicateFilesEpisodesRequestType = {
collecting?: boolean;
ignoreVariations?: boolean;
includeAbsolutePaths?: boolean;
includeDataFrom?: DataSourceType[];
includeFiles?: boolean;
includeMediaInfo?: boolean;
} & PaginationType;
58 changes: 58 additions & 0 deletions src/core/react-query/missing-episodes/queries.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { useInfiniteQuery } from '@tanstack/react-query';

import { axios } from '@/core/axios';

import type {
MissingEpisodesRequestType,
MissingEpisodesSeriesRequestType,
} from '@/core/react-query/missing-episodes/types';
import type { ListResultType } from '@/core/types/api';
import type { EpisodeType } from '@/core/types/api/episode';
import type { ReleaseManagementSeriesType } from '@/core/types/api/series';

export const useMissingEpisodesSeriesQuery = (params: MissingEpisodesSeriesRequestType, enabled = true) =>
useInfiniteQuery<ListResultType<ReleaseManagementSeriesType>>({
queryKey: ['missing-episodes', 'series', params],
queryFn: ({ pageParam }) =>
axios.get(
'MissingEpisodes/Series',
{
params: {
...params,
page: pageParam as number,
},
},
),
initialPageParam: 1,
getNextPageParam: (lastPage, _, lastPageParam: number) => {
if (!params.pageSize || lastPage.Total / params.pageSize <= lastPageParam) return undefined;
return lastPageParam + 1;
},
enabled,
});

export const useMissingEpisodesQuery = (
seriesId: number,
params: MissingEpisodesRequestType,
enabled = true,
) =>
useInfiniteQuery<ListResultType<EpisodeType>>({
queryKey: ['missing-episodes', 'series', 'episodes', seriesId, params],
queryFn: ({ pageParam }) =>
axios.get(
`MissingEpisodes/Series/${seriesId}/Episodes`,
{
params: {
...params,
page: pageParam as number,
},
},
),
initialPageParam: 1,
getNextPageParam: (lastPage, _, lastPageParam: number) => {
if (!params.pageSize || lastPage.Total / params.pageSize <= lastPageParam) return undefined;
return lastPageParam + 1;
},
enabled,
staleTime: Infinity,
});
18 changes: 18 additions & 0 deletions src/core/react-query/missing-episodes/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import type { PaginationType } from '@/core/types/api';
import type { DataSourceType } from '@/core/types/api/common';

export type MissingEpisodesSeriesRequestType = {
collecting?: boolean;
ignoreVariations?: boolean;
includeDataFrom?: DataSourceType[];
onlyFinishedSeries?: boolean;
} & PaginationType;

export type MissingEpisodesRequestType = {
collecting?: boolean;
ignoreVariations?: boolean;
includeAbsolutePaths?: boolean;
includeDataFrom?: DataSourceType[];
includeFiles?: boolean;
includeMediaInfo?: boolean;
} & PaginationType;
2 changes: 1 addition & 1 deletion src/core/react-query/release-management/mutations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@ import type { ReleaseDeletionRequestType } from '@/core/react-query/release-mana

export const useReleaseDeleteMutation = () =>
useMutation({
mutationFn: (body: ReleaseDeletionRequestType) => axios.post('ReleaseManagement/MultipleReleases/Execute', body),
mutationFn: (body: ReleaseDeletionRequestType) => axios.post('ReleaseManagement/Execute', body),
});
Loading