import { apiAtom, userAtom } from "@/providers/JellyfinProvider"; import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models"; import { getLibraryApi } from "@jellyfin/sdk/lib/utils/api"; import { useQuery } from "@tanstack/react-query"; import { router } from "expo-router"; import { useAtom } from "jotai"; import { ActivityIndicator, ScrollView, TouchableOpacity, View, } from "react-native"; import ContinueWatchingPoster from "./ContinueWatchingPoster"; import { ItemCardText } from "./ItemCardText"; import { Text } from "./common/Text"; import MoviePoster from "./MoviePoster"; import { useMemo } from "react"; type SimilarItemsProps = { itemId: string; }; export const SimilarItems: React.FC = ({ itemId }) => { const [api] = useAtom(apiAtom); const [user] = useAtom(userAtom); const { data: similarItems, isLoading } = useQuery({ queryKey: ["similarItems", itemId], queryFn: async () => { if (!api || !user?.Id) return []; const response = await getLibraryApi(api).getSimilarItems({ itemId, userId: user.Id, limit: 5, }); return response.data.Items || []; }, enabled: !!api && !!user?.Id, staleTime: Infinity, }); const movies = useMemo( () => similarItems?.filter((i) => i.Type === "Movie") || [], [similarItems] ); return ( Similar items {isLoading ? ( ) : ( {movies.map((item) => ( router.push(`/items/${item.Id}/page`)} className="flex flex-col w-32" > ))} )} {movies.length === 0 && No similar items} ); };