Compare commits

...

7 Commits

Author SHA1 Message Date
lostb1t
a096c86fe2 Refactor page.tsx to use local search params 2025-11-06 16:22:20 +01:00
lostb1t
6051d4ca1e Update page.tsx 2025-11-06 16:15:25 +01:00
lostb1t
e727d93303 Update useItemQuery.ts 2025-11-06 13:24:52 +01:00
lostb1t
b71e4bbcda Update page.tsx 2025-11-06 13:24:18 +01:00
lostb1t
c80131f560 Update useItemQuery.ts 2025-11-06 13:19:21 +01:00
lostb1t
a650dc4174 Update useItemQuery.ts 2025-11-06 13:15:41 +01:00
lostb1t
3bde693618 Update useItemQuery.ts 2025-11-06 12:59:56 +01:00
2 changed files with 36 additions and 10 deletions

View File

@@ -20,7 +20,8 @@ const Page: React.FC = () => {
const { offline } = useLocalSearchParams() as { offline?: string }; const { offline } = useLocalSearchParams() as { offline?: string };
const isOffline = offline === "true"; const isOffline = offline === "true";
const { data: item, isError } = useItemQuery(id, isOffline); const { data: item, isError } = useItemQuery(itemId, false, undefined, [ItemFields.MediaSources]);
const { data: mediaSourcesitem, isError } = useItemQuery(id, isOffline);
const opacity = useSharedValue(1); const opacity = useSharedValue(1);
const animatedStyle = useAnimatedStyle(() => { const animatedStyle = useAnimatedStyle(() => {
@@ -90,7 +91,7 @@ const Page: React.FC = () => {
<View className='h-12 bg-neutral-900 rounded-lg w-full mb-2' /> <View className='h-12 bg-neutral-900 rounded-lg w-full mb-2' />
<View className='h-24 bg-neutral-900 rounded-lg mb-1 w-full' /> <View className='h-24 bg-neutral-900 rounded-lg mb-1 w-full' />
</Animated.View> </Animated.View>
{item && <ItemContent item={item} isOffline={isOffline} />} {item && <ItemContent item={item} isOffline={isOffline} mediaSourcesItem={mediaSourcesItem} />}
</View> </View>
); );
}; };

View File

@@ -1,31 +1,56 @@
import { getUserLibraryApi } from "@jellyfin/sdk/lib/utils/api"; import { getUserLibraryApi } from "@jellyfin/sdk/lib/utils/api";
import { ItemFields } from "@jellyfin/sdk/lib/generated-client/models";
import { useQuery } from "@tanstack/react-query"; import { useQuery } from "@tanstack/react-query";
import { useAtom } from "jotai"; import { useAtom } from "jotai";
import { useDownload } from "@/providers/DownloadProvider"; import { useDownload } from "@/providers/DownloadProvider";
import { apiAtom, userAtom } from "@/providers/JellyfinProvider"; import { apiAtom, userAtom } from "@/providers/JellyfinProvider";
export const useItemQuery = (itemId: string, isOffline: boolean) => { // Helper to exclude specific fields
export const excludeFields = (fieldsToExclude: ItemFields[]) => {
return Object.values(ItemFields).filter(
(field) => !fieldsToExclude.includes(field)
);
};
export const useItemQuery = (
itemId: string | undefined,
isOffline?: boolean,
fields?: ItemFields[],
excludeFields?: ItemFields[]
) => {
const [api] = useAtom(apiAtom); const [api] = useAtom(apiAtom);
const [user] = useAtom(userAtom); const [user] = useAtom(userAtom);
const { getDownloadedItemById } = useDownload(); const { getDownloadedItemById } = useDownload();
// Calculate final fields: use excludeFields if provided, otherwise use fields
const finalFields = excludeFields
? Object.values(ItemFields).filter(field => !excludeFields.includes(field))
: fields;
return useQuery({ return useQuery({
queryKey: ["item", itemId], queryKey: ["item", itemId, finalFields],
queryFn: async () => { queryFn: async () => {
if (!itemId) throw new Error('Item ID is required');
if (isOffline) { if (isOffline) {
return getDownloadedItemById(itemId)?.item; return getDownloadedItemById(itemId)?.item;
} }
if (!api || !user || !itemId) return null;
const res = await getUserLibraryApi(api).getItem({ if (!api || !user) return null;
itemId: itemId,
userId: user?.Id, const response = await getUserLibraryApi(api).getItem({
itemId,
userId: user.Id,
...(finalFields && { fields: finalFields }),
}); });
return res.data;
return response.data;
}, },
enabled: !!itemId,
staleTime: 0, staleTime: 0,
refetchOnMount: true, refetchOnMount: true,
refetchOnWindowFocus: true, refetchOnWindowFocus: true,
refetchOnReconnect: true, refetchOnReconnect: true,
networkMode: "always", networkMode: "always",
}); });
}; };