From b64e595d2ce77bb13179243438f003aa07349bfa Mon Sep 17 00:00:00 2001 From: Steven Mask Date: Thu, 10 Mar 2022 17:33:20 -0500 Subject: [PATCH] Add fullScreen prop (#44) * fullScreen prop * tests * tests * add tests Co-authored-by: Steve Mask --- src/overlay/style.js | 12 ++ src/overlay/template.jsx | 43 +++---- test/integration/tests/index.js | 1 + test/integration/tests/overlay/happy.jsx | 147 +++++++++++++++++++++++ test/integration/tests/overlay/index.js | 3 + 5 files changed, 185 insertions(+), 21 deletions(-) create mode 100644 test/integration/tests/overlay/happy.jsx create mode 100644 test/integration/tests/overlay/index.js diff --git a/src/overlay/style.js b/src/overlay/style.js index 39d941d5..70165c0f 100644 --- a/src/overlay/style.js +++ b/src/overlay/style.js @@ -212,12 +212,24 @@ export function getContainerStyle({ uid } : {| uid : string |}) : string { max-width: 95vw; } + #${ uid }.paypal-overlay-context-${ CONTEXT.IFRAME } .paypal-checkout-iframe-container-full, + #${ uid }.paypal-overlay-context-${ CONTEXT.IFRAME } .paypal-checkout-iframe-container-full > .${ CLASS.OUTLET }, + #${ uid }.paypal-overlay-context-${ CONTEXT.IFRAME } .paypal-checkout-iframe-container-full > .${ CLASS.OUTLET } > iframe { + height: 100vh; + width: 100vw; + } + @media screen and (max-width: 470px) { #${ uid }.paypal-overlay-context-${ CONTEXT.IFRAME } .paypal-checkout-iframe-container, #${ uid }.paypal-overlay-context-${ CONTEXT.IFRAME } .paypal-checkout-iframe-container > .${ CLASS.OUTLET }, #${ uid }.paypal-overlay-context-${ CONTEXT.IFRAME } .paypal-checkout-iframe-container > .${ CLASS.OUTLET } > iframe { max-height: 85vh; } + #${ uid }.paypal-overlay-context-${ CONTEXT.IFRAME } .paypal-checkout-iframe-container-full, + #${ uid }.paypal-overlay-context-${ CONTEXT.IFRAME } .paypal-checkout-iframe-container-full > .${ CLASS.OUTLET }, + #${ uid }.paypal-overlay-context-${ CONTEXT.IFRAME } .paypal-checkout-iframe-container-full > .${ CLASS.OUTLET } > iframe { + height: 100vh; + } } #${ uid }.paypal-overlay-context-${ CONTEXT.IFRAME } .paypal-checkout-iframe-container { diff --git a/src/overlay/template.jsx b/src/overlay/template.jsx index a70e1cbd..074212f8 100644 --- a/src/overlay/template.jsx +++ b/src/overlay/template.jsx @@ -23,10 +23,11 @@ export type OverlayProps = {| |}, autoResize? : boolean, hideCloseButton? : boolean, - nonce : string + nonce : string, + fullScreen? : boolean |}; -export function Overlay({ context, close, focus, event, frame, prerenderFrame, content = {}, autoResize, hideCloseButton, nonce } : OverlayProps) : ElementNode { +export function Overlay({ context, close, focus, event, frame, prerenderFrame, content = {}, autoResize, hideCloseButton, nonce, fullScreen = false } : OverlayProps) : ElementNode { const uid = `paypal-overlay-${ uniqueID() }`; function closeCheckout(e) { @@ -119,25 +120,25 @@ export function Overlay({ context, close, focus, event, frame, prerenderFrame, c
{ !hideCloseButton && } -
- - {content.windowMessage && -
- {content.windowMessage} -
} - {content.continueMessage && -
} -
-
-
-
- -
+ { !fullScreen && +
+ + {content.windowMessage && +
+ {content.windowMessage} +
} + {content.continueMessage && + } +
+
+
+
} +
{ outlet }
diff --git a/test/integration/tests/index.js b/test/integration/tests/index.js index 95d3802b..24ab5f1d 100644 --- a/test/integration/tests/index.js +++ b/test/integration/tests/index.js @@ -2,4 +2,5 @@ import './three-domain-secure'; import './spinner-page'; +import './overlay'; import './post-robot'; diff --git a/test/integration/tests/overlay/happy.jsx b/test/integration/tests/overlay/happy.jsx new file mode 100644 index 00000000..407ec33f --- /dev/null +++ b/test/integration/tests/overlay/happy.jsx @@ -0,0 +1,147 @@ +/* @flow */ +/** @jsx node */ + +import { node, dom } from 'jsx-pragmatic/src'; +import { ZalgoPromise } from 'zalgo-promise/src'; + +import { Overlay } from '../../../../src/overlay'; + +describe(`paypal overlay component happy path`, () => { + const cancel = () => undefined; + + let context = 'popup'; + let focussed; + + const close = () => ZalgoPromise.resolve(); + const focus = () => { + focussed = true; + return ZalgoPromise.resolve(); + }; + const event = { + on: () => ({ cancel }), + once: () => ({ cancel }), + reset: () => undefined, + trigger: () => ZalgoPromise.resolve(), + triggerOnce: () => ZalgoPromise.resolve() + }; + const frame = null; + const prerenderFrame = null; + const content = { + windowMessage: 'window message', + continueMessage: 'continue message' + }; + const autoResize = true; + let hideCloseButton = false; + const nonce = 'abc123'; + let fullScreen = false; + + const getOverlay = () => + (); + + const addOverlayToDOM = (child) => { + // $FlowFixMe + document.body.appendChild(child); + }; + + const getOverlayContainer = (domNode) => { + // $FlowFixMe + return domNode.querySelector('iframe').contentWindow.document; + }; + + beforeEach(() => { + // $FlowFixMe + document.body.innerHTML = ''; + }); + + it('should render the overlay component', () => { + const domNode = getOverlay().render(dom()); + + if (domNode.ownerDocument !== document) { + throw new Error(`Expected overlay component to be rendered to current dom`); + } + }); + + it('should render the overlay component with popup', () => { + context = 'popup'; + + const domNode = getOverlay().render(dom()); + addOverlayToDOM(domNode); + + if (!getOverlayContainer(domNode).querySelector('.paypal-overlay-context-popup')) { + throw new Error(`Expected overlay to have popup`); + } + }); + + it('should render the overlay component with iframe', () => { + context = 'iframe'; + + const domNode = getOverlay().render(dom()); + addOverlayToDOM(domNode); + + if (!getOverlayContainer(domNode).querySelector('.paypal-overlay-context-iframe')) { + throw new Error(`Expected overlay to have iframe`); + } + + context = 'popup'; // reset + }); + + it('should render the overlay component fullscreen', () => { + fullScreen = true; + + const domNode = getOverlay().render(dom()); + addOverlayToDOM(domNode); + + if (!getOverlayContainer(domNode).querySelector('.paypal-checkout-iframe-container-full')) { + throw new Error(`Expected overlay to be full screen`); + } + }); + + it('should hide the overlay close button', () => { + hideCloseButton = true; + + const domNode = getOverlay().render(dom()); + addOverlayToDOM(domNode); + + if (getOverlayContainer(domNode).querySelector('.paypal-checkout-close')) { + throw new Error(`Expected close button to be hidden`); + } + + hideCloseButton = false; // reset + }); + + it('should be able to close the overlay using close button', () => { + const domNode = getOverlay().render(dom()); + addOverlayToDOM(domNode); + + getOverlayContainer(domNode).querySelector('.paypal-checkout-close').click(); + + if (getOverlayContainer(domNode).querySelector('.paypal-checkout-sandbox')) { + throw new Error(`Expected overlay to be removed after closing`); + } + }); + + it('should be able to focus on the overlay by clicking on it', () => { + const domNode = getOverlay().render(dom()); + addOverlayToDOM(domNode); + + getOverlayContainer(domNode).querySelector('.paypal-checkout-overlay').click(); + + if (!focussed) { + throw new Error(`Expected overlay to be focussed after clicking on it`); + } + + focussed = null; // reset + }); +}); diff --git a/test/integration/tests/overlay/index.js b/test/integration/tests/overlay/index.js new file mode 100644 index 00000000..f31927de --- /dev/null +++ b/test/integration/tests/overlay/index.js @@ -0,0 +1,3 @@ +/* @flow */ + +import './happy';