otp function

Future<String?> otp(
  1. String code,
  2. AppSettings appSettings,
  3. String stringPleaseEnterCode
)

Implementation

Future<String?> otp(String code, AppSettings appSettings,
    String stringPleaseEnterCode, // Please enter valid code
    ) async {
  try {

    //
    // Twilio
    //
    if (appSettings.otpTwilioEnable) {
      var serviceId = appSettings.twilioServiceId;

      var url = 'https://verify.twilio.com/v2/Services/$serviceId/VerificationCheck';
      Map<String, String> requestHeaders = {
        'Accept': "application/json",
        'Authorization' : "Basic ${base64Encode(
            utf8.encode("${appSettings.twilioAccountSID}:${appSettings.twilioAuthToken}"))}",
      };
      Map<String, dynamic> map = {};
      map['To'] = _lastPhone;
      map['Code'] = code;

      var response = await http.post(Uri.parse(url), headers: requestHeaders, body: map).timeout(const Duration(seconds: 30));
      if (response.statusCode == 200) {
        var jsonResult = json.decode(response.body);
        if (jsonResult['status'] != "approved")
          return stringPleaseEnterCode; /// Please enter valid code
        User? user = FirebaseAuth.instance.currentUser;
        if (user == null)
          return "user = null";
        await FirebaseFirestore.instance.collection("listusers").doc(user.uid).set({
          "phoneVerified": true,
          "phone": _lastPhone,
        }, SetOptions(merge:true));
        needOTPParam = false;
        userAccountData.userPhone = _lastPhone;
        return null;
      }
      return response.reasonPhrase;
    }

    //
    // Firebase
    //
    if (appSettings.otpEnable) {
      PhoneAuthCredential _credential = PhoneAuthProvider.credential(verificationId: _verificationId, smsCode: code);
      User? user = FirebaseAuth.instance.currentUser;
      if (user != null) {
        var user1 = await user.linkWithCredential(_credential);
        dprint("linkWithCredential =${user1.user!.uid}");
        await FirebaseFirestore.instance.collection("listusers").doc(user.uid).set({
          "phoneVerified": true,
          "phone": _lastPhone,
        }, SetOptions(merge:true));
        needOTPParam = false;
        userAccountData.userPhone = _lastPhone;
      }
    }

    //
    // Nexmo
    //
    if (appSettings.otpNexmoEnable) {
      if (_codeSent == code){
        User? user = FirebaseAuth.instance.currentUser;
        if (user != null) {
          await FirebaseFirestore.instance.collection("listusers").doc(user.uid).set({
            "phoneVerified": true,
            "phone": _lastPhone,
          }, SetOptions(merge:true));
          needOTPParam = false;
          userAccountData.userPhone = _lastPhone;
        }else
          return stringPleaseEnterCode; /// "Please enter valid code",
      }
    }

    //
    // SMS to
    //
    if (appSettings.otpSMSToEnable) {
      if (_codeSent == code){
        User? user = FirebaseAuth.instance.currentUser;
        if (user != null) {
          await FirebaseFirestore.instance.collection("listusers").doc(user.uid).set({
            "phoneVerified": true,
            "phone": _lastPhone,
          }, SetOptions(merge:true));
          needOTPParam = false;
          userAccountData.userPhone = _lastPhone;
        }
      }else
        return stringPleaseEnterCode; /// "Please enter valid code",
    }

  }catch(ex){
    return "otp " + ex.toString();
  }
  return null;

}