@@ -16,7 +16,13 @@ import auth from '../config/firebase';
1616import type { User as AuthUser } from 'firebase/auth' ;
1717import type { User } from '../types/User' ;
1818import { db } from '../config/firestore' ;
19- import { deleteDoc , doc , getDoc , setDoc } from 'firebase/firestore' ;
19+ import {
20+ deleteDoc ,
21+ doc ,
22+ getDoc ,
23+ getDocFromServer ,
24+ setDoc ,
25+ } from 'firebase/firestore' ;
2026import md5 from 'md5' ;
2127
2228interface AuthContextType {
@@ -62,10 +68,8 @@ export function AuthProvider({ children }) {
6268 /**
6369 * Creates user in Firestore and updates current user state
6470 */
65- async function createUser ( credential : UserCredential ) {
71+ async function createUser ( newUser : AuthUser ) {
6672 // Create a new user document in database using same user id as auth
67- const newUser = credential . user ;
68-
6973 const emptyUser : User = {
7074 awards : [ ] ,
7175 certifications : [ ] ,
@@ -95,8 +99,10 @@ export function AuthProvider({ children }) {
9599 await setDoc ( doc ( db . users , newUser . uid ) , emptyUser ) ;
96100
97101 // Refresh auth user state with signed in user
98- setAuthUser ( credential . user ) ;
102+ setAuthUser ( newUser ) ;
99103 setCurrentUser ( emptyUser ) ;
104+
105+ console . log ( 'new user created. current and auth user updated.' , emptyUser ) ;
100106 }
101107
102108 /**
@@ -109,7 +115,7 @@ export function AuthProvider({ children }) {
109115 password
110116 ) ;
111117
112- await createUser ( credential ) ;
118+ await createUser ( credential . user ) ;
113119
114120 return credential ;
115121 }
@@ -135,15 +141,19 @@ export function AuthProvider({ children }) {
135141 const credential = await signInWithPopup ( auth , googleProvider ) ;
136142
137143 // Get user from database
138- const userDoc = await getDoc ( doc ( db . users , credential . user . uid ) ) ;
144+ const userDoc = await getDocFromServer ( doc ( db . users , credential . user . uid ) ) ;
139145
140146 // User exists -> set user as state
141147 if ( userDoc . exists ( ) ) {
148+ console . log ( 'user doc exists: ' , userDoc . data ( ) ) ;
149+
142150 setCurrentUser ( userDoc . data ( ) ) ;
143151 }
144152 // User doesn't exist -> create user
145153 else {
146- await createUser ( credential ) ;
154+ console . log ( 'user doc does not exist. Creating it.' ) ;
155+
156+ await createUser ( credential . user ) ;
147157 }
148158
149159 return credential ;
@@ -157,10 +167,16 @@ export function AuthProvider({ children }) {
157167 await auth . currentUser . reload ( ) ;
158168
159169 // Refresh current user
160- const userDoc = await getDoc ( doc ( db . users , auth . currentUser . uid ) ) ;
161- setCurrentUser ( userDoc . data ( ) ) ;
170+ if ( auth . currentUser ) {
171+ const userDoc = await getDoc ( doc ( db . users , auth . currentUser . uid ) ) ;
172+ if ( ! userDoc . exists ( ) ) {
173+ await createUser ( auth . currentUser ) ;
174+ } else {
175+ setCurrentUser ( userDoc . data ( ) ) ;
176+ }
162177
163- return userDoc . data ( ) ;
178+ return userDoc . data ( ) ;
179+ }
164180 }
165181
166182 /**
@@ -200,6 +216,8 @@ export function AuthProvider({ children }) {
200216 // On first load of the page, prepare an unsubscribe function
201217 useEffect ( ( ) => {
202218 const unsubscribe = auth . onAuthStateChanged ( ( user ) => {
219+ console . log ( 'auth state changed triggered!' ) ;
220+
203221 setLoading ( true ) ;
204222
205223 setAuthUser ( user ) ;
@@ -213,7 +231,11 @@ export function AuthProvider({ children }) {
213231 // Ensure user data is loaded if user logged in
214232 else if ( ! currentUser ) {
215233 getDoc ( doc ( db . users , user . uid ) ) . then ( ( res ) => {
216- setCurrentUser ( res . data ( ) ) ;
234+ if ( ! res . exists ( ) ) {
235+ createUser ( auth . currentUser ) ;
236+ } else {
237+ setCurrentUser ( res . data ( ) ) ;
238+ }
217239 setLoading ( false ) ;
218240 } ) ;
219241 }
0 commit comments