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 { useJellyseerr } from "@/hooks/useJellyseerr"; 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 JellyserrRatings: React.FC<{ result: MovieResult | TvResult | TvDetails | MovieDetails; }> = ({ result }) => { const { jellyseerrApi, getMediaType } = useJellyseerr(); const mediaType = useMemo(() => getMediaType(result), [result]); const { data, isLoading } = useQuery({ queryKey: ["jellyseerr", result.id, mediaType, "ratings"], queryFn: async () => { return mediaType === MediaType.MOVIE ? jellyseerrApi?.movieRatings(result.id) : jellyseerrApi?.tvRatings(result.id); }, staleTime: (5).minutesToMilliseconds(), retry: false, enabled: !!jellyseerrApi, }); return ( (isLoading || !!result.voteCount || (data?.criticsRating && !!data?.criticsScore) || (data?.audienceRating && !!data?.audienceScore)) && ( {data?.criticsRating && !!data?.criticsScore && ( } /> )} {data?.audienceRating && !!data?.audienceScore && ( } /> )} {!!result.voteCount && ( } /> )} ) ); };