From c75d9ce56fa8f0f807ce68156f328f3b8aa3b351 Mon Sep 17 00:00:00 2001 From: Philipp Stracker Date: Tue, 11 Jun 2024 15:23:06 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Improve=20error=20logging=20and?= =?UTF-8?q?=20dependency=20detection?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/Renderer/PreviewButtonManager.js | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/modules/ppcp-button/resources/js/modules/Renderer/PreviewButtonManager.js b/modules/ppcp-button/resources/js/modules/Renderer/PreviewButtonManager.js index fcb61fbe4..fef94d995 100644 --- a/modules/ppcp-button/resources/js/modules/Renderer/PreviewButtonManager.js +++ b/modules/ppcp-button/resources/js/modules/Renderer/PreviewButtonManager.js @@ -105,16 +105,38 @@ class PreviewButtonManager { const customScriptPromise = loadCustomScript({url: this.buttonConfig.sdk_url}); // Wait until PayPal is ready. - const paypalPromise = new Promise(resolve => { - if (this.widgetBuilder.paypal) { - resolve(); - } else { - jQuery(document).on('ppcp-paypal-loaded', resolve); + const paypalPromise = new Promise((resolve, reject) => { + const maxWaitTime = 3000; // 3 seconds before failing. + + const resolveIfAvailable = () => { + if (this.widgetBuilder.paypal) { + resolve(); + } } + + // Resolve this promise instantly, if the PayPal object is available. + resolveIfAvailable(); + + // If the object is not available yet, wait for (a) the custom event, or (b) a custom timeout. + jQuery(document).on('ppcp-paypal-loaded', resolve); + setTimeout(() => { + resolveIfAvailable(); + reject('Timeout while waiting for widgetBuilder.paypal') + }, maxWaitTime) }); - await Promise.all([customScriptPromise, paypalPromise]); + // Wait for both promises to resolve before continuing. + await Promise + .all([customScriptPromise, paypalPromise]) + .catch(err => { + console.log(`Failed to load ${this.methodName} dependencies:`, err) + }) + /* + The fetchConfig method requires two objects to succeed: + (a) the SDK custom-script + (b) the `widgetBuilder.paypal` object + */ this.apiConfig = await this.fetchConfig(); await this.#onInitResolver()