import { DateTime } from "luxon"; import { useState } from "react"; import { Button } from "~/components/ui/button"; import { ChevronLeft, ChevronRight, Star, Users, UserIcon, SortAsc, SortDesc, } from "lucide-react"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "~/components/ui/select"; import { Tabs, TabsList, tabsStyle, TabsTrigger } from "~/components/ui/tabs"; import DatePickerWithRange from "~/components/home/date-picker"; import BottomNavigation from "~/components/bottom-nav"; import Error from "~/components/error"; import { useSearchParams } from "react-router"; import { useColles, type User } from "~/lib/api"; import TabContent from "~/components/home/tab-content"; import { MainLayout } from "~/layout"; import { forceReload } from "~/lib/utils"; import { SyncButton } from "../sync-status"; import WeekNavigation from "./week-navigation"; export default function Home({ user }: { user: User }) { // Handle query parameters const [query, setQuery] = useSearchParams(); const updateQuery = (key: string, value: string) => { if (query.get(key) !== value) { setQuery((prev) => { const newQuery = new URLSearchParams(prev); newQuery.set(key, value); return newQuery; }); } }; // Tabs const activeTab = query.get("view") || "you"; const setActiveTab = (tab: string) => updateQuery("view", tab); // Date const rawStartDate = query.get("start"); const startDate = rawStartDate ? DateTime.fromISO(rawStartDate, { zone: "local" }) : DateTime.now().startOf("week"); const setStartDate = (date: DateTime) => updateQuery("start", date.startOf("week").toISODate()!); // Fetch colles from API const { studentColles, classColles, favoriteColles, healthyUntil, lastSync, error, isLoading, } = useColles(startDate); // Error handling (after all hooks) if (error) return ( ); // TODO: FAVORITES const useToggleStar = (auth: any) => {}; // Filter state const rawSubject = query.get("subject"); const [subjectFilter, setSubjectFilter] = useState( rawSubject === "all" ? "" : rawSubject || "" ); const setSubject = (subject: string) => { updateQuery("subject", subject); setSubjectFilter(subject); }; const rawExaminer = query.get("examiner"); const [examinerFilter, setExaminerFilter] = useState( rawExaminer === "all" ? "" : rawExaminer || "" ); const setExaminer = (examiner: string) => { updateQuery("examiner", examiner); setExaminerFilter(examiner); }; const [sorted, setSort] = useState(query.get("sort") || "desc"); const toggleSort = () => { const newSort = sorted === "asc" ? "desc" : "asc"; updateQuery("sort", newSort); setSort(newSort); }; const generateFilter = (arr: string[], value: string) => { const unique = [...new Set(arr)]; if (value && !unique.includes(value)) { unique.push(value); } unique.sort((a, b) => a.localeCompare(b)); return unique; }; const subjects = generateFilter( classColles.map((colle) => colle.subject?.name), subjectFilter ); const examiners = generateFilter( classColles.map((colle) => colle.examiner?.name), examinerFilter ); const applyFilters = (colles: any[]) => { return colles .filter((colle) => { const subjectMatch = subjectFilter === "all" || !subjectFilter ? true : colle.subject?.name === subjectFilter; const examinerMatch = examinerFilter === "all" || !examinerFilter ? true : colle.examiner?.name === examinerFilter; return subjectMatch && examinerMatch; }) .sort((a, b) => { if (sorted === "asc") { return a.date.localeCompare(b.date); } else { return b.date.localeCompare(a.date); } }); }; return (

Khollisé - {user.className} ⚔️

} >
{/* Tabs */} Vous {/* Favoris */} Classe {/* Week Navigation */} {/* Filter component */}
{/* Your Colles Tab */} {activeTab === "you" && ( )} {/* Favorites Tab {activeTab === "favorites" && ( )} */} {/* Class Colles Tab */} {activeTab === "class" && ( )} {/* Bottom Navigation for Mobile */}
); }