import { Ionicons } from "@expo/vector-icons"; import type { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models"; import { useQuery } from "@tanstack/react-query"; import { Image } from "expo-image"; import { useMemo } from "react"; import { View, type ViewProps } from "react-native"; import { useSeerr } from "@/hooks/useSeerr"; import { MediaType } from "@/utils/jellyseerr/server/constants/media"; import type { MovieDetails } from "@/utils/jellyseerr/server/models/Movie"; import type { MovieResult, TvResult, } from "@/utils/jellyseerr/server/models/Search"; import type { TvDetails } from "@/utils/jellyseerr/server/models/Tv"; import { Badge } from "./Badge"; interface Props extends ViewProps { item?: BaseItemDto | null; } export const Ratings: React.FC = ({ item, ...props }) => { if (!item) return null; return ( {item.OfficialRating && ( )} {item.CommunityRating && ( } /> )} {item.CriticRating && ( } /> )} ); }; export const SeerrRatings: React.FC<{ result: MovieResult | TvResult | TvDetails | MovieDetails; }> = ({ result }) => { const { seerrApi, getMediaType } = useSeerr(); const mediaType = useMemo(() => getMediaType(result), [result]); const { data, isLoading } = useQuery({ queryKey: ["seerr", result.id, mediaType, "ratings"], queryFn: async () => { return mediaType === MediaType.MOVIE ? seerrApi?.movieRatings(result.id) : seerrApi?.tvRatings(result.id); }, staleTime: (5).minutesToMilliseconds(), retry: false, enabled: !!seerrApi, }); return ( (isLoading || !!result.voteCount || (data?.criticsRating && !!data?.criticsScore) || (data?.audienceRating && !!data?.audienceScore)) && ( {data?.criticsRating && !!data?.criticsScore && ( } /> )} {data?.audienceRating && !!data?.audienceScore && ( } /> )} {!!result.voteCount && ( } /> )} ) ); };