diff --git a/app/components/home/index.tsx b/app/components/home/index.tsx
index a53b269..b6b7bce 100644
--- a/app/components/home/index.tsx
+++ b/app/components/home/index.tsx
@@ -67,12 +67,19 @@ export default function Home({ user }: { user: User }) {
isLoading,
} = useColles(startDate);
+ // Fetch upcoming colles from API
+ const {
+ classColles: upcomingClassColles,
+ error: upcomingError,
+ isLoading: upcomingIsLoading,
+ } = useColles(DateTime.now());
+
// Error handling (after all hooks)
- if (error)
+ if (error || upcomingError)
return (
@@ -98,6 +105,14 @@ export default function Home({ user }: { user: User }) {
updateQuery("examiner", examiner);
setExaminerFilter(examiner == "all" ? "" : examiner);
};
+ const rawStudent = query.get("student");
+ const [studentFilter, setStudentFilter] = useState(
+ rawStudent === "all" ? "" : rawStudent || ""
+ );
+ const setStudent = (student: string) => {
+ updateQuery("student", student);
+ setStudentFilter(student == "all" ? "" : student);
+ };
const [sorted, setSort] = useState(query.get("sort") || "desc");
const toggleSort = () => {
const newSort = sorted === "asc" ? "desc" : "asc";
@@ -106,21 +121,29 @@ export default function Home({ user }: { user: User }) {
};
const generateFilter = (arr: string[], value: string) => {
- const unique = [...new Set(arr)];
+ const unique = [...new Set(arr.filter(Boolean))];
if (value && !unique.includes(value)) {
unique.push(value);
}
unique.sort((a, b) => a.localeCompare(b));
return unique;
};
+
+ const currentClassColles =
+ activeTab === "upcoming" ? upcomingClassColles : classColles;
+
const subjects = generateFilter(
- classColles.map((colle) => colle.subject?.name),
+ currentClassColles.map((colle) => colle.subject?.name),
subjectFilter
);
const examiners = generateFilter(
- classColles.map((colle) => colle.examiner?.name),
+ currentClassColles.map((colle) => colle.examiner?.name),
examinerFilter
);
+ const students = generateFilter(
+ upcomingClassColles.map((colle) => colle.student?.fullName),
+ studentFilter
+ );
const applyFilters = (colles: any[]) => {
return colles
@@ -133,7 +156,11 @@ export default function Home({ user }: { user: User }) {
examinerFilter === "all" || !examinerFilter
? true
: colle.examiner?.name === examinerFilter;
- return subjectMatch && examinerMatch;
+ const studentMatch =
+ activeTab !== "upcoming" || studentFilter === "all" || !studentFilter
+ ? true
+ : colle.student?.fullName === studentFilter;
+ return subjectMatch && examinerMatch && studentMatch;
})
.sort((a, b) => {
if (sorted === "asc") {
@@ -218,6 +245,22 @@ export default function Home({ user }: { user: User }) {
+ {activeTab === "upcoming" && (
+
+ )}
+
)}
diff --git a/app/lib/api.ts b/app/lib/api.ts
index d16197a..0c536cf 100644
--- a/app/lib/api.ts
+++ b/app/lib/api.ts
@@ -203,6 +203,7 @@ interface CollePayload {
classColles: Colle[];
studentColles: Colle[];
favoriteColles: Colle[];
+ upcomingClassColles: Colle[];
healthyUntil: Date;
lastSync: Date;
}
@@ -238,6 +239,7 @@ export const useColles = (startDate: DateTime) => {
classColles: [],
studentColles: [],
favoriteColles: [],
+ upcomingClassColles: [],
healthyUntil: new Date(0),
lastSync: new Date(0),
},