({ tracks, categories }: TracksWithCategoriesProps)
| 46 | } |
| 47 | |
| 48 | export const Tracks = ({ tracks, categories }: TracksWithCategoriesProps) => { |
| 49 | const [selectedCategory, setSelectedCategory] = useRecoilState(category); |
| 50 | const [filteredTracks, setFilteredTracks] = useState<TrackPros[]>(tracks); |
| 51 | const [visibleTracks, setVisibleTracks] = useState<TrackPros[]>([]); |
| 52 | const [sortBy, setSortBy] = useState<string>("new"); |
| 53 | const [isSelectOpen, setIsSelectOpen] = useState<boolean>(false); |
| 54 | const [currentPage, setCurrentPage] = useState<number>(1); |
| 55 | const [loading, setLoading] = useState<boolean>(true); |
| 56 | const [selectedCohort, setSelectedCohort] = useState<number | null>(null); |
| 57 | |
| 58 | const tracksPerPage = 10; |
| 59 | const isCohort2Selected = selectedCohort === CohortGroup.Two; |
| 60 | const isCohort3Selected = selectedCohort === CohortGroup.Three; |
| 61 | |
| 62 | const filterTracks = () => { |
| 63 | setLoading(true); |
| 64 | setFilteredTracks(tracks.filter((t) => selectedCohort === 3 ? t.cohort === 3 : t.cohort !== 3)); |
| 65 | setCurrentPage(1); // Reset to first page on filtering |
| 66 | setLoading(false); |
| 67 | }; |
| 68 | |
| 69 | const sortTracks = (sortBy: string) => { |
| 70 | setLoading(true); |
| 71 | let sortedTracks = [...filteredTracks]; |
| 72 | if (sortBy === "ascending") { |
| 73 | sortedTracks.sort((a, b) => a.title.localeCompare(b.title)); |
| 74 | } else if (sortBy === "descending") { |
| 75 | sortedTracks.sort((a, b) => b.title.localeCompare(a.title)); |
| 76 | } else if (sortBy === "new") { |
| 77 | sortedTracks.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()); |
| 78 | } else if (sortBy === "old") { |
| 79 | sortedTracks.sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()); |
| 80 | } |
| 81 | setFilteredTracks(sortedTracks); |
| 82 | setLoading(false); |
| 83 | }; |
| 84 | |
| 85 | const handleCohortSelection = (cohort: number) => { |
| 86 | setSelectedCohort((prevCohort) => (prevCohort === cohort ? null : cohort)); |
| 87 | }; |
| 88 | |
| 89 | useEffect(() => { |
| 90 | filterTracks(); |
| 91 | }, [selectedCategory, selectedCohort, tracks]); |
| 92 | |
| 93 | useEffect(() => { |
| 94 | sortTracks(sortBy); |
| 95 | }, [sortBy]); |
| 96 | |
| 97 | useEffect(() => { |
| 98 | setLoading(true); |
| 99 | const start = (currentPage - 1) * tracksPerPage; |
| 100 | const end = start + tracksPerPage; |
| 101 | setVisibleTracks(filteredTracks.slice(start, end)); |
| 102 | setLoading(false); |
| 103 | }, [currentPage, filteredTracks]); |
| 104 | |
| 105 | const totalPages = Math.ceil(filteredTracks.length / tracksPerPage); |
nothing calls this directly
no test coverage detected