determineNextStep method

VerificationStep determineNextStep(
  1. PreflightResponse response
)

Implementation

VerificationStep determineNextStep(PreflightResponse response) {
   if (response.screen.show == AppScreen.completedScreen ||
      response.screen.show == AppScreen.successfulScreen) {
    if (_showCompletionView) {
      return const VerificationStep.completed();
    } else {
      WidgetsBinding.instance.addPostFrameCallback((_) {
        completeFlow();
      });
      return const VerificationStep.processing();
    }
  }

  if (response.entityIdState != null) {
    if (response.entityIdState == IdDocumentState.frontReceivedButNeedsResubmission ||
        response.entityIdState == IdDocumentState.frontReceivedAndBackReceivedButBackNeedsResubmission) {
      final errorStep = VerificationStep.documentError(
        state: response.entityIdState!,
        type: response.entityIdDocumentType ?? IdDocumentType.idCard,
      );
      return errorStep;
    }
  }

  String? poaRejectionMessage;
  String? pofRejectionMessage;

  if (response.proofOfAddress?.status == "rejected") {
    poaRejectionMessage = response.proofOfAddress?.message;
  }

  if (response.proofOfFunds?.status == "rejected") {
    pofRejectionMessage = response.proofOfFunds?.message;
  }

  if (response.requirement != null) {
    switch (response.requirement!.requirementType) {
      case "identity_document":
        if (response.entityIdState != null) {
          if (response.entityIdState != IdDocumentState.frontReceivedButNeedsResubmission &&
              response.entityIdState != IdDocumentState.frontReceivedAndBackReceivedButBackNeedsResubmission) {
            if (response.entityIdState == IdDocumentState.frontReceivedAwaitingBack) {
              return const VerificationStep.documentCapture(side: DocumentSide.back);
            } else {
              return const VerificationStep.documentCapture(side: DocumentSide.front);
            }
          }
        } else {
          return const VerificationStep.documentCapture(side: DocumentSide.front);
        }
        break;
      case "liveness":
        return const VerificationStep.livenessCheck();
      case "phone_verification":
        return const VerificationStep.phoneVerification();
      case "email_verification":
        return const VerificationStep.emailVerification();
      case "proof_of_address":
        return VerificationStep.documentUpload(
          type: DocumentVerificationType.proofOfAddress,
          rejectionMessage: poaRejectionMessage,
        );
      case "proof_of_funds":
        return VerificationStep.documentUpload(
          type: DocumentVerificationType.proofOfFunds,
          rejectionMessage: pofRejectionMessage,
        );
    }
  }

  if (response.entityIdState != null) {
    switch (response.entityIdState) {
      case IdDocumentState.frontReceivedAwaitingBack:
        return const VerificationStep.documentCapture(side: DocumentSide.back);

      case IdDocumentState.awaitingNfc:
      case IdDocumentState.noneReceived:
        return const VerificationStep.documentCapture(side: DocumentSide.front);

      case IdDocumentState.idReceivedAwaitingLiveness:
      case IdDocumentState.awaitingLiveness:
        return const VerificationStep.livenessCheck();

      case IdDocumentState.awaitingPoa:
      case IdDocumentState.awaitingA4Document:
        return VerificationStep.documentUpload(
          type: DocumentVerificationType.proofOfAddress,
          rejectionMessage: poaRejectionMessage,
        );

      case IdDocumentState.awaitingPof:
        return VerificationStep.documentUpload(
          type: DocumentVerificationType.proofOfFunds,
          rejectionMessage: pofRejectionMessage,
        );

      case IdDocumentState.completed:
        if (_showCompletionView) {
          return const VerificationStep.completed();
        } else {
          WidgetsBinding.instance.addPostFrameCallback((_) {
            completeFlow();
          });
          return const VerificationStep.processing();
        }

      default:
        break;
    }
  }

  switch (response.screen.show) {
    case AppScreen.scanIdDocumentFrontScreen:
      return const VerificationStep.documentCapture(side: DocumentSide.front);

    case AppScreen.scanIdDocumentBackScreen:
      return const VerificationStep.documentCapture(side: DocumentSide.back);

    case AppScreen.nfcCaptureScreen:
      return const VerificationStep.documentCapture(side: DocumentSide.front);

    case AppScreen.scanA4DocumentScreen:
      if (response.entityIdState == IdDocumentState.awaitingPof) {
        return VerificationStep.documentUpload(
          type: DocumentVerificationType.proofOfFunds,
          rejectionMessage: pofRejectionMessage,
        );
      } else {
        return VerificationStep.documentUpload(
          type: DocumentVerificationType.proofOfAddress,
          rejectionMessage: poaRejectionMessage,
        );
      }

    case AppScreen.proofOfAddressScreen:
      return VerificationStep.documentUpload(
        type: DocumentVerificationType.proofOfAddress,
        rejectionMessage: poaRejectionMessage,
      );

    case AppScreen.proofOfFundsScreen:
      return VerificationStep.documentUpload(
        type: DocumentVerificationType.proofOfFunds,
        rejectionMessage: pofRejectionMessage,
      );

    case AppScreen.livenessScreen:
      return const VerificationStep.livenessCheck();

    case AppScreen.completedScreen:
    case AppScreen.successfulScreen:
      if (_showCompletionView) {
        return const VerificationStep.completed();
      } else {
        WidgetsBinding.instance.addPostFrameCallback((_) {
          completeFlow();
        });
        return const VerificationStep.processing();
      }

    case AppScreen.waitingForPreviousCallToComplete:
      return const VerificationStep.processing();

    case AppScreen.consentScreen:
      return const VerificationStep.consent();

    case AppScreen.cancelScreen:
    case AppScreen.rejectedScreen:
      if (_context != null) {
        showErrorMessage(ApiErrorStrings(_context!).verificationRejectedOrCanceled);
      } else {
        showErrorMessage(ApiErrorStrings(_context!).verificationRejectedOrCanceled);
      }
      _onCancelledCallback?.call();
      return const VerificationStep.completed();

    case AppScreen.phoneVerificationStartScreen:
    case AppScreen.phoneVerificationConfirmScreen:
    case AppScreen.phoneVerificationScreen:
      return const VerificationStep.phoneVerification();

    case AppScreen.emailVerificationStartScreen:
    case AppScreen.emailVerificationConfirmScreen:
    case AppScreen.emailVerificationScreen:
      return const VerificationStep.emailVerification();
  }
}