Я пытаюсь создать документ профиля пользователя для обычных пользователей и продавцов на Firebase. Я пытаюсь добавить дополнительные данные в этот документ, когда продавец регистрируется, но мне это не удалось. Разница в том, что у торговцев должен быть массив roles
со своими ролями. Если это неправильный подход к дифференцированию пользователей, я также был бы рад услышать, какие лучшие практики.
Мой userService
файл
async createUserProfileDocument(user, additionalData) {
console.log('additionalData: ', additionalData) //always undefined
if (!user) return
const userRef = this.firestore.doc(`users/${user.uid}`)
const snapshot = await userRef.get()
if (!snapshot.exists) {
const { displayName, email } = user
try {
await userRef.set({
displayName,
email,
...additionalData,
})
} catch (error) {
console.error('error creating user: ', error)
}
}
return this.getUserDocument(user.uid)
}
async getUserDocument(uid) {
if (!uid) return null
try {
const userDocument = await this.firestore.collection('users').doc(uid).get()
return { uid, ...userDocument.data() }
} catch (error) {
console.error('error getting user document: ', error)
}
}
Вот что происходит, когда пользователь регистрируется как продавец в компоненте RegisterMerchant
:
onSubmit={(values, { setSubmitting }) => {
async function writeToFirebase() {
//I can't pass the 'roles' array as additionalData
userService.createUserProfileDocument(values.user, { roles: ['businessOnwer'] })
authService.createUserWithEmailAndPassword(values.user.email, values.user.password)
await merchantsPendingApprovalService.collection().add(values)
}
writeToFirebase()
Я боюсь, что это может иметь какое-то отношение к onAuthStateChange
, который мог быть запущен до указанного выше и не передавать additionalData
? Это в Middleware
, где я контролирую все маршруты.
useEffect(() => {
authService.onAuthStateChanged(async function (userAuth) {
if (userAuth) {
//is the below running before the file above and not passing any additional data?
const user = await userService.createUserProfileDocument(userAuth) //this should return the already created document?
//** do logic here depending on whether user is businessOwner or not
setUserObject(user)
} else {
console.log('no one signed in')
}
})
}, [])