{"version":3,"sources":["../src/epg-modal.tsx","../src/shared.ts"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { CFG, GENERAL_SIZE, AUTH_SIZE, modalCSS } from \"./shared\";\nimport type { EpgSize } from \"./shared\";\n\ntype EpgMessageData = {\n  m?: string;\n  // Optional redirect URL from terms.php on Accept. Populated by\n  // LW_Generate_Terms_JWT v1.8+ (Plaid brokers get a Plaid hosted-link URL,\n  // Finicity brokers get a Finicity Connect URL). When present we navigate\n  // the parent page to it instead of just closing the modal.\n  r?: string;\n};\n\ndeclare global {\n  interface Window {\n    openEpgModal?: (url: string) => void;\n    epg_auth?: (url: string) => void;\n    [key: string]: unknown;\n  }\n}\n\nconst EpgModal: React.FC = () => {\n  const [isOpen, setIsOpen] = useState(false);\n  const [url, setUrl] = useState<string | null>(null);\n  const [animateIn, setAnimateIn] = useState(false);\n  const [size, setSize] = useState<EpgSize>(GENERAL_SIZE);\n\n  useEffect(() => {\n    const style = document.createElement(\"style\");\n    style.innerHTML = modalCSS;\n    document.head.appendChild(style);\n\n    return () => {\n      document.head.removeChild(style);\n    };\n  }, []);\n\n  useEffect(() => {\n    const open = (nextUrl: string, nextSize: EpgSize) => {\n      setSize(nextSize);\n      setUrl(nextUrl);\n      setIsOpen(true);\n      requestAnimationFrame(() => setAnimateIn(true));\n    };\n\n    // General modal (terms, IBV, etc.)\n    window.openEpgModal = (nextUrl: string) => open(nextUrl, GENERAL_SIZE);\n\n    // Payment-authorization clickwrap (auth.php) — compact auth size\n    window.epg_auth = (nextUrl: string) => open(nextUrl, AUTH_SIZE);\n\n    return () => {\n      delete window.openEpgModal;\n      delete window.epg_auth;\n    };\n  }, []);\n\n  useEffect(() => {\n    const handleMessage = (e: MessageEvent) => {\n      if (!e.origin.includes(\"ecommission.com\")) return;\n      const data = e.data as EpgMessageData;\n\n      // r takes precedence — navigate the parent page (modal disappears with\n      // the page change, so skip the explicit closeModal to avoid a stray\n      // fade-out racing the navigation).\n      if (data.r) {\n        window.location.href = data.r;\n        return;\n      }\n      if (data.m) closeModal();\n    };\n    window.addEventListener(\"message\", handleMessage);\n    return () => window.removeEventListener(\"message\", handleMessage);\n  }, []);\n\n  const closeModal = () => {\n    setAnimateIn(false);\n    setTimeout(() => {\n      setIsOpen(false);\n      setUrl(null);\n    }, CFG.fadeDuration);\n  };\n\n  if (!isOpen || !url) return null;\n\n  return ReactDOM.createPortal(\n    <div\n      className={`epg-modal-backdrop ${animateIn ? \"epg-show\" : \"\"}`}\n    >\n      <div\n        className={`epg-modal-dialog ${animateIn ? \"epg-show\" : \"\"}`}\n        onClick={(e) => e.stopPropagation()}\n        style={{\n          width: size.width,\n          maxWidth: CFG.maxWidth,\n        }}\n      >\n        <div className=\"epg-modal-content\">\n          <div className=\"epg-modal-container\">\n            <iframe\n              id={size.id}\n              src={url}\n              style={{\n                width: \"100%\",\n                height: size.iframeHeight,\n                border: 0,\n              }}\n            />\n          </div>\n        </div>\n      </div>\n    </div>,\n    document.body\n  );\n};\n\nexport default EpgModal;\n","// Shared config + styles for both the React component (epg-modal.tsx) and the\n// vanilla/global build (vanilla.ts). Keep sizing here so the two builds match.\n\nexport const CFG = {\n  id: \"epgTerms\",\n  width: \"600px\",\n  maxWidth: \"95vw\",\n  topOffset: \"8vh\",\n  iframeHeight: \"560px\",\n  fadeDuration: 400,\n} as const;\n\n// Payment-authorization clickwrap (auth.php) — sized to fit the CAD PAD variant\n// (the tallest: 4-item certification + recourse rights paragraph).\nexport const AUTH_CFG = {\n  id: \"epgAgentAuth\",\n  width: \"720px\",\n  iframeHeight: \"720px\",\n} as const;\n\nexport type EpgSize = { id: string; width: string; iframeHeight: string };\n\nexport const GENERAL_SIZE: EpgSize = {\n  id: CFG.id,\n  width: CFG.width,\n  iframeHeight: CFG.iframeHeight,\n};\n\nexport const AUTH_SIZE: EpgSize = {\n  id: AUTH_CFG.id,\n  width: AUTH_CFG.width,\n  iframeHeight: AUTH_CFG.iframeHeight,\n};\n\nexport const modalCSS = `\n.epg-modal-backdrop {\n  position: fixed;\n  inset: 0;\n  background: rgba(0,0,0,0.4);\n  z-index: 1050;\n  display: flex;\n  justify-content: center;\n  align-items: flex-start;\n  opacity: 0;\n  transition: opacity 0.4s ease;\n}\n\n.epg-modal-backdrop.epg-show {\n  opacity: 1;\n}\n\n.epg-modal-dialog {\n  margin-top: 8vh;\n  transform: translateY(-12px);\n  transition: transform 0.4s ease, opacity 0.4s ease;\n  opacity: 0;\n}\n\n.epg-modal-dialog.epg-show {\n  transform: translateY(0);\n  opacity: 1;\n}\n\n.epg-modal-content {\n  display: flex;\n  flex-direction: column;\n  border-radius: 12px;\n  overflow: hidden;\n  border: 0;\n  padding: 20px;\n  background: white;\n  box-shadow: 0 8px 32px rgba(0,0,0,0.25);\n}\n\n.epg-modal-container {\n  flex: 1 1 auto;\n  display: flex;\n}\n\n@media (max-width: 768px) {\n  .epg-modal-dialog {\n    margin-top: 6vh;\n  }\n  #epgTerms,\n  #epgAgentAuth {\n    height: 70vh;\n  }\n}\n`;\n"],"mappings":"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","names":[]}