{"version":3,"sources":["../src/popup.ts"],"sourcesContent":["import debug from 'debug'\n\nconst popupLog = debug('upProvider:popup')\n\nexport interface ModalPopup {\n  openModal(): void\n  closeModal(): void\n  destroyModal(): void\n  createModal(): Promise<{ isNew: boolean; window: Window }>\n  isOpen: boolean\n  contentWindow?: Window\n}\n\nclass VanillaModalPopup implements ModalPopup {\n  private modalElement: HTMLDivElement\n  private iframeElement: HTMLIFrameElement\n  private closeButton: HTMLSpanElement\n  private iframeSrc: string\n  private promise?: Promise<Window>\n  private resolve?: (window: Window) => void\n  private reject?: (error: Error) => void\n\n  isOpen = false\n  contentWindow?: Window\n\n  constructor(iframeSrc: string, id: string) {\n    this.iframeSrc = iframeSrc\n\n    // Create modal structure\n    this.modalElement = document.createElement('div')\n    this.modalElement.id = id\n    this.modalElement.className = 'up-modal'\n    this.modalElement.innerHTML = `\n      <div class=\"up-modal-content\">\n        <span class=\"up-close-button\">&times;</span>\n        <iframe src=\"about:blank\" allow=\"publickey-credentials-get; publickey-credentials-create\"></iframe>\n      </div>\n    `\n\n    // Get references\n    this.closeButton = this.modalElement.querySelector('.up-close-button')!\n    this.iframeElement = this.modalElement.querySelector('iframe')!\n\n    // Bind events\n    this.closeButton.addEventListener('click', () => this.closeModal())\n    // this.modalElement.addEventListener('click', (e) => {\n    //   if (e.target === this.modalElement) {\n    //     this.closeModal()\n    //   }\n    // })\n\n    this.iframeElement.addEventListener('load', this.handleIframeLoad)\n    this.iframeElement.addEventListener('error', this.handleIframeError)\n\n    // Add styles if not already present\n    if (!document.getElementById('up-modal-styles')) {\n      const style = document.createElement('style')\n      style.id = 'up-modal-styles'\n      style.textContent = `\n        .up-modal {\n          display: none;\n          position: fixed;\n          top: 0;\n          left: 0;\n          width: 100%;\n          height: 100%;\n          background-color: rgba(0, 0, 0, 0.5);\n          justify-content: center;\n          align-items: center;\n          z-index: 9999;\n        }\n        .up-modal.show {\n          display: flex;\n        }\n        .up-modal-content {\n          background-color: #fff;\n          border-radius: 8px;\n          overflow: hidden;\n          position: relative;\n          width: 480px;\n          height: 640px;\n          box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n        }\n        @media (max-width: 768px) {\n          .up-modal-content {\n            width: 100%;\n            height: 100%;\n            border-radius: 0;\n          }\n        }\n        .up-close-button {\n          position: absolute;\n          top: 10px;\n          right: 15px;\n          font-size: 24px;\n          cursor: pointer;\n          z-index: 10;\n          color: #000;\n          background: rgba(255, 255, 255, 0.8);\n          width: 30px;\n          height: 30px;\n          border-radius: 50%;\n          display: flex;\n          align-items: center;\n          justify-content: center;\n          line-height: 1;\n        }\n        .up-close-button:hover {\n          background: rgba(255, 255, 255, 1);\n        }\n        .up-modal iframe {\n          width: 100%;\n          height: 100%;\n          border: none;\n        }\n      `\n      document.head.appendChild(style)\n    }\n\n    // Add to DOM\n    document.body.appendChild(this.modalElement)\n  }\n\n  private handleIframeLoad = () => {\n    popupLog('Iframe loaded, contentWindow:', this.iframeElement.contentWindow)\n    this.contentWindow = this.iframeElement.contentWindow || undefined\n    this.resolve?.(this.contentWindow!)\n  }\n\n  private handleIframeError = (e: ErrorEvent) => {\n    popupLog('Iframe error occurred:', e.error, e.message)\n    this.reject?.(e.error)\n    this.closeModal()\n  }\n\n  async createModal(): Promise<{ isNew: boolean; window: Window }> {\n    popupLog('createModal called, has promise:', !!this.promise, 'iframe src:', this.iframeSrc)\n\n    if (this.promise) {\n      popupLog('Reusing existing popup promise')\n      return this.promise.then(window => ({\n        isNew: false,\n        window,\n      }))\n    }\n\n    popupLog('Creating new popup promise')\n\n    this.promise = new Promise<Window>((resolve, reject) => {\n      this.resolve = resolve\n      this.reject = reject\n\n      // Set the iframe src first\n      if (this.iframeSrc) {\n        this.iframeElement.src = this.iframeSrc\n      }\n\n      // Auto-open in debug mode after iframe src is set\n      const debugMode = window.location.search.includes('debug=true') || localStorage.getItem('upProvider:debug') === 'true'\n      if (debugMode) {\n        // Delay to ensure iframe starts loading\n        setTimeout(() => this.openModal(), 100)\n      }\n    })\n\n    return this.promise.then(window => ({\n      isNew: true,\n      window,\n    }))\n  }\n\n  openModal() {\n    if (this.isOpen) {\n      return\n    }\n    // Use requestAnimationFrame to ensure DOM is ready and styles are applied\n    requestAnimationFrame(() => {\n      this.isOpen = true\n      this.modalElement.classList.add('show')\n      popupLog('Opening popup')\n\n      // Dispatch custom event\n      this.modalElement.dispatchEvent(\n        new CustomEvent('open', {\n          bubbles: true,\n          composed: true,\n        })\n      )\n\n      window.parent.postMessage({ type: 'upProvider:modalOpened' }, '*')\n    })\n  }\n\n  closeModal() {\n    // Log the call stack to see what's triggering the close\n    popupLog('closeModal called from:', new Error().stack)\n\n    // Debug mode - check for debug flag in URL or localStorage\n    const debugMode = window.location.search.includes('debug=true') || localStorage.getItem('upProvider:debug') === 'true'\n\n    if (debugMode) {\n      popupLog('Debug mode: keeping modal open')\n      return\n    }\n\n    this.isOpen = false\n    this.modalElement.classList.remove('show')\n    popupLog('Closing popup')\n\n    // Dispatch custom event\n    this.modalElement.dispatchEvent(\n      new CustomEvent('close', {\n        bubbles: true,\n        composed: true,\n      })\n    )\n\n    window.parent.postMessage({ type: 'upProvider:modalClosed' }, '*')\n  }\n\n  destroyModal() {\n    this.contentWindow = undefined\n    this.closeModal()\n\n    // Remove event listeners\n    this.iframeElement.removeEventListener('load', this.handleIframeLoad)\n    this.iframeElement.removeEventListener('error', this.handleIframeError)\n\n    // Remove from DOM\n    this.modalElement.remove()\n\n    popupLog('Destroying popup')\n\n    // Dispatch custom event\n    this.modalElement.dispatchEvent(\n      new CustomEvent('destroy', {\n        bubbles: true,\n        composed: true,\n      })\n    )\n  }\n}\n\nexport async function createWalletPopup(_url: string): Promise<{ popup: ModalPopup; isNew: boolean }> {\n  if (typeof window === 'undefined' || typeof document === 'undefined') {\n    throw new Error('This function can only be called in a browser environment.')\n  }\n\n  const url = new URL(_url)\n  const key = `up-wallet-popup-${url.hostname.replace(/\\./g, '-')}${url.pathname.split('/').join('-')}`\n\n  // Check for existing popup\n  const existingElement = document.getElementById(key)\n  if (existingElement && (existingElement as any)._popup) {\n    return { isNew: false, popup: (existingElement as any)._popup }\n  }\n\n  popupLog('Instantiating new popup')\n  const popup = new VanillaModalPopup(_url, key)\n\n  // Store reference on the element for reuse\n  const element = document.getElementById(key)\n  if (element) {\n    ;(element as any)._popup = popup\n  }\n\n  return popup\n    .createModal()\n    .then(({ isNew }) => ({ isNew, popup }))\n    .catch(error => {\n      popupLog('Error creating popup:', error)\n      popup.destroyModal()\n      throw error\n    })\n}\n"],"mappings":"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","names":["window"]}