import {View, ViewProps} from "react-native"; import {MovieDetails} from "@/utils/jellyseerr/server/models/Movie"; import {TvDetails} from "@/utils/jellyseerr/server/models/Tv"; import {Text} from "@/components/common/Text"; import {useMemo} from "react"; import {useJellyseerr} from "@/hooks/useJellyseerr"; import {uniqBy} from "lodash"; import {TmdbRelease} from "@/utils/jellyseerr/server/api/themoviedb/interfaces"; import {Ionicons, MaterialCommunityIcons} from "@expo/vector-icons"; import CountryFlag from "react-native-country-flag"; import {ANIME_KEYWORD_ID} from "@/utils/jellyseerr/server/api/themoviedb/constants"; interface Release { certification: string; iso_639_1?: string; note?: string; release_date: string; type: number; } const dateOpts: Intl.DateTimeFormatOptions = { year: 'numeric', month: 'long', day: 'numeric', } const Facts: React.FC<{title: string, facts?: string[] | React.ReactNode[]} & ViewProps> = ({title, facts, ...props}) => ( facts && facts?.length > 0 && ( {title} {facts.map((f, idx) => typeof f === "string" ? {f} : f )} ) ) const Fact: React.FC<{title: string, fact?: string | null} & ViewProps> = ({title, fact, ...props}) => ( fact && ) const DetailFacts: React.FC<{ details?: MovieDetails | TvDetails } & ViewProps> = ({ details, className, ...props }) => { const {jellyseerrUser} = useJellyseerr(); const locale = useMemo(() => { return jellyseerrUser?.settings?.locale || 'en' }, [jellyseerrUser]); const region = useMemo( () => jellyseerrUser?.settings?.region || 'US', [jellyseerrUser] ); const releases = useMemo( () => (details as MovieDetails)?.releases?.results.find((r: TmdbRelease) => r.iso_3166_1 === region)?.release_dates as TmdbRelease['release_dates'], [details] ); // Release date types: // 1. Premiere // 2. Theatrical (limited) // 3. Theatrical // 4. Digital // 5. Physical // 6. TV const filteredReleases = useMemo( () => uniqBy(releases?.filter((r: Release) => r.type > 2 && r.type < 6), 'type'), [releases] ); const firstAirDate = useMemo(() => { const firstAirDate = (details as TvDetails)?.firstAirDate if (firstAirDate) { return new Date(firstAirDate).toLocaleDateString(`${locale}-${region}`, dateOpts) } }, [details]); const nextAirDate = useMemo(() => { const firstAirDate = (details as TvDetails)?.firstAirDate const nextAirDate = (details as TvDetails)?.nextEpisodeToAir?.airDate if (nextAirDate && firstAirDate !== nextAirDate) { return new Date(nextAirDate).toLocaleDateString(`${locale}-${region}`, dateOpts) } }, [details]); const revenue = useMemo( () => (details as MovieDetails)?.revenue ?.toLocaleString?.(`${locale}-${region}`, {style: 'currency', currency: "USD"}), [details] ); const budget = useMemo( () => (details as MovieDetails)?.budget ?.toLocaleString?.(`${locale}-${region}`, {style: 'currency', currency: "USD"}), [details] ); const streamingProviders = useMemo( () => details?.watchProviders?.find((provider) => provider.iso_3166_1 === region)?.flatrate, [details] ); const networks = useMemo( () => (details as TvDetails)?.networks, [details] ); const spokenLanguage = useMemo( () => details?.spokenLanguages.find((lng) => lng.iso_639_1 === details.originalLanguage)?.name, [details] ); return ( details && Details {details.keywords.some((keyword) => keyword.id === ANIME_KEYWORD_ID) && ( )} {r.type === 3 ? ( // Theatrical ) : r.type === 4 ? ( // Digital ) : ( // Physical )} {new Date(r.release_date).toLocaleDateString(`${locale}-${region}`, dateOpts)} )} /> {n.name} )}/> n.name)}/> n.name)}/> s.name)}/> ) } export default DetailFacts;