{"version":3,"file":"PaymentusForm.mjs","names":["React","useEffect","useState","useCallback","useRef","HostedPaymentPageAuthTokenResponse","PaymentDetails","PaymentMethodData","PaymentTenderTypeEnum","PaymentVendorFactoryEnum","useTranslation","apiMutate","useUser","UdpFlexbox","UdpSpinner","UdpMessageBar","ConfigService","PaymentusFormProps","paymentMethod","onStatusChange","paymentFormResult","paymentDetails","baseUrl","attributes","paymentData","s2sToken","s2sTenantId","PaymentusForm","FC","CreditCard","methodURL","src","setSrc","setResponse","loading","setLoading","error","setError","user","t","getPaymentusToken","payload","Promise","data","basePath","path","pgV1ApiUrl","method","headers","Authorization","currentTenantId","postPaymentusToken","PostURL","handlePaymentusResponse","response","isError","console","log","paymentFormResponse","isValid","message","Token","errorCode","errorMessage","selectedHostedPayment","Paymentus","result","handlePaymentusResponseRef","current","handleLoad","handleError","PAYMENT_GATEWAY_ORIGIN","allowedOrigins","Set","add","URL","origin","handleMessage","e","MessageEvent","size","has","jsonData","constructor","name","frameHeight","iframe","document","querySelector","HTMLIFrameElement","style","height","responseData","JSON","parse","postBackData","window","addEventListener","removeEventListener","preLoadForm","appPaymentVendorID","defaultValue","TenantID","AppPaymentVendorID","PaymentAmount","amount","CurrencyCode","Customer","FirstName","firstName","LastName","lastName","Email","Phone","phone","OriginUrl","location","Reference1","reference1","Reference2","reference2","Reference3","reference3","success","iFrameUrl","width","overflowX","display","border","margin"],"sources":["../../../../../src/utilities/form/paymentForm/vendorsForms/PaymentusForm.tsx"],"sourcesContent":["import React, { useEffect, useState, useCallback, useRef } from 'react';\nimport { HostedPaymentPageAuthTokenResponse, PaymentDetails, PaymentMethodData } from '../AccountPayment.model';\nimport { PaymentTenderTypeEnum } from '../../../../enums/paymentTenderTypeEnum';\nimport { PaymentVendorFactoryEnum } from '../../../../enums/paymentVendorFactoryEnum';\nimport { useTranslation } from 'react-i18next';\nimport { apiMutate } from '../../../useAxiosMutate';\nimport { useUser } from '../../../auth/useUser';\nimport { UdpFlexbox } from '../../../../UI/fluent-web-components/UdpFlexbox';\nimport { UdpSpinner } from '../../../../UI/fluent-web-components/UdpSpinner';\nimport { UdpMessageBar } from '../../../../UI/fluent-web-components/UdpMessageBar';\nimport { ConfigService } from '../../../../configService';\n\ninterface PaymentusFormProps {\n  paymentMethod?: PaymentTenderTypeEnum;\n  onStatusChange?: (paymentFormResult: any) => void;\n  paymentDetails: PaymentDetails;\n  baseUrl: string;\n  attributes?: any;\n  paymentData?: PaymentMethodData;\n  /** S2S bearer token; when present the token fetch uses the `/S2S` endpoint variant. */\n  s2sToken?: string;\n  /** Tenant ID required alongside `s2sToken` for S2S mode API calls. */\n  s2sTenantId?: string;\n};\n\nexport const PaymentusForm: React.FC<PaymentusFormProps> = ({\n  paymentMethod = PaymentTenderTypeEnum.CreditCard,\n  onStatusChange = null,\n  paymentDetails = null,\n  baseUrl = \"https://secure4.paymentus.com/xotp/pm/sgc2\",\n  attributes = null,\n  paymentData = null,\n  s2sToken,\n  s2sTenantId\n}) => {\n  const methodURL = (paymentMethod === PaymentTenderTypeEnum.CreditCard) ? 'creditcard' : 'echeck';\n\n  const [src, setSrc] = useState('');\n  const [, setResponse] = useState({});\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState('');\n  const user = useUser();\n\n  const { t } = useTranslation();\n\n  /**\n   * API call to get the Paymentus Token\n   */\n  const getPaymentusToken = useCallback(\n    async (payload: any): Promise<{ data?: HostedPaymentPageAuthTokenResponse } | null> => {\n      if (!payload) {\n        return null;\n      }\n\n      const basePath = `ProcessHostedPaymentPagePayment/authToken/${methodURL}`;\n      const path = s2sToken ? `${basePath}/S2S` : basePath;\n\n      return apiMutate(\n        ConfigService.pgV1ApiUrl,\n        path,\n        s2sToken\n          ? { method: 'POST', data: payload, headers: { Authorization: `Bearer ${s2sToken}`, currentTenantId: s2sTenantId } }\n          : { method: 'POST', data: payload },\n        {}\n      ) as Promise<{ data?: HostedPaymentPageAuthTokenResponse }>;\n    },\n    [methodURL, s2sToken, s2sTenantId]\n  );\n\n  /**\n   * API post the generated Token\n   */\n  const postPaymentusToken: any = useCallback(\n    async (payload: any) => {\n      if (!payload) {\n        return null;\n      }\n\n      const PostURL = (paymentMethod === PaymentTenderTypeEnum.CreditCard) ?\n        'PaymentTokenCreditCard/ByPass' : 'PaymentTokenECheck/CreateByPass';\n\n      return apiMutate(\n        ConfigService.pgV1ApiUrl,\n        `${PostURL}`,\n        {\n          method: 'POST',\n          data: payload,\n        },\n        {}\n      );\n    },\n    []\n  );\n\n  /**\n   * handleFiservResponse\n   *\n   * @param {*} response\n   */\n  const handlePaymentusResponse = useCallback((response: any) => {\n    const isError = response?.error;\n    console.log('it was here');\n    const paymentFormResponse = {\n      isValid: !isError,\n      payload: response,\n      message: response?.Token,\n      errorCode: response?.error,\n      errorMessage: response?.error,\n      selectedHostedPayment: PaymentVendorFactoryEnum.Paymentus\n    };\n\n    (onStatusChange as unknown as ((result: any) => void) | undefined)?.(paymentFormResponse);\n  }, [onStatusChange, paymentMethod]);\n\n  // Keeps the message listener effect below from needing handlePaymentusResponse\n  // in its deps — onStatusChange (and therefore handlePaymentusResponse) can churn\n  // identity on every parent render, which was tearing down and re-adding the\n  // window listener and could miss the iframe's response mid-rebuild.\n  const handlePaymentusResponseRef = useRef(handlePaymentusResponse);\n  useEffect(() => {\n    handlePaymentusResponseRef.current = handlePaymentusResponse;\n  }, [handlePaymentusResponse]);\n\n  const handleLoad = () => {\n    setLoading(false);\n  };\n\n  const handleError = () => {\n    setLoading(false);\n  };\n\n  useEffect(() => {\n    // Restrict postMessage handling to known senders: the Paymentus iframe\n    // itself (frame-height pings) and our payment-gateway host, which is where\n    // Paymentus's hosted flow actually serves the final tokenization postback\n    // page from — NOT the Paymentus domain.\n    //\n    // KNOWN STOPGAP: this should come from config (ConfigService.pgV1ApiUrl is\n    // hardcoded to UNITY_API_DOMAIN and never picks up REACT_APP_PG_API_BASE;\n    // reading import.meta.env directly from here doesn't work either, since\n    // this component ships inside the enterprise library's pre-built dist and\n    // the value comes back undefined at runtime). Hardcoded here as a known\n    // dev-environment value until ConfigService is fixed to wire this through\n    // properly — will need updating (or replacing with a real fix) before this\n    // goes to any environment other than unitydev.\n    const PAYMENT_GATEWAY_ORIGIN = 'https://pg-unity-api.unitydev.ca';\n\n    const allowedOrigins = new Set<string>([PAYMENT_GATEWAY_ORIGIN]);\n    try {\n      allowedOrigins.add(new URL(src).origin);\n    } catch {\n      // src isn't a valid absolute URL yet (e.g. still '' before the token loads).\n    }\n\n    const handleMessage = async (e: MessageEvent) => {\n      if (allowedOrigins.size && !allowedOrigins.has(e.origin)) return;\n\n      const jsonData = e.data;\n\n      if (\n        typeof jsonData === 'object' &&\n        jsonData?.constructor?.name === 'Object'\n      ) {\n        if (jsonData.frameHeight) {\n          const iframe = document.querySelector<HTMLIFrameElement>('#iFramePS');\n          if (iframe) {\n            iframe.style.height = `${jsonData.frameHeight}px`;\n          }\n        }\n\n        let responseData;\n        try {\n          responseData = JSON.parse(jsonData?.postBackData);\n        } catch (e) {\n          return;\n        }\n        if (responseData?.Token) {\n          handlePaymentusResponseRef.current(responseData);\n          setResponse(responseData);\n        }\n      }\n    };\n    window.addEventListener('message', handleMessage);\n\n    return () => {\n      window.removeEventListener('message', handleMessage);\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [src]);\n\n  useEffect(() => {\n    const preLoadForm = async () => {\n      try {\n        // == null intentionally matches both null and undefined.\n        if ((paymentData as any)?.appPaymentVendorID == null ||\n          !paymentDetails\n        ) {\n          setError(\n            t('payments.form.missingHostedData', {\n              defaultValue: 'Missing required data to render the hosted payment form',\n            })\n          );\n          return;\n        }\n\n        const payload = {\n          TenantID: s2sToken ? s2sTenantId : user?.currentTenantId,\n          AppPaymentVendorID: (paymentData as any)?.appPaymentVendorID,\n          PaymentAmount: (paymentDetails as any)?.amount,\n          CurrencyCode: 'USD',\n          Customer: {\n            FirstName: (paymentDetails as any)?.firstName,\n            LastName: (paymentDetails as any)?.lastName,\n            Email: null, //paymentDetails?.email, // NULL enable one-time payment\n            Phone: (paymentDetails as any)?.phone\n          },\n          OriginUrl: window.location.origin,\n          Reference1: (paymentDetails as any)?.reference1,\n          Reference2: (paymentDetails as any)?.reference2,\n          Reference3: (paymentDetails as any)?.reference3,\n        };\n\n        const response = await getPaymentusToken(payload);\n        const result = response?.data;\n        if (!result?.success) {\n          setError(\n            t('payments.form.tokenGenerationFailed', {\n              defaultValue: 'Failed to generate the hosted payment page token',\n            })\n          );\n          return;\n        }\n        if (!result.iFrameUrl) {\n          setError(\n            t('payments.form.noIframeUrl', {\n              defaultValue: 'The payment provider did not return an iframe URL',\n            })\n          );\n          return;\n        }\n        setSrc(result.iFrameUrl);\n      } catch (e: any) {\n        console.error('Error generating iframe source URL:', e);\n        setError(\n          t('payments.form.iframeSourceError', {\n            defaultValue: 'Error generating iframe source: {{message}}',\n            message: e?.message,\n          })\n        );\n      }\n    }\n    preLoadForm();\n  }, [attributes, paymentData, paymentDetails, baseUrl, user, t]);\n\n  if (error) {\n    return (\n      <UdpMessageBar intent=\"error\" layout=\"multiline\">\n        {t('payments.form.hostedRenderError', {\n          defaultValue:\n            'There was an error rendering the hosted payment form. Please check your settings and try again',\n        })}\n        {': '}\n        {error}\n      </UdpMessageBar>\n    );\n  }\n\n  return (\n    <div style={{ width: '100%', overflowX: 'auto' }}>\n      {loading && (\n        <UdpFlexbox direction=\"row\" justify=\"center\" align=\"center\">\n          <UdpSpinner size=\"medium\" />\n        </UdpFlexbox>\n      )}\n\n      {src && (\n        <iframe\n          id=\"iFramePS\"\n          name=\"iFramePS\"\n          title={t('payments.form.tokenizationTitle', { defaultValue: 'Payment tokenization' })}\n          src={src}\n          scrolling=\"auto\"\n          width=\"540\"\n          height=\"785\"\n          frameBorder=\"0\"\n          onLoad={handleLoad}\n          onError={handleError}\n          style={{ display: loading ? 'none' : 'block', border: 0, margin: '0 auto' }}\n        />\n      )}\n    </div>\n  );\n};\n"],"mappings":"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"}