import React, { useState, useEffect } from "react"; import { PayPalButtons, PayPalScriptProvider } from "@paypal/react-paypal-js"; import axios from "axios"; import { useRazorpay } from "react-razorpay"; const CACHE_DURATION = 24 * 60 * 60 * 1000; // 24 hours in milliseconds const EXCHANGE_RATE_KEY = "exchange_rate_cache"; const PaymentComponent = ({ amount, onSuccess }) => { const { error: razorpayError, isLoading, Razorpay } = useRazorpay(); const [error, setError] = useState(null); const [isProcessing, setIsProcessing] = useState(false); const [usdAmount, setUsdAmount] = useState(null); const [showPopup, setShowPopup] = useState(false); const [shippingData, setShippingData] = useState({ address_line_1: "", address_line_2: "", state: "", city: "", country_code: "", postal_code: "", }); useEffect(() => { const fetchExchangeRate = async () => { try { const cachedData = localStorage.getItem(EXCHANGE_RATE_KEY); if (cachedData) { const { rate, timestamp } = JSON.parse(cachedData); if (Date.now() - timestamp < CACHE_DURATION) { setUsdAmount((amount * rate).toFixed(2)); return; } } const response = await axios.get("https://apilayer.net/api/live", { params: { access_key: "", currencies: "USD", source: "INR", format: 1, }, }); if (response.data.success) { const rate = response.data.quotes.INRUSD; localStorage.setItem( EXCHANGE_RATE_KEY, JSON.stringify({ rate, timestamp: Date.now(), }) ); setUsdAmount((amount * rate).toFixed(2)); } else { throw new Error("Failed to fetch exchange rate"); } } catch (err) { setError("Currency conversion failed. Please try again later."); console.error("Exchange rate error:", err); } }; fetchExchangeRate(); }, [amount]); 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, shippingData, // Include the shipping data in the success callback }); }; const handleRazorpayPayment = async () => { if (!shippingData.address_line_1 || !shippingData.city || !shippingData.postal_code) { setError("Please fill in all required fields."); return; } try { const order = await createOrder(); console.log(shippingData) const options = { key: process.env.NEXT_RAZORPAY_CLIENT_ID, 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.city, }, handler: (response) => { response.address = shippingData handlePaymentSuccess(response); // Pass the response to the success handler }, }; const razorpayInstance = new Razorpay(options); razorpayInstance.open(); } catch (error) { setError("Payment failed. Please try again."); console.error("Razorpay error:", error); } }; const handlePopupSubmit = () => { setShowPopup(false); handleRazorpayPayment(); }; if (!usdAmount) { return
Loading exchange rates...
; } return (
{error && (
{error}
)} {razorpayError && (
Error loading Razorpay: {razorpayError}
)} { return actions.order.create({ purchase_units: [ { amount: { value: usdAmount, currency_code: "USD", }, }, ], application_context: { shipping_preference: "GET_FROM_FILE", }, }); }} onApprove={async (data, actions) => { try { setIsProcessing(true); const order = await actions.order.capture(); onSuccess?.(order); } catch (err) { setError("Payment failed. Please try again."); console.error("Payment error:", err); } finally { setIsProcessing(false); } }} onError={(err) => { setError("Payment failed. Please try again."); }} /> {showPopup && (

Enter Your Shipping Details

setShippingData({ ...shippingData, address_line_1: e.target.value })} className="w-full p-2 mb-4 border border-gray-300 rounded" /> setShippingData({ ...shippingData, address_line_2: e.target.value })} className="w-full p-2 mb-4 border border-gray-300 rounded" /> setShippingData({ ...shippingData, city: e.target.value })} className="w-full p-2 mb-4 border border-gray-300 rounded" /> setShippingData({ ...shippingData, state: e.target.value })} className="w-full p-2 mb-4 border border-gray-300 rounded" /> setShippingData({ ...shippingData, country_code: e.target.value })} className="w-full p-2 mb-4 border border-gray-300 rounded" /> setShippingData({ ...shippingData, postal_code: e.target.value })} className="w-full p-2 mb-4 border border-gray-300 rounded" />
)}

Note: We only ship to addresses in India, Malaysia, and Nepal.

); }; export default PaymentComponent;