sendOtp method

Future<CkAuthResult<void>> sendOtp({
  1. CkOtpTrigger? trigger,
  2. String? recipient,
})

Send/Resend OTP via API

Implementation

Future<CkAuthResult<void>> sendOtp({
  CkOtpTrigger? trigger,
  String? recipient,
}) async {
  final activeTrigger = trigger ?? lastTrigger;
  if (activeTrigger == null) {
    return const CkAuthResult<void>.failure(
      message:
          'No active OTP trigger found, try like sendOtp(CkOtpTrigger.login)',
    );
  }

  if (recipient != null && recipient.isNotEmpty) {
    lastRecipient = recipient;
  }

  if (trigger != null) {
    lastTrigger = trigger;
    await CkStorage.write('core_kit_last_otp_trigger', trigger.name);
  }

  if (_sendUrl == null) {
    return const CkAuthResult<void>.failure(
      message: 'OTP send URL is not configured',
    );
  }

  if (!canResend) {
    return const CkAuthResult<void>.failure(
      message: 'Resend is locked. Please wait for the cooldown timer.',
    );
  }

  final vToken = getVerificationToken(activeTrigger);

  final body = await _config.resendBodyBuilder(
    ResendOtpCallBack(
      recipient: lastRecipient,
      token: vToken ?? '',
      trigger: activeTrigger,
    ),
  );

  final response = await CkTransport.request(
    input: RequestInput(
      endpoint: _sendUrl,
      method: _sendMethod,
      jsonBody: body,
      requiresToken: false,
    ),
    responseBuilder: (data) => data,
    showMessage: true,
  );

  if (response.isSuccess) {
    _resendAttempts++;
    startResendTimer();
    final newToken = _extractors.verificationTokens?[activeTrigger]?.call(
      response.data,
    );
    if (newToken != null) {
      await storeVerificationToken(activeTrigger, newToken);
    }
    return CkAuthResult<void>.success(
      statusCode: response.statusCode,
      rawResponse: response.data,
    );
  }

  return CkAuthResult<void>.failure(
    message: response.message,
    statusCode: response.statusCode,
    rawResponse: response.data,
  );
}