Spaces:
Sleeping
Sleeping
| import React, { useEffect, useState } from 'react'; | |
| import PageHeader from '../components/PageHeader'; | |
| import ContentGrid from '../components/ContentGrid'; | |
| import { getAllTvShows, getTvShowCard } from '../lib/api'; | |
| import { useToast } from '@/hooks/use-toast'; | |
| import { useSearchParams } from 'react-router-dom'; | |
| const TvShowsPage = () => { | |
| const [loading, setLoading] = useState(true); | |
| const [tvShows, setTvShows] = useState<any[]>([]); | |
| const [searchParams] = useSearchParams(); | |
| const genreFilter = searchParams.get('genre'); | |
| const { toast } = useToast(); | |
| useEffect(() => { | |
| const fetchTvShows = async () => { | |
| try { | |
| setLoading(true); | |
| const allTvShows = await getAllTvShows(); | |
| // For each tv show, get its card info for display | |
| const tvShowPromises = allTvShows.slice(0, 30).map(async (show: any) => { | |
| try { | |
| const showInfo = await getTvShowCard(show.title); | |
| if (showInfo) { | |
| return { | |
| type: 'tvshow', | |
| title: show.title, | |
| image: showInfo.image, | |
| description: showInfo.overview, | |
| genre: showInfo.genres?.map((g: any) => g.name) || [], | |
| year: showInfo.year, | |
| episodeCount: show.episodeCount | |
| }; | |
| } | |
| return null; | |
| } catch (error) { | |
| console.error(`Error fetching tv show info for ${show.title}:`, error); | |
| return null; | |
| } | |
| }); | |
| let tvShowsData = await Promise.all(tvShowPromises); | |
| tvShowsData = tvShowsData.filter(show => show !== null); | |
| // Apply genre filter if present | |
| if (genreFilter) { | |
| tvShowsData = tvShowsData.filter(show => | |
| show.genre.some((g: string) => g.toLowerCase() === genreFilter.toLowerCase()) | |
| ); | |
| } | |
| setTvShows(tvShowsData); | |
| } catch (error) { | |
| console.error('Error fetching TV shows:', error); | |
| toast({ | |
| title: "Error loading TV shows", | |
| description: "Please try again later", | |
| variant: "destructive" | |
| }); | |
| } finally { | |
| setLoading(false); | |
| } | |
| }; | |
| fetchTvShows(); | |
| }, [genreFilter, toast]); | |
| return ( | |
| <div className="pb-12"> | |
| <PageHeader | |
| title={genreFilter ? `${genreFilter} TV Shows` : "All TV Shows"} | |
| subtitle={`${tvShows.length} titles available`} | |
| /> | |
| {loading ? ( | |
| <div className="flex items-center justify-center h-64"> | |
| <div className="animate-spin rounded-full h-12 w-12 border-t-2 border-b-2 border-netflix-red"></div> | |
| </div> | |
| ) : ( | |
| <ContentGrid | |
| items={tvShows} | |
| emptyMessage={genreFilter | |
| ? `No TV shows found in the ${genreFilter} genre` | |
| : "No TV shows available"} | |
| /> | |
| )} | |
| </div> | |
| ); | |
| }; | |
| export default TvShowsPage; | |