MCPcopy Create free account
hub / github.com/code100x/daily-code / Tracks

Function Tracks

apps/web/components/Tracks.tsx:48–256  ·  view source on GitHub ↗
({ tracks, categories }: TracksWithCategoriesProps)

Source from the content-addressed store, hash-verified

46}
47
48export 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);

Callers

nothing calls this directly

Calls 3

filterTracksFunction · 0.85
sortTracksFunction · 0.85
handleCohortSelectionFunction · 0.85

Tested by

no test coverage detected