mirror of
https://github.com/streamyfin/streamyfin.git
synced 2025-08-20 18:37:18 +02:00
93 lines
2.7 KiB
TypeScript
93 lines
2.7 KiB
TypeScript
import index from "@/app/(auth)/(tabs)/(home)";
|
|
import { apiAtom } from "@/providers/JellyfinProvider";
|
|
import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client";
|
|
import { getItemsApi } from "@jellyfin/sdk/lib/utils/api/items-api";
|
|
import { useQuery } from "@tanstack/react-query";
|
|
import { useAtomValue } from "jotai";
|
|
|
|
interface AdjacentEpisodesProps {
|
|
item?: BaseItemDto | null;
|
|
}
|
|
|
|
export const useAdjacentItems = ({ item }: AdjacentEpisodesProps) => {
|
|
const api = useAtomValue(apiAtom);
|
|
|
|
const { data: previousItem } = useQuery({
|
|
queryKey: ["previousItem", item?.Id, item?.ParentId, item?.IndexNumber],
|
|
queryFn: async (): Promise<BaseItemDto | null> => {
|
|
const parentId = item?.AlbumId || item?.ParentId;
|
|
const indexNumber = item?.IndexNumber;
|
|
|
|
if (
|
|
!api ||
|
|
!parentId ||
|
|
indexNumber === undefined ||
|
|
indexNumber === null ||
|
|
indexNumber - 1 < 1
|
|
) {
|
|
return null;
|
|
}
|
|
|
|
const newIndexNumber = indexNumber - 2;
|
|
|
|
const res = await getItemsApi(api).getItems({
|
|
parentId: parentId!,
|
|
startIndex: newIndexNumber,
|
|
limit: 1,
|
|
sortBy: ["IndexNumber"],
|
|
includeItemTypes: ["Episode", "Audio"],
|
|
fields: ["MediaSources", "MediaStreams", "ParentId"],
|
|
});
|
|
|
|
if (res.data.Items?.[0]?.IndexNumber !== indexNumber - 1) {
|
|
throw new Error("Previous item is not correct");
|
|
}
|
|
|
|
return res.data.Items?.[0] || null;
|
|
},
|
|
enabled: item?.Type === "Episode" || item?.Type === "Audio",
|
|
staleTime: 0,
|
|
});
|
|
|
|
const { data: nextItem } = useQuery({
|
|
queryKey: ["nextItem", item?.Id, item?.ParentId, item?.IndexNumber],
|
|
queryFn: async (): Promise<BaseItemDto | null> => {
|
|
const parentId = item?.AlbumId || item?.ParentId;
|
|
const indexNumber = item?.IndexNumber;
|
|
|
|
if (
|
|
!api ||
|
|
!parentId ||
|
|
indexNumber === undefined ||
|
|
indexNumber === null
|
|
) {
|
|
console.log("No next item", {
|
|
itemId: item?.Id,
|
|
parentId: parentId,
|
|
indexNumber: indexNumber,
|
|
});
|
|
return null;
|
|
}
|
|
|
|
const res = await getItemsApi(api).getItems({
|
|
parentId: parentId!,
|
|
startIndex: indexNumber,
|
|
sortBy: ["IndexNumber"],
|
|
limit: 1,
|
|
includeItemTypes: ["Episode", "Audio"],
|
|
fields: ["MediaSources", "MediaStreams", "ParentId"],
|
|
});
|
|
|
|
if (res.data.Items?.[0]?.IndexNumber !== indexNumber + 1) {
|
|
throw new Error("Previous item is not correct");
|
|
}
|
|
|
|
return res.data.Items?.[0] || null;
|
|
},
|
|
enabled: item?.Type === "Episode" || item?.Type === "Audio",
|
|
staleTime: 0,
|
|
});
|
|
|
|
return { previousItem, nextItem };
|
|
};
|