157 lines
4.0 KiB
TypeScript
157 lines
4.0 KiB
TypeScript
import { useMemo } from 'react';
|
|
|
|
import { Series, SeriesResource } from '@/back-api';
|
|
import { useServiceContext } from '@/service/ServiceContext';
|
|
import { SessionServiceProps } from '@/service/session';
|
|
import { DataStoreType, useDataStore } from '@/utils/data-store';
|
|
import { DataTools, TypeCheck } from '@/utils/data-tools';
|
|
import { isNullOrUndefined } from '@/utils/validator';
|
|
|
|
import { useMediaService } from './Media';
|
|
import { useSeasonService } from './Season';
|
|
|
|
export type SeriesServiceProps = {
|
|
store: DataStoreType<Series>;
|
|
};
|
|
|
|
export const useSeriesService = (): SeriesServiceProps => {
|
|
const { series } = useServiceContext();
|
|
return series;
|
|
};
|
|
|
|
export const useSeriesServiceWrapped = (
|
|
session: SessionServiceProps
|
|
): SeriesServiceProps => {
|
|
const store = useDataStore<Series>(
|
|
{
|
|
restApiName: 'Series',
|
|
primaryKey: 'id',
|
|
available: session.token !== undefined,
|
|
getsCall: () => {
|
|
return SeriesResource.gets({
|
|
restConfig: session.getRestConfig(),
|
|
});
|
|
},
|
|
},
|
|
[session.token]
|
|
);
|
|
|
|
return { store };
|
|
};
|
|
|
|
export const useOrderedSeries = (nameFilter?: string) => {
|
|
const { store } = useSeriesService();
|
|
const dataSeries = useMemo(() => {
|
|
let tmpData = store.data;
|
|
if (!isNullOrUndefined(nameFilter)) {
|
|
tmpData = DataTools.getNameLike(tmpData, nameFilter);
|
|
}
|
|
return DataTools.getsWhere(
|
|
tmpData,
|
|
[
|
|
{
|
|
check: TypeCheck.NOT_EQUAL,
|
|
key: 'id',
|
|
value: [undefined, null],
|
|
},
|
|
],
|
|
['name', 'id']
|
|
);
|
|
}, [store.data, nameFilter]);
|
|
return { isLoading: store.isLoading, dataSeries };
|
|
};
|
|
|
|
export const useSpecificSeries = (id: number | undefined) => {
|
|
const { store } = useSeriesService();
|
|
const dataSeries = useMemo(() => {
|
|
return store.get(id);
|
|
}, [store.data, id]);
|
|
return { dataSeries };
|
|
};
|
|
|
|
export const useSeriesVideo = (id: number) => {
|
|
const { store } = useSeriesService();
|
|
const seriesVideo = useMemo(() => {
|
|
return DataTools.getsWhere(
|
|
store.data,
|
|
[
|
|
{
|
|
check: TypeCheck.EQUAL,
|
|
key: 'seriesId',
|
|
value: id,
|
|
},
|
|
{
|
|
check: TypeCheck.EQUAL,
|
|
key: 'seasonId',
|
|
value: undefined,
|
|
},
|
|
],
|
|
['episode', 'name']
|
|
);
|
|
}, [store.data, id]);
|
|
return { isLoading: store.isLoading, dataTypes: seriesVideo };
|
|
};
|
|
|
|
export const useSeriesCountVideo = (id?: number) => {
|
|
const { store } = useMediaService();
|
|
const seriesCountVideo = useMemo(() => {
|
|
if (id === undefined) {
|
|
return 0;
|
|
}
|
|
return DataTools.count(store.data, [
|
|
{
|
|
check: TypeCheck.EQUAL,
|
|
key: 'seriesId',
|
|
value: id,
|
|
},
|
|
]);
|
|
}, [store.data, id]);
|
|
return { isLoading: store.isLoading, seriesCountVideo };
|
|
};
|
|
export const useSeasonWithSeries = (seriesId?: number) => {
|
|
const { store } = useSeasonService();
|
|
const seasonOfSeriesId = useMemo(() => {
|
|
if (seriesId === undefined) {
|
|
return [];
|
|
}
|
|
return DataTools.getsWhere(
|
|
store.data,
|
|
[
|
|
{
|
|
check: TypeCheck.EQUAL,
|
|
key: 'parentId',
|
|
value: seriesId,
|
|
},
|
|
],
|
|
['name', 'id']
|
|
// TODO: ['>name', 'id'] padding right request ...:
|
|
// const maxLength = Math.max(...values.map(v => v.length));
|
|
// const paddedA = a.padStart(maxLength, " ");
|
|
// const paddedB = b.padStart(maxLength, " ");
|
|
// return paddedA.localeCompare(paddedB);
|
|
);
|
|
}, [store.data, seriesId]);
|
|
return { isLoading: store.isLoading, seasonOfSeriesId };
|
|
};
|
|
|
|
export const useSeriesWithType = (typeId?: number) => {
|
|
const { store } = useSeriesService();
|
|
const seriesWithType = useMemo(() => {
|
|
if (typeId === undefined) {
|
|
return [];
|
|
}
|
|
return DataTools.getsWhere(
|
|
store.data,
|
|
[
|
|
{
|
|
check: TypeCheck.EQUAL,
|
|
key: 'parentId',
|
|
value: typeId,
|
|
},
|
|
],
|
|
['name']
|
|
);
|
|
}, [store.data, typeId]);
|
|
return { isLoading: store.isLoading, seriesWithType };
|
|
};
|