169 lines
3.9 KiB
Vue
169 lines
3.9 KiB
Vue
<template>
|
|
<div>
|
|
<span
|
|
v-if="team.pg.currency === 'INR' || paypalEnabled"
|
|
class="mt-2.5 inline-flex gap-2 text-base text-gray-700"
|
|
>
|
|
<FeatherIcon name="info" class="my-1 h-4" />
|
|
<span class="leading-5" v-if="team.pg.currency === 'INR'">
|
|
If you select Razorpay, you can pay using Credit Card, Debit Card, Net
|
|
Banking, UPI, Wallets, etc. If you are using Net Banking, it may take
|
|
upto 5 days for balance to reflect.
|
|
</span>
|
|
<span class="leading-5" v-if="paypalEnabled">
|
|
You can pay using your PayPal account. Processing may take a few minutes
|
|
for the balance to reflect.
|
|
</span>
|
|
</span>
|
|
<ErrorMessage class="mt-3" :message="createRazorpayOrder.error" />
|
|
<div class="mt-8">
|
|
<Button
|
|
v-if="!isPaymentComplete"
|
|
class="w-full"
|
|
size="md"
|
|
variant="solid"
|
|
:label="`Proceed to payment using ${paypalEnabled ? 'PayPal' : 'Razorpay'}`"
|
|
:loading="createRazorpayOrder.loading"
|
|
@click="createRazorpayOrder.submit()"
|
|
/>
|
|
<Button
|
|
v-else
|
|
class="w-full"
|
|
size="md"
|
|
label="Confirming payment"
|
|
variant="solid"
|
|
:loading="isVerifyingPayment"
|
|
/>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
<script setup>
|
|
import { Button, ErrorMessage, FeatherIcon, createResource } from 'jingrow-ui';
|
|
import { ref, onMounted, onBeforeUnmount, inject } from 'vue';
|
|
import { toast } from 'vue-sonner';
|
|
import { DashboardError } from '../../utils/error';
|
|
|
|
const props = defineProps({
|
|
amount: {
|
|
type: Number,
|
|
default: 0,
|
|
},
|
|
minimumAmount: {
|
|
type: Number,
|
|
default: 0,
|
|
},
|
|
paypalEnabled: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
type: {
|
|
type: String,
|
|
default: 'Prepaid Credits',
|
|
},
|
|
docName: {
|
|
type: String,
|
|
default: null,
|
|
},
|
|
});
|
|
|
|
const emit = defineEmits(['success']);
|
|
const team = inject('team');
|
|
|
|
const paypalEnabled = team.pg.currency === 'USD' && props.paypalEnabled;
|
|
const isPaymentComplete = ref(false);
|
|
const isVerifyingPayment = ref(false);
|
|
|
|
const razorpayCheckoutJS = ref(null);
|
|
|
|
onMounted(() => {
|
|
razorpayCheckoutJS.value = document.createElement('script');
|
|
razorpayCheckoutJS.value.setAttribute(
|
|
'src',
|
|
'https://checkout.razorpay.com/v1/checkout.js',
|
|
);
|
|
razorpayCheckoutJS.value.async = true;
|
|
document.head.appendChild(razorpayCheckoutJS.value);
|
|
});
|
|
|
|
onBeforeUnmount(() => {
|
|
razorpayCheckoutJS.value?.remove();
|
|
});
|
|
|
|
const createRazorpayOrder = createResource({
|
|
url: 'press.api.billing.create_razorpay_order',
|
|
params: {
|
|
amount: props.amount,
|
|
transaction_type: props.type,
|
|
pg_name: props.docName,
|
|
},
|
|
onSuccess: (data) => processOrder(data),
|
|
validate: () => {
|
|
if (props.amount < props.minimumAmount) {
|
|
throw new DashboardError('Amount less than minimum amount required');
|
|
}
|
|
},
|
|
});
|
|
|
|
const handlePaymentFailed = createResource({
|
|
url: 'press.api.billing.handle_razorpay_payment_failed',
|
|
onSuccess: () => {
|
|
console.log('Payment Failed.');
|
|
},
|
|
});
|
|
|
|
function processOrder(data) {
|
|
const options = {
|
|
key: data.key_id,
|
|
order_id: data.order_id,
|
|
name: 'Jingrow Cloud',
|
|
image: 'https://framework.jingrow.com/files/cloud.png',
|
|
prefill: { email: team.pg?.user },
|
|
handler: handlePaymentSuccess,
|
|
theme: { color: '#171717' },
|
|
...(paypalEnabled
|
|
? {
|
|
config: {
|
|
display: {
|
|
blocks: {
|
|
wallets: {
|
|
name: 'Pay using PayPal',
|
|
instruments: [
|
|
{
|
|
method: 'wallet',
|
|
wallets: ['paypal'],
|
|
},
|
|
],
|
|
},
|
|
},
|
|
sequence: ['block.wallets'],
|
|
preferences: {
|
|
show_default_blocks: false,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
: {}),
|
|
};
|
|
|
|
const rzp = new Razorpay(options);
|
|
|
|
// Opens the payment checkout frame
|
|
rzp.open();
|
|
|
|
// Attach failure handler
|
|
rzp.on('payment.failed', handlePaymentFailure);
|
|
// rzp.on('payment.success', this.handlePaymentSuccess);
|
|
}
|
|
|
|
function handlePaymentFailure(response) {
|
|
handlePaymentFailed.submit({ response });
|
|
toast.error('Payment failed');
|
|
}
|
|
|
|
function handlePaymentSuccess() {
|
|
isPaymentComplete.value = true;
|
|
emit('success');
|
|
toast.success('Payment successful');
|
|
}
|
|
</script>
|