1- import React , { ReactNode , useState } from 'react' ;
1+ import React , { ReactNode , useCallback , useEffect , useState } from 'react' ;
22import { BrowserRouter as Router , Route , Routes } from 'react-router-dom' ;
33
44import Navbar from './components/Navbar' ;
@@ -7,12 +7,56 @@ import Home from './pages/Home';
77import EventsDashboard from './pages/EventsDashboard' ;
88import Login from './pages/Login' ;
99import SignUp from './pages/SignUp' ;
10- import { UserDetails } from './types' ;
10+ import { AWSCredentials , UserDetails } from './types' ;
1111
1212const App : React . FC = ( ) => {
1313 const [ isDarkMode , setIsDarkMode ] = useState ( false ) ; // Dark mode state
1414 const [ user , setUser ] = useState < UserDetails | null > ( null ) ;
1515
16+ const updateCredentials = useCallback (
17+ function ( credentials : AWSCredentials ) : void {
18+ const locallyStoredUser : UserDetails = JSON . parse (
19+ window . localStorage . getItem ( 'user' ) !
20+ ) as UserDetails ;
21+ fetch ( '/credentials' , {
22+ method : 'POST' ,
23+ body : JSON . stringify ( {
24+ ...credentials ,
25+ username :
26+ user ?. username ?? locallyStoredUser . username ?? 'No Active User' ,
27+ } ) ,
28+ headers : {
29+ 'Content-Type' : 'application/json' ,
30+ } ,
31+ } )
32+ . then ( ( response ) => {
33+ if ( ! response . ok )
34+ throw Error ( 'Server Error while updating aws credentials' ) ;
35+ return response . json ( ) ;
36+ } )
37+ . then ( ( data : UserDetails ) => {
38+ setUser ( data ) ;
39+ window . localStorage . setItem ( 'user' , JSON . stringify ( data ) ) ;
40+ } )
41+ . catch ( ( error : Error ) => {
42+ console . error ( error ) ;
43+ } ) ;
44+ } ,
45+ // we don't want to update on user update, because it would create an infinte loop, only on app reload
46+ // eslint-disable-next-line react-hooks/exhaustive-deps
47+ [ ]
48+ ) ;
49+
50+ // check for a user session and update the user if found
51+ useEffect ( ( ) => {
52+ if ( window . localStorage . getItem ( 'user' ) ) {
53+ const locallyStoredUser : UserDetails = JSON . parse (
54+ window . localStorage . getItem ( 'user' ) !
55+ ) as UserDetails ;
56+ setUser ( locallyStoredUser ) ;
57+ }
58+ } , [ ] ) ;
59+
1660 const toggleDarkMode = ( ) => {
1761 setIsDarkMode ( ( prev ) => ! prev ) ;
1862 document . body . classList . toggle ( 'dark-mode' , ! isDarkMode ) ; // Toggle class based on state
@@ -47,26 +91,30 @@ const App: React.FC = () => {
4791 setUser = { setUser }
4892 />
4993 < Routes >
94+ < Route path = "/" element = { < Login setUser = { setUser } /> } />
5095 < Route path = "/login" element = { < Login setUser = { setUser } /> } />
5196 < Route path = "/signup" element = { < SignUp /> } />
5297
5398 < Route
54- path = "/"
55- element = { checkAWSCreds ( checkLogin ( < Home isDarkMode = { isDarkMode } /> ) ) }
99+ path = "/home "
100+ element = { checkLogin ( checkAWSCreds ( < Home isDarkMode = { isDarkMode } /> ) ) }
56101 />
57102 < Route
58103 path = "/profile"
59104 element = { checkLogin (
60- < Profile isDarkMode = { isDarkMode } user = { user } setUser = { setUser } />
105+ < Profile
106+ isDarkMode = { isDarkMode }
107+ user = { user }
108+ updateCredentials = { updateCredentials }
109+ />
61110 ) }
62111 />
63112 < Route
64113 path = "/events-dashboard"
65- element = { checkAWSCreds (
66- checkLogin ( < EventsDashboard isDarkMode = { isDarkMode } /> )
114+ element = { checkLogin (
115+ checkAWSCreds ( < EventsDashboard isDarkMode = { isDarkMode } /> )
67116 ) }
68117 />
69- { /* </>} */ }
70118 </ Routes >
71119 </ Router >
72120 ) ;
0 commit comments