Advertisement
justfrenzy

CrackFlix - frontend /src/components/App/useMediaData.tsx

May 12th, 2024
454
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { useContext, useEffect, useState } from "react";
  2. import { AppContext, AppContextTypes } from "../../utils/AppContext";
  3. import { useLocation } from "react-router-dom";
  4. import { mediaType } from "./props.interface";
  5. import { useDisclosure } from "@nextui-org/react";
  6. import {
  7.     PopularMovies,
  8.     PopularTV,
  9.     TrendingMovies,
  10.     TrendingTV,
  11.     NowPlayingMovies,
  12.     NowPlayingTV,
  13. } from "./onloadFuncs";
  14.  
  15. type mediaDataProps = {
  16.     type: "popular" | "trending" | "now_playing";
  17.     isMovie: boolean;
  18. };
  19.  
  20. type mediaFetch = {
  21.     movies: {
  22.         results: mediaType[];
  23.         total_pages: number;
  24.     };
  25.     tvShows: {
  26.         results: mediaType[];
  27.         total_pages: number;
  28.     };
  29. };
  30.  
  31. const useMediaData = ({ type, isMovie }: mediaDataProps) => {
  32.     const { defaultLanguage } = useContext<AppContextTypes>(AppContext);
  33.     const location = useLocation();
  34.     const queryParams = new URLSearchParams(location.search);
  35.     const page = queryParams.get("page") || "1";
  36.     const [mediaData, setMediaData] = useState<mediaType[]>([] as mediaType[]);
  37.     const [currPage, setCurrPage] = useState<number>(page ? Number(page) : 1);
  38.     const [totalPages, setTotalPages] = useState<number>(0);
  39.     const [search, setSearch] = useState<string>("");
  40.     const { isOpen, onOpen, onOpenChange } = useDisclosure();
  41.     const [mediaId, setMediaId] = useState<number>(0);
  42.     const [isLoading, setLoading] = useState<boolean>(false);
  43.     const [error, setError] = useState<string>("");
  44.  
  45.     useEffect(() => {
  46.         window.scrollTo({
  47.             top: 0,
  48.             behavior: "smooth",
  49.         });
  50.         setLoading(true);
  51.  
  52.  
  53.         if (isNaN(Number(currPage))) {
  54.             setError(
  55.                 defaultLanguage === "en-US"
  56.                     ? "Invalid page parameter. You can navigate back to look for other movies or shows."
  57.                     : "Невалиден параметър на страницата. Може да се навигирате назад, за да намерите други филми или сериали."
  58.             );
  59.             return;
  60.         }
  61.  
  62.         const fetchMediaData = async (lang: string) => {
  63.             try {
  64.                 const apiFunction = isMovie
  65.                     ? type === "popular"
  66.                         ? PopularMovies
  67.                         : type === "trending"
  68.                             ? TrendingMovies
  69.                             : type === "now_playing"
  70.                                 ? NowPlayingMovies
  71.                                 : () => {}
  72.                     : type === "popular"
  73.                         ? PopularTV
  74.                         : type === "trending"
  75.                             ? TrendingTV
  76.                             : type === "now_playing"
  77.                                 ? NowPlayingTV
  78.                                 : () => {};
  79.  
  80.                 const response = (await apiFunction(
  81.                     lang as AppContextTypes['defaultLanguage'],
  82.                     currPage as number
  83.                 )) as mediaFetch;
  84.                 const mazna = response.movies || response.tvShows;
  85.                 const data: mediaType[] = mazna.results || [];
  86.                 setMediaData(data);
  87.                 setTotalPages(mazna.total_pages || 0);
  88.  
  89.                 if (
  90.                     typeof response === "undefined" ||
  91.                     response === null ||
  92.                     mazna.total_pages < currPage
  93.                 ) {
  94.                     const msg =
  95.                         defaultLanguage === "en-US"
  96.                             ? "Oops! Server Down.\nWe apologize, but it seems our server is currently experiencing some technical difficulties.\nPlease bear with us as we work to restore service. Thank you for your patience."
  97.                             : "Упс! Сървърът е изключен.\nИзвиняваме се, но изглежда, че нашият сървър в момента преживява технически затруднения.Моля, бъдете търпеливи, докато работим за възстановяването на услугата. Благодарим ви за търпението.";
  98.                     setError(msg);
  99.                     return;
  100.                 }
  101.  
  102.                 setLoading(false);
  103.             } catch (err) {
  104.                 const msg =
  105.                     defaultLanguage === "en-US"
  106.                         ? "Oops! Server Down.\nWe apologize, but it seems our server is currently experiencing some technical difficulties.\nPlease bear with us as we work to restore service. Thank you for your patience."
  107.                         : "Упс! Сървърът е изключен.\nИзвиняваме се, но изглежда, че нашият сървър в момента преживява технически затруднения.Моля, бъдете търпеливи, докато работим за възстановяването на услугата. Благодарим ви за търпението.";
  108.                 setError(msg);
  109.             }
  110.         };
  111.         fetchMediaData(defaultLanguage);
  112.     }, [defaultLanguage, currPage, type, page, isMovie]);
  113.  
  114.     return {
  115.         currPage,
  116.         error,
  117.         isLoading,
  118.         isOpen,
  119.         mediaData,
  120.         mediaId,
  121.         onOpen,
  122.         onOpenChange,
  123.         page,
  124.         search,
  125.         setCurrPage,
  126.         setMediaId,
  127.         setSearch,
  128.         totalPages,
  129.     } as useMediaDataTypes;
  130. };
  131.  
  132. export default useMediaData;
  133.  
  134. type useMediaDataTypes = {
  135.     currPage: number;
  136.     error: string;
  137.     isLoading: boolean;
  138.     isOpen: boolean;
  139.     mediaData: mediaType[] | [];
  140.     mediaId: number;
  141.     onOpen: () => void;
  142.     onOpenChange: React.Dispatch<React.SetStateAction<boolean>>;
  143.     page: string;
  144.     search: string;
  145.     setCurrPage: React.Dispatch<React.SetStateAction<number>>;
  146.     setMediaId: React.Dispatch<React.SetStateAction<number>>;
  147.     setSearch: React.Dispatch<React.SetStateAction<string>>;
  148.     totalPages: number;
  149. };
  150.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement