Использование Firebase отрисовка эффекта - PullRequest
0 голосов
/ 06 мая 2020

Я не знаю, что я здесь делаю не так, но консоль для currentUser рендерится каждый раз. Я добавил зависимости currentUser, но он выполняет повторную визуализацию, я также добавил очистку, но при этом выполняется повторная визуализация.

  const [currentUser, setcurrentUser] = useState({});

  const aut = () => {
    return authentication.onAuthStateChanged(async (user) => {
      if (user) {
        const userRef = await createUserProfileDoc(user);

        userRef.onSnapshot((snapshot) => {
          setcurrentUser({
            id: snapshot.id,
            ...snapshot.data(),
          });
        });
        console.log("inside", currentUser);
      } else {
        setcurrentUser(null);
      }
      // setcurrentUser(user);
      // createUserProfi  leDoc(user);
    });
  };

  useEffect(() => {
    // aut();

  });

Даже при использовании зависимостей он возвращает null. Если я добавлю currentUser в [], то бесконечный l oop начнется с вывода консоли.

  const [currentUser, setcurrentUser] = useState({});
  const [user, setUser] = useState();

  const aut = () => {
    return authentication.onAuthStateChanged(async (user) => {
      setUser(user);
      if (user) {
        const userRef = await createUserProfileDoc(user);

        userRef.onSnapshot((snapshot) => {
          setcurrentUser({
            id: snapshot.id,
            ...snapshot.data(),
          });
        });
        console.log("inside", currentUser);
      } else {
        setcurrentUser(null);
      }
      // setcurrentUser(user);
      // createUserProfi  leDoc(user);
    });
  };

  useEffect(() => {
    aut();
  }, [user]);

это profileDo c FUnction

export const createUserProfileDoc = async (userAuth, data) => {
  if (!userAuth) return;

  const userRef = firestore.doc(`users/${userAuth.uid}`);

  const snapShot = await userRef.get();

  if (!snapShot.exists) {
    const { displayName, email } = userAuth;
    const createdAt = new Date();

    try {
      await userRef.set({
        displayName,
        email,
        createdAt,
        ...data,
      });
    } catch (error) {
      console.log("error in creating User", error.message);
    }
  }
  return userRef;
};

Ответы [ 2 ]

1 голос
/ 06 мая 2020

вот как я обрабатываю аутентификацию firebase в моем приложении

useEffect(() => {
    firebaseApp.auth().onAuthStateChanged((user) => {
        if (user) {
            setUser(user)
        } else {
            console.log(user, 'user not loggedin')
        }
    })
}, [user])

Я устанавливаю пользователя, если пользователь присутствует, и я вызываю useEffect со вторым аргументом [user] только для вызова если user изменилось

0 голосов
/ 06 мая 2020

Почему бы просто не использовать AsyncStorage для сохранения пользователя как зарегистрированного следующим образом:

const saveDataToStorage = async (user) => {
  await AsyncStorage.setItem("userData", JSON.stringify(user));
};

и получить такого пользователя на экране запуска:

const userData = await AsyncStorage.getItem("userData");

и только Если кто-то не сохранил, отправить почтовый запрос, используя данные, которые вы отправили в форме входа?

fetch("https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword? key=apiKey",
        {
            method: "POST",
            headers: {
                "Content-type": "application/json",
            },
            body: JSON.stringify({
                email: email,
                password,
                returnSecureToken: true,
            }),
        }
    );
...