@@ -7,18 +7,20 @@ 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 { useUpdateTimetableMutation , useGetTimetableQuery } from "@/api/timetableApiSlice" ;
1414import { Link } from "react-router-dom" ;
15+ import { TimetableModel } from "@/models/models" ;
1516
1617interface 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 < >
0 commit comments