'use client'; import { useState, useEffect, useRef } from 'react'; import AnimeCard from '@/components/AnimeCard'; import AnimeFilters from '@/components/AnimeFilters'; import { fetchTopAiring } from '@/lib/api'; export default function TopAiringPage() { const [animeList, setAnimeList] = useState([]); const [filteredList, setFilteredList] = useState([]); const [isLoading, setIsLoading] = useState(true); const [currentPage, setCurrentPage] = useState(1); const [hasNextPage, setHasNextPage] = useState(false); const [selectedGenre, setSelectedGenre] = useState(null); const [yearFilter, setYearFilter] = useState('all'); const [sortOrder, setSortOrder] = useState('default'); const [searchQuery, setSearchQuery] = useState(''); const [selectedSeasons, setSelectedSeasons] = useState([]); const [selectedTypes, setSelectedTypes] = useState([]); const [selectedStatus, setSelectedStatus] = useState([]); const [selectedLanguages, setSelectedLanguages] = useState([]); const [error, setError] = useState(null); // Current year for filtering const currentYear = new Date().getFullYear(); // Add ref to track if this is the first render const initialRender = useRef(true); useEffect(() => { const fetchData = async () => { setIsLoading(true); try { const data = await fetchTopAiring(currentPage); if (currentPage === 1) { setAnimeList(data.results || []); } else { setAnimeList(prev => [...prev, ...(data.results || [])]); } setHasNextPage(data.hasNextPage || false); } catch (error) { console.error('Error fetching top airing anime:', error); setError('Failed to load anime. Please try again later.'); } finally { setIsLoading(false); } }; fetchData(); }, [currentPage]); // Apply filters and sorting whenever the anime list or filter settings change useEffect(() => { // Skip the initial render effect to avoid duplicate filtering if (initialRender.current) { initialRender.current = false; return; } if (!animeList.length) { setFilteredList([]); return; } let result = [...animeList]; // Search filter if (searchQuery && searchQuery.trim() !== '') { const query = searchQuery.toLowerCase().trim(); result = result.filter(anime => { const title = (anime.title || '').toLowerCase(); const otherNames = (anime.otherNames || '').toLowerCase(); return title.includes(query) || otherNames.includes(query); }); } // Filter by genre if selected if (selectedGenre) { result = result.filter(anime => { if (anime.genres && Array.isArray(anime.genres)) { return anime.genres.some(g => g.toLowerCase() === selectedGenre.toLowerCase() || (g.name && g.name.toLowerCase() === selectedGenre.toLowerCase()) ); } else if (anime.genre) { return anime.genre.toLowerCase().includes(selectedGenre.toLowerCase()); } return false; }); } // Filter by season if (selectedSeasons.length > 0) { result = result.filter(anime => { const season = getAnimeSeason(anime); return selectedSeasons.includes(season); }); } // Filter by year if (yearFilter !== 'all') { result = result.filter(anime => { const animeYear = parseInt(anime.year) || 0; if (yearFilter === 'older') { return animeYear < 2000; } else { return animeYear.toString() === yearFilter; } }); } // Filter by type if (selectedTypes.length > 0) { result = result.filter(anime => selectedTypes.includes(anime.type) ); } // Filter by status if (selectedStatus.length > 0) { result = result.filter(anime => { const status = anime.status || getDefaultStatus(anime); return selectedStatus.includes(status); }); } // Filter by language if (selectedLanguages.length > 0) { result = result.filter(anime => { const language = anime.language || getDefaultLanguage(anime); return selectedLanguages.includes(language); }); } // Apply sorting switch (sortOrder) { case 'title-asc': result.sort((a, b) => (a.title || '').localeCompare(b.title || '')); break; case 'title-desc': result.sort((a, b) => (b.title || '').localeCompare(a.title || '')); break; case 'year-desc': result.sort((a, b) => (parseInt(b.year) || 0) - (parseInt(a.year) || 0)); break; case 'year-asc': result.sort((a, b) => (parseInt(a.year) || 0) - (parseInt(b.year) || 0)); break; default: // Default order from API break; } setFilteredList(result); }, [animeList, selectedGenre, yearFilter, sortOrder, searchQuery, selectedSeasons, selectedTypes, selectedStatus, selectedLanguages]); const handleLoadMore = () => { setCurrentPage(prev => prev + 1); }; const handleGenreChange = (genre) => { setSelectedGenre(genre); }; const handleYearChange = (year) => { setYearFilter(year); }; const handleSortChange = (order) => { setSortOrder(order); }; const handleSearchChange = (value) => { setSearchQuery(value); }; const handleSeasonChange = (seasons) => { setSelectedSeasons(seasons); }; const handleTypeChange = (types) => { setSelectedTypes(types); }; const handleStatusChange = (status) => { setSelectedStatus(status); }; const handleLanguageChange = (languages) => { setSelectedLanguages(languages); }; return (
We couldn't find any top airing anime at this time. Please check back later.