UNPKG

@microbitsclub/paywall-solid

Version:
54 lines (51 loc) 2.2 kB
import { createEffect, Show } from 'solid-js'; import { isServer, Portal } from 'solid-js/web'; import { PaywallPopoverContent } from './paywall-popover-content'; import { usePaywallPopover } from './use-paywall-popover'; export const PaywallPopoverContainer = (props) => { const paywallPopover = usePaywallPopover(); const popoverElement = isServer ? undefined : document.body; let preserveBodyStyle; createEffect(() => { if (paywallPopover.popover !== undefined) { preserveBodyStyle = { height: document.body.style.height, overflow: document.body.style.overflow, }; document.body.style.height = '100%'; document.body.style.overflow = 'hidden'; } else if (preserveBodyStyle !== undefined) { document.body.style.height = preserveBodyStyle.height; document.body.style.overflow = preserveBodyStyle.overflow; preserveBodyStyle = undefined; } }); const handleLogin = (contentUrl, shouldPurchase) => { paywallPopover.navigateToGetUserSession(contentUrl, shouldPurchase); }; const handlePurchase = (contentUrl) => { paywallPopover.navigateToPurchaseThenViewContent(contentUrl); }; const handleCancel = () => { paywallPopover.hidePopoverPaywall(); }; return (<> {props.children} <Portal mount={popoverElement}> <Show when={paywallPopover.popover !== undefined}> <div style={{ position: 'fixed', 'box-sizing': 'border', top: 0, left: 0, width: '100vw', height: '100vh', opacity: 0.5, 'background-color': '#eee', }}/> </Show> <PaywallPopoverContent mode={paywallPopover.popover?.mode} visible={paywallPopover.popover !== undefined} paywallId={paywallPopover.popover?.paywall.id} paywallPrice={paywallPopover.popover?.paywall.price} contentUrl={paywallPopover.popover?.contentUrl} onLogin={handleLogin} onPurchase={handlePurchase} onCancel={handleCancel}/> </Portal> </>); };