Partage
  • Partager sur Facebook
  • Partager sur Twitter

API Trailers TMDB avec ReactJS

Sujet résolu
    16 janvier 2023 à 9:57:45

    Bonjour à tous,

    Je débute dans ReactJS et je suis en train de faire un site sur le cinéma grave à l'API de TMDB

    Bon, j'ai pratiquement terminé ma page d'accueil (https://cinestars.fr pour avoir un peu un aperçu)

    J'ai un problème pour afficher les trailers des films et séries sur mon carousel en haut

    ma premiere page HomeSlider.jsx   est la suivante :

    import React, { useState, useEffect } from "react";
    import ReactDOM from "react-dom";
    import axios from "axios";
    import "./Style.css";
    
    import ModalBox from "../ModalBox/ModalBox";
    import { Container, Col, Row } from "react-bootstrap";
    
    import { BACKDROP_BASE_URL } from "../config";
    import ReactReadMoreReadLess from "react-read-more-read-less";
    
    
    
    import Modal from "react-bootstrap/Modal";
    import Tab from "react-bootstrap/Tab";
    import Tabs from "react-bootstrap/Tabs";
    
    import Youtube from "react-youtube"
    import Video from "../Videos/Videos"
    
    const Homepage = () => {
      const [show, setShow] = useState(false);
      const [genres, setGenres] = React.useState();
      const handleClose = () => setShow(false);
      const handleShow = () => setShow(true);
    
      const [tendance, setTendance] = useState([]);
      
      const url =
        "https://api.themoviedb.org/3/trending/all/day?api_key="API_KEY"&include_video=false&language=fr-FR&append_to_response=videos";
      useEffect(() => {
        fetchTendance();
      }, []);
      const fetchTendance = async () => {
        const data = await fetch(url);
        const movies = await data.json();
     
       
        setTendance(movies.results);
        const a = movies.results
    
      };
    
    
    
    
      
      return (
        <>
          <section id="home" className="iq-main-slider p-0 iq-rtl-direction">
            <Carousel className="slide slick-bg s-bg-1" fade>
              {tendance.map((movie) => (
                
                <Carousel.Item
                  className="cover_img"
                  style={{
                    background: movie
                      ? `linear-gradient(rgba(0,0,0,0.55), rgba(0,0,0,0.55)), url("${BACKDROP_BASE_URL}${movie.backdrop_path}") no-repeat center / cover`
                      : "black",
                  }}
                >
                  <Container fluid className="position-relative h-100">
                    <div className="slider-inner h-100">
                      <Row className="cover_box align-items-center  iq-ltr-direction h-100 ">
                        <div className="test col-xl-6 col-lg-12 col-md-12">
                          <a href="#">
                            <h1
                              className="titleMovie slider-text big-title title text-uppercase"
                              data-iq-gsap="onStart"
                              data-iq-position-x="-200"
                            >
                              
                              <ReactReadMoreReadLess
                                charLimit={35}
                                readMoreText={" ▼"}
                                readLessText={" ▲"}
                              >
                                {movie.title || movie.name}
                              </ReactReadMoreReadLess>
                            </h1>
                          </a>
                          <div className="d-flex flex-wrap align-items-center">
                            <div
                              className="slider-ratting d-flex align-items-center mr-4 mt-2 mt-md-3"
                              data-iq-gsap="onStart"
                              data-iq-position-x="-200"
                              data-iq-delay="-0.5"
                            >
                              <ul className="ratting-start p-0 m-0 list-inline text-primary d-flex align-items-center justify-content-left">
                                <li>
                                  <i className="fa fa-star text-warning" aria-hidden="true"></i>
                                </li>
                                <li>
                                  <i className="fa fa-star text-warning" aria-hidden="true"></i>
                                </li>
                                <li>
                                  <i className="fa fa-star text-warning" aria-hidden="true"></i>
                                </li>
                                <li>
                                  <i className="fa fa-star text-warning" aria-hidden="true"></i>
                                </li>
                                <li>
                                  <i
                                    className="fa fa-star-half text-warning"
                                    aria-hidden="true"
                                  ></i>
                                </li>
                              </ul>
                              <span className="text-white ml-2">
                                {movie.vote_average} (lmdb) {movie.id}
                              </span>
                            </div>
                            <div
                              className="d-flex align-items-center mt-2 mt-md-3"
                              data-iq-gsap="onStart"
                              data-iq-position-x="-200"
                              data-iq-delay="-0.5"
                            >
                              <span className="badge badge-secondary p-2"></span>
                              <span className="ml-3"></span>
                            </div>
                            <p
                              className="overview"
                              data-iq-gsap="onStart"
                              data-iq-position-y="80"
                              data-iq-delay="0.8"
                            >
                              <ReactReadMoreReadLess
                                charLimit={200}
                                readMoreText={"Lire plus ▼"}
                                readLessText={"Réduire ▲"}
                              >
                                {movie.overview}
                              </ReactReadMoreReadLess>
                            </p>
                          </div>
                          <div
                            className="trending-list"
                            data-wp_object-in="fadeInUp"
                            data-delay-in="1.2"
                          >
                            <div className="text-danger title starring">
                              Casting:{" "}
                              <span className="textbody">
                                Karen Gilchrist, James Earl Jones
                              </span>
                            </div>
                            <div className="text-danger title genres">
                              Genres: <span className="textbody">Action</span>
                            </div>
                            <div className="text-danger title tag">
                              Tag:{" "}
                              <span className="textbody">
                                Action, Adventure, Horror
                              </span>
                            </div>
                          </div>
                          <div
                            className="d-flex align-items-center r-mb-23"
                            data-iq-gsap="onStart"
                            data-iq-position-y="80"
                            data-iq-delay="0.8"
                          >
                            <ModalBox key={movie.id} {...movie} />
                          
                             
                          </div>
                        </div>
                        <div className="col-xl-6 col-lg-12 col-md-12 trailor-video text-center">
                        <Video key={movie.id} {...movie}>
    
    
                        </Video>
                      
    
                        </div>
                      </Row>
                    </div>
                  </Container>
                </Carousel.Item>
              ))}
            </Carousel>
          </section>

    C'est la partie 

    <Video key={movie.id} {...movie}></Video>

    qui ne fonctionne pas

    Ensuite voici mon code de ma page videos.jsx

    import React, { useEffect, useState } from "react";
    import axios from "axios";
    
    import Youtube from "react-youtube"
    import ModalVideo from "./ModalVideo";
    
    const MovieBox = ({media_type, id }) => {
    
      const [video, setVideo] = useState();
      const baseURL = `https://api.themoviedb.org/3/`;
      const rst = `/videos?api_key="API_KEY"&language=fr-FR&append_to_response=videos`;
      const t = id;
    
    
    
      useEffect(() => {
        axios
          .get(`${baseURL}` + `${media_type}` + `/` +`${t}` + `${rst}`)
         
          .then(({ data }) => setVideo(data.results))
         
          .catch((err) => console.log(err));
        
      }, [id]);
     
    
    
        console.log(video);
    
    
    const [show, setShow] = useState(false);
    
      const handleShow = () => setShow(true);
      const handleClose = () => setShow(false);
    
      return (
        <div>
    {trailer && trailer.map(vid => (
    <ModalVideo key={vid.id} {...vid}/>
    ))}
        </div>
      );
    };
    
    export default MovieBox;

    Quand je fais mon console.log de video, j'obtiens bien ma liste des videos par rapport a mon API de ma page précedente

    ensuite voici ma page de modalVideo :

    ou quand je veux importer ma key j'obtiens un https://www.youtube.com/watch?v=undefined


    import React, { useState } from "react";
    import { Modal, show, Button } from "react-bootstrap";
    import Youtube from "react-youtube";
    import { VIDEO_URL } from "../config";
    const ModalVideo = ({ key, id }) => {
      const [show, setShow] = useState(false);
    
      const handleShow = () => setShow(true);
      const handleClose = () => setShow(false);
      return (
        <div>
          <a target="_blank" onClick={handleShow} className="video-open playbtn">
            <svg
              version="1.1"
              xmlns="http://www.w3.org/2000/svg"
              xmlnsXlink="http://www.w3.org/1999/xlink"
              x="0px"
              y="0px"
              width="80px"
              height="80px"
              viewBox="0 0 213.7 213.7"
              enableBackground="new 0 0 213.7 213.7"
              xmlSpace="preserve"
            >
              <polygon
                className="triangle"
                fill="none"
                strokeWidth="7"
                strokeLinecap="round"
                strokeLinejoin="round"
                strokeMiterlimit="10"
                points="73.5,62.5 148.5,105.8 73.5,149.1 "
              />
              <circle
                className="circle"
                fill="none"
                strokeWidth="7"
                strokeLinecap="round"
                strokeLinejoin="round"
                strokeMiterlimit="10"
                cx="106.8"
                cy="106.8"
                r="103.3"
              />
            </svg>
    
            <span className="w-trailor">Bande-annonce</span>
          </a>
          <Modal show={show} onHide={handleClose}>
            <Modal.Header closeButton>
              <Modal.Title></Modal.Title>
            </Modal.Header>
            <Modal.Body className="d-flex align-items-center flex-column">
              <a href={VIDEO_URL + key}>sdsd</a>
              <a href={VIDEO_URL + key}>sdsd</a>
              <Youtube
                videoId={key}
                className={"youtube amru"}
                containerClassName={"youtube-container amru"}
                opts={{
                  width: "100%",
                  height: "100%",
                  playerVars: {
                    autoplay: 1,
                    controls: 0,
                    cc_load_policy: 0,
                    fs: 0,
                    iv_load_policy: 0,
                    modestbranding: 0,
                    rel: 0,
                    showinfo: 0,
                  },
                }}
              />
            </Modal.Body>
            <Modal.Footer>
              <Button variant="secondary" onClick={handleClose}>
                Close
              </Button>
            </Modal.Footer>
          </Modal>
        </div>
      );
    };
    
    export default ModalVideo;


    Voila je pense ne rien oublier.

    Si quelqu'un arrive a trouver mon problème je l'appellerai maitre !!!


    En vous remerciant par avance.



    -
    Edité par Hôrn 16 janvier 2023 à 10:33:23

    • Partager sur Facebook
    • Partager sur Twitter
      16 janvier 2023 à 18:02:18

      Bonjour Hôrn, 

      Ce n'est pas simple de reproduire le problème, j'ai essayé de recopier le code de ta page mais il manque des composants comme Carousel, le mieux pour qu'on puisse t'aider ça serait que tu nous partages un git.

      Très joli sinon ton site, et puis j'arrive à lire la bande-annonce donc peut-être as-tu résolu le problème ?

      • Partager sur Facebook
      • Partager sur Twitter
        18 janvier 2023 à 23:37:39

        Bonjour,

        oui j’ai résolu le pb le jour ou j’ai posté mais je devais attendre 24 h sur le forum afin de répondre une 2nd fois mais entre 2 j’ai été grippé et je n’ai plus eu la force d’ouvrir mon ordinateur pou revenir sur le forum ^^

        en fait, j’ai juste laissé tombé mon fichier modalvideo.js et j’ai repris le code de ce fichier en le mettant sur le fichier vidéo.js et la sans comprendre pourquoi ça a fonctionné. les mystères de l’informatique lol.

        Sinon merci pour le compliment, ça fait plaisir. Et dire que je galere pour trouver du taf en dev Web…

        la actuellement je me pose la question comment je peux récupérer les infos d’un film de l’api tmdb grâce à l’ID via un <Link to=«/Show »/> 

        si quelqu’un sait.. 

        • Partager sur Facebook
        • Partager sur Twitter
          19 janvier 2023 à 9:09:52

          Bonjour, je ne que très vaguement vue ton site:

          https://cinestars.fr

          Car mon navigateur est à peine capable de charger la page d'accueil et mon ventilateur commence à faire du bruit quand la page ce charge, pourtant il arrive à charger sans trop de difficulté des applications qui sont censé être plus lourde (Facebook, Linkedin, Youtube...).

          J'ai quand même put faire un click droit examiner élément pour essayer de voir où est le problème.

          Dans l'onglet network colonne XHR (qui affiche les requête réseaux effectuer par Javascript) donc on devrait voir dans cette colonnes quelque requête réseaux qui parte vers l'API de IMDB pour récupérer les infos des films.

          Ton application fait continuellement des requêtes réseaux vers IMDB api, ces a dire qu'au bout de quelque secondes l'application fait des dizaines, peut-être même une centaine de requêtes réseaux vers IMDB est la liste de requêtes continue indéfiniment d'augmenter (je le vois car la bar de scroll des requêtes réseaux diminue de plus en plus donc il y a des requêtes qui sont ajoutées à la fin de la liste).

          Vue que tu es dans une application React.js j'imagine très fortement que tu as un où plusieurs composant React qui se recharge en boucle est fait une requête réseaux aux passage.

          Dans le code que tu as montré je ne vois pas le problème, peut-être un composant parent où un composant enfant que tu n'as pas posté.

          A noter que ton composant Homepage commence à devenir très volumineux (~140 lignes de JSX pour 180 lignes total), une bonne idée pourrait être de le décomposer en composants plus petit de déplacer une partie du JSX dans un composant spécialisé et si besoin une partie de la logique aussi, ce sera bien plus simple pour toi de maintenir des composants moins gros avec un seul rôle, que de devoir modifier/débuger un composant de quasiment 200 lignes.

          -
          Edité par SamuelGaborieau3 19 janvier 2023 à 9:12:49

          • Partager sur Facebook
          • Partager sur Twitter

          suggestion de présentation.

            19 janvier 2023 à 10:30:47

            C'est marrant que tu me dises mais j'ai remarqué également une lenteur et j'ai cherché un peu ce matin. 

            J'ai réglé ce problème aussi en remplaçant axios par un fetch pour l'API des trailers chez  TMDB.. Je ne sais pas pourquoi ca me faisait ca

            par contre, savez vous comment récupérer les infos d'un film de l'API TMDB grâce à l'ID via <Link to=«/Show »/> 

            -
            Edité par Hôrn 19 janvier 2023 à 14:44:46

            • Partager sur Facebook
            • Partager sur Twitter
              20 janvier 2023 à 11:00:38

              Personne pour m'aider ? 

              j'ai fait un 

               <Link to={`/Show/${movie.media_type}/${movie.id}`}

              Quaand je clique dessus, je récupère bien l'ID et le media_type (movie ou tv) dans l'url mais après sur mon autre page, comment je peux récupérer ses informations ?

              • Partager sur Facebook
              • Partager sur Twitter
                20 janvier 2023 à 13:08:57

                Bonjour, la documentation indique que tu peux récupérer les détails d'un film avec ce enpoint et les détails d'une série avec celui-ci

                Dans ton composant qui affiche les détails une fois que tu as récupéré: "media_type" et "id" tu dois pouvoir construire la requête de cette façon:

                // media type doit avoir la valeur: "movie" où "tv":
                const url = `https://api.themoviedb.org/3/${media_type}/${id}?api_key=${API_KEY}&language=fr-FR`
                
                fetch(url, {method: "GET"})
                .then(response => response.json())
                .then(details => {
                    console.log(details);
                })
                .catch(error => {
                    console.warn("> cant fetch details for:" + media_type + "#" + id + " with: ", error)
                })

                Il faudra surement mettre la requête dans un useEffect avec une dépendance vers "media_type" et "id"

                 

                • Partager sur Facebook
                • Partager sur Twitter

                suggestion de présentation.

                  20 janvier 2023 à 14:30:32

                  Merci pour ta réponse.

                  Je crois que je me suis mal expliqué et je vais reprendre (ou alors je n'ai pas compris lol)

                  j'ai fait des modifications depuis sur ma page HomeSlider.jsx

                  import React, { useState, useEffect } from "react";
                  
                  import "./Style.css";
                  
                  import { Link } from "react-router-dom";
                  
                  import Carousel from "react-bootstrap/Carousel";
                  
                  import FullSlide from "../FullSlide/FullSlide";
                  import StarOne from "../Star/StarOne";
                  import StarOneHalf from "../Star/StarOneHalf";
                  import StarTwo from "../Star/StarTwo";
                  import StarThree from "../Star/StarThree";
                  import StarFour from "../Star/StarFour";
                  import StarFive from "../Star/StarFive";
                  import StarTwoHalf from "../Star/StarTwoHalf";
                  import StarThreeHalf from "../Star/StarThreeHalf";
                  import StarFourHalf from "../Star/StarFourHalf";
                  import StarHalf from "../Star/StarHalf";
                  import StarNone from "../Star/StarNone";
                  
                  import ModalBox from "../ModalBox/ModalBox";
                  import { Container, Col, Row } from "react-bootstrap";
                  
                  import { BACKDROP_BASE_URL } from "../config";
                  import ReactReadMoreReadLess from "react-read-more-read-less";
                  
                  import Video from "../Videos/Videos";
                  
                  const Homepage = () => {
                   
                  
                  
                    const [genres, setGenres] = React.useState([]);
                    const [tendance, setTendance] = React.useState([]);
                    const mov = "movie";
                    const tv = "tv";
                  
                    React.useEffect(() => {
                      fetch(
                        "https://api.themoviedb.org/3/trending/all/day?api_key=**********&include_video=false&language=fr-FR&append_to_response=videos"
                      )
                        .then((res) => res.json())
                        .then((result) => {
                          setTendance(result.results);
                        });
                  
                      fetch(
                        `https://api.themoviedb.org/3/genre/${
                          mov || tv
                        }/list?&api_key=*************&language=fr-FR`
                      )
                        .then((genre) => genre.json())
                        .then((result) => {
                          const genres = result.genres.reduce((genres, gen) => {
                            const { id, name } = gen;
                            genres[id] = name;
                            return genres;
                          }, []);
                          setGenres(genres);
                        });
                    }, []);
                  
                   
                  
                    return (
                      <>
                        <section id="home" className="iq-main-slider p-0 iq-rtl-direction">
                          <Carousel className="slide slick-bg s-bg-1" fade>
                            {tendance.map((movie) => (
                              <Carousel.Item
                                className="cover_img"
                                style={{
                                  background: movie
                                    ? `linear-gradient(rgba(0,0,0,0.55), rgba(0,0,0,0.55)), url("${BACKDROP_BASE_URL}${movie.backdrop_path}") no-repeat center / cover`
                                    : "black",
                                }}
                              >
                                <Container fluid className="position-relative h-100">
                                  <div className="slider-inner h-100">
                                    <Row className="cover_box align-items-center  iq-ltr-direction h-100 ">
                                      <div className="test col-xl-6 col-lg-12 col-md-12">
                                        <a href="#">
                                          <h1
                                            className="titleMovie slider-text big-title title text-uppercase"
                                            data-iq-gsap="onStart"
                                            data-iq-position-x="-200"
                                          >
                                            <ReactReadMoreReadLess
                                              charLimit={35}
                                              readMoreText={" ▼"}
                                              readLessText={" ▲"}
                                            >
                                              {movie.title || movie.name}
                                            </ReactReadMoreReadLess>
                                          </h1>
                                        </a>
                                        <div className="d-flex flex-wrap align-items-center">
                                          <div
                                            className="slider-ratting d-flex align-items-center mr-4 mt-2 mt-md-3"
                                            data-iq-gsap="onStart"
                                            data-iq-position-x="-200"
                                            data-iq-delay="-0.5"
                                          >
                                            {movie.vote_average > 0 &&
                                            movie.vote_average < 0.5 ? (
                                              <StarHalf />
                                            ) : movie.vote_average >= 1 &&
                                              movie.vote_average < 1.5 ? (
                                              <StarOne />
                                            ) : movie.vote_average >= 1.5 &&
                                              movie.vote_average < 2.5 ? (
                                              <StarOneHalf />
                                            ) : movie.vote_average >= 2.5 &&
                                              movie.vote_average < 3.5 ? (
                                              <StarTwo />
                                            ) : movie.vote_average >= 3.5 &&
                                              movie.vote_average < 4.5 ? (
                                              <StarTwoHalf />
                                            ) : movie.vote_average >= 4.5 &&
                                              movie.vote_average < 5.5 ? (
                                              <StarThree />
                                            ) : movie.vote_average >= 5.5 &&
                                              movie.vote_average < 6.5 ? (
                                              <StarThreeHalf />
                                            ) : movie.vote_average >= 6.5 &&
                                              movie.vote_average < 8 ? (
                                              <StarFour />
                                            ) : movie.vote_average >= 8 &&
                                              movie.vote_average < 9.5 ? (
                                              <StarFourHalf />
                                            ) : movie.vote_average >= 9.5 &&
                                              movie.vote_average < 10 ? (
                                              <StarFive />
                                            ) : (
                                              <StarNone />
                                            )}
                  
                                            <span className="text-white ml-2">
                                              {movie.vote_average} (lmdb)
                                            </span>
                                          </div>
                                          <div
                                            className="d-flex align-items-center mt-2 mt-md-3"
                                            data-iq-gsap="onStart"
                                            data-iq-position-x="-200"
                                            data-iq-delay="-0.5"
                                          >
                                            <span className="badge badge-secondary p-2"></span>
                                            <span className="ml-3"></span>
                                          </div>
                                          <p
                                            className="overview"
                                            data-iq-gsap="onStart"
                                            data-iq-position-y="80"
                                            data-iq-delay="0.8"
                                          >
                                            <ReactReadMoreReadLess
                                              charLimit={200}
                                              readMoreText={" ▼"}
                                              readLessText={" ▲"}
                                            >
                                              {movie.overview}
                                            </ReactReadMoreReadLess>
                                          </p>
                                        </div>
                                        <div
                                          className="trending-list"
                                          data-wp_object-in="fadeInUp"
                                          data-delay-in="1.2"
                                        >
                                          <div className="text-danger title starring">
                                            Casting:{" "}
                                            <span className="textbody">
                                              Karen Gilchrist, James Earl Jones
                                            </span>
                                          </div>
                                          {/* <div className="text-danger title genres">
                                            Genres: <span className="textbody">Action</span>
                                          </div> */}
                                          <div className="text-danger title tag">
                                            Genres:{" "}
                                            <span className="textbody">
                                              {movie.genre_ids.map((id) => {
                                                return (
                                                  <span className="textbody"> {genres[id]} </span>
                                                );
                                              })}
                                            </span>
                                          </div>
                                        </div>
                                        <div
                                          className="d-flex align-items-center r-mb-23"
                                          data-iq-gsap="onStart"
                                          data-iq-position-y="80"
                                          data-iq-delay="0.8"
                                        >
                                          <ModalBox key={movie.id} {...movie} />
                                       
                  
                                          <Link
                                            to={`/Show/${movie.media_type}/${movie.id}`}
                                            type="button"
                                            className="btn btn-hover iq-button"
                                          >
                                            {" "}
                                            <i className="fa fa-play mx-2" aria-hidden="true"></i>
                                            Détails
                                          </Link>
                                        </div>
                                      </div>
                                      <div className="col-xl-6 col-lg-12 col-md-12 trailor-video text-center">
                                        <Video key={movie.id} {...movie}></Video>
                                      </div>
                                    </Row>
                                  </div>
                                </Container>
                              </Carousel.Item>
                            ))}
                          </Carousel>
                        </section>
                  
                        <FullSlide />
                      </>
                    );
                  };
                  
                  export default Homepage;
                  

                  j'ai ce code qui permet de basculer sur une autre page 

                     <Link
                                            to={`/Show/${movie.media_type}/${movie.id}`}
                                            type="button"
                                            className="btn btn-hover iq-button"
                                          >
                                            {" "}
                                            <i className="fa fa-play mx-2" aria-hidden="true"></i>
                                            Détails
                                          </Link>


                  et des que je clique sur le Link  j'ai ca en URL 

                  http://localhost:3000/Show/tv/100088

                  et j'ai ca dans ce composant  Show-list.jsx

                  import React, {useState} from 'react'
                  import { Link } from 'react-router-dom'
                  import { Container, Row, Col } from 'react-bootstrap'
                  import Nav from "../Home/Nav/Nav"
                  import Footer from "../Home/Footer/Footer"
                  
                  import { useParams } from 'react-router-dom'
                  
                  const ShowList = ( {title,
                     poster_path,
                     vote_average,
                     release_date,
                     overview,
                     first_air_date,
                     name}) => { 
                  
                      
                     return (
                        <>
                  
                  
                        <Nav/>
                           <div className="video-container iq-main-slider">
                              <video className="video d-block" controls loop>
                                 <source src="" type="video/mp4"/>
                              </video>
                           </div>
                           <div className="main-content">
                              <section className="movie-detail container-fluid">
                                 <Row>
                                    <Col lg="12">
                                       <div className="trending-info season-info g-border">
                                          <h4 className="trending-text big-title text-uppercase mt-0">{title || name}</h4>
                                         
                                          <p className="trending-dec w-100 mb-0">{overview}
                                          </p>
                                         
                                       </div>
                                    </Col>
                                 </Row>
                              </section>
                            
                              <Footer/>
                           </div>
                        </>
                     )
                  }
                  export default ShowList; 


                  mais a partir de la je n'arrive pas à récupérer les informations de l'ID et et du media_type comme le title et l'overview

                  Après tu veux peut etre dire qu'a partir de ce dernier composant , il faut mettre cette requete ?



                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 janvier 2023 à 14:48:32

                    Si ton composant "Show-list.jsx" répond à la route:

                    `/Show/${movie.media_type}/${movie.id}`


                    Il ne devrait pas recevoir les données de film/séries dans c'est props.

                    Il a juste accès au params dans l'url que tu peux lire avec le hooks useParams

                    C'est avec c'est paramètre là que tu effectues la requête réseaux pour récupérer les détails.

                    import React, {useState, useMemo, useEffect} from 'react'
                    import { Link } from 'react-router-dom'
                    import { Container, Row, Col } from 'react-bootstrap'
                    import Nav from "../Home/Nav/Nav"
                    import Footer from "../Home/Footer/Footer"
                     
                    import { useParams } from 'react-router-dom'
                    
                    
                     
                    const ShowList = () => {
                     
                        const {id, media_type} = useParams()
                    
                        // les détails du film/série qui par défaut sont inconnue
                        const [details, setDetails] = useState(null)
                    
                        const url = React.useMemo(() => (
                            `https://api.themoviedb.org/3/${media_type}/${id}?api_key=${API_KEY}&language=fr-FR`
                        ), [id, media_type])
                    
                        // requête réseaux pour récupérer les détails du film/série
                        useEffect(() => {
                            
                            fetch(url, {method: "GET"})
                            .then(response => response.json())
                            .then(_details => {
                                setDetails(_details)
                            })
                            .catch(error => {
                                console.warn("> cant fetch details for:" + media_type + "#" + id + " with: ", error)
                            })
                    
                        }, [url])
                    
                        // details est "null" donc la requête réseaux n'est pas terminée. (où elle a plantée)
                        if(!details) {
                            return (
                                <div>
                                    chargement en cours...
                                </div>
                            );
                        }
                    
                        const {title, name, overview} = details;
                         
                        return (
                        <>
                        <Nav/>
                            <div className="video-container iq-main-slider">
                            <video className="video d-block" controls loop>
                                <source src="" type="video/mp4"/>
                            </video>
                            </div>
                            <div className="main-content">
                            <section className="movie-detail container-fluid">
                                <Row>
                                    <Col lg="12">
                                        <div className="trending-info season-info g-border">
                                        <h4 className="trending-text big-title text-uppercase mt-0">{title || name}</h4>
                                        
                                        <p className="trending-dec w-100 mb-0">{overview}
                                        </p>
                                        
                                        </div>
                                    </Col>
                                </Row>
                            </section>
                            
                            <Footer/>
                            </div>
                        </>
                        )
                    }
                    export default ShowList;
                    

                    Ci-dessus le composant ne reçoit que le media_type et l'id du contenu est fait une requête réseaux vers l'API pour récupérer les détails du média.

                    Note a part:

                    Je n'ai pas lu le composant HomeSlider.jsx parce qu'il fait 230 lignes.

                    Je pense pas que ce soit utiles de posté des composant entier de 230 lignes sur le forum personnes de prendra le temps de lire le composant entier de chercher les modification avec l'ancienne version de ton composant ect...

                    Tout ce que j'ai vue c'est que ton composant est passer de ~180 lignes à ~230 lignes

                    ce qui commence à sérieusement à faire peur.

                    Tu devrais certainement re factoriser ce composant en de plus petits composants avant d'ajouter d'autre fonctionnalités.

                    -
                    Edité par SamuelGaborieau3 20 janvier 2023 à 14:49:50

                    • Partager sur Facebook
                    • Partager sur Twitter

                    suggestion de présentation.

                      20 janvier 2023 à 14:57:35

                      Oui c'est prévu de le redécomposer  pour réduire tout ça.

                      En tout cas, merci beaucoup pour ton aide, je vais regarder car et je te tiendrais au courant si ca fonctionne.

                      Merci beaucoup pour tes conseils

                      Edit : Ca fonctionne, encore merci pour ton aide.

                      -
                      Edité par Hôrn 20 janvier 2023 à 17:22:56

                      • Partager sur Facebook
                      • Partager sur Twitter

                      API Trailers TMDB avec ReactJS

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown