Skip to content

Commit 440f93a

Browse files
thomasyzy7dawangk
andauthored
Ty/scrum 57 timetable favourite (#106)
Co-authored-by: dawangk <[email protected]>
1 parent 96655f1 commit 440f93a

File tree

4 files changed

+57
-7
lines changed

4 files changed

+57
-7
lines changed

course-matrix/frontend/src/api/timetableApiSlice.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export const timetableApiSlice = apiSlice.injectEndpoints({
4040
},
4141
credentials: "include",
4242
}),
43+
keepUnusedDataFor: 0,
4344
}),
4445
updateTimetable: builder.mutation({
4546
query: (data) => ({

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,13 @@ const Home = () => {
8080
<p className="text-sm text-muted-foreground">Loading...</p>
8181
) : (
8282
[...data]
83-
.sort((a: Timetable, b: Timetable) =>
84-
b?.updated_at.localeCompare(a?.updated_at),
85-
)
83+
.sort((a: Timetable, b: Timetable) => {
84+
if (a.favorite == b.favorite)
85+
return b?.updated_at.localeCompare(a?.updated_at);
86+
if (a.favorite) return -1;
87+
if (b.favorite) return 1;
88+
return 0;
89+
})
8690
.map((timetable) => (
8791
<TimetableCard
8892
refetch={refetch}
@@ -91,6 +95,7 @@ const Home = () => {
9195
timetableId={timetable.id}
9296
title={timetable.timetable_title}
9397
lastEditedDate={new Date(timetable.updated_at)}
98+
favorite={timetable.favorite}
9499
owner={name}
95100
/>
96101
))

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

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,15 @@ 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 {
14+
useUpdateTimetableMutation,
15+
useGetTimetableQuery,
16+
} from "@/api/timetableApiSlice";
1417
import { Link } from "react-router-dom";
18+
import { TimetableModel } from "@/models/models";
1519

1620
interface TimetableCardProps {
1721
refetch: () => void;
@@ -20,6 +24,7 @@ interface TimetableCardProps {
2024
title: string;
2125
lastEditedDate: Date;
2226
owner: string;
27+
favorite: boolean;
2328
}
2429

2530
/**
@@ -34,6 +39,7 @@ const TimetableCard = ({
3439
title,
3540
lastEditedDate,
3641
owner,
42+
favorite,
3743
}: TimetableCardProps) => {
3844
const [updateTimetable] = useUpdateTimetableMutation();
3945

@@ -49,6 +55,8 @@ const TimetableCard = ({
4955

5056
const [timetableCardTitle, setTimetableCardTitle] = useState(title);
5157
const [isEditingTitle, setIsEditingTitle] = useState(false);
58+
const { data } = useGetTimetableQuery(timetableId);
59+
const [toggled, setToggled] = useState(favorite);
5260

5361
const handleSave = async () => {
5462
try {
@@ -64,6 +72,30 @@ const TimetableCard = ({
6472
}
6573
};
6674

75+
useEffect(() => {
76+
if (data) {
77+
const val = (data as TimetableModel[])[0]?.favorite;
78+
if (val !== undefined) {
79+
setToggled(val);
80+
}
81+
}
82+
}, [data]);
83+
84+
const handleFavourite = async () => {
85+
try {
86+
await updateTimetable({
87+
id: timetableId,
88+
favorite: !toggled,
89+
}).unwrap();
90+
refetch();
91+
console.log("Favourite success!");
92+
setToggled(!toggled);
93+
console.log(!toggled);
94+
} catch (error) {
95+
console.error("Failed to favourite timetable:", error);
96+
}
97+
};
98+
6799
return (
68100
<Card className="w-full">
69101
<CardHeader>
@@ -86,7 +118,18 @@ const TimetableCard = ({
86118
onChange={(e) => setTimetableCardTitle(e.target.value)}
87119
/>
88120
</CardTitle>
89-
<div className="flex justify-between">
121+
<div className="p-2">
122+
<Star
123+
className={`cursor-pointer h-5 w-5 transition-colors ${
124+
toggled
125+
? "fill-yellow-500 text-yellow-500"
126+
: "fill-none text-gray-500"
127+
} `}
128+
onClick={() => handleFavourite()}
129+
/>
130+
</div>
131+
132+
<div className="flex justify-around">
90133
{!isEditingTitle && (
91134
<>
92135
<Button

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ const TimetableCardKebabMenu = ({
5151
<EllipsisVertical />
5252
</Button>
5353
</DropdownMenuTrigger>
54+
5455
<DropdownMenuContent>
5556
<DropdownMenuItem>
5657
<Link to={`/dashboard/timetable?edit=${timetableId}`}>

0 commit comments

Comments
 (0)