From cbc582b6e1706638c1b727fed3ac82983edecb37 Mon Sep 17 00:00:00 2001 From: Hai-Yen Nguyen Date: Tue, 28 Jan 2025 14:12:47 -0600 Subject: [PATCH 1/6] call onClose --- src/three-domain-secure/component.jsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/three-domain-secure/component.jsx b/src/three-domain-secure/component.jsx index 78fb4ba..a6b0bd8 100644 --- a/src/three-domain-secure/component.jsx +++ b/src/three-domain-secure/component.jsx @@ -115,12 +115,16 @@ export function getThreeDomainSecureComponent(): TDSComponent { onSuccess: { type: "function", alias: "onContingencyResult", - decorate: ({ props, value, onError }) => { + decorate: ({ props, value, onError}) => { return (err, result) => { const isCardFieldFlow = props?.userType === "UNBRANDED_GUEST"; // HostedFields ONLY rejects when the err object is not null. The below implementation ensures that CardFields follows the same pattern. + if(isCardFieldFlow === true && result?.success !== true){ + return props.onClose(); + } + const hasError = isCardFieldFlow ? Boolean(err) : // $FlowFixMe[incompatible-use] From 6d643286de5ba3b4e5b0e5e4903cb36fc44f70b4 Mon Sep 17 00:00:00 2001 From: Hai-Yen Nguyen Date: Tue, 28 Jan 2025 14:16:42 -0600 Subject: [PATCH 2/6] fix spacing --- src/three-domain-secure/component.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/three-domain-secure/component.jsx b/src/three-domain-secure/component.jsx index a6b0bd8..5bfe3d4 100644 --- a/src/three-domain-secure/component.jsx +++ b/src/three-domain-secure/component.jsx @@ -115,7 +115,7 @@ export function getThreeDomainSecureComponent(): TDSComponent { onSuccess: { type: "function", alias: "onContingencyResult", - decorate: ({ props, value, onError}) => { + decorate: ({ props, value, onError }) => { return (err, result) => { const isCardFieldFlow = props?.userType === "UNBRANDED_GUEST"; From 080ae87ce2c5ea4251d97671e1073adfab5f2a47 Mon Sep 17 00:00:00 2001 From: Hai-Yen Nguyen Date: Tue, 28 Jan 2025 14:29:55 -0600 Subject: [PATCH 3/6] fix format --- src/three-domain-secure/component.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/three-domain-secure/component.jsx b/src/three-domain-secure/component.jsx index 5bfe3d4..da9dcf1 100644 --- a/src/three-domain-secure/component.jsx +++ b/src/three-domain-secure/component.jsx @@ -121,7 +121,7 @@ export function getThreeDomainSecureComponent(): TDSComponent { // HostedFields ONLY rejects when the err object is not null. The below implementation ensures that CardFields follows the same pattern. - if(isCardFieldFlow === true && result?.success !== true){ + if (isCardFieldFlow === true && result?.success !== true) { return props.onClose(); } From 1d30508702ed6a9fbd62b7e7fb6411822406e7e9 Mon Sep 17 00:00:00 2001 From: Hai-Yen Nguyen Date: Tue, 28 Jan 2025 14:58:50 -0600 Subject: [PATCH 4/6] add FlowFixMe --- src/three-domain-secure/component.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/three-domain-secure/component.jsx b/src/three-domain-secure/component.jsx index da9dcf1..3f18bbb 100644 --- a/src/three-domain-secure/component.jsx +++ b/src/three-domain-secure/component.jsx @@ -121,6 +121,7 @@ export function getThreeDomainSecureComponent(): TDSComponent { // HostedFields ONLY rejects when the err object is not null. The below implementation ensures that CardFields follows the same pattern. + // $FlowFixMe[incompatible-use] if (isCardFieldFlow === true && result?.success !== true) { return props.onClose(); } From 77d9cb34c0ef43597050c174fad0f5ad54070e5e Mon Sep 17 00:00:00 2001 From: Hai-Yen Nguyen Date: Tue, 28 Jan 2025 15:02:28 -0600 Subject: [PATCH 5/6] fix flowfixme --- src/three-domain-secure/component.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/three-domain-secure/component.jsx b/src/three-domain-secure/component.jsx index 3f18bbb..35e003e 100644 --- a/src/three-domain-secure/component.jsx +++ b/src/three-domain-secure/component.jsx @@ -121,7 +121,7 @@ export function getThreeDomainSecureComponent(): TDSComponent { // HostedFields ONLY rejects when the err object is not null. The below implementation ensures that CardFields follows the same pattern. - // $FlowFixMe[incompatible-use] + // $FlowFixMe[incompatible-type] if (isCardFieldFlow === true && result?.success !== true) { return props.onClose(); } From a3987d39c05657bd0e4935d2452023e700da1f9e Mon Sep 17 00:00:00 2001 From: Hai-Yen Nguyen Date: Mon, 3 Feb 2025 16:38:12 -0600 Subject: [PATCH 6/6] adding test for onClose and onError --- .../tests/three-domain-secure/happy.js | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/test/integration/tests/three-domain-secure/happy.js b/test/integration/tests/three-domain-secure/happy.js index c2259f1..bba30f9 100644 --- a/test/integration/tests/three-domain-secure/happy.js +++ b/test/integration/tests/three-domain-secure/happy.js @@ -77,4 +77,52 @@ describe(`paypal 3ds component happy path`, () => { .render("body"); }); }); + + it("should render onClose if cancel", () => { + return wrapPromise(({ expect, avoid }) => { + const nonce = "12345"; + const userType = "UNBRANDED_GUEST"; + window.contingencyResult = { + success: false, + liability_shift: "NO", + status: "NO", + authentication_status_reason: "FAILURE", + pageID: "1234", + }; + return window.paypal + .ThreeDomainSecure({ + createOrder: () => "XXXXXXXXXXXXXXXXX", + onSuccess: avoid("onSuccess"), + onCancel: avoid("onCancel"), + onError: avoid("onError"), + onClose: expect("onClose"), + nonce, + userType, + }) + .render("body"); + }); + }); + + it("should render onError ", () => { + return wrapPromise(({ expect, avoid }) => { + const nonce = "12345"; + window.contingencyResult = { + success: false, + liability_shift: "NO", + status: "NO", + authentication_status_reason: "FAILURE", + pageID: "1234", + }; + return window.paypal + .ThreeDomainSecure({ + createOrder: () => "XXXXXXXXXXXXXXXXX", + onSuccess: avoid("onSuccess"), + onCancel: avoid("onCancel"), + onError: expect("onError"), + onClose: avoid("onClose"), + nonce, + }) + .render("body"); + }); + }); });