Ajout interface/response/TMDB.
Factorisation du composable tMDB afin de remplacer les appels fetch natif par useFetch.
Showing
4 changed files
with
39 additions
and
40 deletions
| 1 | 0.5.0: | 1 | 0.5.0: |
| 2 | - Mise en place du plugin oFetch pour personnaliser la gestion des requêtes. | 2 | - Mise en place du plugin oFetch pour personnaliser la gestion des requêtes. |
| 3 | +- Ajout interface/response/TMDB. | ||
| 4 | +- Factorisation du composable tMDB afin de remplacer les appels fetch natif par useFetch. | ||
| 3 | 5 | ||
| 4 | 0.4.0: | 6 | 0.4.0: |
| 5 | - Modification de la config eslint avec la suppression de tout ce qui concerne prettier, suppression du module @nuxt/eslint, contenant le module eslint/recommanded, et remplacement par le module @antfu/eslint-config, plus complet et simple. | 7 | - Modification de la config eslint avec la suppression de tout ce qui concerne prettier, suppression du module @nuxt/eslint, contenant le module eslint/recommanded, et remplacement par le module @antfu/eslint-config, plus complet et simple. |
| 1 | -import type { RuntimeConfig } from "nuxt/schema"; | 1 | +import type { MovieInterface } from "~/interfaces/movie"; |
| 2 | +import type { TMDBCollectionResponse } from "~/interfaces/response/TMDB"; | ||
| 2 | 3 | ||
| 3 | export function useTMDB() { | 4 | export function useTMDB() { |
| 4 | - const runtimeconfig: RuntimeConfig = useRuntimeConfig(); | 5 | + const paramsBase = { |
| 5 | - const apiUrl = runtimeconfig.public.apiTMDBUrl; | 6 | + language: "fr-FR", |
| 6 | - const apiKey = runtimeconfig.public.apiTMDBSecret; | 7 | + }; |
| 7 | 8 | ||
| 8 | /** | 9 | /** |
| 9 | * Fetch popular movies. | 10 | * Fetch popular movies. |
| 10 | * @param page | 11 | * @param page |
| 11 | */ | 12 | */ |
| 12 | const fetchPopularMovies = async (page: number) => { | 13 | const fetchPopularMovies = async (page: number) => { |
| 13 | - try { | 14 | + const { data, status, error, execute } = await useFetch(`/movie/popular`, { |
| 14 | - const response = await fetch(`${apiUrl}/movie/popular?api_key=${apiKey}&language=fr-FR&page=${page}`); | 15 | + params: { ...paramsBase, page }, |
| 15 | - if (!response.ok) throw new Error("An error occurred when fetching popular movies"); | 16 | + }); |
| 16 | - return await response.json(); | 17 | + if (unref(status) === "idle") await execute(); |
| 17 | - } | 18 | + if (unref(status) === "error" && unref(error)) throw new Error(`Error fetching popular movies: ${error}`); |
| 18 | - catch (error) { | 19 | + return unref(data) as TMDBCollectionResponse; |
| 19 | - throw new Error(`Error fetching popular movies: ${error}`); | ||
| 20 | - } | ||
| 21 | }; | 20 | }; |
| 22 | 21 | ||
| 23 | /** | 22 | /** |
| @@ -26,16 +25,12 @@ export function useTMDB() { | @@ -26,16 +25,12 @@ export function useTMDB() { | ||
| 26 | * @param page | 25 | * @param page |
| 27 | */ | 26 | */ |
| 28 | const searchMovies = async (query: string, page: number) => { | 27 | const searchMovies = async (query: string, page: number) => { |
| 29 | - try { | 28 | + const { data, status, error, execute } = await useFetch(`/search/movie`, { |
| 30 | - const response = await fetch( | 29 | + params: { ...paramsBase, page, query: encodeURIComponent(query) }, |
| 31 | - `${apiUrl}/search/movie?api_key=${apiKey}&language=fr-FR&query=${encodeURIComponent(query)}&page=${page}`, | 30 | + }); |
| 32 | - ); | 31 | + if (unref(status) === "idle") await execute(); |
| 33 | - if (!response.ok) throw new Error("An error occurred when searching movies"); | 32 | + if (unref(status) === "error" && unref(error)) throw new Error(`Error searching movies: ${error}`); |
| 34 | - return await response.json(); | 33 | + return unref(data) as TMDBCollectionResponse; |
| 35 | - } | ||
| 36 | - catch (error) { | ||
| 37 | - throw new Error(`Error searching movies: ${error}`); | ||
| 38 | - } | ||
| 39 | }; | 34 | }; |
| 40 | 35 | ||
| 41 | /** | 36 | /** |
| @@ -43,28 +38,24 @@ export function useTMDB() { | @@ -43,28 +38,24 @@ export function useTMDB() { | ||
| 43 | * @param id | 38 | * @param id |
| 44 | */ | 39 | */ |
| 45 | const fetchMovieDetails = async (id: number | string) => { | 40 | const fetchMovieDetails = async (id: number | string) => { |
| 46 | - try { | 41 | + const { data, status, error, execute } = await useFetch(`/movie/${id}`, { |
| 47 | - const response = await fetch(`${apiUrl}/movie/${id}?api_key=${apiKey}&language=fr-FR`); | 42 | + params: { ...paramsBase }, |
| 48 | - if (!response.ok) throw new Error("An error occurred when fetching movie details"); | 43 | + }); |
| 49 | - return await response.json(); | 44 | + if (unref(status) === "idle") await execute(); |
| 50 | - } | 45 | + if (unref(status) === "error" && unref(error)) throw new Error(`An error occurred when fetching movie details: ${error}`); |
| 51 | - catch (error) { | 46 | + return unref(data) as MovieInterface; |
| 52 | - throw new Error(`Error fetching details: ${error}`); | ||
| 53 | - } | ||
| 54 | }; | 47 | }; |
| 55 | 48 | ||
| 56 | /** | 49 | /** |
| 57 | * Fetch movie credits | 50 | * Fetch movie credits |
| 58 | */ | 51 | */ |
| 59 | const fetchMovieCredits = async (id: number | string) => { | 52 | const fetchMovieCredits = async (id: number | string) => { |
| 60 | - try { | 53 | + const { data, status, error, execute } = await useFetch(`/movie/${id}/credits`, { |
| 61 | - const response = await fetch(`${apiUrl}/movie/${id}/credits?api_key=${apiKey}&language=fr-FR`); | 54 | + params: { ...paramsBase }, |
| 62 | - if (!response.ok) throw new Error("An error occurred when fetching movie credits"); | 55 | + }); |
| 63 | - return await response.json(); | 56 | + if (unref(status) === "idle") await execute(); |
| 64 | - } | 57 | + if (unref(status) === "error" && unref(error)) throw new Error(`Error fetching movie credits: ${error}`); |
| 65 | - catch (error) { | 58 | + return unref(data); |
| 66 | - throw new Error(`Error fetching movie credits: ${error}`); | ||
| 67 | - } | ||
| 68 | }; | 59 | }; |
| 69 | 60 | ||
| 70 | return { fetchPopularMovies, searchMovies, fetchMovieDetails, fetchMovieCredits }; | 61 | return { fetchPopularMovies, searchMovies, fetchMovieDetails, fetchMovieCredits }; |
interfaces/response/TMDB.ts
0 → 100644
| 1 | { | 1 | { |
| 2 | "name": "nuxt-app", | 2 | "name": "nuxt-app", |
| 3 | - "version": "0.4.0", | 3 | + "version": "0.5.0", |
| 4 | "lockfileVersion": 3, | 4 | "lockfileVersion": 3, |
| 5 | "requires": true, | 5 | "requires": true, |
| 6 | "packages": { | 6 | "packages": { |
| 7 | "": { | 7 | "": { |
| 8 | "name": "nuxt-app", | 8 | "name": "nuxt-app", |
| 9 | - "version": "0.4.0", | 9 | + "version": "0.5.0", |
| 10 | "hasInstallScript": true, | 10 | "hasInstallScript": true, |
| 11 | "dependencies": { | 11 | "dependencies": { |
| 12 | "@nuxt/icon": "^1.12.0", | 12 | "@nuxt/icon": "^1.12.0", |
-
Please register or login to post a comment