import * as React from 'react'; import { Button, TouchableOpacity, ScrollView, View, Text, StyleSheet, Image, ImageBackground, SafeAreaView, ActivityIndicator, FlatList, TouchableHighlight } from 'react-native'; import {RootStackScreenProps} from "../types"; import {useSafeAreaInsets} from "react-native-safe-area-context"; import Movie from "../model/Movie"; import {LinearGradient} from 'expo-linear-gradient'; import {Stars} from "./HomeScreen"; import {useEffect, useState} from "react"; import config from "../constants/config"; import YoutubeIframe from "react-native-youtube-iframe"; import Icon from "react-native-ionicons"; import Ionicons from "@expo/vector-icons/Ionicons"; import MinimalMovie from "../model/MinimalMovie"; import {ListWidget} from "./WatchLaterScreen"; import Review from "../model/review"; export default function InfoScreen({navigation, route}: RootStackScreenProps<'Info'>) { // @ts-ignore const item: Movie = route.params.item const insets = useSafeAreaInsets(); const styles = StyleSheet.create({ background1: { height: '100%', width: '100%', paddingTop: insets.top, }, }); const [trailerPath, setTrailerPath] = useState(""); const [similarMovies, setsimilarMovies] = useState([]); const [review, setReview] = useState([]); const [credit, setCredit] = useState(); const [paddingtopbackgroud, setpaddingtopbackgroud] = useState(0); const [opacitybackground, setopacitybackground] = useState(0.7); const [scalebackground, setscalebackground] = useState(1); const getTriller = async () => { const trailerResponse = (await fetch(config.base_url + "movie/" + item.id + "/videos?api_key=" + config.api_key + "&language=fr-FR")); const trailerJson = await trailerResponse.json(); console.log("trailer", trailerJson) // @ts-ignore const trailer_key = trailerJson.results.slice(0, 1).map((elt) => { if (elt["type"] === "Trailer" && elt["site"] === "YouTube") { return elt["key"]; } }); console.log("key", trailer_key) setTrailerPath(trailer_key); } const getCredits = async () => { const creditResponse = (await fetch(config.base_url + "movie/" + item.id + "/credits?api_key=" + config.api_key + "&language=fr-FR")); const creditJson = await creditResponse.json(); console.log("credittttttt", creditJson) // @ts-ignore let creditList = creditJson.cast.map((elt) => { if (elt["popularity"]) return [elt["name"], 'https://image.tmdb.org/t/p/w500' + elt["profile_path"], elt["popularity"]] }); creditList = creditList.slice(0, 5).sort((a: [fullname: string, profil_path: string, popularity: number], b: [fullname: string, profil_path: string, popularity: number]) => b[2] - a[2]); console.log("credit", creditList); setCredit(creditList); } const getSimilarMovies = async () => { const SimilarMoviesResponse = (await fetch(config.base_url + "movie/" + item.id + "/recommendations?api_key=" + config.api_key + "&language=fr-FR")); const SimilarMoviesJson = await SimilarMoviesResponse.json(); // @ts-ignore const SimilarMoviesList = SimilarMoviesJson.results.slice(0, 10).map((elt) => { return new MinimalMovie(elt["original_title"], elt["poster_path"]) }); console.log("similar", SimilarMoviesList); setsimilarMovies(SimilarMoviesList); } const getReview = async () => { const ReviewResponse = (await fetch(config.base_url + "movie/" + item.id + "/reviews?api_key=" + config.api_key + "&language=us-EN&page=1")); const ReviewJson = await ReviewResponse.json(); // @ts-ignore let ReviewList = ReviewJson.results.map((elt) => { const newreview = new Review(elt["content"], elt["author_details"].avatar_path, elt["created_at"], elt["author"]) return newreview }); ReviewList = ReviewList.filter((review: Review, index: number, array: Review[]) => { return array.findIndex((item: Review) => item.pseudo === review.pseudo) === index; }); console.log("review", ReviewJson.results); setReview(ReviewList); } useEffect(() => { getReview(); getTriller(); getSimilarMovies(); getCredits(); }, []); function formatTime(time: number) { const hours = Math.floor(time / 60); const minutes = time % 60; return `${hours}h ${minutes < 10 ? `0${minutes}` : minutes}m`; } type creditItem = [string, string, number]; type creditProps = { data: creditItem[]; }; const handleScroll = (event: any) => { const {y} = event.nativeEvent.contentOffset; let padTop = y / -5; if (padTop <= 0) setpaddingtopbackgroud(y / -5); setopacitybackground(0.5 - y / 500); let scale = 1 - y / -1000 if (scale >= 1) setscalebackground(scale); }; function CreditList({data}: creditProps) { const renderItem = ({item}: { item: creditItem }) => ( {item[2].toFixed(1).toString()} {item[0]} ); return ( item[0]} /> ); } return ( navigation.goBack()} style={{zIndex: 100}}> {item.original_title} {item.vote_average.toFixed(1)} {trailerPath !== "" && ( )} {item.overview} {credit !== undefined && ( <> Crédits )} {similarMovies.length !== 0 && ( <> Recommendations item.original_title} renderItem={({item}) => {item.original_title} } /> )} {review.length !== 0 && ( <> Commentaires item.pseudo} renderItem={({item}) => {item.pseudo} {item.date} {item.message} } /> )} ) } type InfoBadgeProps = { texte: string } export function InfoBadge(props: InfoBadgeProps) { return ( {props.texte} ); }