first commit
Some checks failed
Build / run (push) Has been cancelled

This commit is contained in:
maher
2025-10-29 11:42:25 +01:00
commit 703f50a09d
4595 changed files with 385164 additions and 0 deletions

View File

@@ -0,0 +1,21 @@
import {useQuery} from '@tanstack/react-query';
import {apiClient} from '@common/http/query-client';
import {Title} from '@app/titles/models/title';
import {BackendResponse} from '@common/http/backend-response/backend-response';
interface Response extends BackendResponse {
titles: Title[];
}
export function useRelatedTitles(titleId: number) {
return useQuery({
queryKey: ['titles', titleId, 'related'],
queryFn: () => fetchRelatedTitles(titleId!),
});
}
function fetchRelatedTitles(titleId: number | string) {
return apiClient
.get<Response>(`titles/${titleId}/related`)
.then(response => response.data);
}

View File

@@ -0,0 +1,32 @@
import {useInfiniteData} from '@common/ui/infinite-scroll/use-infinite-data';
import {PaginationResponse} from '@common/http/backend-response/pagination-response';
import {Episode} from '@app/titles/models/episode';
import {useParams} from 'react-router-dom';
import {seasonQueryKey} from '@app/seasons/requests/use-season';
interface Props {
titleId?: number | string;
season?: number | string;
willSortOrFilter?: boolean;
defaultOrderBy?: string;
defaultOrderDir?: 'desc' | 'asc';
}
export function useSeasonEpisodes(
initialPage?: PaginationResponse<Episode>,
queryParams?: Record<string, string | number>,
props: Props = {}
) {
const urlParams = useParams();
const titleId = props.titleId || urlParams.titleId;
const season = props.season || urlParams.season;
return useInfiniteData<Episode>({
initialPage,
willSortOrFilter: props.willSortOrFilter,
defaultOrderBy: props.defaultOrderBy,
defaultOrderDir: props.defaultOrderDir,
endpoint: `titles/${titleId}/seasons/${season}/episodes`,
queryKey: [...seasonQueryKey(titleId!, season!), 'episodes'],
queryParams,
});
}

View File

@@ -0,0 +1,22 @@
import {useInfiniteData} from '@common/ui/infinite-scroll/use-infinite-data';
import {Season} from '@app/titles/models/season';
import {PaginationResponse} from '@common/http/backend-response/pagination-response';
export const titleSeasonsQueryKey = (titleId: number | string) => [
'title',
`${titleId}`,
'seasons',
];
export function useTitleSeasons(
titleId: string | number,
initialPage?: PaginationResponse<Season>,
queryParams?: Record<string, string | number>
) {
return useInfiniteData<Season>({
initialPage,
endpoint: `titles/${titleId}/seasons`,
queryKey: titleSeasonsQueryKey(titleId),
queryParams,
});
}

View File

@@ -0,0 +1,44 @@
import {useQuery} from '@tanstack/react-query';
import {apiClient} from '@common/http/query-client';
import {useParams} from 'react-router-dom';
import {Title, TitleCredit, TitleCreditPivot} from '@app/titles/models/title';
import {BackendResponse} from '@common/http/backend-response/backend-response';
import {LengthAwarePaginationResponse} from '@common/http/backend-response/pagination-response';
import {Season} from '@app/titles/models/season';
import {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';
import {Episode} from '@app/titles/models/episode';
export type GroupTitleCredits = Partial<
Record<TitleCreditPivot['department'], TitleCredit[]>
>;
export interface GetTitleResponse extends BackendResponse {
title: Title;
seasons?: LengthAwarePaginationResponse<Season>;
episodes?: LengthAwarePaginationResponse<Episode>;
credits?: GroupTitleCredits;
language?: string;
}
export function useTitle(
loader: 'title' | 'titlePage' | 'titleCreditsPage' | 'editTitlePage',
) {
const {titleId} = useParams();
return useQuery({
queryKey: ['titles', `${titleId}`, loader],
queryFn: () => fetchTitle(titleId!, loader),
initialData: () => {
const data = getBootstrapData().loaders?.[loader];
if (data?.title?.id == titleId) {
return data;
}
return undefined;
},
});
}
function fetchTitle(titleId: number | string, loader: string) {
return apiClient
.get<GetTitleResponse>(`titles/${titleId}`, {params: {loader}})
.then(response => response.data);
}

View File

@@ -0,0 +1,33 @@
import {keepPreviousData, useQuery} from '@tanstack/react-query';
import {apiClient} from '@common/http/query-client';
import {BackendResponse} from '@common/http/backend-response/backend-response';
import {NormalizedModel} from '@common/datatable/filters/normalized-model';
interface AutocompleteTitle extends NormalizedModel {
seasons_count: number;
episode_numbers: number[];
}
interface Response extends BackendResponse {
titles: AutocompleteTitle[];
}
interface Params {
searchQuery: string;
selectedTitleId?: number | string;
seasonNumber?: number | string;
}
export function useTitlesAutocomplete(params: Params) {
return useQuery({
queryKey: ['titles', 'autocomplete', params],
queryFn: () => autocompleteTitles(params),
placeholderData: keepPreviousData,
});
}
function autocompleteTitles(params: Params) {
return apiClient
.get<Response>(`titles/autocomplete`, {params})
.then(response => response.data);
}