diff --git a/src/connect/component.jsx b/src/connect/component.jsx index c61bfe04b..ae2404591 100644 --- a/src/connect/component.jsx +++ b/src/connect/component.jsx @@ -112,7 +112,28 @@ export const getConnectComponent = async (merchantProps = {}) => { }) .flush(); - throw new Error(error); + throw error; + } + + // Added check for window.braintree and window.braintree.connect + if (!window.braintree || !window.braintree.connect) { + getLogger() + .track({ + [FPTI_KEY.CONTEXT_TYPE]: "CMID", + [FPTI_KEY.CONTEXT_ID]: cmid, + [FPTI_KEY.EVENT_NAME]: `ppcp_connect_failure`, + }) + .error("braintree_sdk_missing_error", { err: "Braintree SDK is not loaded or connect is unavailable." }) + .metricCounter({ + namespace: "connect.init.count", + event: "error", + dimensions: { + errorName: "braintree_sdk_missing_error", + }, + }) + .flush(); + + throw new Error("Braintree SDK is not loaded or connect is unavailable."); } try { @@ -158,6 +179,6 @@ export const getConnectComponent = async (merchantProps = {}) => { }) .flush(); - throw new Error(error); + throw error; } -}; +}; \ No newline at end of file diff --git a/src/connect/component.test.js b/src/connect/component.test.js index 3ebed1dec..87f577b0f 100644 --- a/src/connect/component.test.js +++ b/src/connect/component.test.js @@ -122,6 +122,13 @@ describe("getConnectComponent: returns ConnectComponent", () => { platform: "PPCP", }); }); + + test("throws error if braintree or connect is missing", async () => { + window.braintree = undefined; + await expect(() => getConnectComponent(mockProps)).rejects.toThrow( + "Braintree SDK is not loaded or connect is unavailable." + ); + }); }); describe("getSdkVersion", () => { @@ -150,4 +157,4 @@ describe("getSdkVersion", () => { expect(() => getSdkVersion("2.87.1-alpha-test")).toThrowError(); expect(() => getSdkVersion("3.34.2-beta-test")).toThrowError(); }); -}); +}); \ No newline at end of file