"use strict";
var wrapPromise = require("@braintree/wrap-promise");
var BraintreeError = require("../../lib/braintree-error");
var sepaErrors = require("../shared/errors");
var constants = require("../shared/constants");
var mandates = require("./mandate");
var hasMissingOption = require("../shared/has-missing-option");
var analytics = require("../../lib/analytics");
var VERSION = process.env.npm_package_version;
var assign = require("../../lib/assign").assign;
function SEPA(options) {
var getConfiguration = options.client.getConfiguration();
this._client = options.client;
this._assetsUrl =
getConfiguration.gatewayConfiguration.assetsUrl + "/web/" + VERSION;
this._isDebug = getConfiguration.isDebug;
if (options.redirectUrl) {
this._returnUrl = options.redirectUrl;
this._cancelUrl = options.redirectUrl + "?cancel=1";
this._isRedirectFlow = true;
} else {
this._returnUrl = this._assetsUrl + "/html/redirect-frame.html?success=1";
this._cancelUrl = this._assetsUrl + "/html/redirect-frame.html?cancel=1";
}
if (options.tokenizePayload) {
this.tokenizePayload = options.tokenizePayload;
}
analytics.sendEvent(this._client, "sepa.component.initialized");
}
SEPA.prototype.tokenize = function (options) {
var self = this;
var popupPromise;
var createMandateOptions = assign(
{ cancelUrl: self._cancelUrl, returnUrl: self._returnUrl },
options
);
if (!options || hasMissingOption(options, constants.REQUIRED_OPTIONS)) {
analytics.sendEvent(self._client, "sepa.input-validation.missing-options");
return Promise.reject(
new BraintreeError(sepaErrors.SEPA_TOKENIZE_MISSING_REQUIRED_OPTION)
);
}
if (!constants.MANDATE_TYPE_ENUM.includes(options.mandateType)) {
analytics.sendEvent(self._client, "sepa.input-validation.invalid-mandate");
return Promise.reject(
new BraintreeError(sepaErrors.SEPA_INVALID_MANDATE_TYPE)
);
}
popupPromise = mandates
.createMandate(self._client, createMandateOptions)
.then(function (mandateResponse) {
analytics.sendEvent(self._client, "sepa.create-mandate.success");
if (self._isRedirectFlow) {
return mandates.redirectPage(mandateResponse.approvalUrl);
}
options.last4 = mandateResponse.last4;
options.bankReferenceToken = mandateResponse.bankReferenceToken;
return mandates.openPopup(self._client, {
approvalUrl: mandateResponse.approvalUrl,
assetsUrl: self._assetsUrl,
});
});
if (self._isRedirectFlow) {
return Promise.resolve();
}
return popupPromise
.then(function () {
analytics.sendEvent(self._client, "sepa.mandate.approved");
return mandates.handleApproval(self._client, {
bankReferenceToken: options.bankReferenceToken,
last4: options.last4,
customerId: options.customerId,
mandateType: options.mandateType,
merchantAccountId: options.merchantAccountId,
});
})
.then(function (approval) {
analytics.sendEvent(self._client, "sepa.tokenization.success");
return Promise.resolve(approval);
})
.catch(function (err) {
analytics.sendEvent(self._client, "sepa." + err.details + ".failed");
return Promise.reject(err);
});
};
module.exports = wrapPromise.wrapPrototype(SEPA);