verifyPhoneNumber method

Future<PhoneAuthCredential?> verifyPhoneNumber()

Implementation

Future<PhoneAuthCredential?> verifyPhoneNumber() async {
  resultPin.value = '';
  _timer?.cancel();
  Completer<PhoneAuthCredential?> completer = Completer();

  String phoneNumber = mobileNumTxtController.text.trim();

  print("Verifying Phone Number: $phoneNumber");

  await FirebaseAuth.instance.verifyPhoneNumber(
    phoneNumber: phoneNumber,
    forceResendingToken: myResendToken,
    verificationCompleted: (PhoneAuthCredential credential) {
      print("✅ Auto verification completed.");
      completer.complete(credential);
    },
    verificationFailed: (FirebaseAuthException e) {
      print("❌ Phone verification failed: ${e.code} - ${e.message}");

      String errorMessage;
      switch (e.code) {
        case 'invalid-phone-number':
          errorMessage =
              "The phone number entered is invalid. Please check and try again.";
          break;
        case 'too-short':
          errorMessage =
              "The phone number you entered is not valid. Please enter the correct one";
          break;
        case 'too-long':
          errorMessage =
              "The phone number you entered is not valid. Please enter the correct one";
          break;
        case 'quota-exceeded':
          errorMessage = "SMS quota exceeded. Please try again later.";
          break;
        case 'network-request-failed':
          errorMessage =
              "Network error occurred. Check your internet connection and try again.";
          break;
        case 'session-expired':
          errorMessage =
              "The verification session expired. Please request a new code.";
          break;
        case 'captcha-check-failed':
          errorMessage = "Captcha verification failed. Try again later.";
          break;
        case 'missing-client-identifier':
          errorMessage =
              "Client identifier is missing. Restart the app and try again.";
          break;
        default:
          errorMessage = e.message ?? "Something went wrong. Try again.";
      }

      CustomFlashWidget.showFlashMessage(
        type: FlashType.error,
        title: "Verification Failed",
        message: errorMessage,
      );

      completer.complete(null);
    },
    codeSent: (String verificationId, int? resendToken) async {
      print("📩 Code sent! Verification ID: $verificationId");
      _timer?.cancel();
      myResendToken = resendToken;
      myVerificationID = verificationId;
      startTimer();
      await OtpVerificationView.show(
        barrierDismissible: false,
        onConfirm: () {
          closeDialog();
          if(resultPin.value.isEmpty){
            CustomFlashWidget.showFlashMessage(
              title: "Error",
              message: "Please enter the OTP sent to your phone number."
            );

          }
        },
        onResend: () {
          resendOTP(phoneNumber);
        },
      );
      if (resultPin.value != null && resultPin.value.isNotEmpty) {
        PhoneAuthCredential credential = PhoneAuthProvider.credential(
          verificationId: verificationId,
          smsCode: resultPin.value,
        );
        completer.complete(credential);
      } else {
        completer.complete(null);
      }
    },
    codeAutoRetrievalTimeout: (String verificationId) {
      print("⏳ Auto retrieval timeout. Verification ID: $verificationId");
    },
    timeout: const Duration(seconds: 120),
  );

  return completer.future;
}