@@ -7,11 +7,15 @@ import {
77} from "@/components/ui/card" ;
88import { Button } from "@/components/ui/button" ;
99import { 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" ;
1212import TimetableCardKebabMenu from "./TimetableCardKebabMenu" ;
13- import { useUpdateTimetableMutation } from "@/api/timetableApiSlice" ;
13+ import {
14+ useUpdateTimetableMutation ,
15+ useGetTimetableQuery ,
16+ } from "@/api/timetableApiSlice" ;
1417import { Link } from "react-router-dom" ;
18+ import { TimetableModel } from "@/models/models" ;
1519
1620interface 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
0 commit comments