{"version":3,"file":"checkout.cjs","sources":["../src/checkout.ts"],"sourcesContent":["// Create a new div element\nconst newDiv = document.createElement(\"div\");\n\n// Add some content to the div (optional)\nnewDiv.innerHTML = `<style>\n  .dhanyatra-container > iframe { min-height: 100%!important; }\n  @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n  @keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } }\n  @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\n</style>`;\n\n// Add a class and inline styles to the div\nnewDiv.className = \"dhanyatra-container\";\nnewDiv.style.cssText =\n  \"z-index: 2147483647; position: fixed; top: 0px; display: none; left: 0px; height: 100%; width: 100%; backface-visibility: hidden; overflow-y: visible;\";\n\n// Create another div element for the backdrop\nconst backdropDiv = document.createElement(\"div\");\nbackdropDiv.className = \"dhanyatra-backdrop\";\n\nconst spinnerDiv = document.createElement(\"div\");\nspinnerDiv.className = \"dhanyatra-loader\";\n\n// Add styles to the backdrop div\nconst backdropStyles = {\n  \"min-height\": \"100%\",\n  transition: \"0.3s ease-out\",\n  position: \"fixed\",\n  top: \"0\",\n  left: \"0\",\n  width: \"100%\",\n  height: \"100%\",\n  background: \"rgba(0, 0, 0, 0.6)\",\n  display: \"flex\",\n  \"justify-content\": \"center\",\n  \"align-items\": \"center\",\n};\n\nconst loaderStyles = {\n  border: \"5px solid #ffffff\" /* Light grey */,\n  \"border-bottom-color\": \"transparent\",\n  \"border-radius\": \"50%\",\n  display: \"inline-block\",\n  \"box-sizing\": \"border-box\",\n  width: \"48px\",\n  height: \"48px\",\n  animation: \"spin 2s linear infinite\",\n};\n\nObject.assign(backdropDiv.style, backdropStyles);\nObject.assign(spinnerDiv.style, loaderStyles);\n\n// Append the backdrop div to the newDiv\nbackdropDiv.appendChild(spinnerDiv);\nnewDiv.appendChild(backdropDiv);\n\n// Append the div to the body of the HTML document\ndocument.body.appendChild(newDiv);\n\ninterface PaymentBlock {\n  [key: string]: {\n    name: string;\n    instruments: PaymentInstrument[];\n  };\n}\n\ninterface PaymentInstrument {\n  method: string;\n  flows: string[];\n  apps: string[];\n  issuer: string[];\n  banks: string[];\n  wallets: string[];\n}\n\ninterface DhanyatraOptions {\n  key: string;\n  amount: string;\n  currency: string;\n  order_id: string;\n  organization: string;\n  prefill?: {\n    email?: string;\n    contact?: number;\n  };\n  config?: {\n    display: {\n      blocks: PaymentBlock;\n      hide: {\n        method: string;\n      }[];\n      sequence: string[];\n      preferences: {\n        show_default_blocks: boolean;\n      };\n    };\n  };\n  ark?: {\n    user_id: number;\n    org_id: number;\n  };\n  modal: {\n    onDismiss: (response: any) => void;\n    onSuccess: (response: any) => void;\n    onError: (error: any) => void;\n  };\n}\n\nexport class Dhanyatra {\n  options: DhanyatraOptions;\n  private baseUrl: string = \"https://checkout.dhanyatra.brighthustle.in\";\n  private eventListenerAttached: boolean = false;\n  private onSuccessHandled: boolean = false;\n  private onDismissHandled: boolean = false;\n  private onErrorHandled: boolean = false;\n\n  constructor(options: DhanyatraOptions) {\n    if (!options) {\n      throw new Error(\"Options must be provided to the Dhanyatra constructor.\");\n    }\n    this.options = options;\n    this.attachEventListener();\n  }\n\n  close() {\n    const iframe = document.getElementById(\n      \"dhanyatraIframe\"\n    ) as HTMLIFrameElement;\n    if (iframe) {\n      iframe.style.animation = \"fadeOut 0.5s\";\n      this.removeEventListener();\n      setTimeout(() => {\n        iframe.parentNode?.removeChild(iframe);\n        newDiv.style.display = \"none\";\n      }, 500);\n    }\n  }\n\n  open() {\n    this.onSuccessHandled = false;\n    this.onDismissHandled = false;\n    this.onErrorHandled = false;\n    spinnerDiv.style.display = \"block\";\n    // When you call this method, it will display the dhanyatra-container\n    newDiv.style.display = \"block\";\n    // Create an iframe element\n    const iframe = document.createElement(\"iframe\");\n    iframe.setAttribute(\"id\", \"dhanyatraIframe\");\n    Object.assign(iframe.style, {\n      opacity: \"0\",\n      height: \"100%\",\n      position: \"relative\",\n      background: \"none\",\n      display: \"none\",\n      border: \"0px none transparent\",\n      margin: \"0px\",\n      padding: \"0px\",\n      zIndex: \"2\",\n      width: \"100%\",\n      animation: \"fadeIn 0.5s forwards\",\n    });\n    iframe.frameBorder = \"0\";\n    iframe.setAttribute(\"allowTransparency\", \"true\");\n\n    // Add a cache-busting query parameter\n    const cacheBuster = `?_=${new Date().getTime()}`;\n\n    // Set the source URL for the iframe\n    iframe.src = `${this.baseUrl}${cacheBuster}`;\n\n    // Append the iframe to the dhanyatra-container\n    newDiv.appendChild(iframe);\n\n    // Convert the data to a JSON string\n    const messageString = JSON.stringify(this.options);\n    iframe.setAttribute(\"referrerpolicy\", \"no-referrer-when-downgrade\");\n\n    // Send the data to the iframe\n    iframe.addEventListener(\"load\", () => {\n      // This function will be called when the iframe has fully loaded\n      setTimeout(() => {\n        iframe.contentWindow?.postMessage(messageString, \"*\");\n      }, 500);\n      setTimeout(() => {\n        spinnerDiv.style.display = \"none\";\n        iframe.style.display = \"block\";\n      }, 1000);\n      // Now, you can safely send data to the iframe or perform other actions.\n    });\n\n    iframe.addEventListener(\"error\", () => {\n      console.error(\"Iframe failed to load. Retrying...\");\n      setTimeout(() => {\n        iframe.src = `${this.baseUrl}${cacheBuster}`;\n      }, 3000);\n    });\n  }\n\n  private attachEventListener() {\n    if (!this.eventListenerAttached) {\n      window.addEventListener(\"message\", (event) => this.handleMessage(event));\n      this.eventListenerAttached = true;\n    }\n  }\n\n  private removeEventListener() {\n    if (this.eventListenerAttached) {\n      window.removeEventListener(\"message\", (event) =>\n        this.handleMessage(event)\n      );\n      this.eventListenerAttached = false;\n    }\n  }\n\n  private handleMessage = (event) => {\n    const { origin, data } = event;\n\n    // Check the origin of the event for security\n    if (origin !== this.baseUrl) {\n      return;\n    }\n\n    // Handle different message types\n    switch (data.action) {\n      case \"dismissModal\":\n        this.handleDismissModal(data.data);\n        break;\n      case \"paymentSuccess\":\n        this.handlePaymentResponse(data.data);\n        break;\n      case \"paymentFailed\":\n        this.handleErrorResponse(data.data);\n        break;\n      default:\n        this.handleErrorResponse(data.data);\n        break;\n    }\n  };\n\n  private handleDismissModal = (data) => {\n    const iframe = document.getElementById(\n      \"dhanyatraIframe\"\n    ) as HTMLIFrameElement;\n    if (iframe) {\n      if (!this.onDismissHandled) {\n        this.options.modal.onDismiss(data);\n        this.onDismissHandled = true;\n      }\n    }\n  };\n\n  private handlePaymentResponse = (paymentData) => {\n    if (\n      !this.onSuccessHandled &&\n      this.options &&\n      this.options.modal &&\n      typeof this.options.modal.onSuccess === \"function\"\n    ) {\n      this.options.modal.onSuccess(paymentData);\n      this.onSuccessHandled = true;\n    }\n  };\n\n  private handleErrorResponse = (errorData) => {\n    if (\n      !this.onErrorHandled &&\n      this.options &&\n      this.options.modal &&\n      typeof this.options.modal.onError === \"function\"\n    ) {\n      this.options.modal.onError(errorData);\n      this.onErrorHandled = true;\n    }\n  };\n}\n"],"names":["newDiv","document","createElement","innerHTML","className","style","cssText","backdropDiv","spinnerDiv","Object","assign","transition","position","top","left","width","height","background","display","border","animation","appendChild","body","constructor","options","this","baseUrl","eventListenerAttached","onSuccessHandled","onDismissHandled","onErrorHandled","handleMessage","event","origin","data","action","handleDismissModal","handlePaymentResponse","handleErrorResponse","getElementById","modal","onDismiss","paymentData","onSuccess","errorData","onError","Error","attachEventListener","close","iframe","removeEventListener","setTimeout","_iframe$parentNode","parentNode","removeChild","open","setAttribute","opacity","margin","padding","zIndex","frameBorder","cacheBuster","Date","getTime","src","messageString","JSON","stringify","addEventListener","_iframe$contentWindow","contentWindow","postMessage","console","error","window"],"mappings":"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"}