'use client'; import { useCallback, useMemo, useState } from 'react'; import BN from 'bn.js'; import assert from 'assert'; import { Connection } from '@solana/web3.js'; import { sendSolanaTokenPayment } from '@/services/solana'; import { PaymentModalProps } from '@/types'; assert(process.env.NEXT_PUBLIC_SOLANA_RPC_URL, 'SOLANA_RPC_URL is required'); const SOLANA_RPC_URL = process.env.NEXT_PUBLIC_SOLANA_RPC_URL; export default function PaymentModal({ isOpen, onClose, url, onPaymentComplete, walletState, }: PaymentModalProps) { const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const connection = useMemo(() => new Connection(SOLANA_RPC_URL), []) // Get configuration from environment variables directly const amount = parseInt(process.env.NEXT_PUBLIC_MIN_SOLANA_PAYMENT_AMOUNT || '400000000'); const recipientAddress = process.env.NEXT_PUBLIC_SOLANA_TOKEN_RECIPIENT_ADDRESS; const handlePayment = useCallback(async () => { setLoading(true); setError(''); try { const tokenAmount = new BN(amount); const result = await sendSolanaTokenPayment(connection, walletState.publicKey!, tokenAmount, walletState.walletType!); if (result.success && result.transactionSignature) { onPaymentComplete(result.transactionSignature); } else { setError(result.error || `${process.env.NEXT_PUBLIC_SOLANA_TOKEN_SYMBOL} payment failed. Please try again.`); } } catch (error) { setError(error instanceof Error ? error.message : 'Payment failed. Please try again.'); } finally { setLoading(false); } }, [connection, walletState, amount, onPaymentComplete]); if (!isOpen) return null; return (

Complete {process.env.NEXT_PUBLIC_SOLANA_TOKEN_SYMBOL} Payment

URL to be deployed:

{url}

Recipient Address:

{recipientAddress}
{process.env.NEXT_PUBLIC_SOLANA_TOKEN_SYMBOL}

Fixed amount required for deployment

{error && (
{error}
)}
); }