verify method

Future<void> verify()

Implementation

Future<void> verify() async {
  reset();
  setState(() {
    _isLoading = true;
  });
  try {
    if (widget.delay != null) {
      await Future.delayed(Duration(milliseconds: widget.delay!));
    }
    final challenge = await _fetchChallenge();
    final verifyUrl = _getVerifyUrl();
    final payload = await _requestVerification(challenge);
    if (payload == null) {
      throw Exception('Failed to compute solution.');
    }
    if (challenge.codeChallenge?.image != null &&
        challenge.codeChallenge!.image.isNotEmpty) {
      if (verifyUrl == null || verifyUrl.isEmpty) {
        throw Exception('Received codeChallenge but verifyUrl is not set.');
      }
      setState(() {
        _isCodeRequired = true;
      });
      final code = await _requestCodeVerification(
        challenge.codeChallenge!.image,
        _constructUrl(challenge.codeChallenge!.audio, widget.challengeUrl),
        challenge.codeChallenge!.length,
      );
      setState(() {
        _isCodeRequired = false;
      });
      if (code == null) {
        throw Exception('Verification code was not entered.');
      }
      final serverVerification = await _requestServerVerification(
        verifyUrl,
        payload,
        code,
      );
      if (serverVerification.verified != true) {
        throw Exception('Server verification failed.');
      }
    } else if (verifyUrl != null && verifyUrl.isNotEmpty) {
      await _requestServerVerification(verifyUrl, payload, null);
    }
    setState(() {
      _isSolved = true;
    });
  } catch (e, stack) {
    _log('error: $e $stack');
    if (widget.onFailed != null) {
      widget.onFailed!(e);
    }
    setState(() {
      _errorMessage = AltchaLocalizations.of(context).text('error');
    });
  } finally {
    setState(() {
      _isLoading = false;
    });
  }
}