import React, { useState, useEffect } from "react"; import { PayPalButtons, PayPalScriptProvider } from "@paypal/react-paypal-js"; import axios from "axios"; import { useRazorpay } from "react-razorpay"; import { useCurrency } from "@/app/contexts/currencyContext"; const PaymentComponent = ({ amount, onSuccess }) => { const { error: razorpayError, isLoading, Razorpay } = useRazorpay(); const [error, setError] = useState(null); const [isProcessing, setIsProcessing] = useState(false); const [showPopup, setShowPopup] = useState(false); const [shippingData, setShippingData] = useState({ address_line_1: "", address_line_2: "", state: "", city: "", country_code: "", postal_code: "", phone_number: "", }); const [shippingInfoCollected, setShippingInfoCollected] = useState(false); const { selectedCurrency, convertPrice, exchangeRates } = useCurrency(); const amountInSelectedCurrency = convertPrice(amount); const [usdAmount, setUsdAmount] = useState(null); useEffect(() => { const calculateUsdAmount = async () => { try { if (selectedCurrency === 'USD') { setUsdAmount(amountInSelectedCurrency); return; } if (exchangeRates && exchangeRates['USD']) { const usdRate = exchangeRates['USD']; setUsdAmount((amountInSelectedCurrency / usdRate).toFixed(2)); return; } const response = await axios.get('https://api.exchangerate-api.com/v4/latest/' + selectedCurrency); if (response.data && response.data.rates && response.data.rates.USD) { const usdRate = response.data.rates.USD; setUsdAmount((amountInSelectedCurrency * usdRate).toFixed(2)); } else { throw new Error("Failed to fetch USD exchange rate"); } } catch (err) { console.error("Error calculating USD amount:", err); if (selectedCurrency === 'INR') { setUsdAmount((amountInSelectedCurrency / 75).toFixed(2)); } else { setUsdAmount(amountInSelectedCurrency); } } }; calculateUsdAmount(); }, [amountInSelectedCurrency, selectedCurrency, exchangeRates]); const createOrder = async () => { try { const response = await axios.post("/api/razorpay/order", { amount: amount * 100, // Amount in paise currency: "INR", }); return response.data; } catch (error) { console.error("Error creating order:", error); throw error; } }; const handlePaymentSuccess = (response) => { onSuccess?.({ ...response, address: shippingData, // Include the shipping data in the success callback }); }; const handleRazorpayPayment = async () => { try { const order = await createOrder(); const options = { key: "rzp_live_REdeGZclfm8KFo", amount: order.amount, currency: order.currency, name: "Rudraksha", description: "", order_id: order.id, prefill: { name: shippingData.address_line_1, email: shippingData.address_line_2, contact: shippingData.phone_number || shippingData.city, }, handler: (response) => { response.address = shippingData; handlePaymentSuccess(response); }, }; const razorpayInstance = new Razorpay(options); razorpayInstance.open(); } catch (error) { setError("Payment failed. Please try again."); console.error("Razorpay error:", error); } }; const handlePopupSubmit = () => { if (!shippingData.address_line_1 || !shippingData.city || !shippingData.postal_code || !shippingData.phone_number) { setError("Please fill in all required fields."); return; } // Validate phone number const phoneRegex = /^\+?[0-9]{10,15}$/; if (!phoneRegex.test(shippingData.phone_number)) { setError("Please enter a valid phone number (10-15 digits)."); return; } setShowPopup(false); setShippingInfoCollected(true); setError(null); }; return (
Note: We only ship to addresses in India, Malaysia, and Nepal.