2022-07-18 16:27:06 +03:00
|
|
|
import merge from "deepmerge";
|
2023-07-20 08:02:15 +01:00
|
|
|
import {loadScript} from "@paypal/paypal-js";
|
|
|
|
import {keysToCamelCase} from "../Helper/Utils";
|
2023-07-20 14:19:18 +01:00
|
|
|
import widgetBuilder from "./WidgetBuilder";
|
2023-11-21 16:08:51 +02:00
|
|
|
import {normalizeStyleForFundingSource} from "../Helper/Style";
|
2022-07-18 16:27:06 +03:00
|
|
|
|
2020-04-02 08:38:00 +03:00
|
|
|
class Renderer {
|
2023-07-03 17:35:01 +01:00
|
|
|
constructor(creditCardRenderer, defaultSettings, onSmartButtonClick, onSmartButtonsInit) {
|
2022-07-18 16:27:06 +03:00
|
|
|
this.defaultSettings = defaultSettings;
|
2020-04-30 15:28:48 +03:00
|
|
|
this.creditCardRenderer = creditCardRenderer;
|
2021-12-09 17:29:48 +02:00
|
|
|
this.onSmartButtonClick = onSmartButtonClick;
|
2022-03-17 09:48:00 +02:00
|
|
|
this.onSmartButtonsInit = onSmartButtonsInit;
|
2023-07-03 17:35:01 +01:00
|
|
|
|
|
|
|
this.buttonsOptions = {};
|
|
|
|
this.onButtonsInitListeners = {};
|
2022-07-19 14:04:19 +03:00
|
|
|
|
|
|
|
this.renderedSources = new Set();
|
2023-07-20 14:19:18 +01:00
|
|
|
|
|
|
|
this.reloadEventName = 'ppcp-reload-buttons';
|
2020-04-10 10:34:49 +03:00
|
|
|
}
|
|
|
|
|
2023-05-09 11:42:31 +02:00
|
|
|
render(contextConfig, settingsOverride = {}, contextConfigOverride = () => {}) {
|
2022-07-18 16:27:06 +03:00
|
|
|
const settings = merge(this.defaultSettings, settingsOverride);
|
2020-04-30 16:30:23 +03:00
|
|
|
|
2022-07-19 15:56:12 +03:00
|
|
|
const enabledSeparateGateways = Object.fromEntries(Object.entries(
|
|
|
|
settings.separate_buttons).filter(([s, data]) => document.querySelector(data.wrapper)
|
|
|
|
));
|
|
|
|
const hasEnabledSeparateGateways = Object.keys(enabledSeparateGateways).length !== 0;
|
2022-07-19 14:04:19 +03:00
|
|
|
|
2022-07-19 15:56:12 +03:00
|
|
|
if (!hasEnabledSeparateGateways) {
|
2022-07-19 14:04:19 +03:00
|
|
|
this.renderButtons(
|
|
|
|
settings.button.wrapper,
|
2022-07-19 15:56:12 +03:00
|
|
|
settings.button.style,
|
2022-08-04 09:55:27 +03:00
|
|
|
contextConfig,
|
|
|
|
hasEnabledSeparateGateways
|
2022-07-19 14:04:19 +03:00
|
|
|
);
|
2022-07-19 15:56:12 +03:00
|
|
|
} else {
|
|
|
|
// render each button separately
|
|
|
|
for (const fundingSource of paypal.getFundingSources().filter(s => !(s in enabledSeparateGateways))) {
|
2023-11-21 16:08:51 +02:00
|
|
|
const style = normalizeStyleForFundingSource(settings.button.style, fundingSource);
|
2022-07-19 15:56:12 +03:00
|
|
|
|
|
|
|
this.renderButtons(
|
|
|
|
settings.button.wrapper,
|
|
|
|
style,
|
|
|
|
contextConfig,
|
2022-08-04 09:55:27 +03:00
|
|
|
hasEnabledSeparateGateways,
|
2022-07-19 15:56:12 +03:00
|
|
|
fundingSource
|
|
|
|
);
|
|
|
|
}
|
2022-07-19 14:04:19 +03:00
|
|
|
}
|
|
|
|
|
2022-10-19 11:38:49 +03:00
|
|
|
if (this.creditCardRenderer) {
|
2023-05-09 11:42:31 +02:00
|
|
|
this.creditCardRenderer.render(settings.hosted_fields.wrapper, contextConfigOverride);
|
2022-10-19 11:38:49 +03:00
|
|
|
}
|
2022-07-19 14:04:19 +03:00
|
|
|
|
2022-07-19 15:56:12 +03:00
|
|
|
for (const [fundingSource, data] of Object.entries(enabledSeparateGateways)) {
|
2022-07-19 09:20:26 +03:00
|
|
|
this.renderButtons(
|
|
|
|
data.wrapper,
|
|
|
|
data.style,
|
2022-07-19 15:56:12 +03:00
|
|
|
contextConfig,
|
2022-08-04 09:55:27 +03:00
|
|
|
hasEnabledSeparateGateways,
|
2022-07-19 14:04:19 +03:00
|
|
|
fundingSource
|
2022-07-19 09:20:26 +03:00
|
|
|
);
|
|
|
|
}
|
2020-04-30 16:30:23 +03:00
|
|
|
}
|
|
|
|
|
2022-08-04 09:55:27 +03:00
|
|
|
renderButtons(wrapper, style, contextConfig, hasEnabledSeparateGateways, fundingSource = null) {
|
2023-07-20 08:02:15 +01:00
|
|
|
if (! document.querySelector(wrapper) || this.isAlreadyRendered(wrapper, fundingSource, hasEnabledSeparateGateways) ) {
|
2023-07-20 17:51:48 +01:00
|
|
|
// Try to render registered buttons again in case they were removed from the DOM by an external source.
|
2023-07-25 16:33:56 +01:00
|
|
|
widgetBuilder.renderButtons([wrapper, fundingSource]);
|
2020-04-09 12:57:21 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-07-19 14:04:19 +03:00
|
|
|
if (fundingSource) {
|
|
|
|
contextConfig.fundingSource = fundingSource;
|
|
|
|
}
|
|
|
|
|
2023-07-20 08:02:15 +01:00
|
|
|
const buttonsOptions = () => {
|
|
|
|
return {
|
|
|
|
style,
|
|
|
|
...contextConfig,
|
|
|
|
onClick: this.onSmartButtonClick,
|
|
|
|
onInit: (data, actions) => {
|
|
|
|
if (this.onSmartButtonsInit) {
|
|
|
|
this.onSmartButtonsInit(data, actions);
|
|
|
|
}
|
|
|
|
this.handleOnButtonsInit(wrapper, data, actions);
|
|
|
|
},
|
|
|
|
}
|
2022-07-19 09:20:26 +03:00
|
|
|
}
|
|
|
|
|
2023-07-20 17:51:48 +01:00
|
|
|
jQuery(document)
|
2023-07-21 10:39:18 +01:00
|
|
|
.off(this.reloadEventName, wrapper)
|
2023-07-25 16:33:56 +01:00
|
|
|
.on(this.reloadEventName, wrapper, (event, settingsOverride = {}, triggeredFundingSource) => {
|
|
|
|
|
|
|
|
// Only accept events from the matching funding source
|
|
|
|
if (fundingSource && triggeredFundingSource && (triggeredFundingSource !== fundingSource)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2023-07-20 17:51:48 +01:00
|
|
|
const settings = merge(this.defaultSettings, settingsOverride);
|
|
|
|
let scriptOptions = keysToCamelCase(settings.url_params);
|
|
|
|
scriptOptions = merge(scriptOptions, settings.script_attributes);
|
|
|
|
|
|
|
|
loadScript(scriptOptions).then((paypal) => {
|
|
|
|
widgetBuilder.setPaypal(paypal);
|
2023-07-25 16:33:56 +01:00
|
|
|
widgetBuilder.registerButtons([wrapper, fundingSource], buttonsOptions());
|
2023-07-20 17:51:48 +01:00
|
|
|
widgetBuilder.renderAll();
|
|
|
|
});
|
2023-07-20 08:02:15 +01:00
|
|
|
});
|
2022-07-19 14:04:19 +03:00
|
|
|
|
2023-07-20 14:19:18 +01:00
|
|
|
this.renderedSources.add(wrapper + (fundingSource ?? ''));
|
2023-07-20 08:02:15 +01:00
|
|
|
|
|
|
|
if (typeof paypal !== 'undefined' && typeof paypal.Buttons !== 'undefined') {
|
2023-07-25 16:33:56 +01:00
|
|
|
widgetBuilder.registerButtons([wrapper, fundingSource], buttonsOptions());
|
|
|
|
widgetBuilder.renderButtons([wrapper, fundingSource]);
|
2023-07-20 08:02:15 +01:00
|
|
|
}
|
2020-04-30 16:30:23 +03:00
|
|
|
}
|
2020-04-02 08:38:00 +03:00
|
|
|
|
2023-07-25 08:35:07 +01:00
|
|
|
isAlreadyRendered(wrapper, fundingSource) {
|
2023-07-20 14:19:18 +01:00
|
|
|
return this.renderedSources.has(wrapper + (fundingSource ?? ''));
|
2020-04-09 12:57:21 +03:00
|
|
|
}
|
|
|
|
|
2021-09-16 12:29:30 +02:00
|
|
|
disableCreditCardFields() {
|
|
|
|
this.creditCardRenderer.disableFields();
|
|
|
|
}
|
|
|
|
|
|
|
|
enableCreditCardFields() {
|
|
|
|
this.creditCardRenderer.enableFields();
|
|
|
|
}
|
2023-06-26 18:14:41 +01:00
|
|
|
|
2023-07-03 17:35:01 +01:00
|
|
|
onButtonsInit(wrapper, handler, reset) {
|
|
|
|
this.onButtonsInitListeners[wrapper] = reset ? [] : (this.onButtonsInitListeners[wrapper] || []);
|
|
|
|
this.onButtonsInitListeners[wrapper].push(handler);
|
|
|
|
}
|
|
|
|
|
|
|
|
handleOnButtonsInit(wrapper, data, actions) {
|
|
|
|
|
|
|
|
this.buttonsOptions[wrapper] = {
|
|
|
|
data: data,
|
|
|
|
actions: actions
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.onButtonsInitListeners[wrapper]) {
|
|
|
|
for (let handler of this.onButtonsInitListeners[wrapper]) {
|
|
|
|
if (typeof handler === 'function') {
|
|
|
|
handler({
|
|
|
|
wrapper: wrapper,
|
|
|
|
...this.buttonsOptions[wrapper]
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
disableSmartButtons(wrapper) {
|
|
|
|
if (!this.buttonsOptions[wrapper]) {
|
2023-06-26 18:14:41 +01:00
|
|
|
return;
|
|
|
|
}
|
2023-09-11 10:39:35 +03:00
|
|
|
try {
|
|
|
|
this.buttonsOptions[wrapper].actions.disable();
|
|
|
|
} catch (err) {
|
|
|
|
console.log('Failed to disable buttons: ' + err);
|
|
|
|
}
|
2023-06-26 18:14:41 +01:00
|
|
|
}
|
|
|
|
|
2023-07-03 17:35:01 +01:00
|
|
|
enableSmartButtons(wrapper) {
|
|
|
|
if (!this.buttonsOptions[wrapper]) {
|
2023-06-26 18:14:41 +01:00
|
|
|
return;
|
|
|
|
}
|
2023-09-11 10:39:35 +03:00
|
|
|
try {
|
|
|
|
this.buttonsOptions[wrapper].actions.enable();
|
|
|
|
} catch (err) {
|
|
|
|
console.log('Failed to enable buttons: ' + err);
|
|
|
|
}
|
2023-06-26 18:14:41 +01:00
|
|
|
}
|
2020-04-02 08:38:00 +03:00
|
|
|
}
|
|
|
|
|
2021-09-16 12:29:30 +02:00
|
|
|
export default Renderer;
|