@@ -22,6 +22,33 @@ export const Canvas = () => {
2222 const [ socket , setSocket ] = useState ( null ) ;
2323 const [ isModalOpen , setIsModalOpen ] = useState ( false ) ;
2424
25+ const [ isLoggedIn , setIsLoggedIn ] = useState (
26+ ! ! localStorage . getItem ( "token" )
27+ ) ;
28+
29+ const handleLogout = async ( ) => {
30+ const token = localStorage . getItem ( "token" ) ;
31+ if ( ! token ) return ;
32+ try {
33+ const res = await fetch ( "http://localhost:3000/api/auth/logout" , {
34+ method : "POST" ,
35+ headers : { "Content-Type" : "application/json" } ,
36+ body : JSON . stringify ( { token } ) ,
37+ } ) ;
38+ const data = await res . json ( ) ;
39+ if ( res . ok ) {
40+ localStorage . removeItem ( "token" ) ;
41+ setIsLoggedIn ( false ) ;
42+ toast . success ( "Logged out successfully!" ) ;
43+ } else {
44+ toast . error ( data . message ) ;
45+ }
46+ } catch ( err ) {
47+ console . error ( err ) ;
48+ toast . error ( "Logout failed!" ) ;
49+ }
50+ } ;
51+
2552 useEffect ( ( ) => {
2653 const s = io ( "http://localhost:3000" ) ;
2754 setSocket ( s ) ;
@@ -181,6 +208,61 @@ export const Canvas = () => {
181208
182209 return (
183210 < div className = "relative w-full h-screen overflow-hidden bg-canvas" >
211+
212+ { /* 🔹 Login / Logout buttons */ }
213+ < div className = "fixed top-4 left-4 z-[9999]" >
214+ { isLoggedIn ? (
215+ // Logout button if logged in
216+ < button
217+ onClick = { handleLogout }
218+ className = "bg-red-600 text-white px-4 py-2 rounded-lg shadow hover:bg-red-700"
219+ >
220+ Logout
221+ </ button >
222+ ) : (
223+ < >
224+ { /* Desktop view: two separate buttons */ }
225+ < div className = "hidden sm:flex gap-3" >
226+ < button
227+ onClick = { ( ) => window . location . href = "/login" }
228+ className = "bg-blue-600 text-white px-4 py-2 rounded-lg shadow hover:bg-blue-700"
229+ >
230+ Sign In
231+ </ button >
232+ < button
233+ onClick = { ( ) => window . location . href = "/register" }
234+ className = "bg-blue-600 text-white px-4 py-2 rounded-lg shadow hover:bg-blue-700"
235+ >
236+ Sign Up
237+ </ button >
238+ </ div >
239+
240+ { /* Mobile view: dropdown */ }
241+ < div className = "sm:hidden relative" >
242+ < details className = "bg-blue-600 text-white px-4 py-2 rounded-lg shadow cursor-pointer select-none" >
243+ < summary className = "outline-none list-none" > Menu ☰</ summary >
244+ < div className = "absolute left-0 mt-2 w-32 bg-white text-black rounded-lg shadow-lg border" >
245+ < button
246+ onClick = { ( ) => window . location . href = "/login" }
247+ className = "block w-full text-left px-4 py-2 hover:bg-gray-100"
248+ >
249+ Sign In
250+ </ button >
251+ < button
252+ onClick = { ( ) => window . location . href = "/register" }
253+ className = "block w-full text-left px-4 py-2 hover:bg-gray-100"
254+ >
255+ Sign Up
256+ </ button >
257+ </ div >
258+ </ details >
259+ </ div >
260+ </ >
261+ ) }
262+ </ div >
263+
264+
265+
184266 < Toolbar
185267 activeTool = { activeTool }
186268 onToolChange = { handleToolChange }
0 commit comments