@palta-brain/web-sdk
Version:
359 lines • 21.3 kB
JavaScript
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
import { Api } from '../services/api';
import { v4 as uuidv4 } from 'uuid';
import { PaymentSession } from '../PaymentSession';
import { primerInitCheckout } from '../PrimerClient';
import { BraintreeCheckoutInit, getApplePayHandler, getPaymentHandler, getPayPalFunc, } from '../BrainTreeClient';
import { create as clientBraintreeCreate } from 'braintree-web/client';
import { create as threeDSecureCreate } from 'braintree-web/three-d-secure';
var PaymentClientImpl = /** @class */ (function () {
function PaymentClientImpl(settings, customerId) {
this.clientSettings = settings;
this.customerId = customerId;
this.api = new Api(settings);
this.primerClientToken = undefined;
this.braintreeClientToken = undefined;
this.checkout = null;
this.reCaptchaReady = false;
this.checkoutTraceId = null;
this.orderId = null;
this.price = null;
this.currencyCode = null;
this.braintreeCheckoutFormSelector = null;
this.payPalEnv = null;
this.braintreeOption = null;
}
PaymentClientImpl.prototype.generateCheckoutTraceId = function () {
this.checkoutTraceId = uuidv4();
};
PaymentClientImpl.prototype.loadReCaptchaScript = function (onReCaptchaReady, onError) {
// Check if reCAPTCHA is already loaded
var _this = this;
if (window.grecaptcha) {
console.log('reCAPTCHA already loaded');
if (onError) {
onError();
}
return;
}
var siteKey = this.clientSettings.reCaptchaSiteKey;
if (!siteKey) {
console.warn('reCapchaSiteKey is not set');
if (onError) {
onError();
}
return;
}
var script = document.createElement('script');
script.src = "https://www.google.com/recaptcha/enterprise.js?render=".concat(siteKey);
script.async = true;
script.onerror = function () {
console.warn('Failed to load reCAPTCHA script');
if (onError) {
onError();
}
};
script.onload = function () {
if (!grecaptcha) {
if (onError) {
onError();
}
return;
}
grecaptcha.enterprise.ready(function () {
_this.reCaptchaReady = true;
if (onReCaptchaReady) {
onReCaptchaReady();
}
});
};
document.head.appendChild(script);
};
PaymentClientImpl.prototype.generateReCaptchaToken = function (siteKey) {
return __awaiter(this, void 0, void 0, function () {
var error_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, grecaptcha.enterprise.execute(siteKey, {
action: 'create_client_session',
})];
case 1: return [2 /*return*/, _a.sent()];
case 2:
error_1 = _a.sent();
console.error('Failed to generate reCAPTCHA token:', error_1);
this.clientSettings.onError(error_1, 'Failed to generate reCAPTCHA token');
return [2 /*return*/, null];
case 3: return [2 /*return*/];
}
});
});
};
PaymentClientImpl.prototype.getPricePoints = function (request) {
return __awaiter(this, void 0, void 0, function () {
var result, pricePoints, _i, pricePoints_1, pricePoint;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.api.getPricePoints(request)];
case 1:
result = _a.sent();
pricePoints = result['pricePoints'];
for (_i = 0, pricePoints_1 = pricePoints; _i < pricePoints_1.length; _i++) {
pricePoint = pricePoints_1[_i];
pricePoint['product'] = result['products'][pricePoint.productSku];
}
return [2 /*return*/, pricePoints];
}
});
});
};
PaymentClientImpl.prototype.showPaymentForm = function (_a) {
return __awaiter(this, arguments, void 0, function (_b) {
function handleBeforeUnload() {
localStorage.setItem('isClientSessionRequested', '');
}
var recaptchaToken, result, formSettings, isCustomOrderId, clientSessionData, isClientSessionRequested, clientSessionResult, primerClientToken, braintreeClientToken, formSettingsNewData, session, checkoutOptions, applePayOptions, primerPromise, braintreePromise;
var _c, _d, _e, _f, _g;
var settings = _b.settings, primerOption = _b.primerOption, braintreeOption = _b.braintreeOption, formWrapperSelector = _b.formWrapperSelector, paymentWrapperSelector = _b.paymentWrapperSelector, primerCheckoutFormSelector = _b.primerCheckoutFormSelector, braintreeCheckoutFormSelector = _b.braintreeCheckoutFormSelector, payPalEnv = _b.payPalEnv;
return __generator(this, function (_h) {
switch (_h.label) {
case 0:
this.braintreeCheckoutFormSelector = braintreeCheckoutFormSelector;
this.payPalEnv = payPalEnv;
this.braintreeOption = braintreeOption;
this.generateCheckoutTraceId();
this.api.setHeaders({ 'x-checkout-trace-id': this.checkoutTraceId || '' });
formSettings = __assign({}, settings);
sessionStorage.removeItem('updatedOrderId');
sessionStorage.removeItem('updatedPrice');
sessionStorage.removeItem('updatedCurrencyCode');
if (!(this.clientSettings.reCaptchaEnabled &&
this.clientSettings.reCaptchaSiteKey &&
this.reCaptchaReady)) return [3 /*break*/, 2];
return [4 /*yield*/, this.generateReCaptchaToken(this.clientSettings.reCaptchaSiteKey)];
case 1:
recaptchaToken = _h.sent();
_h.label = 2;
case 2:
isCustomOrderId = formSettings.orderId;
clientSessionData = __assign(__assign(__assign(__assign(__assign({ customer: __assign(__assign(__assign(__assign(__assign({}, formSettings.customer), (formSettings.billingAddress
? { billingAddress: formSettings.billingAddress }
: {})), (formSettings.email ? { emailAddress: formSettings.email } : {})), (formSettings.customer.emailAddress
? { emailAddress: formSettings.customer.emailAddress }
: {})), (formSettings.mobileNumber
? { mobileNumber: formSettings.mobileNumber }
: {})), pricePointIdent: formSettings.ident }, (formSettings.countryCode
? { countryCode: formSettings.countryCode }
: {})), (formSettings.platformCode
? { platformCode: formSettings.platformCode }
: {})), (this.clientSettings.metadata
? { metadata: this.clientSettings.metadata }
: {})), (isCustomOrderId ? { orderId: formSettings.orderId } : {})), (recaptchaToken ? { recaptchaToken: recaptchaToken } : {}));
isClientSessionRequested = localStorage.getItem('isClientSessionRequested');
// Use pagehide for better cross-browser support
window.addEventListener('pagehide', handleBeforeUnload);
window.addEventListener('unload', handleBeforeUnload);
// Fallback for beforeunload for browsers that still support it reliably
window.addEventListener('beforeunload', handleBeforeUnload);
if (isClientSessionRequested) {
return [2 /*return*/];
}
localStorage.setItem('isClientSessionRequested', 'true');
return [4 /*yield*/, this.api.createClientSession(clientSessionData)];
case 3:
clientSessionResult = _h.sent();
if (clientSessionResult) {
localStorage.setItem('isClientSessionRequested', '');
}
this.orderId = clientSessionResult.orderId;
this.price = clientSessionResult.price;
this.currencyCode = clientSessionResult.currencyCode;
primerClientToken = (_c = clientSessionResult.primer) === null || _c === void 0 ? void 0 : _c.clientToken;
this.primerClientToken = primerClientToken;
braintreeClientToken = (_d = clientSessionResult.braintree) === null || _d === void 0 ? void 0 : _d.clientToken;
this.braintreeClientToken = braintreeClientToken;
formSettingsNewData = __assign(__assign({}, formSettings), { orderId: isCustomOrderId ? formSettings.orderId : this.orderId });
session = new PaymentSession(this.clientSettings, formSettingsNewData, this.api);
checkoutOptions = __assign(__assign({}, primerOption), { onBeforePaymentCreate: session.onBeforePaymentCreate.bind(session), onCheckoutComplete: session.onCheckoutComplete.bind(session), onCheckoutFail: session.onCheckoutFail.bind(session) });
applePayOptions = __assign(__assign({}, braintreeOption.applePayOptions), { countryCode: formSettings.countryCode, currencyCode: this.currencyCode, total: __assign(__assign({}, braintreeOption.applePayOptions.total), { amount: this.price }) });
primerPromise = primerClientToken
? primerInitCheckout({
primerClientToken: primerClientToken,
checkoutOptions: checkoutOptions,
api: this.api,
orderId: this.orderId,
onErrorCustom: this.clientSettings.onError,
})
: null;
braintreePromise = braintreeClientToken
? BraintreeCheckoutInit({
braintreeClientToken: braintreeClientToken,
paymentMethods: (_e = clientSessionResult.braintree) === null || _e === void 0 ? void 0 : _e.paymentMethods,
orderId: this.orderId,
api: this.api,
onErrorCustom: this.clientSettings.onError,
price: this.price,
currencyCode: this.currencyCode,
braintreeCheckoutFormSelector: braintreeCheckoutFormSelector,
payPalEnv: payPalEnv,
braintreeOption: __assign(__assign({}, braintreeOption), { applePayOptions: applePayOptions }),
})
: null;
if (!primerPromise) return [3 /*break*/, 5];
return [4 /*yield*/, primerPromise];
case 4:
// Initialize both PSPs in parallel
result = _h.sent();
if (formWrapperSelector) {
// @ts-ignore
document.getElementById(formWrapperSelector).style.display = 'none';
}
if (paymentWrapperSelector) {
// @ts-ignore
document.getElementById(paymentWrapperSelector).style.display = 'block';
}
if (primerCheckoutFormSelector) {
// @ts-ignore
document.getElementById(primerCheckoutFormSelector).style.display =
'block';
}
return [3 /*break*/, 7];
case 5:
if (!braintreePromise) return [3 /*break*/, 7];
return [4 /*yield*/, braintreePromise];
case 6:
result = _h.sent();
if (formWrapperSelector) {
// @ts-ignore
document.getElementById(formWrapperSelector).style.display = 'none';
}
if (paymentWrapperSelector) {
// @ts-ignore
document.getElementById(paymentWrapperSelector).style.display =
'block';
}
if (braintreeCheckoutFormSelector) {
// @ts-ignore
(_g = (_f = document.getElementById(braintreeCheckoutFormSelector)) === null || _f === void 0 ? void 0 : _f.style) === null || _g === void 0 ? void 0 : _g.display = 'block';
}
_h.label = 7;
case 7: return [2 /*return*/, result ? result : null];
}
});
});
};
PaymentClientImpl.prototype.updatePaymentForm = function (settings) {
return __awaiter(this, void 0, void 0, function () {
var clientSessionResult, payPalFunc, clientInstance, threeDSecureInstance, paymentHandler, applePayUpdateHandler;
var _a, _b, _c, _d, _e;
return __generator(this, function (_f) {
switch (_f.label) {
case 0: return [4 /*yield*/, this.api.updateClientSession(__assign(__assign({ metadata: this.clientSettings.metadata }, (settings.orderId ? { orderId: settings.orderId } : {})), { platformCode: settings.platformCode, countryCode: settings.countryCode, pricePointIdent: settings.ident, customer: settings.customer, primerClientToken: this.primerClientToken, braintreeClientToken: this.braintreeClientToken }))];
case 1:
clientSessionResult = _f.sent();
this.primerClientToken = (_a = clientSessionResult.primer) === null || _a === void 0 ? void 0 : _a.clientToken;
this.braintreeClientToken = (_b = clientSessionResult.braintree) === null || _b === void 0 ? void 0 : _b.clientToken;
this.orderId = clientSessionResult.orderId;
this.price = clientSessionResult.price;
this.currencyCode = clientSessionResult.currencyCode;
sessionStorage.setItem('updatedOrderId', clientSessionResult.orderId);
sessionStorage.setItem('updatedPrice', clientSessionResult.price);
sessionStorage.setItem('updatedCurrencyCode', clientSessionResult.currencyCode);
if (!this.primerClientToken) return [3 /*break*/, 3];
return [4 /*yield*/, ((_c = this.checkout) === null || _c === void 0 ? void 0 : _c.refreshClientSession())];
case 2:
_f.sent();
return [3 /*break*/, 9];
case 3:
if (!((_d = clientSessionResult.braintree) === null || _d === void 0 ? void 0 : _d.clientToken)) return [3 /*break*/, 9];
payPalFunc = getPayPalFunc();
return [4 /*yield*/, payPalFunc({
price: clientSessionResult.price,
currencyCode: clientSessionResult.currencyCode,
orderId: clientSessionResult.orderId,
})];
case 4:
_f.sent();
return [4 /*yield*/, clientBraintreeCreate({
authorization: (_e = clientSessionResult.braintree) === null || _e === void 0 ? void 0 : _e.clientToken,
})];
case 5:
clientInstance = _f.sent();
return [4 /*yield*/, threeDSecureCreate({
version: 2,
client: clientInstance,
})];
case 6:
threeDSecureInstance = _f.sent();
paymentHandler = getPaymentHandler();
return [4 /*yield*/, paymentHandler({
amount: clientSessionResult.price,
orderId: clientSessionResult.orderId,
threeDSecureInstance: threeDSecureInstance,
})];
case 7:
_f.sent();
applePayUpdateHandler = getApplePayHandler();
return [4 /*yield*/, applePayUpdateHandler({
total: clientSessionResult.price,
currencyCode: clientSessionResult.currencyCode,
})];
case 8:
_f.sent();
_f.label = 9;
case 9: return [2 /*return*/];
}
});
});
};
return PaymentClientImpl;
}());
export { PaymentClientImpl };
//# sourceMappingURL=index.js.map