Bruno Predot

Ajout du template pour les têtes d'affiches.

@@ -2,11 +2,11 @@ @@ -2,11 +2,11 @@
2 //#region --import--. 2 //#region --import--.
3 import { ArrowLeftIcon, FilmIcon } from "lucide-vue-next"; 3 import { ArrowLeftIcon, FilmIcon } from "lucide-vue-next";
4 import { useTMDB } from "~/composables/tMDB"; 4 import { useTMDB } from "~/composables/tMDB";
5 -import { onMounted, ref } from "vue"; 5 +import { computed, onMounted, ref } from "vue";
6 import { Movie } from "~/models/movie"; 6 import { Movie } from "~/models/movie";
7 import type { MovieInterface } from "~/interfaces/movie"; 7 import type { MovieInterface } from "~/interfaces/movie";
8 import { Credit } from "~/models/credit"; 8 import { Credit } from "~/models/credit";
9 -import type { CreditInterface, CreditsResponse } from "~/interfaces/credit"; 9 +import type { CreditsResponse } from "~/interfaces/credit";
10 //#endregion 10 //#endregion
11 11
12 //#region --Declaration--. 12 //#region --Declaration--.
@@ -46,6 +46,17 @@ const movie = computed(() => { @@ -46,6 +46,17 @@ const movie = computed(() => {
46 return null; 46 return null;
47 } 47 }
48 }); 48 });
  49 +
  50 +/**
  51 + * Computed property for director
  52 + */
  53 +const director = computed(() => {
  54 + if (unref(movie)?.credit?.crew) {
  55 + return movie.value?.credit.crew.find((person) => person.job === "Director");
  56 + } else {
  57 + return null;
  58 + }
  59 +});
49 //#endregion 60 //#endregion
50 61
51 //#region --Function--. 62 //#region --Function--.
@@ -91,18 +102,17 @@ const formatVoteCount = (count: number) => { @@ -91,18 +102,17 @@ const formatVoteCount = (count: number) => {
91 return `${count} votes`; 102 return `${count} votes`;
92 }; 103 };
93 104
94 -async function fetchCredits(id: number|string) { 105 +async function fetchCredits(id: number | string) {
95 try { 106 try {
96 - const data = await fetchMovieCredits(id) as CreditsResponse; 107 + const data = (await fetchMovieCredits(id)) as CreditsResponse;
97 data.movie_id = id; 108 data.movie_id = id;
98 // Add to store collection. 109 // Add to store collection.
99 - console.log('credit response', data)  
100 -  
101 useRepo(Credit).save(data); 110 useRepo(Credit).save(data);
102 } catch (error) { 111 } catch (error) {
103 console.error("Error fetching movie credits:", error); 112 console.error("Error fetching movie credits:", error);
104 } 113 }
105 } 114 }
  115 +
106 //#endregion 116 //#endregion
107 117
108 //#region --Global event--. 118 //#region --Global event--.
@@ -111,7 +121,7 @@ onMounted(() => { @@ -111,7 +121,7 @@ onMounted(() => {
111 if (unref(movieId)) { 121 if (unref(movieId)) {
112 const id = unref(movieId) as string | number; 122 const id = unref(movieId) as string | number;
113 fetchDetails(id); 123 fetchDetails(id);
114 - fetchCredits(id) 124 + fetchCredits(id);
115 } 125 }
116 // loadComments() 126 // loadComments()
117 }); 127 });
@@ -194,6 +204,18 @@ onMounted(() => { @@ -194,6 +204,18 @@ onMounted(() => {
194 <h2 class="text-xl font-bold mb-2">Synopsis</h2> 204 <h2 class="text-xl font-bold mb-2">Synopsis</h2>
195 <p class="text-gray-300">{{ movie.overview || "Aucun synopsis disponible." }}</p> 205 <p class="text-gray-300">{{ movie.overview || "Aucun synopsis disponible." }}</p>
196 </div> 206 </div>
  207 +
  208 + <!-- Réalisateur et têtes d'affiche -->
  209 + <div v-if="movie.credit" class="mb-6">
  210 + <h2 class="text-xl font-bold mb-2">Équipe</h2>
  211 + <div v-if="director" class="mb-2">
  212 + <span class="font-semibold">Réalisateur:</span> {{ director.name }}
  213 + </div>
  214 + <div v-if="movie.credit.cast.length > 0">
  215 + <span class="font-semibold">Têtes d'affiche:</span>
  216 + {{ movie.credit.cast.slice(0, 5).map(person => person.name).join(', ') }}
  217 + </div>
  218 + </div>
197 </div> 219 </div>
198 </div> 220 </div>
199 </div> 221 </div>