createAgreement method

Future<BkashAgreementResponse> createAgreement({
  1. required BuildContext context,
  2. String payerReference = " ",
})

Call this function to Create an AgreementId

Throws BkashFailure for error with a user-friendly message

Provide User Phonenumber for payerReference

Implementation

Future<BkashAgreementResponse> createAgreement({
  required BuildContext context,
  String payerReference = " ",
}) async {
  await _validateToken();

  final paymentResponse = await _token?.fold<Future<BkashAgreementResponse>>(
    (l) async => throw l,
    (tokenRes) async {
      final agreementResponse = await _bkashApi.createAgreement(
        idToken: tokenRes.idToken,
        payerReference: payerReference,
      );

      return await agreementResponse.fold<Future<BkashAgreementResponse>>(
        (l) async => throw l,
        (agrRes) async {
          if (agrRes.statusCode != "0000") {
            throw BkashFailure(message: agrRes.statusMessage);
          }

          final bkashPaymentStatus = await Navigator.push<BkashPaymentStatus>(
                context,
                MaterialPageRoute(
                  builder: (context) => FlutterBkashView(
                    bkashURL: agrRes.bkashURL,
                    failureCallbackURL: agrRes.failureCallbackURL,
                    successCallbackURL: agrRes.successCallbackURL,
                    cancelledCallbackURL: agrRes.cancelledCallbackURL,
                  ),
                ),
              ) ??
              BkashPaymentStatus.canceled;

          if (bkashPaymentStatus == BkashPaymentStatus.successed) {
            final result = await _bkashApi.executeCreateAgreement(
              paymentId: agrRes.paymentID,
              idToken: tokenRes.idToken,
            );

            return result.fold<BkashAgreementResponse>(
              (l) => throw l,
              (r) {
                // failed to execute
                if (r.statusCode != "0000") {
                  throw BkashFailure(message: r.statusMessage);
                }
                return BkashAgreementResponse(
                  r.agreementExecuteTime,
                  payerReference: r.payerReference,
                  paymentId: r.paymentID,
                  customerMsisdn: r.customerMsisdn,
                  agreementId: r.agreementID,
                );
              },
            );
          }
          if (bkashPaymentStatus == BkashPaymentStatus.canceled) {
            throw BkashFailure(message: "Agreement creation Cancelled");
          }
          throw BkashFailure(message: "Agreement creation Failed");
        },
      );
    },
  );

  if (paymentResponse == null) {
    throw BkashFailure();
  }
  return paymentResponse;
}