Как передать дополнительные данные функции, которая добавляет объекты к объекту? - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь создать документ профиля пользователя для обычных пользователей и продавцов на 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')
      }
    })
  }, [])

1 Ответ

2 голосов
/ 27 мая 2020

Существует функция обратного вызова onCreate, которая вызывается при аутентификации пользователя.

Вот как вы могли бы ее реализовать

const onSubmit = (values, { setSubmitting }) => {

  const { user: {email, password} } = values;
  const additionalData = { roles: ['businessOnwer'] };

  auth.user().onCreate((user) => {
      const { uid, displayName, email } = user;

      this.firestore.doc(`users/${uid}`).set({
            displayName,
            email,
            ...additionalData
      });
  });

  authService.createUserWithEmailAndPassword(email, password);
}
...