JezK
Edit File: sc-checkout-razorpay-payment-provider2.js.map
{"file":"sc-checkout-razorpay-payment-provider2.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6CAiHqC,eAAO,CAAC,UAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qDAgCN,UAAE;;;;;;;;;;;;;;;;;gKAmBQ,UAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":[],"sources":["src/components/controllers/checkout-form/sc-checkout-razorpay-payment-provider/sc-checkout-razorpay-payment-provider.tsx"],"sourcesContent":["/**\n * External dependencies.\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport { Component, Prop } from '@stencil/core';\nimport { addQueryArgs } from '@wordpress/url';\n\n/**\n * Internal dependencies.\n */\nimport { state as checkoutState } from '@store/checkout';\nimport { listenTo } from '@store/checkout/functions';\nimport { lockCheckout, unLockCheckout } from '@store/checkout/mutations';\nimport { state as processorsState } from '@store/processors';\nimport { state as selectedProcessor } from '@store/selected-processor';\nimport { onChange as onChangeFormState } from '@store/form';\nimport { currentFormState } from '@store/form/getters';\nimport { updateFormState } from '@store/form/mutations';\nimport { createErrorNotice } from '@store/notices/mutations';\nimport { loadRazorpay } from 'src/functions/razorpay';\nimport apiFetch from '../../../../functions/fetch';\nimport { Customer, Pagination, PaymentMethodType, RazorpayConstructor, ResponseError } from 'src/types';\n\n@Component({\n tag: 'sc-checkout-razorpay-payment-provider',\n shadow: true,\n})\nexport class ScCheckoutRazorpayPaymentProvider {\n /** Razorpay processor id. Required for the recurring `payment_method_types` fetch. */\n @Prop() processorId: string;\n\n private unlistenToFormState?: () => void;\n private unlistenToCheckout?: () => void;\n private razorpayInstance: RazorpayConstructor | null = null;\n private confirming: boolean = false;\n\n componentWillLoad() {\n // Preload Razorpay script.\n loadRazorpay()\n .then(instance => (this.razorpayInstance = instance))\n .catch(err => createErrorNotice({ message: err.message }));\n\n // we need to listen to the form state and pay when the form state enters the paying state.\n this.unlistenToFormState = onChangeFormState('formState', () => {\n // are we paying?\n if ('paying' === currentFormState()) {\n this.confirm();\n }\n });\n\n // Keep the recurring payment_method_types in sync with the checkout.\n this.fetchMethods();\n this.unlistenToCheckout = listenTo('checkout', ['currency', 'reusable_payment_method_required'], () => this.fetchMethods());\n }\n\n disconnectedCallback() {\n // Guarded — Stencil can disconnect before componentWillLoad fires on mid-render reparenting.\n this.unlistenToFormState?.();\n this.unlistenToCheckout?.();\n // Release shared state so a later mollie / non-recurring flow starts clean.\n processorsState.methods = [];\n }\n\n /** Fetch enabled `payment_method_types` for recurring checkouts. No-op otherwise. */\n async fetchMethods() {\n const checkout = checkoutState.checkout;\n if (!this.processorId || !checkout?.currency) return;\n\n // One-time — Razorpay handles method selection in its modal. Clear any stale recurring methods.\n if (!checkout?.reusable_payment_method_required) {\n if (processorsState.methods.length) processorsState.methods = [];\n return;\n }\n\n try {\n lockCheckout('methods');\n const response = (await apiFetch({\n path: addQueryArgs(`surecart/v1/processors/${this.processorId}/payment_method_types`, {\n currency: checkout.currency,\n reusable: true,\n per_page: 100,\n }),\n })) as {\n object: 'list';\n pagination: Pagination;\n data: PaymentMethodType[];\n };\n processorsState.methods = response?.data || [];\n } catch (e) {\n createErrorNotice(e as ResponseError);\n console.error(e);\n } finally {\n unLockCheckout('methods');\n }\n }\n\n async confirm() {\n // this processor is not selected.\n if (selectedProcessor?.id !== 'razorpay') return;\n // Must be a razorpay session\n if (!checkoutState?.checkout?.payment_intent?.processor_data?.razorpay) return;\n // Prevent if already paid.\n if (checkoutState?.checkout?.status === 'paid') return;\n // Prevent multiple simultaneous payment attempts\n if (this.confirming) return;\n\n this.confirming = true;\n\n try {\n // must have a public_key and external_intent_id.\n const { external_intent_id, processor_data, reusable } = checkoutState?.checkout?.payment_intent || {};\n const { public_key, customer_id } = processor_data?.razorpay || {};\n if (!external_intent_id || !public_key) {\n createErrorNotice({ message: sprintf(__('Payment gateway configuration incomplete. Please ensure Razorpay is properly configured for transactions.', 'surecart')) });\n return;\n }\n\n // Wait for script to load if not loaded yet.\n if (!this.razorpayInstance) {\n this.razorpayInstance = await loadRazorpay();\n }\n\n const customer = checkoutState?.checkout?.customer as Customer | undefined;\n const prefill = customer\n ? {\n ...(customer.name && { name: customer.name }),\n ...(customer.email && { email: customer.email }),\n ...(customer.phone && { contact: customer.phone }),\n }\n : undefined;\n\n /*\n * Razorpay options.\n * @see https://razorpay.com/docs/payments/payment-gateway/web-integration/standard/integration-steps/#123-checkout-options\n */\n let options = {\n key: public_key,\n order_id: external_intent_id,\n prefill,\n customer_id,\n recurring: reusable,\n handler: (response: any) => {\n if (response?.razorpay_payment_id) {\n return updateFormState('PAID');\n } else {\n createErrorNotice({ message: __('Payment verification failed. Please contact support.', 'surecart') });\n updateFormState('REJECT');\n }\n },\n modal: {\n ondismiss: () => {\n updateFormState('REJECT');\n },\n },\n };\n\n if (window?.wp?.hooks?.applyFilters) {\n options = window.wp.hooks.applyFilters('surecart_razorpay_checkout_options', options);\n }\n\n const razorpay = new this.razorpayInstance(options);\n\n razorpay.on('payment.failed', response => {\n createErrorNotice({\n message: response?.error?.description || __('Payment failed. Please try again.', 'surecart'),\n });\n updateFormState('REJECT');\n console.error('payment.failed', response);\n });\n\n razorpay.open();\n } catch (err) {\n createErrorNotice(err);\n console.error(err);\n updateFormState('REJECT');\n } finally {\n this.confirming = false;\n }\n }\n}\n"],"version":3}