@@ -2,17 +2,31 @@ import React, { useState } from 'react';
22import { observer } from "mobx-react-lite" ;
33
44const FavouritesDropdown = observer ( ( props ) => {
5- const [ showShareBox , setShowShareBox ] = useState ( false ) ;
65 const [ shareUrl , setShareUrl ] = useState ( "" ) ;
6+ const [ copied , setCopied ] = useState ( false ) ;
7+
8+
9+
10+
711
812 function handleShareCourses ( ) {
913 if ( ! props . favouriteCourses || props . favouriteCourses . length === 0 ) return ;
10-
14+
1115 const courseCodes = props . favouriteCourses . map ( course => course . code ) . join ( "," ) ;
1216 const url = `${ window . location . origin } /#/share?favs=${ encodeURIComponent ( courseCodes ) } ` ;
13- setShareUrl ( url ) ;
14- setShowShareBox ( true ) ;
17+
18+ navigator . clipboard . writeText ( url )
19+ . then ( ( ) => {
20+ setCopied ( true ) ;
21+ setTimeout ( ( ) => setCopied ( false ) , 2500 ) ; // revert after 2.5 seconds
22+ } )
23+ . catch ( err => {
24+ console . error ( "Copy failed:" , err ) ;
25+ } ) ;
1526 }
27+
28+
29+
1630
1731 function handleCopy ( ) {
1832 navigator . clipboard . writeText ( shareUrl )
@@ -62,55 +76,34 @@ const FavouritesDropdown = observer((props) => {
6276 ) }
6377 </ div >
6478
65- { /* Footer */ }
66- < div className = "sticky bottom-0 border-t border-solid border-violet-400 bg-indigo-300/75 backdrop-blur-lg" >
67- < div className = 'p-3 flex justify-between items-center bg-violet-400/30' >
68- < p className = 'text-slate-900 font-bold w-1/2' > Total:</ p >
69- < p className = 'text-slate-900 font-bold w-1/4' > </ p >
70- < p className = 'text-slate-900 font-bold w-1/4 text-center' > { props . totalCredits } hp</ p >
71- < div className = "w-8" > </ div >
72- </ div >
7379
74- < div className = "flex border-t border-solid border-violet-400" >
75- { props . favouriteCourses . length > 0 && (
76- < >
77- < button
78- onClick = { props . removeAllFavourites }
79- className = "w-1/2 p-3 cursor-pointer text-red-600 hover:bg-red-600 hover:text-white border-r border-solid border-violet-400 font-semibold transition-colors"
80- >
81- Clear All
82- </ button >
83- < button
84- onClick = { handleShareCourses }
85- className = "w-1/2 p-3 cursor-pointer text-violet-700 hover:bg-blue-500 hover:text-white flex items-center justify-center gap-2 font-semibold"
86- >
87- Share Courses
88- </ button >
89- </ >
90- ) }
91- </ div >
92- </ div >
80+ < div className = "flex border-t border-solid border-violet-400" >
81+ { props . favouriteCourses . length > 0 && (
82+ < >
83+ < button
84+ onClick = { props . removeAllFavourites }
85+ className = "w-1/2 p-3 cursor-pointer text-red-600 hover:bg-red-600 hover:text-white border-r border-solid border-violet-400 font-semibold transition-colors"
86+ >
87+ Clear All
88+ </ button >
89+
90+ < button
91+ onClick = { handleShareCourses }
92+ className = { `w-1/2 p-3 cursor-pointer ${
93+ copied ? "bg-violet-600 text-white" : "text-violet-700 hover:bg-blue-500 hover:text-white"
94+ } flex items-center justify-center gap-2 font-semibold transition-colors duration-300`}
95+ >
96+ { copied ? "Copied to Clipboard!" : "Share Courses" }
97+ </ button >
9398
94- { /* Floating share box */ }
95- { showShareBox && (
96- < div className = "fixed z-30 right-8 top-20 bg-white p-4 border border-gray-300 rounded-xl shadow-xl w-[320px]" >
97- < p className = "text-sm break-words mb-2" > { shareUrl } </ p >
98- < div className = "flex justify-between items-center" >
99- < button
100- onClick = { handleCopy }
101- className = "bg-blue-600 text-white px-3 py-1 rounded hover:bg-blue-800 text-sm"
102- >
103- Copy to Clipboard
104- </ button >
105- < button
106- onClick = { ( ) => setShowShareBox ( false ) }
107- className = "text-gray-600 text-sm hover:underline"
108- >
109- Close
110- </ button >
99+ </ >
100+ ) }
111101 </ div >
102+
112103 </ div >
113- ) }
104+ < / d i v >
105+
106+
114107
115108 { /* Optional course popup */ }
116109 < div className = "relative z-100" >
0 commit comments