我无法传递到ReactNative

时间:2020-10-30 17:12:53

标签: reactjs firebase react-native google-cloud-firestore firebase-authentication

我正在尝试使用firebase.auth()的signInWithEmailAndPassword函数创建登录页面 我可以创建用户,但是我无法登录,也不知道为什么。

当我单击按钮(touchableOpacity)时,我应该转到登录功能并执行登录并传递到另一个页面。但是相反,它什么也不做,没有错误,但是导航或错误电子邮件的错误也没有。

即使创建用户的功能起作用并且我导航到同一页面,导航也已正确实现。

这是我的功能:

编辑:这是我登录页面的完整代码

import getIdByEmail from './firebase/getIdByEmail';
import {IdContext} from './Context';


async function pushClient(email) {
  //I WANT TO PASS SIZE+1 TO ALL PAGES
  const size = await getID('Clients');
  const newID = (size + 1).toString();
  const docRef = firebase.firestore().collection('Clients').doc(newID);
  await docRef.set({
    Email: email
  });
  return (size+1);
}

async function getID(){ 
  const snapshot = await firebase.firestore().collection('Clients').get();
  return snapshot.size;
}

export default const LoginApp = props => {
    const [Email, setEmail] = useState();
    const [Pass, setPass] = useState();
    const [SignPress, setSignPress] = useState();
    const [CreatePress, setCreatePress] = useState();
    const [id, setId] = useContext(IdContext);

    const signIn = async(props) => {
        const ID = await getIdByEmail(Email);
          firebase.auth()
          .signInWithEmailAndPassword(Email, Pass)
          .then(() => {
              setId(ID);
              props.navigation.navigate('Skip'); 
          })
          .catch(error => {
              if (error.code === 'auth/email-already-in-use') {
              console.log('That email address is already in use!');
              }
  
              if (error.code === 'auth/invalid-email') {
              console.log('That email address is invalid!');
              }
              console.error(error);
          });
    }

    const createUser = () => {
        firebase.auth()
        .createUserWithEmailAndPassword(Email, Pass)
        .then(() => {
            pushClient(Email).then(id => {
              setId(id);
              props.navigation.navigate('ChooseRole');
            }); 
        })
        .catch(error => {
            if (error.code === 'auth/email-already-in-use') {
            console.log('That email address is already in use!');
            }

            if (error.code === 'auth/invalid-email') {
            console.log('That email address is invalid!');
            }

            console.error(error);
        });
    }

    return(
      <View>
          <Button title="Create User" onPress={() => setCreatePress(!CreatePress)}/>
            {CreatePress &&
              <View >
                <TextInput
                  style={styles.inputText}
                  placeholder="Email"
                  placeholderTextColor="#000000"
                  onChangeText={text => setEmail(text)}
                />
                <TextInput
                  style={styles.inputText}
                  placeholder="Password"
                  placeholderTextColor="#000000"
                  onChangeText={text => setPass(text)}
                />
                <TouchableOpacity
                    onPress={createUser} style={styles.loginBtn}>
                    <Text style={styles.buttonText}>continue</Text>
                </TouchableOpacity>
              </View> 
            }
          <Button title="Sign In with Email" onPress={() => setSignPress(!SignPress)}/>
            {SignPress &&
              <View>
                <TextInput
                  style={styles.inputText}
                  placeholder="Email"
                  placeholderTextColor="#000000"
                  onChangeText={text => setEmail(text)}
                />
                <TextInput
                  style={styles.inputText}
                  placeholder="Password"
                  placeholderTextColor="#000000"
                  onChangeText={text => setPass(text)}
                />
                <TouchableOpacity
                    onPress={signIn} style={styles.loginBtn}>
                    <Text style={styles.buttonText}>continue</Text>
                </TouchableOpacity>
              </View> 
            }
          <Text> Welcome</Text>
      </View>
  );
}

getIdByEmail.js

const getIdByEmail = email => {
    return new Promise((resolve, reject) => {
        db.collection('Clients').get().then(data => {
            data.docs.map(doc => {
                const d = doc.data();
                if (d.email === email) resolve(doc.id);
            });
        });
    });
}

编辑:我希望当用户单击按钮SignIn时,inputText出现,用于插入电子邮件和密码,然后他们单击“继续”,系统应计算文档的ID(在创建ID时分配给我)帐户),其中有他们的电子邮件;之后,我想转到另一个名为“跳过”(相同导航器)的页面

1 个答案:

答案 0 :(得分:1)

我最好的猜测是文档中可能不存在该电子邮件,并且您的承诺永远不会解决或拒绝,因此ID将永远等待,firebase.auth()永远不会运行。如果无法匹配电子邮件,请尝试拒绝它。

$("#btn").css("background", "red");

// .... }