UNPKG

@palta-brain/web-sdk

Version:
359 lines 21.3 kB
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