Skip to content

Commit 1c97098

Browse files
committed
implemented timetable favourite integration
1 parent 13cc5f8 commit 1c97098

File tree

3 files changed

+57
-8
lines changed

3 files changed

+57
-8
lines changed

course-matrix/frontend/src/pages/Home/Home.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,16 +72,19 @@ const Home = () => {
7272
<p className="text-sm text-muted-foreground">Loading...</p>
7373
) : (
7474
[...data]
75-
.sort((a: Timetable, b: Timetable) =>
76-
b?.updated_at.localeCompare(a?.updated_at),
77-
)
75+
.sort((a: Timetable, b: Timetable) => {
76+
if(a.favorite) return 1;
77+
if(b.favorite) return -1;
78+
return b?.updated_at.localeCompare(a?.updated_at);
79+
})
7880
.map((timetable) => (
7981
<TimetableCard
8082
refetch={refetch}
8183
key={timetable.id}
8284
timetableId={timetable.id}
8385
title={timetable.timetable_title}
8486
lastEditedDate={new Date(timetable.updated_at)}
87+
favorite={timetable.favorite}
8588
owner={name}
8689
/>
8790
))

course-matrix/frontend/src/pages/Home/TimetableCard.tsx

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,20 @@ import {
77
} from "@/components/ui/card";
88
import { Button } from "@/components/ui/button";
99
import { Input } from "@/components/ui/input";
10-
import { Pencil } from "lucide-react";
11-
import { useState } from "react";
10+
import { Star, Pencil } from "lucide-react";
11+
import { useState,useEffect } from "react";
1212
import TimetableCardKebabMenu from "./TimetableCardKebabMenu";
13-
import { useUpdateTimetableMutation } from "@/api/timetableApiSlice";
13+
import { useUpdateTimetableMutation, useGetTimetableQuery} from "@/api/timetableApiSlice";
1414
import { Link } from "react-router-dom";
15+
import { TimetableModel } from "@/models/models";
1516

1617
interface TimetableCardProps {
1718
refetch: () => void;
1819
timetableId: number;
1920
title: string;
2021
lastEditedDate: Date;
2122
owner: string;
23+
favorite: boolean;
2224
}
2325

2426
/**
@@ -32,9 +34,12 @@ const TimetableCard = ({
3234
title,
3335
lastEditedDate,
3436
owner,
37+
favorite
3538
}: TimetableCardProps) => {
3639
const [updateTimetable] = useUpdateTimetableMutation();
3740

41+
42+
3843
const lastEditedDateArray = lastEditedDate
3944
.toISOString()
4045
.split("T")[0]
@@ -47,6 +52,8 @@ const TimetableCard = ({
4752

4853
const [timetableCardTitle, setTimetableCardTitle] = useState(title);
4954
const [isEditingTitle, setIsEditingTitle] = useState(false);
55+
const { data } = useGetTimetableQuery(timetableId);
56+
const [toggled, setToggled] = useState(favorite);
5057

5158
const handleSave = async () => {
5259
try {
@@ -60,6 +67,35 @@ const TimetableCard = ({
6067
}
6168
};
6269

70+
useEffect(() => {
71+
if (data) {
72+
const val = (data as TimetableModel[])[0]?.favorite;
73+
if (val !== undefined) {
74+
setToggled(val);
75+
}
76+
}
77+
}, [data]);
78+
79+
const handleFavourite = async () => {
80+
try {
81+
await updateTimetable({
82+
id: timetableId,
83+
favorite: !toggled,
84+
}).unwrap();
85+
refetch();
86+
console.log("Favourite success!");
87+
setToggled(!toggled);
88+
console.log(!toggled);
89+
handleReload();
90+
} catch (error) {
91+
console.error("Failed to favourite timetable:", error);
92+
}
93+
};
94+
95+
const handleReload = () => {
96+
window.location.reload(); // Reloads the page
97+
};
98+
6399
return (
64100
<Card className="w-full">
65101
<CardHeader>
@@ -70,6 +106,7 @@ const TimetableCard = ({
70106
/>
71107
</Link>
72108
<div className="flex justify-between items-center">
109+
73110
<CardTitle>
74111
<Input
75112
disabled={!isEditingTitle}
@@ -82,6 +119,10 @@ const TimetableCard = ({
82119
onChange={(e) => setTimetableCardTitle(e.target.value)}
83120
/>
84121
</CardTitle>
122+
123+
<Star className={`w-6 h-6 transition-colors ${
124+
toggled ? "fill-none text-gray-500" : "fill-yellow-500 text-yellow-500"
125+
}`} onClick={() => handleFavourite()}/>
85126
<div className="flex justify-between">
86127
{!isEditingTitle && (
87128
<>

course-matrix/frontend/src/pages/Home/TimetableCardKebabMenu.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ import {
1616
DialogDescription,
1717
DialogClose,
1818
} from "@/components/ui/dialog";
19-
import { EllipsisVertical } from "lucide-react";
20-
import { useDeleteTimetableMutation } from "@/api/timetableApiSlice";
19+
import { EllipsisVertical} from "lucide-react";
20+
import { useDeleteTimetableMutation} from "@/api/timetableApiSlice";
2121
import { EmailNotificationSettings } from "./EmailNotificationSettings";
2222

2323
interface TimetableCardKebabMenuProps {
@@ -33,7 +33,11 @@ const TimetableCardKebabMenu = ({
3333
refetch,
3434
timetableId,
3535
}: TimetableCardKebabMenuProps) => {
36+
3637
const [deleteTimetable] = useDeleteTimetableMutation();
38+
39+
40+
3741

3842
const handleDelete = async () => {
3943
try {
@@ -51,6 +55,7 @@ const TimetableCardKebabMenu = ({
5155
<EllipsisVertical />
5256
</Button>
5357
</DropdownMenuTrigger>
58+
5459
<DropdownMenuContent>
5560
<DropdownMenuItem>
5661
<Link to={`/dashboard/timetable?edit=${timetableId}`}>

0 commit comments

Comments
 (0)