dante
dante

Reputation: 115

How can I validate textField input with a Firestore query call?

So my goal is to validate a textfield by checking if that value is within any of the documents in the Firestore collection. So in my other validation function, I can return a String and show an alert with the error like so:

 func validateFields() -> String? {
    if nameTextF.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" ||
        emailTextF.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" ||
        passwordTextF.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" ||
        schoolIDTextF.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" ||
        currentGradeTextF.text?.trimmingCharacters(in: .whitespacesAndNewlines) == ""{
        
        showAlert(title: "Missing Fields", message: "Please fill in all fields.")
        return "Issue With Fields"
    }
    
    let cleanedPassword = passwordTextF.text!.trimmingCharacters(in: .whitespacesAndNewlines)
    let properGradeSelected = currentGradeTextF.text!.trimmingCharacters(in: .whitespacesAndNewlines)
    let validSchoolID = schoolIDTextF.text!.trimmingCharacters(in: .whitespacesAndNewlines)

    if Utilities.isPasswordValid(cleanedPassword) == false {
        
        showAlert(title: "Invalid Password", message: "Please ensure that your password contains 8 characters, contains a special character and a number as well.")
        return "Issue With Password"
    }
    
    if Utilities.isGradeValid(properGradeSelected) == false {
        showAlert(title: "Invalid Grade", message: "Please ensure that your current grade is valid.")
        return "Issue With Grade Input"
    }
    
    if Utilities.isSchoolIDValid(validSchoolID) == false {
        showAlert(title: "Invalid School ID Format", message: "The School ID entered has the incorrect format.")
        return "Issue With School ID input."
    }

    return nil
    
}

Then I call it when the 'Sign Up' button is pressed like so:

 @IBAction func signupPressed(_ sender: UIButton) {
    //Validate the fields
    let validationError = validateFields()
    
    if validationError != nil {
        return
    } else {
        //Create the user
        Auth.auth().createUser(withEmail: email, password: password) { (result, err) in ....

This works perfect. Now since I want to use a Firestore query in a function, I can't return the String like how I did in the other ones without getting errors, so I'm quite confused on how to go about doing this.

This is the function I have so far:

 func determineIfIDIsValid() {
    let schoolIDText = schoolIDTextF.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
    db.collection("school_users").whereField("school_id", isEqualTo: schoolIDText).getDocuments { (querySnapshot, error) in
        guard error == nil else {
            return
        }
        guard let query = querySnapshot?.isEmpty else { return }
        if query == true {
            //Show error alert
        } else {
            return
           //Continue With Signup flow
        }
    }
}

I've tried declaring a variable before the query whether it be a String or Bool, changing the value after the query, and using logic to return a String but that didn't work either. How can I use this function to validate the specific field without getting any errors?

Upvotes: 0

Views: 64

Answers (1)

func determineIfIDIsValid(_ callback: @escaping (Bool) -> ()) {
    let schoolIDText = schoolIDTextF.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
    db.collection("school_users").whereField("school_id", isEqualTo: schoolIDText).getDocuments { (querySnapshot, error) in
        guard error == nil else {
            return
        }
        guard let query = querySnapshot?.isEmpty else { return }
        if query == true {
            //Show error alert
            callback(true)
        } else {
            callback(false)
           //Continue With Signup flow
        }
    }
}

Firebase calls are async. You need use closure

determineIfIDIsValid() { res in 
if res {
//Show alert 

} else {
//Continue With Signup flow
}

Upvotes: 3

Related Questions