import type { BaseItemDtoQueryResult } from "@jellyfin/sdk/lib/generated-client/models"; import { getItemsApi } from "@jellyfin/sdk/lib/utils/api"; import { useQuery } from "@tanstack/react-query"; import { Image } from "expo-image"; import { useLocalSearchParams } from "expo-router"; import { useAtom } from "jotai"; import { useCallback, useMemo } from "react"; import { useTranslation } from "react-i18next"; import { View } from "react-native"; import { InfiniteHorizontalScroll } from "@/components/common/InfiniteHorizontalScroll"; import { Text } from "@/components/common/Text"; import { TouchableItemRouter } from "@/components/common/TouchableItemRouter"; import { ItemCardText } from "@/components/ItemCardText"; import { Loader } from "@/components/Loader"; import { MoviesTitleHeader } from "@/components/movies/MoviesTitleHeader"; import { OverviewText } from "@/components/OverviewText"; import { ParallaxScrollView } from "@/components/ParallaxPage"; import MoviePoster from "@/components/posters/MoviePoster"; import { apiAtom, userAtom } from "@/providers/JellyfinProvider"; import { getBackdropUrl } from "@/utils/jellyfin/image/getBackdropUrl"; import { getUserItemData } from "@/utils/jellyfin/user-library/getUserItemData"; const page: React.FC = () => { const local = useLocalSearchParams(); const { personId } = local as { personId: string }; const { t } = useTranslation(); const [api] = useAtom(apiAtom); const [user] = useAtom(userAtom); const { data: item, isLoading: l1 } = useQuery({ queryKey: ["item", personId], queryFn: async () => await getUserItemData({ api, userId: user?.Id, itemId: personId, }), enabled: !!personId && !!api, staleTime: 60, }); const fetchItems = useCallback( async ({ pageParam, }: { pageParam: number; }): Promise => { if (!api || !user?.Id) return null; const response = await getItemsApi(api).getItems({ userId: user.Id, personIds: [personId], startIndex: pageParam, limit: 16, sortOrder: ["Descending", "Descending", "Ascending"], includeItemTypes: ["Movie", "Series"], recursive: true, fields: [ "ParentId", "PrimaryImageAspectRatio", "ParentId", "PrimaryImageAspectRatio", ], sortBy: ["PremiereDate", "ProductionYear", "SortName"], collapseBoxSetItems: false, }); return response.data; }, [api, user?.Id, personId], ); const backdropUrl = useMemo( () => getBackdropUrl({ api, item, quality: 90, width: 1000, }), [item], ); if (l1) return ( ); if (!item?.Id || !backdropUrl) return null; return ( } > {t("item_card.appeared_in")} ( )} queryFn={fetchItems} queryKey={["actor", "movies", personId]} /> ); }; export default page;