'use client'; import React, { useMemo, useEffect } from 'react'; import { Card } from '@/ui/Card'; import { Button } from '@/ui/Button'; import { Heading } from '@/ui/Heading'; import Breadcrumbs from '@/components/layout/Breadcrumbs'; import { Flag, SlidersHorizontal, Calendar, } from 'lucide-react'; import { RaceFilterModal } from '@/components/races/RaceFilterModal'; import { RacePagination } from '@/components/races/RacePagination'; import { Box } from '@/ui/Box'; import { Stack } from '@/ui/Stack'; import { Text } from '@/ui/Text'; import { Container } from '@/ui/Container'; import { Icon } from '@/ui/Icon'; import { Surface } from '@/ui/Surface'; import { Skeleton } from '@/ui/Skeleton'; import { RaceListItem } from '@/components/races/RaceListItem'; import type { RacesViewData } from '@/lib/view-data/RacesViewData'; export type StatusFilter = 'scheduled' | 'running' | 'completed' | 'cancelled' | 'all'; interface RacesAllTemplateProps { viewData: RacesViewData; isLoading: boolean; // Pagination currentPage: number; totalPages: number; itemsPerPage: number; onPageChange: (page: number) => void; // Filters statusFilter: StatusFilter; setStatusFilter: (filter: StatusFilter) => void; leagueFilter: string; setLeagueFilter: (filter: string) => void; searchQuery: string; setSearchQuery: (query: string) => void; // UI State showFilters: boolean; setShowFilters: (show: boolean) => void; showFilterModal: boolean; setShowFilterModal: (show: boolean) => void; // Actions onRaceClick: (raceId: string) => void; onLeagueClick: (leagueId: string) => void; } export function RacesAllTemplate({ viewData, isLoading, currentPage, totalPages, itemsPerPage, onPageChange, statusFilter, setStatusFilter, leagueFilter, setLeagueFilter, searchQuery, setSearchQuery, showFilters, setShowFilters, showFilterModal, setShowFilterModal, onRaceClick, }: RacesAllTemplateProps) { const { races } = viewData; // Filter races const filteredRaces = useMemo(() => { return races.filter(race => { if (statusFilter !== 'all' && race.status !== statusFilter) { return false; } if (leagueFilter !== 'all' && race.leagueId !== leagueFilter) { return false; } if (searchQuery) { const query = searchQuery.toLowerCase(); const matchesTrack = race.track.toLowerCase().includes(query); const matchesCar = race.car.toLowerCase().includes(query); const matchesLeague = race.leagueName?.toLowerCase().includes(query); if (!matchesTrack && !matchesCar && !matchesLeague) { return false; } } return true; }); }, [races, statusFilter, leagueFilter, searchQuery]); // Paginate const paginatedRaces = useMemo(() => { const start = (currentPage - 1) * itemsPerPage; return filteredRaces.slice(start, start + itemsPerPage); }, [filteredRaces, currentPage, itemsPerPage]); // Reset page when filters change useEffect(() => { onPageChange(1); }, [statusFilter, leagueFilter, searchQuery]); const breadcrumbItems = [ { label: 'Races', href: '/races' }, { label: 'All Races' }, ]; if (isLoading) { return ( {[1, 2, 3, 4, 5].map(i => ( ))} ); } return ( {/* Breadcrumbs */} {/* Header */} }> All Races {filteredRaces.length} race{filteredRaces.length !== 1 ? 's' : ''} found {/* Search & Filters (Simplified for template) */} {showFilters && ( Use the filter button to open advanced search and filtering options. )} {/* Race List */} {paginatedRaces.length === 0 ? ( No races found {races.length === 0 ? 'No races have been scheduled yet' : 'Try adjusting your search or filters'} ) : ( {paginatedRaces.map(race => ( ))} )} {/* Pagination */} {/* Filter Modal */} setShowFilterModal(false)} statusFilter={statusFilter} setStatusFilter={setStatusFilter} leagueFilter={leagueFilter} setLeagueFilter={setLeagueFilter} timeFilter="all" setTimeFilter={() => {}} searchQuery={searchQuery} setSearchQuery={setSearchQuery} leagues={viewData.leagues} showSearch={true} showTimeFilter={false} /> ); }