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: "9bcb30907dee1cda9866f7b49f0f8def", 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) // log env varaible NEXT_RAZORPAY_CLIENT_ID in next js console.log("Razorpay Client ID:", process.env.NEXT_PUBLIC_RAZORPAY_CLIENT_ID); const options = { key: "rzp_test_Xf4wnkvQQeUnCq", 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
Note: We only ship to addresses in India, Malaysia, and Nepal.