Skip to content

Commit 9b35bd8

Browse files
authored
Merge pull request #8171 from thornbill/refactor-recommendations-hook
Refactor useMovieRecommendations hook
2 parents 3d49704 + 0145a58 commit 9b35bd8

3 files changed

Lines changed: 56 additions & 41 deletions

File tree

src/apps/modern/features/libraries/components/SuggestionsSectionView.tsx

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1+
import { ItemFields } from '@jellyfin/sdk/lib/generated-client/models/item-fields';
12
import type { RecommendationDto } from '@jellyfin/sdk/lib/generated-client/models/recommendation-dto';
23
import { RecommendationType } from '@jellyfin/sdk/lib/generated-client/models/recommendation-type';
34
import React, { type FC } from 'react';
45

56
import { CardShape } from 'components/cardbuilder/utils/shape';
67
import { useApi } from 'hooks/useApi';
7-
import {
8-
useGetMovieRecommendations,
9-
useGetSuggestionSectionsWithItems
10-
} from 'hooks/useFetchItems';
8+
import { useGetSuggestionSectionsWithItems } from 'hooks/useFetchItems';
119
import { appRouter } from 'components/router/appRouter';
1210
import globalize from 'lib/globalize';
1311
import Loading from 'components/loading/LoadingComponent';
@@ -17,6 +15,8 @@ import type { ParentId } from 'types/library';
1715
import type { Section, SectionType } from 'types/sections';
1816
import type { ItemDto } from 'types/base/models/item-dto';
1917

18+
import { useMovieRecommendations } from '../hooks/api/useMovieRecommendations';
19+
2020
interface SuggestionsSectionViewProps {
2121
parentId: ParentId;
2222
sectionType: SectionType[];
@@ -35,7 +35,15 @@ const SuggestionsSectionView: FC<SuggestionsSectionViewProps> = ({
3535
const {
3636
isLoading: isRecommendationsLoading,
3737
data: movieRecommendationsItems
38-
} = useGetMovieRecommendations(isMovieRecommendationEnabled, parentId);
38+
} = useMovieRecommendations({
39+
parentId: parentId || undefined,
40+
fields: [
41+
ItemFields.PrimaryImageAspectRatio,
42+
ItemFields.MediaSourceCount
43+
],
44+
categoryLimit: 6,
45+
itemLimit: 20
46+
}, isMovieRecommendationEnabled);
3947

4048
if (isLoading || isRecommendationsLoading) {
4149
return <Loading />;
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import type { Api } from '@jellyfin/sdk/lib/api';
2+
import type { MovieApiGetMovieRecommendationsRequest } from '@jellyfin/sdk/lib/generated-client/api/movie-api';
3+
import { getMovieApi } from '@jellyfin/sdk/lib/utils/api/movie-api';
4+
import { queryOptions, useQuery } from '@tanstack/react-query';
5+
import type { AxiosRequestConfig } from 'axios';
6+
7+
import { useApi } from 'hooks/useApi';
8+
9+
const fetchGetMovieRecommendations = async (
10+
api: Api,
11+
params: MovieApiGetMovieRecommendationsRequest,
12+
options?: AxiosRequestConfig
13+
) => {
14+
const response = await getMovieApi(api).getMovieRecommendations(params, options);
15+
return response.data;
16+
};
17+
18+
/** Query options for fetching movie recommendations. */
19+
export const getMovieRecommendationsQuery = (
20+
api?: Api,
21+
params: MovieApiGetMovieRecommendationsRequest = {},
22+
enabled = true
23+
) => queryOptions({
24+
queryKey: ['MovieRecommendations', params?.parentId],
25+
queryFn: ({ signal }) => fetchGetMovieRecommendations(api!, params, { signal }),
26+
enabled: !!api && enabled
27+
});
28+
29+
/** Hook for fetching movie recommendations. */
30+
export const useMovieRecommendations = (
31+
params?: MovieApiGetMovieRecommendationsRequest,
32+
enabled?: boolean
33+
) => {
34+
const { api, user } = useApi();
35+
return useQuery(getMovieRecommendationsQuery(
36+
api,
37+
{
38+
...params,
39+
userId: params?.userId || user?.Id
40+
},
41+
enabled
42+
));
43+
};

src/hooks/useFetchItems.ts

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import { SortOrder } from '@jellyfin/sdk/lib/generated-client/models/sort-order'
1111
import { getArtistApi } from '@jellyfin/sdk/lib/utils/api/artist-api';
1212
import { getFilterApi } from '@jellyfin/sdk/lib/utils/api/filter-api';
1313
import { getGenreApi } from '@jellyfin/sdk/lib/utils/api/genre-api';
14-
import { getMovieApi } from '@jellyfin/sdk/lib/utils/api/movie-api';
1514
import { getPersonApi } from '@jellyfin/sdk/lib/utils/api/person-api';
1615
import { getStudioApi } from '@jellyfin/sdk/lib/utils/api/studio-api';
1716
import { getShowApi } from '@jellyfin/sdk/lib/utils/api/show-api';
@@ -74,41 +73,6 @@ export const useGetItems = (parametersOptions: LibraryApiGetItemsRequest) => {
7473
});
7574
};
7675

77-
const fetchGetMovieRecommendations = async (
78-
currentApi: JellyfinApiContext,
79-
parentId: ParentId,
80-
options?: AxiosRequestConfig
81-
) => {
82-
const { api, user } = currentApi;
83-
if (api && user?.Id) {
84-
const response = await getMovieApi(api).getMovieRecommendations(
85-
{
86-
userId: user.Id,
87-
fields: [
88-
ItemFields.PrimaryImageAspectRatio,
89-
ItemFields.MediaSourceCount
90-
],
91-
parentId: parentId ?? undefined,
92-
categoryLimit: 6,
93-
itemLimit: 20
94-
},
95-
{
96-
signal: options?.signal
97-
}
98-
);
99-
return response.data;
100-
}
101-
};
102-
103-
export const useGetMovieRecommendations = (isMovieRecommendationEnabled: boolean, parentId: ParentId) => {
104-
const currentApi = useApi();
105-
return useQuery({
106-
queryKey: ['MovieRecommendations', isMovieRecommendationEnabled, parentId],
107-
queryFn: ({ signal }) => fetchGetMovieRecommendations(currentApi, parentId, { signal }),
108-
enabled: !!currentApi.api && !!currentApi.user?.Id && isMovieRecommendationEnabled
109-
});
110-
};
111-
11276
const fetchGetGenres = async (
11377
currentApi: JellyfinApiContext,
11478
itemType: BaseItemKind[],

0 commit comments

Comments
 (0)