2222 class =" w-full"
2323 size =" md"
2424 variant =" solid"
25- :label =" `Proceed to payment using ${paypalEnabled ? 'PayPal' : 'Razorpay'}`"
26- :loading =" createRazorpayOrder.loading"
25+ :label ="
26+ razorpayScriptLoading
27+ ? 'Loading payment gateway...'
28+ : `Proceed to payment using ${paypalEnabled ? 'PayPal' : 'Razorpay'}`
29+ "
30+ :loading =" createRazorpayOrder.loading || razorpayScriptLoading"
2731 @click =" createRazorpayOrder.submit()"
2832 />
2933 <Button
@@ -42,6 +46,7 @@ import { Button, ErrorMessage, FeatherIcon, createResource } from 'frappe-ui';
4246import { ref , onMounted , onBeforeUnmount , inject } from ' vue' ;
4347import { toast } from ' vue-sonner' ;
4448import { DashboardError } from ' ../../utils/error' ;
49+ import { loadRazorpayScript } from ' ../../utils/razorpay' ;
4550
4651const props = defineProps ({
4752 amount: {
@@ -73,20 +78,18 @@ const paypalEnabled = team.doc.currency === 'USD' && props.paypalEnabled;
7378const isPaymentComplete = ref (false );
7479const isVerifyingPayment = ref (false );
7580
76- const razorpayCheckoutJS = ref (null );
81+ const razorpayScriptLoading = ref (! window . Razorpay );
7782
7883onMounted (() => {
79- razorpayCheckoutJS .value = document .createElement (' script' );
80- razorpayCheckoutJS .value .setAttribute (
81- ' src' ,
82- ' https://checkout.razorpay.com/v1/checkout.js' ,
83- );
84- razorpayCheckoutJS .value .async = true ;
85- document .head .appendChild (razorpayCheckoutJS .value );
86- });
87-
88- onBeforeUnmount (() => {
89- razorpayCheckoutJS .value ? .remove ();
84+ loadRazorpayScript ()
85+ .then (() => {
86+ razorpayScriptLoading .value = false ;
87+ })
88+ .catch (() => {
89+ toast .error (
90+ ' Failed to load payment gateway. Please refresh and try again.' ,
91+ );
92+ });
9093});
9194
9295const createRazorpayOrder = createResource ({
@@ -96,7 +99,10 @@ const createRazorpayOrder = createResource({
9699 transaction_type: props .type ,
97100 doc_name: props .docName ,
98101 },
99- onSuccess : (data ) => processOrder (data),
102+ onSuccess: async (data ) => {
103+ await loadRazorpayScript ();
104+ processOrder (data);
105+ },
100106 validate : () => {
101107 if (props .amount < props .minimumAmount ) {
102108 throw new DashboardError (' Amount less than minimum amount required' );
0 commit comments