import { Media, MediaCategory } from '@/types'; import MediaCard from './MediaCard'; import MediaListItem from './MediaListItem'; import { LayoutGrid, List, Star, ChevronLeft, ChevronRight, ArrowUpDown, Search, Monitor, Users, FolderTree } from 'lucide-react'; import { Button } from '@/components/ui/button'; import React, { useState, useMemo, useEffect } from 'react'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu'; import { cn } from '@/lib/utils'; import { AnimatePresence } from 'motion/react'; interface BrowseViewProps { mediaList: Media[]; onMediaClick: (media: Media) => void; activeCategory: MediaCategory; } export default function BrowseView({ mediaList, onMediaClick, activeCategory }: BrowseViewProps) { const [viewMode, setViewMode] = useState<'grid' | 'list'>('grid'); const [currentPage, setCurrentPage] = useState(1); const [itemsPerPage, setItemsPerPage] = useState(12); const [sortBy, setSortBy] = useState('default'); // Filter states const [selectedGenre, setSelectedGenre] = useState(null); const [selectedStudio, setSelectedStudio] = useState(null); const [selectedPlatform, setSelectedPlatform] = useState(null); const [selectedDeveloper, setSelectedDeveloper] = useState(null); const [selectedCategory, setSelectedCategory] = useState(null); // Extract unique values for filters const allGenres = useMemo(() => Array.from(new Set(mediaList.flatMap(m => m.genres || []))), [mediaList]); const allStudios = useMemo(() => Array.from(new Set(mediaList.flatMap(m => m.studios || []))), [mediaList]); const allPlatforms = useMemo(() => Array.from(new Set(mediaList.flatMap(m => m.platforms || []))), [mediaList]); const allDevelopers = useMemo(() => Array.from(new Set(mediaList.flatMap(m => m.developers || []))), [mediaList]); const allCategories = useMemo(() => Array.from(new Set(mediaList.flatMap(m => m.categories || []))), [mediaList]); const filteredMedia = useMemo(() => { return mediaList.filter(media => { if (selectedGenre && !media.genres?.includes(selectedGenre)) return false; if (selectedStudio && !media.studios?.includes(selectedStudio)) return false; if (selectedPlatform && !media.platforms?.includes(selectedPlatform)) return false; if (selectedDeveloper && !media.developers?.includes(selectedDeveloper)) return false; if (selectedCategory && !media.categories?.includes(selectedCategory)) return false; return true; }); }, [mediaList, selectedGenre, selectedStudio, selectedPlatform, selectedDeveloper, selectedCategory]); // Reset to first page when mediaList or filters change useEffect(() => { setCurrentPage(1); }, [filteredMedia, sortBy]); const sortedMedia = useMemo(() => { const list = [...filteredMedia]; if (sortBy === 'title-asc') { return list.sort((a, b) => a.title.localeCompare(b.title)); } if (sortBy === 'title-desc') { return list.sort((a, b) => b.title.localeCompare(a.title)); } return list; }, [filteredMedia, sortBy]); const totalPages = Math.ceil(sortedMedia.length / itemsPerPage); const paginatedMedia = useMemo(() => { const startIndex = (currentPage - 1) * itemsPerPage; return sortedMedia.slice(startIndex, startIndex + itemsPerPage); }, [sortedMedia, currentPage, itemsPerPage]); const handlePrevPage = () => { setCurrentPage((prev) => Math.max(prev - 1, 1)); window.scrollTo({ top: 0, behavior: 'smooth' }); }; const handleNextPage = () => { setCurrentPage((prev) => Math.min(prev + 1, totalPages)); window.scrollTo({ top: 0, behavior: 'smooth' }); }; return (
{/* Filters Bar */}
{/* Genre Filter */} setSelectedGenre(null)}>All Genres {allGenres.sort().map(genre => ( setSelectedGenre(genre)}>{genre} ))} {/* Studio Filter */} setSelectedStudio(null)}>All Studios {allStudios.sort().map(studio => ( setSelectedStudio(studio)}>{studio} ))} {/* Platform Filter - Only for Games */} {activeCategory === 'Games' && ( setSelectedPlatform(null)}>All Platforms {allPlatforms.sort().map(platform => ( setSelectedPlatform(platform)}>{platform} ))} )} {/* Developer Filter - Only for Games */} {activeCategory === 'Games' && ( setSelectedDeveloper(null)}>All Developers {allDevelopers.sort().map(developer => ( setSelectedDeveloper(developer)}>{developer} ))} )} {/* Category Filter - Only for Games */} {activeCategory === 'Games' && ( setSelectedCategory(null)}>All Categories {allCategories.sort().map(category => ( setSelectedCategory(category)}>{category} ))} )} {(selectedGenre || selectedStudio || selectedPlatform || selectedDeveloper || selectedCategory) && ( )}
setSortBy('default')}>Default setSortBy('title-asc')}>Title (A-Z) setSortBy('title-desc')}>Title (Z-A)
{/* Content */} {mediaList.length === 0 ? (

No results found

Try adjusting your search or filters

) : (
{paginatedMedia.map((media) => ( viewMode === 'grid' ? ( ) : ( ) ))}
)} {/* Pagination Controls */} {mediaList.length > 0 && (
Items per page:
{currentPage} of {totalPages || 1}
)}
); }