@@ -30,36 +30,45 @@ export const AuthProvider = ({ children }) => {
3030 } ;
3131
3232 useEffect ( ( ) => {
33- const { data : authListener } = supabase . auth . onAuthStateChange ( ( _event , session ) => {
34- if ( session ) {
35- setUser ( session . user ) ;
36- setToken ( session . access_token ) ;
37- localStorage . setItem ( 'jwtToken' , session . access_token ) ;
38- } else {
39- setUser ( null ) ;
40- setToken ( null ) ;
33+ // Check for existing session token in localStorage on mount
34+ const existingToken = localStorage . getItem ( 'jwtToken' ) ;
35+ if ( existingToken ) {
36+ // Validate the session token with our backend
37+ const apiUrl = process . env . REACT_APP_API_URL || 'http://localhost:4000' ;
38+ fetch ( `${ apiUrl } /api/projects` , {
39+ headers : {
40+ 'Authorization' : `Bearer ${ existingToken } ` ,
41+ 'Content-Type' : 'application/json'
42+ }
43+ } )
44+ . then ( response => {
45+ if ( response . ok ) {
46+ // Token is valid, keep the session
47+ setToken ( existingToken ) ;
48+ // The backend's authenticateToken middleware now sets req.user from Supabase
49+ // We don't need to fetch user info separately here, but we can set a basic user object
50+ // if needed for immediate UI updates before a full user object is available.
51+ // For now, we'll assume the backend correctly authenticates and the user object
52+ // will be populated on subsequent requests or a dedicated user info endpoint.
53+ // setUser({ email: 'authenticated' }); // Removed placeholder
54+ } else {
55+ // Token is invalid, clear it
56+ localStorage . removeItem ( 'jwtToken' ) ;
57+ setUser ( null ) ;
58+ setToken ( null ) ;
59+ }
60+ setLoading ( false ) ;
61+ } )
62+ . catch ( error => {
63+ Logger . warn ( 'Session validation failed:' , error . message ) ;
4164 localStorage . removeItem ( 'jwtToken' ) ;
42- }
43- setLoading ( false ) ;
44- } ) ;
45-
46- // Initial session check
47- supabase . auth . getSession ( ) . then ( ( { data : { session } } ) => {
48- if ( session ) {
49- setUser ( session . user ) ;
50- setToken ( session . access_token ) ;
51- localStorage . setItem ( 'jwtToken' , session . access_token ) ;
52- } else {
5365 setUser ( null ) ;
5466 setToken ( null ) ;
55- localStorage . removeItem ( 'jwtToken' ) ;
56- }
67+ setLoading ( false ) ;
68+ } ) ;
69+ } else {
5770 setLoading ( false ) ;
58- } ) ;
59-
60- return ( ) => {
61- authListener . unsubscribe ( ) ;
62- } ;
71+ }
6372 } , [ ] ) ;
6473
6574 const login = async ( email , password ) => {
@@ -83,7 +92,12 @@ export const AuthProvider = ({ children }) => {
8392
8493
8594
86- // Supabase's onAuthStateChange will handle setting user, token, and localStorage
95+ const data = await response . json ( ) ;
96+
97+ const userWithToken = { ...data . user , access_token : data . access_token } ;
98+ setUser ( userWithToken ) ;
99+ setToken ( data . access_token ) ; // Use Supabase access token
100+ localStorage . setItem ( 'jwtToken' , data . access_token ) ;
87101 setLoading ( false ) ;
88102 navigate ( '/dashboard' ) ;
89103 } catch ( error ) {
0 commit comments