1- import React , { 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,30 +7,114 @@ import Home from './pages/Home';
77import EventsDashboard from './pages/EventsDashboard' ;
88import Login from './pages/Login' ;
99import SignUp from './pages/SignUp' ;
10+ import { AWSCredentials , UserDetails } from './types' ;
1011
1112const App : React . FC = ( ) => {
1213 const [ isDarkMode , setIsDarkMode ] = useState ( false ) ; // Dark mode state
13- const [ user , setUser ] = useState < Record < string , string > | null > ( null ) ;
14+ const [ user , setUser ] = useState < UserDetails | null > ( null ) ;
15+
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+ } , [ ] ) ;
1459
1560 const toggleDarkMode = ( ) => {
1661 setIsDarkMode ( ( prev ) => ! prev ) ;
1762 document . body . classList . toggle ( 'dark-mode' , ! isDarkMode ) ; // Toggle class based on state
1863 } ;
1964
65+ function checkLogin ( component : ReactNode ) : ReactNode {
66+ return user ? component : < p > You must login to see this page</ p > ;
67+ }
68+
69+ function checkAWSCreds ( component : ReactNode ) : ReactNode {
70+ if (
71+ user ?. aws_access_key ?. length &&
72+ user ?. aws_region ?. length > 0 &&
73+ user ?. aws_secret_access_key ?. length > 0
74+ ) {
75+ return component ;
76+ }
77+ return (
78+ < p >
79+ You must enter your AWS credentials in the profile page to see any data
80+ here.
81+ </ p >
82+ ) ;
83+ }
84+
2085 return (
2186 < Router >
22- < Navbar toggleDarkMode = { toggleDarkMode } isDarkMode = { isDarkMode } username = { user ?. username ?? null } setUser = { setUser } />
87+ < Navbar
88+ toggleDarkMode = { toggleDarkMode }
89+ isDarkMode = { isDarkMode }
90+ username = { user ?. username ?? null }
91+ setUser = { setUser }
92+ />
2393 < Routes >
94+ < Route path = "/" element = { < Login setUser = { setUser } /> } />
2495 < Route path = "/login" element = { < Login setUser = { setUser } /> } />
2596 < Route path = "/signup" element = { < SignUp /> } />
26- { /* {user !== null && <> */ }
27- < Route path = "/" element = { < Home isDarkMode = { isDarkMode } /> } />
28- < Route path = "/profile" element = { < Profile isDarkMode = { isDarkMode } user = { user } /> } />
97+
98+ < Route
99+ path = "/home"
100+ element = { checkLogin ( checkAWSCreds ( < Home isDarkMode = { isDarkMode } /> ) ) }
101+ />
102+ < Route
103+ path = "/profile"
104+ element = { checkLogin (
105+ < Profile
106+ isDarkMode = { isDarkMode }
107+ user = { user }
108+ updateCredentials = { updateCredentials }
109+ />
110+ ) }
111+ />
29112 < Route
30113 path = "/events-dashboard"
31- element = { < EventsDashboard isDarkMode = { isDarkMode } /> }
114+ element = { checkLogin (
115+ checkAWSCreds ( < EventsDashboard isDarkMode = { isDarkMode } /> )
116+ ) }
32117 />
33- { /* </>} */ }
34118 </ Routes >
35119 </ Router >
36120 ) ;
0 commit comments