coinley-test 0.0.21 → 0.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.esm.js +977 -14
- package/dist/index.esm.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/jsx-runtime.js","../src/PaymentAPI.js","../src/CoinleyPayment.jsx","../src/CoinleyProvider.jsx","../src/components/SimpleCoinleyPayment.jsx","../src/index.js"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","//src/PaymentAPI.js\r\nimport axios from 'axios';\r\n\r\nexport class PaymentAPI {\r\n constructor(baseURL, apiKey, apiSecret) {\r\n this.apiKey = apiKey;\r\n this.apiSecret = apiSecret;\r\n\r\n this.api = axios.create({\r\n baseURL: baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL,\r\n timeout: 30000,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n // Add request interceptor\r\n this.api.interceptors.request.use(\r\n (config) => {\r\n config.headers['X-API-Key'] = this.apiKey;\r\n config.headers['X-API-Secret'] = this.apiSecret;\r\n \r\n const token = this.generateMerchantToken();\r\n if (token) {\r\n config.headers['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n console.log('API Request:', {\r\n method: config.method?.toUpperCase(),\r\n url: config.url,\r\n data: config.data\r\n });\r\n\r\n return config;\r\n },\r\n (error) => {\r\n console.error('Request interceptor error:', error);\r\n return Promise.reject(error);\r\n }\r\n );\r\n\r\n // Add response interceptor\r\n this.api.interceptors.response.use(\r\n (response) => {\r\n console.log('API Response:', {\r\n status: response.status,\r\n url: response.config.url,\r\n data: response.data\r\n });\r\n return response;\r\n },\r\n (error) => {\r\n console.error('API Error:', {\r\n status: error.response?.status,\r\n data: error.response?.data,\r\n message: error.message\r\n });\r\n\r\n if (error.response?.status === 401) {\r\n throw new Error('Authentication failed. Please check your API credentials.');\r\n } else if (error.response?.status === 404) {\r\n throw new Error('API endpoint not found. Please check your API URL.');\r\n } else if (error.response?.status >= 500) {\r\n throw new Error('Server error. Please try again later.');\r\n }\r\n\r\n throw error;\r\n }\r\n );\r\n }\r\n\r\n generateMerchantToken() {\r\n try {\r\n const credentials = `${this.apiKey}:${this.apiSecret}`;\r\n return btoa(credentials);\r\n } catch (error) {\r\n console.error('Failed to generate token:', error);\r\n return null;\r\n }\r\n }\r\n\r\n async createPayment(params) {\r\n try {\r\n const response = await this.api.post('/api/payments/create', params);\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to create payment');\r\n }\r\n }\r\n\r\n async getPayment(paymentId) {\r\n try {\r\n const response = await this.api.get(`/api/payments/${paymentId}`);\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to get payment details');\r\n }\r\n }\r\n\r\n async getNetworks() {\r\n try {\r\n const response = await this.api.get('/api/networks');\r\n return response.data;\r\n } catch (error) {\r\n console.error('Get networks failed:', error);\r\n \r\n // Return fallback networks\r\n return {\r\n networks: [\r\n {\r\n id: 'ethereum',\r\n name: 'Ethereum',\r\n shortName: 'ethereum',\r\n chainId: '1',\r\n type: 'ethereum',\r\n explorerUrl: 'https://etherscan.io',\r\n isTestnet: false,\r\n },\r\n {\r\n id: 'bsc',\r\n name: 'Binance Smart Chain',\r\n shortName: 'bsc',\r\n chainId: '56',\r\n type: 'bsc',\r\n explorerUrl: 'https://bscscan.com',\r\n isTestnet: false,\r\n },\r\n {\r\n id: 'polygon',\r\n name: 'Polygon',\r\n shortName: 'polygon',\r\n chainId: '137',\r\n type: 'ethereum',\r\n explorerUrl: 'https://polygonscan.com',\r\n isTestnet: false,\r\n },\r\n ]\r\n };\r\n }\r\n }\r\n\r\n async getStablecoins() {\r\n try {\r\n const response = await this.api.get('/api/networks/stablecoins');\r\n return response.data;\r\n } catch (error) {\r\n console.error('Get stablecoins failed:', error);\r\n \r\n // Return fallback stablecoins\r\n return {\r\n stablecoins: [\r\n {\r\n id: 'usdt-eth',\r\n name: 'Tether USD',\r\n symbol: 'USDT',\r\n contractAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n decimals: 6,\r\n isStablecoin: true,\r\n networkId: 'ethereum',\r\n Network: {\r\n id: 'ethereum',\r\n name: 'Ethereum',\r\n shortName: 'ethereum',\r\n type: 'ethereum',\r\n }\r\n },\r\n {\r\n id: 'usdc-eth',\r\n name: 'USD Coin',\r\n symbol: 'USDC',\r\n contractAddress: '0xA0b86a33E6441d81d0B93bF9EE0f74ca32F7e6f6',\r\n decimals: 6,\r\n isStablecoin: true,\r\n networkId: 'ethereum',\r\n Network: {\r\n id: 'ethereum',\r\n name: 'Ethereum',\r\n shortName: 'ethereum',\r\n type: 'ethereum',\r\n }\r\n }\r\n ]\r\n };\r\n }\r\n }\r\n\r\n async verifyQRPayment(paymentId) {\r\n try {\r\n const response = await this.api.post('/api/payments/verify-qr', {\r\n paymentId\r\n });\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to verify payment');\r\n }\r\n }\r\n\r\n async processPayment(paymentId, transactionHash, network, senderAddress) {\r\n try {\r\n const response = await this.api.post('/api/payments/process', {\r\n paymentId,\r\n transactionHash,\r\n network,\r\n senderAddress\r\n });\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to process payment');\r\n }\r\n }\r\n\r\n async healthCheck() {\r\n try {\r\n const response = await this.api.get('/api/health');\r\n return response.status === 200;\r\n } catch (error) {\r\n console.error('Health check failed:', error);\r\n return false;\r\n }\r\n }\r\n}","//src/CoinleyPayment.jsx\r\nimport React, { useState, useEffect, useRef } from 'react';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport {\r\n Wallet,\r\n QrCode,\r\n ChevronDown,\r\n Copy,\r\n Check,\r\n X,\r\n ArrowLeft,\r\n Loader2,\r\n ExternalLink,\r\n AlertCircle,\r\n CheckCircle2,\r\n Zap,\r\n Sparkles\r\n} from 'lucide-react';\r\n// import QRCodeLib from 'qrcode';\r\nimport {\r\n createCoinleyWalletConfig,\r\n CoinleyWalletProvider,\r\n ConnectButton,\r\n WalletModal,\r\n useWallet,\r\n useWalletConnect,\r\n useWalletTransaction,\r\n useWalletModal,\r\n useWalletDetection\r\n} from '@coinley/wallet-connect-core';\r\nimport { PaymentAPI } from './PaymentAPI';\r\n\r\n// Wallet Integration Component\r\nconst WalletIntegration = ({\r\n selectedNetwork,\r\n selectedToken,\r\n paymentData,\r\n config,\r\n onTransactionSent,\r\n onError,\r\n isConnecting,\r\n setIsConnecting\r\n}) => {\r\n const { isConnected, address, disconnect } = useWallet();\r\n const { connectWallet, isPending } = useWalletConnect();\r\n const { detectedWallets, hasWallets, walletCount } = useWalletDetection();\r\n const { sendTransaction } = useWalletTransaction();\r\n const { openModal } = useWalletModal();\r\n\r\n // Filter wallets to only show Ethereum-compatible ones\r\n const ethereumWallets = detectedWallets.filter(wallet => \r\n wallet.name.toLowerCase().includes('metamask') || \r\n wallet.provider === 'injected' ||\r\n wallet.name.toLowerCase().includes('coinbase') ||\r\n wallet.name.toLowerCase().includes('wallet connect')\r\n );\r\n\r\n const handleConnectSpecificWallet = async (walletType) => {\r\n try {\r\n setIsConnecting(true);\r\n \r\n // Disconnect any existing connections first\r\n if (isConnected) {\r\n await disconnect();\r\n // Wait a bit for disconnection to complete\r\n await new Promise(resolve => setTimeout(resolve, 1000));\r\n }\r\n\r\n // For MetaMask, try to connect directly to window.ethereum\r\n if (walletType === 'metamask' && window.ethereum && window.ethereum.isMetaMask) {\r\n try {\r\n // Direct MetaMask connection\r\n await window.ethereum.request({ method: 'eth_requestAccounts' });\r\n console.log('✅ Connected directly to MetaMask');\r\n } catch (error) {\r\n console.error('MetaMask connection failed:', error);\r\n throw error;\r\n }\r\n } else {\r\n // Use the library's connect function\r\n await connectWallet(walletType);\r\n }\r\n } catch (error) {\r\n console.error('Wallet connection failed:', error);\r\n onError(error.message || 'Failed to connect wallet');\r\n } finally {\r\n setIsConnecting(false);\r\n }\r\n };\r\n\r\n // Alternative: Try opening the modal directly\r\n const handleOpenModal = () => {\r\n try {\r\n console.log('Attempting to open wallet modal...');\r\n openModal();\r\n } catch (error) {\r\n console.error('Failed to open modal:', error);\r\n // Fallback: try direct wallet connection\r\n handleConnectSpecificWallet('injected');\r\n }\r\n };\r\n\r\n const handleSendPayment = async () => {\r\n if (!isConnected || !paymentData || !selectedToken) {\r\n onError('Wallet not connected or payment data missing');\r\n return;\r\n }\r\n\r\n try {\r\n setIsConnecting(true);\r\n\r\n console.log('🔍 Transaction Debug:');\r\n console.log('Connected wallet address:', address);\r\n console.log('Payment data:', paymentData);\r\n console.log('Selected token:', selectedToken);\r\n console.log('Selected network:', selectedNetwork);\r\n\r\n // Use the merchant's wallet address from the payment data as the recipient\r\n let recipientAddress = paymentData.metadata?.recipientWallet;\r\n\r\n console.log('Merchant recipient address:', recipientAddress);\r\n\r\n if (!recipientAddress || typeof recipientAddress !== 'string') {\r\n throw new Error('Merchant wallet address not found in payment data');\r\n }\r\n\r\n // Validate Ethereum address format\r\n if (!recipientAddress.match(/^0x[a-fA-F0-9]{40}$/)) {\r\n throw new Error(`Invalid merchant address format: ${recipientAddress}`);\r\n }\r\n\r\n let txHash;\r\n\r\n if (selectedToken.contractAddress) {\r\n // ERC-20 Token Transaction\r\n console.log('🔍 ERC-20 Transaction Details:');\r\n console.log('Token contract:', selectedToken.contractAddress);\r\n console.log('Token decimals:', selectedToken.decimals);\r\n console.log('Payment amount:', paymentData.totalAmount);\r\n\r\n const decimals = selectedToken.decimals || 6;\r\n const amount = Math.floor(paymentData.totalAmount * Math.pow(10, decimals));\r\n \r\n console.log('Calculated amount (with decimals):', amount);\r\n\r\n // ERC-20 transfer encoding\r\n const methodId = '0xa9059cbb';\r\n const addressWithoutPrefix = recipientAddress.slice(2);\r\n const recipientPadded = addressWithoutPrefix.toLowerCase().padStart(64, '0');\r\n const amountPadded = amount.toString(16).padStart(64, '0');\r\n \r\n const transferData = `${methodId}${recipientPadded}${amountPadded}`;\r\n\r\n console.log('🔍 Transaction Data:');\r\n console.log('Method ID:', methodId);\r\n console.log('Recipient (padded):', recipientPadded);\r\n console.log('Amount (padded):', amountPadded);\r\n console.log('Full data:', transferData);\r\n\r\n const txParams = {\r\n to: selectedToken.contractAddress,\r\n data: transferData,\r\n value: '0x0'\r\n };\r\n\r\n console.log('📤 Sending ERC-20 transaction:', txParams);\r\n txHash = await sendTransaction(txParams);\r\n } else {\r\n // Native Token Transaction\r\n const value = Math.floor(paymentData.totalAmount * Math.pow(10, 18));\r\n const valueHex = `0x${value.toString(16)}`;\r\n\r\n const txParams = {\r\n to: recipientAddress,\r\n value: valueHex\r\n };\r\n\r\n console.log('📤 Sending native transaction:', txParams);\r\n txHash = await sendTransaction(txParams);\r\n }\r\n\r\n if (txHash) {\r\n console.log('✅ Transaction sent successfully:', txHash);\r\n onTransactionSent(txHash);\r\n }\r\n } catch (error) {\r\n console.error('❌ Transaction failed:', error);\r\n onError(error.message || 'Transaction failed');\r\n } finally {\r\n setIsConnecting(false);\r\n }\r\n };\r\n\r\n const handleDisconnect = async () => {\r\n try {\r\n await disconnect();\r\n } catch (error) {\r\n console.error('Disconnect error:', error);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"text-center space-y-6\">\r\n <div className=\"space-y-4\">\r\n <div className=\"w-16 h-16 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center mx-auto\">\r\n <Wallet className=\"w-8 h-8 text-[#7042D2]\" />\r\n </div>\r\n \r\n {!isConnected ? (\r\n <>\r\n <h3 className=\"text-lg font-semibold\">\r\n Connect Your Wallet\r\n </h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 text-sm\">\r\n Choose your preferred wallet to complete the payment\r\n </p>\r\n \r\n <div className=\"space-y-3\">\r\n {/* MetaMask Button */}\r\n <button\r\n onClick={() => handleConnectSpecificWallet('metamask')}\r\n disabled={isPending || isConnecting}\r\n className=\"w-full p-3 border border-gray-300 rounded-lg hover:border-[#7042D2] flex items-center space-x-3 transition-colors disabled:opacity-50\"\r\n >\r\n <span className=\"text-xl\">🦊</span>\r\n <div className=\"text-left flex-1\">\r\n <div className=\"font-medium\">MetaMask</div>\r\n <div className=\"text-xs text-gray-500\">Connect with MetaMask</div>\r\n </div>\r\n </button>\r\n\r\n {/* Generic Wallet Button */}\r\n <button\r\n onClick={handleOpenModal}\r\n disabled={isPending || isConnecting}\r\n className=\"w-full p-3 border border-gray-300 rounded-lg hover:border-[#7042D2] flex items-center space-x-3 transition-colors disabled:opacity-50\"\r\n >\r\n <span className=\"text-xl\">💼</span>\r\n <div className=\"text-left flex-1\">\r\n <div className=\"font-medium\">Other Wallets</div>\r\n <div className=\"text-xs text-gray-500\">Choose from available wallets</div>\r\n </div>\r\n </button>\r\n\r\n {/* Manual Connection Fallback */}\r\n <button\r\n onClick={() => handleConnectSpecificWallet('injected')}\r\n disabled={isPending || isConnecting}\r\n className=\"w-full p-2 text-sm border border-dashed border-gray-300 rounded-lg hover:border-[#7042D2] transition-colors disabled:opacity-50\"\r\n >\r\n Try Direct Connection\r\n </button>\r\n </div>\r\n\r\n {isConnecting && (\r\n <div className=\"flex items-center justify-center space-x-2 text-gray-600\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n <span>Connecting...</span>\r\n </div>\r\n )}\r\n </>\r\n ) : (\r\n <>\r\n <h3 className=\"text-lg font-semibold text-green-600\">\r\n Wallet Connected ✅\r\n </h3>\r\n \r\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4 space-y-3\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Address:</span>\r\n <div className=\"flex items-center space-x-2\">\r\n <span className=\"font-mono text-sm\">\r\n {address?.slice(0, 6)}...{address?.slice(-4)}\r\n </span>\r\n <button\r\n onClick={handleDisconnect}\r\n className=\"text-xs text-red-600 hover:text-red-800\"\r\n >\r\n Disconnect\r\n </button>\r\n </div>\r\n </div>\r\n \r\n {paymentData && (\r\n <>\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Amount:</span>\r\n <span className=\"font-medium\">{paymentData.totalAmount} {selectedToken?.symbol}</span>\r\n </div>\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Network:</span>\r\n <span className=\"font-medium\">{selectedNetwork?.name}</span>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Payment Button */}\r\n <button\r\n onClick={handleSendPayment}\r\n disabled={isConnecting}\r\n className=\"w-full bg-[#7042D2] text-white py-4 rounded-lg font-semibold hover:bg-[#7042D2]/90 transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center space-x-2\"\r\n >\r\n {isConnecting ? (\r\n <>\r\n <Loader2 className=\"w-5 h-5 animate-spin\" />\r\n <span>Processing Payment...</span>\r\n </>\r\n ) : (\r\n <>\r\n <Zap className=\"w-5 h-5\" />\r\n <span>Send Payment</span>\r\n </>\r\n )}\r\n </button>\r\n\r\n <p className=\"text-xs text-gray-500\">\r\n Make sure you have enough {selectedToken?.symbol} and ETH for gas fees\r\n </p>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nconst CoinleyPayment = ({\r\n apiKey,\r\n apiSecret,\r\n apiUrl = 'http://localhost:9000',\r\n onSuccess,\r\n onError,\r\n onClose,\r\n isOpen,\r\n config,\r\n theme = 'light',\r\n merchantName,\r\n debug = false\r\n}) => {\r\n // State management\r\n const [currentStep, setCurrentStep] = useState('select-method');\r\n const [networks, setNetworks] = useState([]);\r\n const [tokens, setTokens] = useState([]);\r\n const [selectedNetwork, setSelectedNetwork] = useState(null);\r\n const [selectedToken, setSelectedToken] = useState(null);\r\n const [paymentMethod, setPaymentMethod] = useState(null);\r\n const [qrCode, setQrCode] = useState('');\r\n const [paymentData, setPaymentData] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState('');\r\n const [copied, setCopied] = useState(false);\r\n const [txHash, setTxHash] = useState('');\r\n const [isConnecting, setIsConnecting] = useState(false);\r\n\r\n // Services\r\n const paymentAPI = useRef(new PaymentAPI(apiUrl, apiKey, apiSecret));\r\n\r\n // Wallet configuration - Fixed to use proper chain configuration\r\n const walletConfig = createCoinleyWalletConfig({\r\n appName: merchantName || 'Coinley Payment',\r\n appDescription: 'Crypto payment processing',\r\n // Fix: Provide proper chain configurations instead of just IDs\r\n chains: [\r\n {\r\n id: 1,\r\n name: 'Ethereum',\r\n network: 'ethereum',\r\n rpcUrls: {\r\n default: { http: ['https://eth.llamarpc.com'] }\r\n },\r\n nativeCurrency: {\r\n name: 'Ethereum',\r\n symbol: 'ETH',\r\n decimals: 18\r\n }\r\n },\r\n {\r\n id: 56,\r\n name: 'BNB Smart Chain',\r\n network: 'bsc',\r\n rpcUrls: {\r\n default: { http: ['https://bsc-dataseed1.binance.org'] }\r\n },\r\n nativeCurrency: {\r\n name: 'BNB',\r\n symbol: 'BNB',\r\n decimals: 18\r\n }\r\n }\r\n ]\r\n });\r\n\r\n // Initialize\r\n useEffect(() => {\r\n if (isOpen) {\r\n initializePayment();\r\n }\r\n }, [isOpen]);\r\n\r\n const initializePayment = async () => {\r\n try {\r\n setLoading(true);\r\n setError('');\r\n\r\n const [networksRes, tokensRes] = await Promise.all([\r\n paymentAPI.current.getNetworks(),\r\n paymentAPI.current.getStablecoins()\r\n ]);\r\n\r\n setNetworks(networksRes.networks || []);\r\n setTokens(tokensRes.stablecoins || []);\r\n\r\n if (debug) {\r\n console.log('Initialized networks:', networksRes.networks);\r\n console.log('Initialized tokens:', tokensRes.stablecoins);\r\n }\r\n } catch (err) {\r\n console.error('Failed to initialize payment:', err);\r\n setError('Failed to load payment options. Please try again.');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleMethodSelect = (method) => {\r\n setPaymentMethod(method);\r\n setCurrentStep('select-network');\r\n };\r\n\r\n const handleNetworkSelect = async (network) => {\r\n setSelectedNetwork(network);\r\n\r\n // Get available tokens for this network\r\n const networkTokens = tokens.filter(token =>\r\n token.Network?.shortName === network.shortName || token.networkId === network.id\r\n );\r\n\r\n if (networkTokens.length > 1) {\r\n // Multiple tokens available - let user choose\r\n setCurrentStep('select-token');\r\n } else if (networkTokens.length === 1) {\r\n // Only one token available - auto-select and proceed\r\n const token = networkTokens[0];\r\n setSelectedToken(token);\r\n await initiatePayment(network, token);\r\n } else {\r\n // No tokens available for this network\r\n setError(`No supported tokens found for ${network.name}`);\r\n setCurrentStep('error');\r\n }\r\n };\r\n\r\n const handleTokenSelect = async (token) => {\r\n setSelectedToken(token);\r\n await initiatePayment(selectedNetwork, token);\r\n };\r\n\r\n const initiatePayment = async (network, token) => {\r\n try {\r\n setLoading(true);\r\n\r\n const paymentPayload = {\r\n amount: config.amount,\r\n currency: token.symbol,\r\n network: network.shortName,\r\n customerEmail: config.customerEmail,\r\n callbackUrl: config.callbackUrl,\r\n metadata: {\r\n ...config.metadata,\r\n paymentMethod,\r\n selectedNetwork: network.shortName,\r\n selectedToken: token.symbol,\r\n // Add the merchant wallet addresses to metadata\r\n merchantWalletAddresses: config.merchantWalletAddresses\r\n }\r\n };\r\n\r\n console.log('🔍 Payment payload with merchant wallets:', paymentPayload);\r\n\r\n const payment = await paymentAPI.current.createPayment(paymentPayload);\r\n setPaymentData(payment.payment);\r\n\r\n if (paymentMethod === 'wallet') {\r\n setCurrentStep('wallet-connect');\r\n } else {\r\n await generateQRCode(payment.payment);\r\n setCurrentStep('qr-code');\r\n }\r\n } catch (err) {\r\n console.error('Payment initiation failed:', err);\r\n setError(err.message || 'Failed to create payment');\r\n setCurrentStep('error');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const generateQRCode = async (payment) => {\r\n try {\r\n const recipientAddress = payment.metadata?.recipientWallet ||\r\n config.merchantWalletAddresses?.[selectedNetwork?.shortName || ''];\r\n\r\n if (!recipientAddress) {\r\n throw new Error('Recipient wallet address not found');\r\n }\r\n\r\n let qrData = '';\r\n\r\n if (selectedNetwork?.type === 'ethereum' || selectedNetwork?.type === 'bsc') {\r\n qrData = selectedToken?.contractAddress\r\n ? `ethereum:${selectedToken.contractAddress}/transfer?address=${recipientAddress}&uint256=${payment.totalAmount * Math.pow(10, selectedToken.decimals)}`\r\n : `ethereum:${recipientAddress}?value=${payment.totalAmount}e18`;\r\n } else if (selectedNetwork?.type === 'tron') {\r\n qrData = `tron:${recipientAddress}?amount=${payment.totalAmount}`;\r\n } else {\r\n qrData = `${selectedToken?.symbol}:${recipientAddress}?amount=${payment.totalAmount}`;\r\n }\r\n\r\n // For now, just set the recipient address since QRCodeLib is commented out\r\n setQrCode(recipientAddress);\r\n startPaymentVerification(payment.id);\r\n\r\n } catch (err) {\r\n console.error('QR code generation failed:', err);\r\n setError('Failed to generate QR code');\r\n setCurrentStep('error');\r\n }\r\n };\r\n\r\n const startPaymentVerification = async (paymentId) => {\r\n const maxAttempts = 60;\r\n let attempts = 0;\r\n\r\n const checkPayment = async () => {\r\n try {\r\n const result = await paymentAPI.current.verifyQRPayment(paymentId);\r\n\r\n if (result.verified && result.payment?.transactionHash) {\r\n setTxHash(result.payment.transactionHash);\r\n await handlePaymentSuccess(paymentId, result.payment.transactionHash);\r\n return true;\r\n }\r\n\r\n attempts++;\r\n if (attempts < maxAttempts) {\r\n setTimeout(checkPayment, 5000);\r\n } else {\r\n setError('Payment verification timeout. Please check your transaction.');\r\n setCurrentStep('error');\r\n }\r\n\r\n return false;\r\n } catch (err) {\r\n console.error('Payment verification error:', err);\r\n attempts++;\r\n if (attempts < maxAttempts) {\r\n setTimeout(checkPayment, 5000);\r\n } else {\r\n setError('Payment verification failed');\r\n setCurrentStep('error');\r\n }\r\n return false;\r\n }\r\n };\r\n\r\n setTimeout(checkPayment, 2000);\r\n };\r\n\r\n const handleTransactionSent = async (transactionHash) => {\r\n setTxHash(transactionHash);\r\n setCurrentStep('processing');\r\n\r\n try {\r\n await paymentAPI.current.processPayment(\r\n paymentData.id,\r\n transactionHash,\r\n selectedNetwork?.shortName || '',\r\n ''\r\n );\r\n\r\n await handlePaymentSuccess(paymentData.id, transactionHash);\r\n } catch (error) {\r\n console.error('Payment processing failed:', error);\r\n await handlePaymentSuccess(paymentData.id, transactionHash);\r\n }\r\n };\r\n\r\n const handlePaymentSuccess = async (paymentId, transactionHash) => {\r\n setCurrentStep('success');\r\n\r\n if (onSuccess) {\r\n onSuccess(paymentId, transactionHash, {\r\n network: selectedNetwork?.name,\r\n token: selectedToken?.symbol,\r\n amount: paymentData?.totalAmount,\r\n method: paymentMethod\r\n });\r\n }\r\n };\r\n\r\n const copyToClipboard = async (text) => {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n }\r\n };\r\n\r\n const handleClose = () => {\r\n setCurrentStep('select-method');\r\n setPaymentMethod(null);\r\n setSelectedNetwork(null);\r\n setSelectedToken(null);\r\n setQrCode('');\r\n setPaymentData(null);\r\n setError('');\r\n setTxHash('');\r\n\r\n if (onClose) {\r\n onClose();\r\n }\r\n };\r\n\r\n const goBack = () => {\r\n if (currentStep === 'select-network') {\r\n setCurrentStep('select-method');\r\n } else if (currentStep === 'select-token') {\r\n setCurrentStep('select-network');\r\n } else if (currentStep === 'wallet-connect' || currentStep === 'qr-code') {\r\n // Go back to token selection if multiple tokens, otherwise network selection\r\n const networkTokens = tokens.filter(token =>\r\n token.Network?.shortName === selectedNetwork?.shortName || token.networkId === selectedNetwork?.id\r\n );\r\n if (networkTokens.length > 1) {\r\n setCurrentStep('select-token');\r\n } else {\r\n setCurrentStep('select-network');\r\n }\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <CoinleyWalletProvider config={walletConfig} walletConfig={{ appName: merchantName || 'Coinley Payment' }}>\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 backdrop-blur-sm\">\r\n <motion.div\r\n initial={{ scale: 0.9, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n exit={{ scale: 0.9, opacity: 0 }}\r\n className={`relative w-full max-w-md mx-4 rounded-2xl shadow-2xl overflow-hidden ${theme === 'dark' ? 'bg-gray-900 text-white' : 'bg-white text-gray-900'\r\n }`}\r\n >\r\n {/* Header */}\r\n <div className=\"relative p-6 border-b border-gray-200 dark:border-gray-700\">\r\n {(currentStep !== 'select-method' && currentStep !== 'success' && currentStep !== 'error') && (\r\n <button\r\n onClick={goBack}\r\n className=\"absolute left-4 top-6 p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5\" />\r\n </button>\r\n )}\r\n\r\n <button\r\n onClick={handleClose}\r\n className=\"absolute right-4 top-6 p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n\r\n <div className=\"text-center\">\r\n <div className=\"flex items-center justify-center space-x-2 mb-2\">\r\n <Sparkles className=\"w-5 h-5 text-[#7042D2]\" />\r\n <h2 className=\"text-xl font-bold\">Pay with Crypto</h2>\r\n <Sparkles className=\"w-5 h-5 text-[#7042D2]\" />\r\n </div>\r\n {merchantName && (\r\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mt-1\">\r\n {merchantName}\r\n </p>\r\n )}\r\n <div className=\"mt-2\">\r\n <span className=\"text-2xl font-bold text-[#7042D2]\">\r\n ${config.amount.toFixed(2)}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"p-6 min-h-[400px]\">\r\n <AnimatePresence mode=\"wait\">\r\n {/* Step 1: Select Payment Method */}\r\n {currentStep === 'select-method' && (\r\n <motion.div\r\n key=\"select-method\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"space-y-4\"\r\n >\r\n <h3 className=\"text-lg font-semibold text-center mb-6\">\r\n Choose Payment Method\r\n </h3>\r\n\r\n <motion.button\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleMethodSelect('wallet')}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n <div className=\"p-3 bg-[#7042D2] bg-opacity-10 rounded-lg group-hover:bg-opacity-20 transition-colors\">\r\n <Wallet className=\"w-6 h-6 text-[#7042D2]\" />\r\n </div>\r\n <div className=\"text-left\">\r\n <div className=\"font-semibold\">Connect Wallet</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n MetaMask, WalletConnect & more\r\n </div>\r\n </div>\r\n <Zap className=\"w-5 h-5 text-[#7042D2] ml-auto\" />\r\n </div>\r\n </motion.button>\r\n\r\n <motion.button\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleMethodSelect('qr')}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n <div className=\"p-3 bg-[#7042D2] bg-opacity-10 rounded-lg group-hover:bg-opacity-20 transition-colors\">\r\n <QrCode className=\"w-6 h-6 text-[#7042D2]\" />\r\n </div>\r\n <div className=\"text-left\">\r\n <div className=\"font-semibold\">QR Code</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n Scan with mobile wallet\r\n </div>\r\n </div>\r\n </div>\r\n </motion.button>\r\n </motion.div>\r\n )}\r\n\r\n {/* Step 2: Select Network */}\r\n {currentStep === 'select-network' && (\r\n <motion.div\r\n key=\"select-network\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"space-y-4\"\r\n >\r\n <h3 className=\"text-lg font-semibold text-center mb-6\">\r\n Select Network\r\n </h3>\r\n\r\n {loading ? (\r\n <div className=\"flex justify-center py-8\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[#7042D2]\" />\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n {networks.map((network) => (\r\n <motion.button\r\n key={network.id}\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleNetworkSelect(network)}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n {network.logo ? (\r\n <img\r\n src={network.logo}\r\n alt={network.name}\r\n className=\"w-8 h-8 rounded-full\"\r\n />\r\n ) : (\r\n <div className=\"w-8 h-8 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center\">\r\n <span className=\"text-sm font-bold text-[#7042D2]\">\r\n {network.shortName.charAt(0).toUpperCase()}\r\n </span>\r\n </div>\r\n )}\r\n <div className=\"text-left flex-1\">\r\n <div className=\"font-semibold\">{network.name}</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n {network.shortName.toUpperCase()}\r\n </div>\r\n </div>\r\n <ChevronDown className=\"w-5 h-5 text-gray-400 transform -rotate-90\" />\r\n </div>\r\n </motion.button>\r\n ))}\r\n </div>\r\n )}\r\n </motion.div>\r\n )}\r\n\r\n {/* Step 3: Select Token */}\r\n {currentStep === 'select-token' && (\r\n <motion.div\r\n key=\"select-token\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"space-y-4\"\r\n >\r\n <h3 className=\"text-lg font-semibold text-center mb-6\">\r\n Select Token on {selectedNetwork?.name}\r\n </h3>\r\n\r\n {loading ? (\r\n <div className=\"flex justify-center py-8\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[#7042D2]\" />\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n {tokens\r\n .filter(token =>\r\n token.Network?.shortName === selectedNetwork?.shortName || \r\n token.networkId === selectedNetwork?.id\r\n )\r\n .map((token) => (\r\n <motion.button\r\n key={token.id}\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleTokenSelect(token)}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n {token.logo ? (\r\n <img\r\n src={token.logo}\r\n alt={token.symbol}\r\n className=\"w-8 h-8 rounded-full\"\r\n />\r\n ) : (\r\n <div className=\"w-8 h-8 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center\">\r\n <span className=\"text-sm font-bold text-[#7042D2]\">\r\n {token.symbol.charAt(0)}\r\n </span>\r\n </div>\r\n )}\r\n <div className=\"text-left flex-1\">\r\n <div className=\"font-semibold\">{token.name}</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n {token.symbol}\r\n {token.isStablecoin && (\r\n <span className=\"ml-2 px-2 py-0.5 bg-green-100 text-green-600 text-xs rounded-full\">\r\n Stablecoin\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <ChevronDown className=\"w-5 h-5 text-gray-400 transform -rotate-90\" />\r\n </div>\r\n </motion.button>\r\n ))\r\n }\r\n </div>\r\n )}\r\n </motion.div>\r\n )}\r\n\r\n {/* Wallet Connect */}\r\n {currentStep === 'wallet-connect' && (\r\n <motion.div\r\n key=\"wallet-connect\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n >\r\n <WalletIntegration\r\n selectedNetwork={selectedNetwork}\r\n selectedToken={selectedToken}\r\n paymentData={paymentData}\r\n config={config} // Pass config to WalletIntegration\r\n onTransactionSent={handleTransactionSent}\r\n onError={setError}\r\n isConnecting={isConnecting}\r\n setIsConnecting={setIsConnecting}\r\n />\r\n </motion.div>\r\n )}\r\n\r\n {/* QR Code */}\r\n {currentStep === 'qr-code' && (\r\n <motion.div\r\n key=\"qr-code\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"space-y-4\">\r\n <h3 className=\"text-lg font-semibold\">Scan QR Code</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Use your mobile wallet to scan and pay\r\n </p>\r\n </div>\r\n\r\n {qrCode && (\r\n <div className=\"bg-white p-4 rounded-xl mx-auto inline-block\">\r\n <div className=\"w-48 h-48 flex items-center justify-center text-gray-500\">\r\n QR Code: {qrCode.slice(0, 10)}...{qrCode.slice(-4)}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {paymentData && (\r\n <div className=\"space-y-3\">\r\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4 space-y-2\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Network:</span>\r\n <span className=\"font-medium\">{selectedNetwork?.name}</span>\r\n </div>\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Amount:</span>\r\n <span className=\"font-medium\">{paymentData.totalAmount} {selectedToken?.symbol}</span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-center justify-center space-x-2 text-sm text-gray-600 dark:text-gray-400\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n <span>Waiting for payment...</span>\r\n </div>\r\n </div>\r\n )}\r\n </motion.div>\r\n )}\r\n\r\n {/* Processing */}\r\n {currentStep === 'processing' && (\r\n <motion.div\r\n key=\"processing\"\r\n initial={{ scale: 0.8, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"w-16 h-16 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center mx-auto\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[#7042D2]\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[#7042D2]\">Processing Payment...</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n Your transaction is being processed\r\n </p>\r\n </div>\r\n </motion.div>\r\n )}\r\n\r\n {/* Success */}\r\n {currentStep === 'success' && (\r\n <motion.div\r\n key=\"success\"\r\n initial={{ scale: 0.8, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"w-16 h-16 bg-green-100 rounded-full flex items-center justify-center mx-auto\">\r\n <CheckCircle2 className=\"w-8 h-8 text-green-500\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-green-600\">Payment Successful!</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n Your payment has been processed successfully\r\n </p>\r\n </div>\r\n\r\n {txHash && (\r\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Transaction:</span>\r\n <div className=\"flex items-center space-x-2\">\r\n <span className=\"font-mono text-sm\">\r\n {txHash.slice(0, 6)}...{txHash.slice(-4)}\r\n </span>\r\n <button\r\n onClick={() => copyToClipboard(txHash)}\r\n className=\"p-1 hover:bg-gray-200 dark:hover:bg-gray-700 rounded\"\r\n >\r\n <Copy className=\"w-4 h-4\" />\r\n </button>\r\n {selectedNetwork?.explorerUrl && (\r\n <a\r\n href={`${selectedNetwork.explorerUrl}/tx/${txHash}`}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"p-1 hover:bg-gray-200 dark:hover:bg-gray-700 rounded\"\r\n >\r\n <ExternalLink className=\"w-4 h-4\" />\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <button\r\n onClick={handleClose}\r\n className=\"w-full bg-[#7042D2] text-white py-3 rounded-lg font-semibold hover:bg-[#7042D2]/90 transition-colors\"\r\n >\r\n Close\r\n </button>\r\n </motion.div>\r\n )}\r\n\r\n {/* Error */}\r\n {currentStep === 'error' && (\r\n <motion.div\r\n key=\"error\"\r\n initial={{ scale: 0.8, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mx-auto\">\r\n <AlertCircle className=\"w-8 h-8 text-red-500\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-red-600\">Payment Failed</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n {error || 'Something went wrong. Please try again.'}\r\n </p>\r\n </div>\r\n\r\n <div className=\"space-y-3\">\r\n <button\r\n onClick={() => {\r\n setCurrentStep('select-method');\r\n setError('');\r\n }}\r\n className=\"w-full bg-[#7042D2] text-white py-3 rounded-lg font-semibold hover:bg-[#7042D2]/90 transition-colors\"\r\n >\r\n Try Again\r\n </button>\r\n <button\r\n onClick={handleClose}\r\n className=\"w-full border border-gray-300 dark:border-gray-600 py-3 rounded-lg font-semibold hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors\"\r\n >\r\n Close\r\n </button>\r\n </div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n\r\n {/* Footer */}\r\n <div className=\"px-6 py-4 border-t border-gray-200 dark:border-gray-700 text-center\">\r\n <p className=\"text-xs text-gray-500\">\r\n Powered by <span className=\"font-semibold text-[#7042D2]\">Coinley</span>\r\n </p>\r\n </div>\r\n </motion.div>\r\n </div>\r\n\r\n <WalletModal />\r\n </CoinleyWalletProvider>\r\n );\r\n};\r\n\r\nexport default CoinleyPayment;","//src/CoinleyProvider.jsx\r\nimport React, { createContext, useContext, useRef, forwardRef, useImperativeHandle } from 'react';\r\nimport CoinleyPayment from './CoinleyPayment';\r\n\r\nconst CoinleyContext = createContext(null);\r\n\r\nexport const CoinleyProvider = ({\r\n apiKey,\r\n apiSecret,\r\n apiUrl,\r\n theme = 'light',\r\n debug = false,\r\n children\r\n}) => {\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n const [paymentConfig, setPaymentConfig] = React.useState(null);\r\n const [callbacks, setCallbacks] = React.useState({});\r\n const [merchantName, setMerchantName] = React.useState('');\r\n\r\n const openPayment = (config, checkoutCallbacks) => {\r\n setPaymentConfig(config);\r\n if (checkoutCallbacks) {\r\n setCallbacks(checkoutCallbacks);\r\n }\r\n setIsOpen(true);\r\n };\r\n\r\n const closePayment = () => {\r\n setIsOpen(false);\r\n setPaymentConfig(null);\r\n if (callbacks.onClose) {\r\n callbacks.onClose();\r\n }\r\n };\r\n\r\n const contextValue = {\r\n openPayment,\r\n closePayment\r\n };\r\n\r\n return (\r\n <CoinleyContext.Provider value={contextValue}>\r\n {children}\r\n {isOpen && paymentConfig && (\r\n <CoinleyPayment\r\n apiKey={apiKey}\r\n apiSecret={apiSecret}\r\n apiUrl={apiUrl}\r\n isOpen={isOpen}\r\n config={paymentConfig}\r\n theme={theme}\r\n debug={debug}\r\n merchantName={merchantName}\r\n onSuccess={callbacks.onSuccess}\r\n onError={callbacks.onError}\r\n onClose={closePayment}\r\n />\r\n )}\r\n </CoinleyContext.Provider>\r\n );\r\n};\r\n\r\nexport const CoinleyCheckout = forwardRef((\r\n {\r\n customerEmail = '',\r\n merchantName = '',\r\n onSuccess,\r\n onError,\r\n onClose,\r\n theme = 'light',\r\n autoOpen = false,\r\n testMode = false,\r\n debug = false,\r\n merchantWalletAddresses = {}\r\n },\r\n ref\r\n) => {\r\n const context = useContext(CoinleyContext);\r\n\r\n if (!context) {\r\n throw new Error('CoinleyCheckout must be used within a CoinleyProvider');\r\n }\r\n\r\n const { openPayment, closePayment } = context;\r\n\r\n const open = (config) => {\r\n try {\r\n if (debug) {\r\n console.log('Opening Coinley checkout with config:', config);\r\n }\r\n\r\n if (!config.amount || config.amount <= 0) {\r\n throw new Error('Amount must be greater than 0');\r\n }\r\n\r\n const finalConfig = {\r\n ...config,\r\n customerEmail: config.customerEmail || customerEmail,\r\n merchantWalletAddresses: {\r\n ...merchantWalletAddresses,\r\n ...config.merchantWalletAddresses\r\n },\r\n metadata: {\r\n ...config.metadata,\r\n testMode,\r\n checkoutVersion: '1.0.0'\r\n }\r\n };\r\n\r\n const checkoutCallbacks = {\r\n onSuccess,\r\n onError,\r\n onClose\r\n };\r\n\r\n openPayment(finalConfig, checkoutCallbacks);\r\n } catch (error) {\r\n console.error('Failed to open Coinley checkout:', error);\r\n if (onError) {\r\n onError(error);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n closePayment();\r\n };\r\n\r\n useImperativeHandle(ref, () => ({\r\n open,\r\n close\r\n }));\r\n\r\n return null;\r\n});\r\n\r\nCoinleyCheckout.displayName = 'CoinleyCheckout';\r\n\r\nexport const useCoinley = () => {\r\n const context = useContext(CoinleyContext);\r\n if (!context) {\r\n throw new Error('useCoinley must be used within a CoinleyProvider');\r\n }\r\n return context;\r\n};\r\n\r\nexport const ThemeProvider = ({\r\n initialTheme = 'light',\r\n children\r\n}) => {\r\n const [theme, setTheme] = React.useState(initialTheme);\r\n\r\n React.useEffect(() => {\r\n document.documentElement.setAttribute('data-coinley-theme', theme);\r\n }, [theme]);\r\n\r\n const toggleTheme = () => {\r\n setTheme(prev => prev === 'light' ? 'dark' : 'light');\r\n };\r\n\r\n return (\r\n <div className={`coinley-theme-${theme}`}>\r\n {children}\r\n </div>\r\n );\r\n};","//src/components/SimpleCoinleyPayment.jsx - NEW FILE in your coinley-test SDK\r\nimport React, { useState, useEffect, useRef } from 'react';\r\n\r\n// Simple Payment API class (reuse your existing PaymentAPI structure)\r\nclass SimplePaymentAPI {\r\n constructor(baseURL, apiKey, apiSecret) {\r\n this.baseURL = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL;\r\n this.apiKey = apiKey;\r\n this.apiSecret = apiSecret;\r\n }\r\n\r\n async request(endpoint, options = {}) {\r\n const url = `${this.baseURL}${endpoint}`;\r\n const headers = {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.apiKey,\r\n 'X-API-Secret': this.apiSecret,\r\n ...options.headers\r\n };\r\n\r\n const response = await fetch(url, {\r\n ...options,\r\n headers\r\n });\r\n\r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({}));\r\n throw new Error(error.error || `HTTP ${response.status}`);\r\n }\r\n\r\n return response.json();\r\n }\r\n\r\n async getNetworks() {\r\n try {\r\n return await this.request('/api/networks');\r\n } catch (error) {\r\n console.error('Failed to fetch networks:', error);\r\n // Fallback networks\r\n return {\r\n networks: [\r\n { id: '1', name: 'Ethereum', shortName: 'ethereum', chainId: '0x1', type: 'ethereum' },\r\n { id: '56', name: 'BSC', shortName: 'bsc', chainId: '0x38', type: 'bsc' }\r\n ]\r\n };\r\n }\r\n }\r\n\r\n async getTokens() {\r\n try {\r\n return await this.request('/api/networks/stablecoins');\r\n } catch (error) {\r\n console.error('Failed to fetch tokens:', error);\r\n // Fallback tokens\r\n return {\r\n stablecoins: [\r\n {\r\n id: '1', name: 'Tether USD', symbol: 'USDT',\r\n contractAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n decimals: 6, networkId: '1',\r\n Network: { shortName: 'ethereum', name: 'Ethereum' }\r\n }\r\n ]\r\n };\r\n }\r\n }\r\n\r\n async createPayment(data) {\r\n return await this.request('/api/payments/create', {\r\n method: 'POST',\r\n body: JSON.stringify(data)\r\n });\r\n }\r\n}\r\n\r\n// Simple MetaMask connector that actually works\r\nclass SimpleMetaMaskWallet {\r\n constructor() {\r\n this.account = null;\r\n this.chainId = null;\r\n }\r\n\r\n async connect() {\r\n if (!window.ethereum) {\r\n throw new Error('MetaMask not installed. Please install MetaMask extension.');\r\n }\r\n\r\n try {\r\n // Request account access\r\n const accounts = await window.ethereum.request({\r\n method: 'eth_requestAccounts'\r\n });\r\n\r\n // Get current chain\r\n const chainId = await window.ethereum.request({\r\n method: 'eth_chainId'\r\n });\r\n\r\n this.account = accounts[0];\r\n this.chainId = chainId;\r\n\r\n console.log('✅ MetaMask connected:', this.account);\r\n return { account: this.account, chainId: this.chainId };\r\n\r\n } catch (error) {\r\n console.error('MetaMask connection failed:', error);\r\n throw new Error(error.message || 'Failed to connect to MetaMask');\r\n }\r\n }\r\n\r\n async sendTransaction(txParams) {\r\n if (!this.account) {\r\n throw new Error('Wallet not connected');\r\n }\r\n\r\n try {\r\n console.log('🦊 Sending MetaMask transaction:', txParams);\r\n \r\n const txHash = await window.ethereum.request({\r\n method: 'eth_sendTransaction',\r\n params: [{\r\n ...txParams,\r\n from: this.account\r\n }]\r\n });\r\n\r\n console.log('✅ Transaction sent:', txHash);\r\n return txHash;\r\n\r\n } catch (error) {\r\n console.error('Transaction failed:', error);\r\n \r\n if (error.code === 4001) {\r\n throw new Error('Transaction cancelled by user');\r\n } else if (error.message.includes('insufficient funds')) {\r\n throw new Error('Insufficient funds in wallet');\r\n } else {\r\n throw new Error(error.message || 'Transaction failed');\r\n }\r\n }\r\n }\r\n\r\n isConnected() {\r\n return !!this.account;\r\n }\r\n}\r\n\r\n// Main Simple Payment Component\r\nconst SimpleCoinleyPayment = ({ \r\n apiKey, \r\n apiSecret, \r\n apiUrl, \r\n config,\r\n onSuccess, \r\n onError, \r\n onClose,\r\n isOpen,\r\n theme = 'light'\r\n}) => {\r\n const [currentStep, setCurrentStep] = useState('method');\r\n const [networks, setNetworks] = useState([]);\r\n const [tokens, setTokens] = useState([]);\r\n const [selectedNetwork, setSelectedNetwork] = useState(null);\r\n const [selectedToken, setSelectedToken] = useState(null);\r\n const [paymentMethod, setPaymentMethod] = useState(null);\r\n const [paymentData, setPaymentData] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState('');\r\n const [wallet, setWallet] = useState(new SimpleMetaMaskWallet());\r\n const [walletConnected, setWalletConnected] = useState(false);\r\n const [processing, setProcessing] = useState(false);\r\n\r\n const api = useRef(new SimplePaymentAPI(apiUrl, apiKey, apiSecret));\r\n\r\n // Load networks and tokens when modal opens\r\n useEffect(() => {\r\n if (isOpen) {\r\n loadData();\r\n resetState();\r\n }\r\n }, [isOpen]);\r\n\r\n const resetState = () => {\r\n setCurrentStep('method');\r\n setSelectedNetwork(null);\r\n setSelectedToken(null);\r\n setPaymentMethod(null);\r\n setPaymentData(null);\r\n setError('');\r\n setWalletConnected(false);\r\n setProcessing(false);\r\n setWallet(new SimpleMetaMaskWallet());\r\n };\r\n\r\n const loadData = async () => {\r\n try {\r\n setLoading(true);\r\n setError('');\r\n \r\n console.log('🔄 Loading networks and tokens...');\r\n const [networksRes, tokensRes] = await Promise.all([\r\n api.current.getNetworks(),\r\n api.current.getTokens()\r\n ]);\r\n \r\n setNetworks(networksRes.networks || []);\r\n setTokens(tokensRes.stablecoins || []);\r\n \r\n console.log('✅ Loaded networks:', networksRes.networks?.length);\r\n console.log('✅ Loaded tokens:', tokensRes.stablecoins?.length);\r\n \r\n } catch (err) {\r\n console.error('Failed to load data:', err);\r\n setError('Failed to load payment options. Using fallback data.');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n // Connect wallet\r\n const connectWallet = async () => {\r\n try {\r\n setLoading(true);\r\n setError('');\r\n \r\n const connection = await wallet.connect();\r\n setWalletConnected(true);\r\n \r\n console.log('✅ Wallet connected successfully:', connection.account);\r\n \r\n } catch (err) {\r\n console.error('Wallet connection failed:', err);\r\n setError(err.message);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n // Create payment\r\n const createPayment = async () => {\r\n try {\r\n setLoading(true);\r\n setError('');\r\n \r\n const paymentPayload = {\r\n amount: config.amount,\r\n currency: selectedToken.symbol,\r\n network: selectedNetwork.shortName,\r\n customerEmail: config.customerEmail,\r\n callbackUrl: config.callbackUrl,\r\n metadata: {\r\n ...config.metadata,\r\n merchantWalletAddresses: config.merchantWalletAddresses,\r\n paymentMethod,\r\n selectedNetwork: selectedNetwork.shortName,\r\n selectedToken: selectedToken.symbol\r\n }\r\n };\r\n\r\n console.log('🔄 Creating payment:', paymentPayload);\r\n const payment = await api.current.createPayment(paymentPayload);\r\n setPaymentData(payment.payment);\r\n \r\n console.log('✅ Payment created:', payment.payment.id);\r\n \r\n if (paymentMethod === 'wallet') {\r\n setCurrentStep('wallet');\r\n } else {\r\n setCurrentStep('qr');\r\n }\r\n \r\n } catch (err) {\r\n console.error('Payment creation failed:', err);\r\n setError(err.message);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n // Send transaction\r\n const sendTransaction = async () => {\r\n try {\r\n setProcessing(true);\r\n setError('');\r\n \r\n const recipientAddress = paymentData.metadata?.recipientWallet || \r\n config.merchantWalletAddresses?.[selectedNetwork.shortName];\r\n\r\n if (!recipientAddress) {\r\n throw new Error('Merchant wallet address not found');\r\n }\r\n\r\n console.log('🔄 Preparing transaction to:', recipientAddress);\r\n\r\n let txParams;\r\n\r\n if (selectedToken.contractAddress) {\r\n // ERC-20 transaction\r\n const decimals = selectedToken.decimals || 6;\r\n const amount = Math.floor(paymentData.totalAmount * Math.pow(10, decimals));\r\n \r\n const methodId = '0xa9059cbb'; // transfer(address,uint256)\r\n const recipientPadded = recipientAddress.slice(2).toLowerCase().padStart(64, '0');\r\n const amountPadded = amount.toString(16).padStart(64, '0');\r\n const data = `${methodId}${recipientPadded}${amountPadded}`;\r\n\r\n txParams = {\r\n to: selectedToken.contractAddress,\r\n data: data,\r\n value: '0x0'\r\n };\r\n \r\n console.log('🔄 ERC-20 Transaction:', {\r\n token: selectedToken.symbol,\r\n amount: paymentData.totalAmount,\r\n amountWithDecimals: amount,\r\n to: selectedToken.contractAddress,\r\n recipient: recipientAddress\r\n });\r\n \r\n } else {\r\n // Native transaction\r\n const value = Math.floor(paymentData.totalAmount * Math.pow(10, 18));\r\n txParams = {\r\n to: recipientAddress,\r\n value: `0x${value.toString(16)}`\r\n };\r\n \r\n console.log('🔄 Native Transaction:', {\r\n amount: paymentData.totalAmount,\r\n to: recipientAddress\r\n });\r\n }\r\n\r\n const txHash = await wallet.sendTransaction(txParams);\r\n \r\n console.log('✅ Transaction successful:', txHash);\r\n setCurrentStep('success');\r\n \r\n // Call success callback\r\n onSuccess?.(paymentData.id, txHash, {\r\n network: selectedNetwork.name,\r\n token: selectedToken.symbol,\r\n amount: paymentData.totalAmount,\r\n method: paymentMethod\r\n });\r\n\r\n } catch (err) {\r\n console.error('Transaction failed:', err);\r\n setError(err.message);\r\n } finally {\r\n setProcessing(false);\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n const isDark = theme === 'dark';\r\n\r\n return (\r\n <div className=\"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50\">\r\n <div className={`rounded-lg shadow-xl max-w-md w-full mx-4 ${isDark ? 'bg-gray-900 text-white' : 'bg-white text-gray-900'}`}>\r\n \r\n {/* Header */}\r\n <div className={`p-4 border-b flex justify-between items-center ${isDark ? 'border-gray-700' : 'border-gray-200'}`}>\r\n <div className=\"text-center flex-1\">\r\n <h2 className=\"text-lg font-semibold\">Pay with Crypto</h2>\r\n {config.amount && (\r\n <p className=\"text-2xl font-bold text-purple-600\">${config.amount.toFixed(2)}</p>\r\n )}\r\n </div>\r\n <button \r\n onClick={onClose} \r\n className={`ml-4 text-gray-500 hover:text-gray-700 ${isDark ? 'hover:text-gray-300' : ''}`}\r\n >\r\n ✕\r\n </button>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"p-4 min-h-[400px]\">\r\n {error && (\r\n <div className=\"mb-4 p-3 bg-red-100 text-red-700 rounded border border-red-200\">\r\n {error}\r\n <button \r\n onClick={() => setError('')}\r\n className=\"ml-2 text-red-500 hover:text-red-700\"\r\n >\r\n ✕\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Step 1: Select Method */}\r\n {currentStep === 'method' && (\r\n <div className=\"space-y-4\">\r\n <h3 className=\"font-medium text-center mb-6\">Choose Payment Method</h3>\r\n <div className=\"space-y-3\">\r\n <button\r\n onClick={() => { setPaymentMethod('wallet'); setCurrentStep('network'); }}\r\n className={`w-full p-4 border-2 rounded-lg hover:border-purple-500 text-left flex items-center space-x-3 transition-colors ${isDark ? 'border-gray-600 hover:bg-gray-800' : 'border-gray-200 hover:bg-gray-50'}`}\r\n >\r\n <span className=\"text-2xl\">🦊</span>\r\n <div>\r\n <div className=\"font-medium\">MetaMask Wallet</div>\r\n <div className={`text-sm ${isDark ? 'text-gray-400' : 'text-gray-500'}`}>Connect and pay instantly</div>\r\n </div>\r\n </button>\r\n <button\r\n onClick={() => { setPaymentMethod('qr'); setCurrentStep('network'); }}\r\n className={`w-full p-4 border-2 rounded-lg hover:border-purple-500 text-left flex items-center space-x-3 transition-colors ${isDark ? 'border-gray-600 hover:bg-gray-800' : 'border-gray-200 hover:bg-gray-50'}`}\r\n >\r\n <span className=\"text-2xl\">📱</span>\r\n <div>\r\n <div className=\"font-medium\">QR Code</div>\r\n <div className={`text-sm ${isDark ? 'text-gray-400' : 'text-gray-500'}`}>Scan with mobile wallet</div>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Step 2: Select Network */}\r\n {currentStep === 'network' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center space-x-2\">\r\n <button \r\n onClick={() => setCurrentStep('method')} \r\n className={`${isDark ? 'text-gray-400 hover:text-gray-200' : 'text-gray-500 hover:text-gray-700'}`}\r\n >\r\n ←\r\n </button>\r\n <h3 className=\"font-medium\">Select Network</h3>\r\n </div>\r\n <div className=\"space-y-2\">\r\n {networks.map((network) => (\r\n <button\r\n key={network.id}\r\n onClick={() => { setSelectedNetwork(network); setCurrentStep('token'); }}\r\n className={`w-full p-3 border rounded-lg hover:border-purple-500 text-left transition-colors ${isDark ? 'border-gray-600 hover:bg-gray-800' : 'border-gray-200 hover:bg-gray-50'}`}\r\n >\r\n <div className=\"font-medium\">{network.name}</div>\r\n <div className={`text-sm ${isDark ? 'text-gray-400' : 'text-gray-500'}`}>{network.shortName.toUpperCase()}</div>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Step 3: Select Token */}\r\n {currentStep === 'token' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center space-x-2\">\r\n <button \r\n onClick={() => setCurrentStep('network')} \r\n className={`${isDark ? 'text-gray-400 hover:text-gray-200' : 'text-gray-500 hover:text-gray-700'}`}\r\n >\r\n ←\r\n </button>\r\n <h3 className=\"font-medium\">Select Token on {selectedNetwork?.name}</h3>\r\n </div>\r\n <div className=\"space-y-2\">\r\n {tokens\r\n .filter(token => token.Network?.shortName === selectedNetwork?.shortName)\r\n .map((token) => (\r\n <button\r\n key={token.id}\r\n onClick={() => { setSelectedToken(token); createPayment(); }}\r\n disabled={loading}\r\n className={`w-full p-3 border rounded-lg hover:border-purple-500 text-left flex justify-between transition-colors disabled:opacity-50 ${isDark ? 'border-gray-600 hover:bg-gray-800' : 'border-gray-200 hover:bg-gray-50'}`}\r\n >\r\n <div>\r\n <div className=\"font-medium\">{token.name}</div>\r\n <div className={`text-sm ${isDark ? 'text-gray-400' : 'text-gray-500'}`}>{token.symbol}</div>\r\n </div>\r\n {token.isStablecoin && (\r\n <span className=\"px-2 py-1 bg-green-100 text-green-600 text-xs rounded\">\r\n Stablecoin\r\n </span>\r\n )}\r\n </button>\r\n ))\r\n }\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Step 4: Wallet Connect & Pay */}\r\n {currentStep === 'wallet' && (\r\n <div className=\"space-y-4\">\r\n <h3 className=\"font-medium text-center\">Connect & Pay</h3>\r\n \r\n {!walletConnected ? (\r\n <div className=\"text-center space-y-4\">\r\n <div className=\"w-16 h-16 bg-purple-100 rounded-full flex items-center justify-center mx-auto\">\r\n <span className=\"text-2xl\">🦊</span>\r\n </div>\r\n <p className={`${isDark ? 'text-gray-300' : 'text-gray-600'}`}>Connect MetaMask to continue</p>\r\n <button\r\n onClick={connectWallet}\r\n disabled={loading}\r\n className=\"w-full bg-purple-600 text-white py-3 px-4 rounded-lg hover:bg-purple-700 disabled:opacity-50 font-medium\"\r\n >\r\n {loading ? 'Connecting...' : 'Connect MetaMask'}\r\n </button>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-4\">\r\n <div className=\"p-3 bg-green-50 rounded-lg border border-green-200\">\r\n <p className=\"text-green-600 text-sm font-medium\">✅ Wallet Connected</p>\r\n <p className=\"font-mono text-xs text-green-700 mt-1\">{wallet.account?.slice(0, 6)}...{wallet.account?.slice(-4)}</p>\r\n </div>\r\n \r\n <div className={`p-4 rounded-lg space-y-2 ${isDark ? 'bg-gray-800' : 'bg-gray-50'}`}>\r\n <div className=\"flex justify-between text-sm\">\r\n <span>Amount:</span>\r\n <span className=\"font-medium\">{paymentData?.totalAmount} {selectedToken?.symbol}</span>\r\n </div>\r\n <div className=\"flex justify-between text-sm\">\r\n <span>Network:</span>\r\n <span className=\"font-medium\">{selectedNetwork?.name}</span>\r\n </div>\r\n <div className=\"flex justify-between text-sm\">\r\n <span>Token:</span>\r\n <span className=\"font-medium\">{selectedToken?.name}</span>\r\n </div>\r\n </div>\r\n\r\n <button\r\n onClick={sendTransaction}\r\n disabled={processing}\r\n className=\"w-full bg-green-600 text-white py-3 px-4 rounded-lg hover:bg-green-700 disabled:opacity-50 font-medium flex items-center justify-center space-x-2\"\r\n >\r\n {processing ? (\r\n <>\r\n <div className=\"animate-spin rounded-full h-4 w-4 border-b-2 border-white\"></div>\r\n <span>Sending Transaction...</span>\r\n </>\r\n ) : (\r\n <span>Send {paymentData?.totalAmount} {selectedToken?.symbol}</span>\r\n )}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* QR Code Step */}\r\n {currentStep === 'qr' && (\r\n <div className=\"text-center space-y-4\">\r\n <h3 className=\"font-medium\">Scan QR Code</h3>\r\n <div className={`p-8 rounded-lg ${isDark ? 'bg-gray-800' : 'bg-gray-100'}`}>\r\n <p className={`${isDark ? 'text-gray-400' : 'text-gray-500'}`}>QR Code will appear here</p>\r\n <p className=\"text-xs mt-2\">Send {paymentData?.totalAmount} {selectedToken?.symbol}</p>\r\n <p className=\"text-xs\">to merchant wallet</p>\r\n </div>\r\n <p className={`text-xs ${isDark ? 'text-gray-400' : 'text-gray-500'}`}>\r\n Waiting for payment confirmation...\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Success */}\r\n {currentStep === 'success' && (\r\n <div className=\"text-center space-y-4\">\r\n <div className=\"w-16 h-16 bg-green-100 rounded-full flex items-center justify-center mx-auto\">\r\n <span className=\"text-2xl\">✅</span>\r\n </div>\r\n <h3 className=\"font-medium text-green-600\">Payment Successful!</h3>\r\n <p className={`text-sm ${isDark ? 'text-gray-300' : 'text-gray-600'}`}>\r\n Your transaction has been sent successfully\r\n </p>\r\n <button\r\n onClick={onClose}\r\n className=\"w-full bg-purple-600 text-white py-3 px-4 rounded-lg hover:bg-purple-700 font-medium\"\r\n >\r\n Close\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Loading Spinner */}\r\n {loading && currentStep !== 'wallet' && (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-purple-600\"></div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default SimpleCoinleyPayment;","// // Main SDK exports\r\n// export {\r\n// CoinleyProvider,\r\n// CoinleyCheckout,\r\n// ThemeProvider,\r\n// useCoinley\r\n// } from './CoinleyProvider';\r\n\r\n// export { PaymentAPI } from './PaymentAPI';\r\n// export { default as CoinleyPayment } from './CoinleyPayment';\r\n\r\n// // Import styles\r\n// import './styles/index.css';\r\n\r\n// // Version\r\n// export const VERSION = '0.0.0';\r\n\r\n// // Utils\r\n// export const utils = {\r\n// formatAmount: (amount, decimals = 2) => amount.toFixed(decimals),\r\n \r\n// truncateAddress: (address, startChars = 6, endChars = 4) => {\r\n// if (!address) return '';\r\n// if (address.length <= startChars + endChars) return address;\r\n// return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\r\n// },\r\n\r\n// isValidAddress: (address, network) => {\r\n// if (!address) return false;\r\n \r\n// switch (network.toLowerCase()) {\r\n// case 'ethereum':\r\n// case 'bsc':\r\n// case 'polygon':\r\n// return /^0x[a-fA-F0-9]{40}$/.test(address);\r\n// case 'tron':\r\n// return /^T[a-zA-Z0-9]{33}$/.test(address);\r\n// case 'solana':\r\n// return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(address);\r\n// default:\r\n// return address.length > 0;\r\n// }\r\n// },\r\n\r\n// copyToClipboard: async (text) => {\r\n// try {\r\n// await navigator.clipboard.writeText(text);\r\n// return true;\r\n// } catch {\r\n// return false;\r\n// }\r\n// }\r\n// };\r\n\r\n// // Error classes\r\n// export class CoinleyError extends Error {\r\n// constructor(message, code) {\r\n// super(message);\r\n// this.name = 'CoinleyError';\r\n// this.code = code;\r\n// }\r\n// }\r\n\r\n// // Default config\r\n// export const DEFAULT_CONFIG = {\r\n// theme: 'light',\r\n// debug: false,\r\n// testMode: false,\r\n// autoOpen: false\r\n// };\r\n\r\n\r\n\r\n\r\n// src/index.js - Updated exports for coinley-test SDK\r\n\r\n// Original exports (keep these for backward compatibility)\r\nexport {\r\n CoinleyProvider,\r\n CoinleyCheckout,\r\n ThemeProvider,\r\n useCoinley\r\n} from './CoinleyProvider';\r\n\r\nexport { PaymentAPI } from './PaymentAPI';\r\nexport { default as CoinleyPayment } from './CoinleyPayment';\r\n\r\n// NEW: Simple payment component (the one that actually works)\r\nexport { default as SimpleCoinleyPayment } from './components/SimpleCoinleyPayment';\r\n\r\n// NEW: Simple provider for the new component\r\nexport const SimpleCoinleyProvider = ({ children, ...props }) => children;\r\n\r\n// Import styles\r\nimport './styles/index.css';\r\n\r\n// Version\r\nexport const VERSION = '0.0.1';\r\n\r\n// Utils\r\nexport const utils = {\r\n formatAmount: (amount, decimals = 2) => amount.toFixed(decimals),\r\n \r\n truncateAddress: (address, startChars = 6, endChars = 4) => {\r\n if (!address) return '';\r\n if (address.length <= startChars + endChars) return address;\r\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\r\n },\r\n \r\n isValidAddress: (address, network) => {\r\n if (!address) return false;\r\n \r\n switch (network.toLowerCase()) {\r\n case 'ethereum':\r\n case 'bsc':\r\n case 'polygon':\r\n return /^0x[a-fA-F0-9]{40}$/.test(address);\r\n case 'tron':\r\n return /^T[a-zA-Z0-9]{33}$/.test(address);\r\n case 'solana':\r\n return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(address);\r\n default:\r\n return address.length > 0;\r\n }\r\n },\r\n \r\n copyToClipboard: async (text) => {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n};\r\n\r\n// Error classes\r\nexport class CoinleyError extends Error {\r\n constructor(message, code) {\r\n super(message);\r\n this.name = 'CoinleyError';\r\n this.code = code;\r\n }\r\n}\r\n\r\n// Default config\r\nexport const DEFAULT_CONFIG = {\r\n theme: 'light',\r\n debug: false,\r\n testMode: false,\r\n autoOpen: false\r\n};"],"names":["require$$0","jsxRuntimeModule","jsxs","jsx","Fragment","error","_a","_b"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/jsx-runtime.js","../src/PaymentAPI.js","../src/CoinleyPayment.jsx","../src/CoinleyProvider.jsx","../src/components/SimpleCoinleyPayment.jsx","../src/components/EnhancedSimpleCoinleyPayment.jsx","../src/index.js"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","//src/PaymentAPI.js - coinley-test\r\nimport axios from 'axios';\r\n\r\nexport class PaymentAPI {\r\n constructor(baseURL, apiKey, apiSecret) {\r\n this.apiKey = apiKey;\r\n this.apiSecret = apiSecret;\r\n\r\n this.api = axios.create({\r\n baseURL: baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL,\r\n timeout: 30000,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n // Add request interceptor\r\n this.api.interceptors.request.use(\r\n (config) => {\r\n config.headers['X-API-Key'] = this.apiKey;\r\n config.headers['X-API-Secret'] = this.apiSecret;\r\n \r\n const token = this.generateMerchantToken();\r\n if (token) {\r\n config.headers['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n console.log('API Request:', {\r\n method: config.method?.toUpperCase(),\r\n url: config.url,\r\n data: config.data\r\n });\r\n\r\n return config;\r\n },\r\n (error) => {\r\n console.error('Request interceptor error:', error);\r\n return Promise.reject(error);\r\n }\r\n );\r\n\r\n // Add response interceptor\r\n this.api.interceptors.response.use(\r\n (response) => {\r\n console.log('API Response:', {\r\n status: response.status,\r\n url: response.config.url,\r\n data: response.data\r\n });\r\n return response;\r\n },\r\n (error) => {\r\n console.error('API Error:', {\r\n status: error.response?.status,\r\n data: error.response?.data,\r\n message: error.message\r\n });\r\n\r\n if (error.response?.status === 401) {\r\n throw new Error('Authentication failed. Please check your API credentials.');\r\n } else if (error.response?.status === 404) {\r\n throw new Error('API endpoint not found. Please check your API URL.');\r\n } else if (error.response?.status >= 500) {\r\n throw new Error('Server error. Please try again later.');\r\n }\r\n\r\n throw error;\r\n }\r\n );\r\n }\r\n\r\n generateMerchantToken() {\r\n try {\r\n const credentials = `${this.apiKey}:${this.apiSecret}`;\r\n return btoa(credentials);\r\n } catch (error) {\r\n console.error('Failed to generate token:', error);\r\n return null;\r\n }\r\n }\r\n\r\n async createPayment(params) {\r\n try {\r\n const response = await this.api.post('/api/payments/create', params);\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to create payment');\r\n }\r\n }\r\n\r\n async getPayment(paymentId) {\r\n try {\r\n const response = await this.api.get(`/api/payments/${paymentId}`);\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to get payment details');\r\n }\r\n }\r\n\r\n async getNetworks() {\r\n try {\r\n const response = await this.api.get('/api/networks');\r\n return response.data;\r\n } catch (error) {\r\n console.error('Get networks failed:', error);\r\n \r\n // Return fallback networks\r\n return {\r\n networks: [\r\n {\r\n id: 'ethereum',\r\n name: 'Ethereum',\r\n shortName: 'ethereum',\r\n chainId: '1',\r\n type: 'ethereum',\r\n explorerUrl: 'https://etherscan.io',\r\n isTestnet: false,\r\n },\r\n {\r\n id: 'bsc',\r\n name: 'Binance Smart Chain',\r\n shortName: 'bsc',\r\n chainId: '56',\r\n type: 'bsc',\r\n explorerUrl: 'https://bscscan.com',\r\n isTestnet: false,\r\n },\r\n {\r\n id: 'polygon',\r\n name: 'Polygon',\r\n shortName: 'polygon',\r\n chainId: '137',\r\n type: 'ethereum',\r\n explorerUrl: 'https://polygonscan.com',\r\n isTestnet: false,\r\n },\r\n ]\r\n };\r\n }\r\n }\r\n\r\n async getStablecoins() {\r\n try {\r\n const response = await this.api.get('/api/networks/stablecoins');\r\n return response.data;\r\n } catch (error) {\r\n console.error('Get stablecoins failed:', error);\r\n \r\n // Return fallback stablecoins\r\n return {\r\n stablecoins: [\r\n {\r\n id: 'usdt-eth',\r\n name: 'Tether USD',\r\n symbol: 'USDT',\r\n contractAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n decimals: 6,\r\n isStablecoin: true,\r\n networkId: 'ethereum',\r\n Network: {\r\n id: 'ethereum',\r\n name: 'Ethereum',\r\n shortName: 'ethereum',\r\n type: 'ethereum',\r\n }\r\n },\r\n {\r\n id: 'usdc-eth',\r\n name: 'USD Coin',\r\n symbol: 'USDC',\r\n contractAddress: '0xA0b86a33E6441d81d0B93bF9EE0f74ca32F7e6f6',\r\n decimals: 6,\r\n isStablecoin: true,\r\n networkId: 'ethereum',\r\n Network: {\r\n id: 'ethereum',\r\n name: 'Ethereum',\r\n shortName: 'ethereum',\r\n type: 'ethereum',\r\n }\r\n }\r\n ]\r\n };\r\n }\r\n }\r\n\r\n async verifyQRPayment(paymentId) {\r\n try {\r\n const response = await this.api.post('/api/payments/verify-qr', {\r\n paymentId\r\n });\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to verify payment');\r\n }\r\n }\r\n\r\n async processPayment(paymentId, transactionHash, network, senderAddress) {\r\n try {\r\n const response = await this.api.post('/api/payments/process', {\r\n paymentId,\r\n transactionHash,\r\n network,\r\n senderAddress\r\n });\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to process payment');\r\n }\r\n }\r\n\r\n async healthCheck() {\r\n try {\r\n const response = await this.api.get('/api/health');\r\n return response.status === 200;\r\n } catch (error) {\r\n console.error('Health check failed:', error);\r\n return false;\r\n }\r\n }\r\n}","//src/CoinleyPayment.jsx\r\nimport React, { useState, useEffect, useRef } from 'react';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport {\r\n Wallet,\r\n QrCode,\r\n ChevronDown,\r\n Copy,\r\n Check,\r\n X,\r\n ArrowLeft,\r\n Loader2,\r\n ExternalLink,\r\n AlertCircle,\r\n CheckCircle2,\r\n Zap,\r\n Sparkles\r\n} from 'lucide-react';\r\n// import QRCodeLib from 'qrcode';\r\nimport {\r\n createCoinleyWalletConfig,\r\n CoinleyWalletProvider,\r\n ConnectButton,\r\n WalletModal,\r\n useWallet,\r\n useWalletConnect,\r\n useWalletTransaction,\r\n useWalletModal,\r\n useWalletDetection\r\n} from '@coinley/wallet-connect-core';\r\nimport { PaymentAPI } from './PaymentAPI';\r\n\r\n// Wallet Integration Component\r\nconst WalletIntegration = ({\r\n selectedNetwork,\r\n selectedToken,\r\n paymentData,\r\n config,\r\n onTransactionSent,\r\n onError,\r\n isConnecting,\r\n setIsConnecting\r\n}) => {\r\n const { isConnected, address, disconnect } = useWallet();\r\n const { connectWallet, isPending } = useWalletConnect();\r\n const { detectedWallets, hasWallets, walletCount } = useWalletDetection();\r\n const { sendTransaction } = useWalletTransaction();\r\n const { openModal } = useWalletModal();\r\n\r\n // Filter wallets to only show Ethereum-compatible ones\r\n const ethereumWallets = detectedWallets.filter(wallet => \r\n wallet.name.toLowerCase().includes('metamask') || \r\n wallet.provider === 'injected' ||\r\n wallet.name.toLowerCase().includes('coinbase') ||\r\n wallet.name.toLowerCase().includes('wallet connect')\r\n );\r\n\r\n const handleConnectSpecificWallet = async (walletType) => {\r\n try {\r\n setIsConnecting(true);\r\n \r\n // Disconnect any existing connections first\r\n if (isConnected) {\r\n await disconnect();\r\n // Wait a bit for disconnection to complete\r\n await new Promise(resolve => setTimeout(resolve, 1000));\r\n }\r\n\r\n // For MetaMask, try to connect directly to window.ethereum\r\n if (walletType === 'metamask' && window.ethereum && window.ethereum.isMetaMask) {\r\n try {\r\n // Direct MetaMask connection\r\n await window.ethereum.request({ method: 'eth_requestAccounts' });\r\n console.log('✅ Connected directly to MetaMask');\r\n } catch (error) {\r\n console.error('MetaMask connection failed:', error);\r\n throw error;\r\n }\r\n } else {\r\n // Use the library's connect function\r\n await connectWallet(walletType);\r\n }\r\n } catch (error) {\r\n console.error('Wallet connection failed:', error);\r\n onError(error.message || 'Failed to connect wallet');\r\n } finally {\r\n setIsConnecting(false);\r\n }\r\n };\r\n\r\n // Alternative: Try opening the modal directly\r\n const handleOpenModal = () => {\r\n try {\r\n console.log('Attempting to open wallet modal...');\r\n openModal();\r\n } catch (error) {\r\n console.error('Failed to open modal:', error);\r\n // Fallback: try direct wallet connection\r\n handleConnectSpecificWallet('injected');\r\n }\r\n };\r\n\r\n const handleSendPayment = async () => {\r\n if (!isConnected || !paymentData || !selectedToken) {\r\n onError('Wallet not connected or payment data missing');\r\n return;\r\n }\r\n\r\n try {\r\n setIsConnecting(true);\r\n\r\n console.log('🔍 Transaction Debug:');\r\n console.log('Connected wallet address:', address);\r\n console.log('Payment data:', paymentData);\r\n console.log('Selected token:', selectedToken);\r\n console.log('Selected network:', selectedNetwork);\r\n\r\n // Use the merchant's wallet address from the payment data as the recipient\r\n let recipientAddress = paymentData.metadata?.recipientWallet;\r\n\r\n console.log('Merchant recipient address:', recipientAddress);\r\n\r\n if (!recipientAddress || typeof recipientAddress !== 'string') {\r\n throw new Error('Merchant wallet address not found in payment data');\r\n }\r\n\r\n // Validate Ethereum address format\r\n if (!recipientAddress.match(/^0x[a-fA-F0-9]{40}$/)) {\r\n throw new Error(`Invalid merchant address format: ${recipientAddress}`);\r\n }\r\n\r\n let txHash;\r\n\r\n if (selectedToken.contractAddress) {\r\n // ERC-20 Token Transaction\r\n console.log('🔍 ERC-20 Transaction Details:');\r\n console.log('Token contract:', selectedToken.contractAddress);\r\n console.log('Token decimals:', selectedToken.decimals);\r\n console.log('Payment amount:', paymentData.totalAmount);\r\n\r\n const decimals = selectedToken.decimals || 6;\r\n const amount = Math.floor(paymentData.totalAmount * Math.pow(10, decimals));\r\n \r\n console.log('Calculated amount (with decimals):', amount);\r\n\r\n // ERC-20 transfer encoding\r\n const methodId = '0xa9059cbb';\r\n const addressWithoutPrefix = recipientAddress.slice(2);\r\n const recipientPadded = addressWithoutPrefix.toLowerCase().padStart(64, '0');\r\n const amountPadded = amount.toString(16).padStart(64, '0');\r\n \r\n const transferData = `${methodId}${recipientPadded}${amountPadded}`;\r\n\r\n console.log('🔍 Transaction Data:');\r\n console.log('Method ID:', methodId);\r\n console.log('Recipient (padded):', recipientPadded);\r\n console.log('Amount (padded):', amountPadded);\r\n console.log('Full data:', transferData);\r\n\r\n const txParams = {\r\n to: selectedToken.contractAddress,\r\n data: transferData,\r\n value: '0x0'\r\n };\r\n\r\n console.log('📤 Sending ERC-20 transaction:', txParams);\r\n txHash = await sendTransaction(txParams);\r\n } else {\r\n // Native Token Transaction\r\n const value = Math.floor(paymentData.totalAmount * Math.pow(10, 18));\r\n const valueHex = `0x${value.toString(16)}`;\r\n\r\n const txParams = {\r\n to: recipientAddress,\r\n value: valueHex\r\n };\r\n\r\n console.log('📤 Sending native transaction:', txParams);\r\n txHash = await sendTransaction(txParams);\r\n }\r\n\r\n if (txHash) {\r\n console.log('✅ Transaction sent successfully:', txHash);\r\n onTransactionSent(txHash);\r\n }\r\n } catch (error) {\r\n console.error('❌ Transaction failed:', error);\r\n onError(error.message || 'Transaction failed');\r\n } finally {\r\n setIsConnecting(false);\r\n }\r\n };\r\n\r\n const handleDisconnect = async () => {\r\n try {\r\n await disconnect();\r\n } catch (error) {\r\n console.error('Disconnect error:', error);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"text-center space-y-6\">\r\n <div className=\"space-y-4\">\r\n <div className=\"w-16 h-16 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center mx-auto\">\r\n <Wallet className=\"w-8 h-8 text-[#7042D2]\" />\r\n </div>\r\n \r\n {!isConnected ? (\r\n <>\r\n <h3 className=\"text-lg font-semibold\">\r\n Connect Your Wallet\r\n </h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 text-sm\">\r\n Choose your preferred wallet to complete the payment\r\n </p>\r\n \r\n <div className=\"space-y-3\">\r\n {/* MetaMask Button */}\r\n <button\r\n onClick={() => handleConnectSpecificWallet('metamask')}\r\n disabled={isPending || isConnecting}\r\n className=\"w-full p-3 border border-gray-300 rounded-lg hover:border-[#7042D2] flex items-center space-x-3 transition-colors disabled:opacity-50\"\r\n >\r\n <span className=\"text-xl\">🦊</span>\r\n <div className=\"text-left flex-1\">\r\n <div className=\"font-medium\">MetaMask</div>\r\n <div className=\"text-xs text-gray-500\">Connect with MetaMask</div>\r\n </div>\r\n </button>\r\n\r\n {/* Generic Wallet Button */}\r\n <button\r\n onClick={handleOpenModal}\r\n disabled={isPending || isConnecting}\r\n className=\"w-full p-3 border border-gray-300 rounded-lg hover:border-[#7042D2] flex items-center space-x-3 transition-colors disabled:opacity-50\"\r\n >\r\n <span className=\"text-xl\">💼</span>\r\n <div className=\"text-left flex-1\">\r\n <div className=\"font-medium\">Other Wallets</div>\r\n <div className=\"text-xs text-gray-500\">Choose from available wallets</div>\r\n </div>\r\n </button>\r\n\r\n {/* Manual Connection Fallback */}\r\n <button\r\n onClick={() => handleConnectSpecificWallet('injected')}\r\n disabled={isPending || isConnecting}\r\n className=\"w-full p-2 text-sm border border-dashed border-gray-300 rounded-lg hover:border-[#7042D2] transition-colors disabled:opacity-50\"\r\n >\r\n Try Direct Connection\r\n </button>\r\n </div>\r\n\r\n {isConnecting && (\r\n <div className=\"flex items-center justify-center space-x-2 text-gray-600\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n <span>Connecting...</span>\r\n </div>\r\n )}\r\n </>\r\n ) : (\r\n <>\r\n <h3 className=\"text-lg font-semibold text-green-600\">\r\n Wallet Connected ✅\r\n </h3>\r\n \r\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4 space-y-3\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Address:</span>\r\n <div className=\"flex items-center space-x-2\">\r\n <span className=\"font-mono text-sm\">\r\n {address?.slice(0, 6)}...{address?.slice(-4)}\r\n </span>\r\n <button\r\n onClick={handleDisconnect}\r\n className=\"text-xs text-red-600 hover:text-red-800\"\r\n >\r\n Disconnect\r\n </button>\r\n </div>\r\n </div>\r\n \r\n {paymentData && (\r\n <>\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Amount:</span>\r\n <span className=\"font-medium\">{paymentData.totalAmount} {selectedToken?.symbol}</span>\r\n </div>\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Network:</span>\r\n <span className=\"font-medium\">{selectedNetwork?.name}</span>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Payment Button */}\r\n <button\r\n onClick={handleSendPayment}\r\n disabled={isConnecting}\r\n className=\"w-full bg-[#7042D2] text-white py-4 rounded-lg font-semibold hover:bg-[#7042D2]/90 transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center space-x-2\"\r\n >\r\n {isConnecting ? (\r\n <>\r\n <Loader2 className=\"w-5 h-5 animate-spin\" />\r\n <span>Processing Payment...</span>\r\n </>\r\n ) : (\r\n <>\r\n <Zap className=\"w-5 h-5\" />\r\n <span>Send Payment</span>\r\n </>\r\n )}\r\n </button>\r\n\r\n <p className=\"text-xs text-gray-500\">\r\n Make sure you have enough {selectedToken?.symbol} and ETH for gas fees\r\n </p>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nconst CoinleyPayment = ({\r\n apiKey,\r\n apiSecret,\r\n apiUrl = 'http://localhost:9000',\r\n onSuccess,\r\n onError,\r\n onClose,\r\n isOpen,\r\n config,\r\n theme = 'light',\r\n merchantName,\r\n debug = false\r\n}) => {\r\n // State management\r\n const [currentStep, setCurrentStep] = useState('select-method');\r\n const [networks, setNetworks] = useState([]);\r\n const [tokens, setTokens] = useState([]);\r\n const [selectedNetwork, setSelectedNetwork] = useState(null);\r\n const [selectedToken, setSelectedToken] = useState(null);\r\n const [paymentMethod, setPaymentMethod] = useState(null);\r\n const [qrCode, setQrCode] = useState('');\r\n const [paymentData, setPaymentData] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState('');\r\n const [copied, setCopied] = useState(false);\r\n const [txHash, setTxHash] = useState('');\r\n const [isConnecting, setIsConnecting] = useState(false);\r\n\r\n // Services\r\n const paymentAPI = useRef(new PaymentAPI(apiUrl, apiKey, apiSecret));\r\n\r\n // Wallet configuration - Fixed to use proper chain configuration\r\n const walletConfig = createCoinleyWalletConfig({\r\n appName: merchantName || 'Coinley Payment',\r\n appDescription: 'Crypto payment processing',\r\n // Fix: Provide proper chain configurations instead of just IDs\r\n chains: [\r\n {\r\n id: 1,\r\n name: 'Ethereum',\r\n network: 'ethereum',\r\n rpcUrls: {\r\n default: { http: ['https://eth.llamarpc.com'] }\r\n },\r\n nativeCurrency: {\r\n name: 'Ethereum',\r\n symbol: 'ETH',\r\n decimals: 18\r\n }\r\n },\r\n {\r\n id: 56,\r\n name: 'BNB Smart Chain',\r\n network: 'bsc',\r\n rpcUrls: {\r\n default: { http: ['https://bsc-dataseed1.binance.org'] }\r\n },\r\n nativeCurrency: {\r\n name: 'BNB',\r\n symbol: 'BNB',\r\n decimals: 18\r\n }\r\n }\r\n ]\r\n });\r\n\r\n // Initialize\r\n useEffect(() => {\r\n if (isOpen) {\r\n initializePayment();\r\n }\r\n }, [isOpen]);\r\n\r\n const initializePayment = async () => {\r\n try {\r\n setLoading(true);\r\n setError('');\r\n\r\n const [networksRes, tokensRes] = await Promise.all([\r\n paymentAPI.current.getNetworks(),\r\n paymentAPI.current.getStablecoins()\r\n ]);\r\n\r\n setNetworks(networksRes.networks || []);\r\n setTokens(tokensRes.stablecoins || []);\r\n\r\n if (debug) {\r\n console.log('Initialized networks:', networksRes.networks);\r\n console.log('Initialized tokens:', tokensRes.stablecoins);\r\n }\r\n } catch (err) {\r\n console.error('Failed to initialize payment:', err);\r\n setError('Failed to load payment options. Please try again.');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleMethodSelect = (method) => {\r\n setPaymentMethod(method);\r\n setCurrentStep('select-network');\r\n };\r\n\r\n const handleNetworkSelect = async (network) => {\r\n setSelectedNetwork(network);\r\n\r\n // Get available tokens for this network\r\n const networkTokens = tokens.filter(token =>\r\n token.Network?.shortName === network.shortName || token.networkId === network.id\r\n );\r\n\r\n if (networkTokens.length > 1) {\r\n // Multiple tokens available - let user choose\r\n setCurrentStep('select-token');\r\n } else if (networkTokens.length === 1) {\r\n // Only one token available - auto-select and proceed\r\n const token = networkTokens[0];\r\n setSelectedToken(token);\r\n await initiatePayment(network, token);\r\n } else {\r\n // No tokens available for this network\r\n setError(`No supported tokens found for ${network.name}`);\r\n setCurrentStep('error');\r\n }\r\n };\r\n\r\n const handleTokenSelect = async (token) => {\r\n setSelectedToken(token);\r\n await initiatePayment(selectedNetwork, token);\r\n };\r\n\r\n const initiatePayment = async (network, token) => {\r\n try {\r\n setLoading(true);\r\n\r\n const paymentPayload = {\r\n amount: config.amount,\r\n currency: token.symbol,\r\n network: network.shortName,\r\n customerEmail: config.customerEmail,\r\n callbackUrl: config.callbackUrl,\r\n metadata: {\r\n ...config.metadata,\r\n paymentMethod,\r\n selectedNetwork: network.shortName,\r\n selectedToken: token.symbol,\r\n // Add the merchant wallet addresses to metadata\r\n merchantWalletAddresses: config.merchantWalletAddresses\r\n }\r\n };\r\n\r\n console.log('🔍 Payment payload with merchant wallets:', paymentPayload);\r\n\r\n const payment = await paymentAPI.current.createPayment(paymentPayload);\r\n setPaymentData(payment.payment);\r\n\r\n if (paymentMethod === 'wallet') {\r\n setCurrentStep('wallet-connect');\r\n } else {\r\n await generateQRCode(payment.payment);\r\n setCurrentStep('qr-code');\r\n }\r\n } catch (err) {\r\n console.error('Payment initiation failed:', err);\r\n setError(err.message || 'Failed to create payment');\r\n setCurrentStep('error');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const generateQRCode = async (payment) => {\r\n try {\r\n const recipientAddress = payment.metadata?.recipientWallet ||\r\n config.merchantWalletAddresses?.[selectedNetwork?.shortName || ''];\r\n\r\n if (!recipientAddress) {\r\n throw new Error('Recipient wallet address not found');\r\n }\r\n\r\n let qrData = '';\r\n\r\n if (selectedNetwork?.type === 'ethereum' || selectedNetwork?.type === 'bsc') {\r\n qrData = selectedToken?.contractAddress\r\n ? `ethereum:${selectedToken.contractAddress}/transfer?address=${recipientAddress}&uint256=${payment.totalAmount * Math.pow(10, selectedToken.decimals)}`\r\n : `ethereum:${recipientAddress}?value=${payment.totalAmount}e18`;\r\n } else if (selectedNetwork?.type === 'tron') {\r\n qrData = `tron:${recipientAddress}?amount=${payment.totalAmount}`;\r\n } else {\r\n qrData = `${selectedToken?.symbol}:${recipientAddress}?amount=${payment.totalAmount}`;\r\n }\r\n\r\n // For now, just set the recipient address since QRCodeLib is commented out\r\n setQrCode(recipientAddress);\r\n startPaymentVerification(payment.id);\r\n\r\n } catch (err) {\r\n console.error('QR code generation failed:', err);\r\n setError('Failed to generate QR code');\r\n setCurrentStep('error');\r\n }\r\n };\r\n\r\n const startPaymentVerification = async (paymentId) => {\r\n const maxAttempts = 60;\r\n let attempts = 0;\r\n\r\n const checkPayment = async () => {\r\n try {\r\n const result = await paymentAPI.current.verifyQRPayment(paymentId);\r\n\r\n if (result.verified && result.payment?.transactionHash) {\r\n setTxHash(result.payment.transactionHash);\r\n await handlePaymentSuccess(paymentId, result.payment.transactionHash);\r\n return true;\r\n }\r\n\r\n attempts++;\r\n if (attempts < maxAttempts) {\r\n setTimeout(checkPayment, 5000);\r\n } else {\r\n setError('Payment verification timeout. Please check your transaction.');\r\n setCurrentStep('error');\r\n }\r\n\r\n return false;\r\n } catch (err) {\r\n console.error('Payment verification error:', err);\r\n attempts++;\r\n if (attempts < maxAttempts) {\r\n setTimeout(checkPayment, 5000);\r\n } else {\r\n setError('Payment verification failed');\r\n setCurrentStep('error');\r\n }\r\n return false;\r\n }\r\n };\r\n\r\n setTimeout(checkPayment, 2000);\r\n };\r\n\r\n const handleTransactionSent = async (transactionHash) => {\r\n setTxHash(transactionHash);\r\n setCurrentStep('processing');\r\n\r\n try {\r\n await paymentAPI.current.processPayment(\r\n paymentData.id,\r\n transactionHash,\r\n selectedNetwork?.shortName || '',\r\n ''\r\n );\r\n\r\n await handlePaymentSuccess(paymentData.id, transactionHash);\r\n } catch (error) {\r\n console.error('Payment processing failed:', error);\r\n await handlePaymentSuccess(paymentData.id, transactionHash);\r\n }\r\n };\r\n\r\n const handlePaymentSuccess = async (paymentId, transactionHash) => {\r\n setCurrentStep('success');\r\n\r\n if (onSuccess) {\r\n onSuccess(paymentId, transactionHash, {\r\n network: selectedNetwork?.name,\r\n token: selectedToken?.symbol,\r\n amount: paymentData?.totalAmount,\r\n method: paymentMethod\r\n });\r\n }\r\n };\r\n\r\n const copyToClipboard = async (text) => {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n }\r\n };\r\n\r\n const handleClose = () => {\r\n setCurrentStep('select-method');\r\n setPaymentMethod(null);\r\n setSelectedNetwork(null);\r\n setSelectedToken(null);\r\n setQrCode('');\r\n setPaymentData(null);\r\n setError('');\r\n setTxHash('');\r\n\r\n if (onClose) {\r\n onClose();\r\n }\r\n };\r\n\r\n const goBack = () => {\r\n if (currentStep === 'select-network') {\r\n setCurrentStep('select-method');\r\n } else if (currentStep === 'select-token') {\r\n setCurrentStep('select-network');\r\n } else if (currentStep === 'wallet-connect' || currentStep === 'qr-code') {\r\n // Go back to token selection if multiple tokens, otherwise network selection\r\n const networkTokens = tokens.filter(token =>\r\n token.Network?.shortName === selectedNetwork?.shortName || token.networkId === selectedNetwork?.id\r\n );\r\n if (networkTokens.length > 1) {\r\n setCurrentStep('select-token');\r\n } else {\r\n setCurrentStep('select-network');\r\n }\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <CoinleyWalletProvider config={walletConfig} walletConfig={{ appName: merchantName || 'Coinley Payment' }}>\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 backdrop-blur-sm\">\r\n <motion.div\r\n initial={{ scale: 0.9, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n exit={{ scale: 0.9, opacity: 0 }}\r\n className={`relative w-full max-w-md mx-4 rounded-2xl shadow-2xl overflow-hidden ${theme === 'dark' ? 'bg-gray-900 text-white' : 'bg-white text-gray-900'\r\n }`}\r\n >\r\n {/* Header */}\r\n <div className=\"relative p-6 border-b border-gray-200 dark:border-gray-700\">\r\n {(currentStep !== 'select-method' && currentStep !== 'success' && currentStep !== 'error') && (\r\n <button\r\n onClick={goBack}\r\n className=\"absolute left-4 top-6 p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5\" />\r\n </button>\r\n )}\r\n\r\n <button\r\n onClick={handleClose}\r\n className=\"absolute right-4 top-6 p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n\r\n <div className=\"text-center\">\r\n <div className=\"flex items-center justify-center space-x-2 mb-2\">\r\n <Sparkles className=\"w-5 h-5 text-[#7042D2]\" />\r\n <h2 className=\"text-xl font-bold\">Pay with Crypto</h2>\r\n <Sparkles className=\"w-5 h-5 text-[#7042D2]\" />\r\n </div>\r\n {merchantName && (\r\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mt-1\">\r\n {merchantName}\r\n </p>\r\n )}\r\n <div className=\"mt-2\">\r\n <span className=\"text-2xl font-bold text-[#7042D2]\">\r\n ${config.amount.toFixed(2)}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"p-6 min-h-[400px]\">\r\n <AnimatePresence mode=\"wait\">\r\n {/* Step 1: Select Payment Method */}\r\n {currentStep === 'select-method' && (\r\n <motion.div\r\n key=\"select-method\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"space-y-4\"\r\n >\r\n <h3 className=\"text-lg font-semibold text-center mb-6\">\r\n Choose Payment Method\r\n </h3>\r\n\r\n <motion.button\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleMethodSelect('wallet')}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n <div className=\"p-3 bg-[#7042D2] bg-opacity-10 rounded-lg group-hover:bg-opacity-20 transition-colors\">\r\n <Wallet className=\"w-6 h-6 text-[#7042D2]\" />\r\n </div>\r\n <div className=\"text-left\">\r\n <div className=\"font-semibold\">Connect Wallet</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n MetaMask, WalletConnect & more\r\n </div>\r\n </div>\r\n <Zap className=\"w-5 h-5 text-[#7042D2] ml-auto\" />\r\n </div>\r\n </motion.button>\r\n\r\n <motion.button\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleMethodSelect('qr')}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n <div className=\"p-3 bg-[#7042D2] bg-opacity-10 rounded-lg group-hover:bg-opacity-20 transition-colors\">\r\n <QrCode className=\"w-6 h-6 text-[#7042D2]\" />\r\n </div>\r\n <div className=\"text-left\">\r\n <div className=\"font-semibold\">QR Code</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n Scan with mobile wallet\r\n </div>\r\n </div>\r\n </div>\r\n </motion.button>\r\n </motion.div>\r\n )}\r\n\r\n {/* Step 2: Select Network */}\r\n {currentStep === 'select-network' && (\r\n <motion.div\r\n key=\"select-network\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"space-y-4\"\r\n >\r\n <h3 className=\"text-lg font-semibold text-center mb-6\">\r\n Select Network\r\n </h3>\r\n\r\n {loading ? (\r\n <div className=\"flex justify-center py-8\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[#7042D2]\" />\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n {networks.map((network) => (\r\n <motion.button\r\n key={network.id}\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleNetworkSelect(network)}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n {network.logo ? (\r\n <img\r\n src={network.logo}\r\n alt={network.name}\r\n className=\"w-8 h-8 rounded-full\"\r\n />\r\n ) : (\r\n <div className=\"w-8 h-8 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center\">\r\n <span className=\"text-sm font-bold text-[#7042D2]\">\r\n {network.shortName.charAt(0).toUpperCase()}\r\n </span>\r\n </div>\r\n )}\r\n <div className=\"text-left flex-1\">\r\n <div className=\"font-semibold\">{network.name}</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n {network.shortName.toUpperCase()}\r\n </div>\r\n </div>\r\n <ChevronDown className=\"w-5 h-5 text-gray-400 transform -rotate-90\" />\r\n </div>\r\n </motion.button>\r\n ))}\r\n </div>\r\n )}\r\n </motion.div>\r\n )}\r\n\r\n {/* Step 3: Select Token */}\r\n {currentStep === 'select-token' && (\r\n <motion.div\r\n key=\"select-token\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"space-y-4\"\r\n >\r\n <h3 className=\"text-lg font-semibold text-center mb-6\">\r\n Select Token on {selectedNetwork?.name}\r\n </h3>\r\n\r\n {loading ? (\r\n <div className=\"flex justify-center py-8\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[#7042D2]\" />\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n {tokens\r\n .filter(token =>\r\n token.Network?.shortName === selectedNetwork?.shortName || \r\n token.networkId === selectedNetwork?.id\r\n )\r\n .map((token) => (\r\n <motion.button\r\n key={token.id}\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleTokenSelect(token)}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n {token.logo ? (\r\n <img\r\n src={token.logo}\r\n alt={token.symbol}\r\n className=\"w-8 h-8 rounded-full\"\r\n />\r\n ) : (\r\n <div className=\"w-8 h-8 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center\">\r\n <span className=\"text-sm font-bold text-[#7042D2]\">\r\n {token.symbol.charAt(0)}\r\n </span>\r\n </div>\r\n )}\r\n <div className=\"text-left flex-1\">\r\n <div className=\"font-semibold\">{token.name}</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n {token.symbol}\r\n {token.isStablecoin && (\r\n <span className=\"ml-2 px-2 py-0.5 bg-green-100 text-green-600 text-xs rounded-full\">\r\n Stablecoin\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <ChevronDown className=\"w-5 h-5 text-gray-400 transform -rotate-90\" />\r\n </div>\r\n </motion.button>\r\n ))\r\n }\r\n </div>\r\n )}\r\n </motion.div>\r\n )}\r\n\r\n {/* Wallet Connect */}\r\n {currentStep === 'wallet-connect' && (\r\n <motion.div\r\n key=\"wallet-connect\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n >\r\n <WalletIntegration\r\n selectedNetwork={selectedNetwork}\r\n selectedToken={selectedToken}\r\n paymentData={paymentData}\r\n config={config} // Pass config to WalletIntegration\r\n onTransactionSent={handleTransactionSent}\r\n onError={setError}\r\n isConnecting={isConnecting}\r\n setIsConnecting={setIsConnecting}\r\n />\r\n </motion.div>\r\n )}\r\n\r\n {/* QR Code */}\r\n {currentStep === 'qr-code' && (\r\n <motion.div\r\n key=\"qr-code\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"space-y-4\">\r\n <h3 className=\"text-lg font-semibold\">Scan QR Code</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Use your mobile wallet to scan and pay\r\n </p>\r\n </div>\r\n\r\n {qrCode && (\r\n <div className=\"bg-white p-4 rounded-xl mx-auto inline-block\">\r\n <div className=\"w-48 h-48 flex items-center justify-center text-gray-500\">\r\n QR Code: {qrCode.slice(0, 10)}...{qrCode.slice(-4)}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {paymentData && (\r\n <div className=\"space-y-3\">\r\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4 space-y-2\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Network:</span>\r\n <span className=\"font-medium\">{selectedNetwork?.name}</span>\r\n </div>\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Amount:</span>\r\n <span className=\"font-medium\">{paymentData.totalAmount} {selectedToken?.symbol}</span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-center justify-center space-x-2 text-sm text-gray-600 dark:text-gray-400\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n <span>Waiting for payment...</span>\r\n </div>\r\n </div>\r\n )}\r\n </motion.div>\r\n )}\r\n\r\n {/* Processing */}\r\n {currentStep === 'processing' && (\r\n <motion.div\r\n key=\"processing\"\r\n initial={{ scale: 0.8, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"w-16 h-16 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center mx-auto\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[#7042D2]\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[#7042D2]\">Processing Payment...</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n Your transaction is being processed\r\n </p>\r\n </div>\r\n </motion.div>\r\n )}\r\n\r\n {/* Success */}\r\n {currentStep === 'success' && (\r\n <motion.div\r\n key=\"success\"\r\n initial={{ scale: 0.8, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"w-16 h-16 bg-green-100 rounded-full flex items-center justify-center mx-auto\">\r\n <CheckCircle2 className=\"w-8 h-8 text-green-500\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-green-600\">Payment Successful!</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n Your payment has been processed successfully\r\n </p>\r\n </div>\r\n\r\n {txHash && (\r\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Transaction:</span>\r\n <div className=\"flex items-center space-x-2\">\r\n <span className=\"font-mono text-sm\">\r\n {txHash.slice(0, 6)}...{txHash.slice(-4)}\r\n </span>\r\n <button\r\n onClick={() => copyToClipboard(txHash)}\r\n className=\"p-1 hover:bg-gray-200 dark:hover:bg-gray-700 rounded\"\r\n >\r\n <Copy className=\"w-4 h-4\" />\r\n </button>\r\n {selectedNetwork?.explorerUrl && (\r\n <a\r\n href={`${selectedNetwork.explorerUrl}/tx/${txHash}`}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"p-1 hover:bg-gray-200 dark:hover:bg-gray-700 rounded\"\r\n >\r\n <ExternalLink className=\"w-4 h-4\" />\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <button\r\n onClick={handleClose}\r\n className=\"w-full bg-[#7042D2] text-white py-3 rounded-lg font-semibold hover:bg-[#7042D2]/90 transition-colors\"\r\n >\r\n Close\r\n </button>\r\n </motion.div>\r\n )}\r\n\r\n {/* Error */}\r\n {currentStep === 'error' && (\r\n <motion.div\r\n key=\"error\"\r\n initial={{ scale: 0.8, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mx-auto\">\r\n <AlertCircle className=\"w-8 h-8 text-red-500\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-red-600\">Payment Failed</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n {error || 'Something went wrong. Please try again.'}\r\n </p>\r\n </div>\r\n\r\n <div className=\"space-y-3\">\r\n <button\r\n onClick={() => {\r\n setCurrentStep('select-method');\r\n setError('');\r\n }}\r\n className=\"w-full bg-[#7042D2] text-white py-3 rounded-lg font-semibold hover:bg-[#7042D2]/90 transition-colors\"\r\n >\r\n Try Again\r\n </button>\r\n <button\r\n onClick={handleClose}\r\n className=\"w-full border border-gray-300 dark:border-gray-600 py-3 rounded-lg font-semibold hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors\"\r\n >\r\n Close\r\n </button>\r\n </div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n\r\n {/* Footer */}\r\n <div className=\"px-6 py-4 border-t border-gray-200 dark:border-gray-700 text-center\">\r\n <p className=\"text-xs text-gray-500\">\r\n Powered by <span className=\"font-semibold text-[#7042D2]\">Coinley</span>\r\n </p>\r\n </div>\r\n </motion.div>\r\n </div>\r\n\r\n <WalletModal />\r\n </CoinleyWalletProvider>\r\n );\r\n};\r\n\r\nexport default CoinleyPayment;","//src/CoinleyProvider.jsx - coinley-test\r\nimport React, { createContext, useContext, useRef, forwardRef, useImperativeHandle } from 'react';\r\nimport CoinleyPayment from './CoinleyPayment';\r\n\r\nconst CoinleyContext = createContext(null);\r\n\r\nexport const CoinleyProvider = ({\r\n apiKey,\r\n apiSecret,\r\n apiUrl,\r\n theme = 'light',\r\n debug = false,\r\n children\r\n}) => {\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n const [paymentConfig, setPaymentConfig] = React.useState(null);\r\n const [callbacks, setCallbacks] = React.useState({});\r\n const [merchantName, setMerchantName] = React.useState('');\r\n\r\n const openPayment = (config, checkoutCallbacks) => {\r\n setPaymentConfig(config);\r\n if (checkoutCallbacks) {\r\n setCallbacks(checkoutCallbacks);\r\n }\r\n setIsOpen(true);\r\n };\r\n\r\n const closePayment = () => {\r\n setIsOpen(false);\r\n setPaymentConfig(null);\r\n if (callbacks.onClose) {\r\n callbacks.onClose();\r\n }\r\n };\r\n\r\n const contextValue = {\r\n openPayment,\r\n closePayment\r\n };\r\n\r\n return (\r\n <CoinleyContext.Provider value={contextValue}>\r\n {children}\r\n {isOpen && paymentConfig && (\r\n <CoinleyPayment\r\n apiKey={apiKey}\r\n apiSecret={apiSecret}\r\n apiUrl={apiUrl}\r\n isOpen={isOpen}\r\n config={paymentConfig}\r\n theme={theme}\r\n debug={debug}\r\n merchantName={merchantName}\r\n onSuccess={callbacks.onSuccess}\r\n onError={callbacks.onError}\r\n onClose={closePayment}\r\n />\r\n )}\r\n </CoinleyContext.Provider>\r\n );\r\n};\r\n\r\nexport const CoinleyCheckout = forwardRef((\r\n {\r\n customerEmail = '',\r\n merchantName = '',\r\n onSuccess,\r\n onError,\r\n onClose,\r\n theme = 'light',\r\n autoOpen = false,\r\n testMode = false,\r\n debug = false,\r\n merchantWalletAddresses = {}\r\n },\r\n ref\r\n) => {\r\n const context = useContext(CoinleyContext);\r\n\r\n if (!context) {\r\n throw new Error('CoinleyCheckout must be used within a CoinleyProvider');\r\n }\r\n\r\n const { openPayment, closePayment } = context;\r\n\r\n const open = (config) => {\r\n try {\r\n if (debug) {\r\n console.log('Opening Coinley checkout with config:', config);\r\n }\r\n\r\n if (!config.amount || config.amount <= 0) {\r\n throw new Error('Amount must be greater than 0');\r\n }\r\n\r\n const finalConfig = {\r\n ...config,\r\n customerEmail: config.customerEmail || customerEmail,\r\n merchantWalletAddresses: {\r\n ...merchantWalletAddresses,\r\n ...config.merchantWalletAddresses\r\n },\r\n metadata: {\r\n ...config.metadata,\r\n testMode,\r\n checkoutVersion: '1.0.0'\r\n }\r\n };\r\n\r\n const checkoutCallbacks = {\r\n onSuccess,\r\n onError,\r\n onClose\r\n };\r\n\r\n openPayment(finalConfig, checkoutCallbacks);\r\n } catch (error) {\r\n console.error('Failed to open Coinley checkout:', error);\r\n if (onError) {\r\n onError(error);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n closePayment();\r\n };\r\n\r\n useImperativeHandle(ref, () => ({\r\n open,\r\n close\r\n }));\r\n\r\n return null;\r\n});\r\n\r\nCoinleyCheckout.displayName = 'CoinleyCheckout';\r\n\r\nexport const useCoinley = () => {\r\n const context = useContext(CoinleyContext);\r\n if (!context) {\r\n throw new Error('useCoinley must be used within a CoinleyProvider');\r\n }\r\n return context;\r\n};\r\n\r\nexport const ThemeProvider = ({\r\n initialTheme = 'light',\r\n children\r\n}) => {\r\n const [theme, setTheme] = React.useState(initialTheme);\r\n\r\n React.useEffect(() => {\r\n document.documentElement.setAttribute('data-coinley-theme', theme);\r\n }, [theme]);\r\n\r\n const toggleTheme = () => {\r\n setTheme(prev => prev === 'light' ? 'dark' : 'light');\r\n };\r\n\r\n return (\r\n <div className={`coinley-theme-${theme}`}>\r\n {children}\r\n </div>\r\n );\r\n};","//src/components/SimpleCoinleyPayment.jsx - in my coinley-test SDK\r\nimport React, { useState, useEffect, useRef } from 'react';\r\n\r\n// Simple Payment API class (reuse your existing PaymentAPI structure)\r\nclass SimplePaymentAPI {\r\n constructor(baseURL, apiKey, apiSecret) {\r\n this.baseURL = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL;\r\n this.apiKey = apiKey;\r\n this.apiSecret = apiSecret;\r\n }\r\n\r\n async request(endpoint, options = {}) {\r\n const url = `${this.baseURL}${endpoint}`;\r\n const headers = {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.apiKey,\r\n 'X-API-Secret': this.apiSecret,\r\n ...options.headers\r\n };\r\n\r\n const response = await fetch(url, {\r\n ...options,\r\n headers\r\n });\r\n\r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({}));\r\n throw new Error(error.error || `HTTP ${response.status}`);\r\n }\r\n\r\n return response.json();\r\n }\r\n\r\n async getNetworks() {\r\n try {\r\n return await this.request('/api/networks');\r\n } catch (error) {\r\n console.error('Failed to fetch networks:', error);\r\n // Fallback networks\r\n return {\r\n networks: [\r\n { id: '1', name: 'Ethereum', shortName: 'ethereum', chainId: '0x1', type: 'ethereum' },\r\n { id: '56', name: 'BSC', shortName: 'bsc', chainId: '0x38', type: 'bsc' }\r\n ]\r\n };\r\n }\r\n }\r\n\r\n async getTokens() {\r\n try {\r\n return await this.request('/api/networks/stablecoins');\r\n } catch (error) {\r\n console.error('Failed to fetch tokens:', error);\r\n // Fallback tokens\r\n return {\r\n stablecoins: [\r\n {\r\n id: '1', name: 'Tether USD', symbol: 'USDT',\r\n contractAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n decimals: 6, networkId: '1',\r\n Network: { shortName: 'ethereum', name: 'Ethereum' }\r\n }\r\n ]\r\n };\r\n }\r\n }\r\n\r\n async createPayment(data) {\r\n return await this.request('/api/payments/create', {\r\n method: 'POST',\r\n body: JSON.stringify(data)\r\n });\r\n }\r\n}\r\n\r\n// Simple MetaMask connector that actually works\r\nclass SimpleMetaMaskWallet {\r\n constructor() {\r\n this.account = null;\r\n this.chainId = null;\r\n }\r\n\r\n async connect() {\r\n // FORCE MetaMask connection by being very specific\r\n if (!window.ethereum) {\r\n throw new Error('MetaMask not installed. Please install MetaMask extension.');\r\n }\r\n\r\n // Check if we have multiple wallets installed\r\n if (window.ethereum.providers) {\r\n console.log('🔍 Multiple wallets detected:', window.ethereum.providers.length);\r\n \r\n // Find MetaMask specifically\r\n const metamaskProvider = window.ethereum.providers.find(provider => provider.isMetaMask);\r\n if (!metamaskProvider) {\r\n throw new Error('MetaMask not found among installed wallets');\r\n }\r\n \r\n console.log('🦊 Using MetaMask provider specifically');\r\n window.ethereum = metamaskProvider; // Force use MetaMask\r\n } else if (!window.ethereum.isMetaMask) {\r\n throw new Error('Please use MetaMask wallet');\r\n }\r\n\r\n try {\r\n console.log('🦊 Requesting MetaMask account access...');\r\n \r\n // Request account access with specific MetaMask method\r\n const accounts = await window.ethereum.request({\r\n method: 'eth_requestAccounts'\r\n });\r\n\r\n if (!accounts || accounts.length === 0) {\r\n throw new Error('No accounts found in MetaMask');\r\n }\r\n\r\n // Get current chain\r\n const chainId = await window.ethereum.request({\r\n method: 'eth_chainId'\r\n });\r\n\r\n this.account = accounts[0];\r\n this.chainId = chainId;\r\n\r\n console.log('✅ MetaMask connected successfully:');\r\n console.log(' Account:', this.account);\r\n console.log(' Chain ID:', this.chainId);\r\n \r\n // Verify this is the expected account\r\n if (this.account.toLowerCase() !== '0xa0419a048a1469b34a5245f08c0697ba956a56ab') {\r\n console.warn('⚠️ Connected to different account than expected');\r\n console.warn(' Expected: 0xa0419a048A1469B34a5245f08C0697Ba956a56Ab');\r\n console.warn(' Connected:', this.account);\r\n \r\n // Ask user to switch account\r\n throw new Error(`Please switch MetaMask to account 0xa041...56Ab. Currently connected to ${this.account.slice(0, 6)}...${this.account.slice(-4)}`);\r\n }\r\n\r\n return { account: this.account, chainId: this.chainId };\r\n\r\n } catch (error) {\r\n console.error('MetaMask connection failed:', error);\r\n throw new Error(error.message || 'Failed to connect to MetaMask');\r\n }\r\n }\r\n\r\n async sendTransaction(txParams) {\r\n if (!this.account) {\r\n throw new Error('Wallet not connected');\r\n }\r\n\r\n try {\r\n console.log('🦊 Sending MetaMask transaction:', txParams);\r\n \r\n // Make sure we're using MetaMask provider\r\n if (!window.ethereum.isMetaMask) {\r\n throw new Error('Not using MetaMask provider');\r\n }\r\n\r\n // Check if user has enough balance for the transaction\r\n if (txParams.data && txParams.data.includes('a9059cbb')) {\r\n // This is an ERC-20 transfer, check token balance\r\n console.log('🔍 Checking USDT balance...');\r\n \r\n try {\r\n // Get USDT balance\r\n const balanceHex = await window.ethereum.request({\r\n method: 'eth_call',\r\n params: [{\r\n to: txParams.to, // USDT contract\r\n data: `0x70a08231000000000000000000000000${this.account.slice(2)}` // balanceOf(address)\r\n }, 'latest']\r\n });\r\n \r\n const balance = parseInt(balanceHex, 16);\r\n const balanceUSDT = balance / 1000000; // USDT has 6 decimals\r\n \r\n console.log('💰 USDT Balance:', balanceUSDT);\r\n \r\n // Extract amount from transaction data\r\n const amountHex = txParams.data.slice(-64);\r\n const transactionAmount = parseInt(amountHex, 16);\r\n const transactionAmountUSDT = transactionAmount / 1000000;\r\n \r\n console.log('💸 Transaction Amount:', transactionAmountUSDT);\r\n \r\n if (balance < transactionAmount) {\r\n throw new Error(`Insufficient USDT balance. You have ${balanceUSDT} USDT but need ${transactionAmountUSDT} USDT`);\r\n }\r\n } catch (balanceError) {\r\n console.warn('Could not check balance:', balanceError);\r\n // Continue with transaction anyway\r\n }\r\n }\r\n\r\n // Check ETH balance for gas\r\n try {\r\n const ethBalanceHex = await window.ethereum.request({\r\n method: 'eth_getBalance',\r\n params: [this.account, 'latest']\r\n });\r\n \r\n const ethBalance = parseInt(ethBalanceHex, 16) / Math.pow(10, 18);\r\n console.log('⛽ ETH Balance for gas:', ethBalance);\r\n \r\n if (ethBalance < 0.001) {\r\n throw new Error(`Insufficient ETH for gas fees. You have ${ethBalance.toFixed(4)} ETH but need at least 0.001 ETH`);\r\n }\r\n } catch (gasError) {\r\n console.warn('Could not check ETH balance:', gasError);\r\n }\r\n\r\n // Prepare transaction with proper gas estimation\r\n const fullTxParams = {\r\n ...txParams,\r\n from: this.account\r\n };\r\n\r\n // Try to estimate gas\r\n try {\r\n const gasEstimate = await window.ethereum.request({\r\n method: 'eth_estimateGas',\r\n params: [fullTxParams]\r\n });\r\n \r\n // Add 20% buffer to gas estimate\r\n const gasLimit = Math.floor(parseInt(gasEstimate, 16) * 1.2);\r\n fullTxParams.gas = `0x${gasLimit.toString(16)}`;\r\n \r\n console.log('⛽ Gas estimate:', parseInt(gasEstimate, 16));\r\n console.log('⛽ Gas limit (with buffer):', gasLimit);\r\n \r\n } catch (gasError) {\r\n console.warn('Gas estimation failed:', gasError);\r\n // Set a reasonable default gas limit for USDT transfers\r\n fullTxParams.gas = '0x15F90'; // 90,000 gas\r\n }\r\n\r\n console.log('📤 Final transaction params:', fullTxParams);\r\n\r\n const txHash = await window.ethereum.request({\r\n method: 'eth_sendTransaction',\r\n params: [fullTxParams]\r\n });\r\n\r\n console.log('✅ Transaction sent successfully:', txHash);\r\n return txHash;\r\n\r\n } catch (error) {\r\n console.error('Transaction failed:', error);\r\n \r\n if (error.code === 4001) {\r\n throw new Error('Transaction cancelled by user');\r\n } else if (error.message.includes('insufficient funds')) {\r\n throw new Error('Insufficient funds in wallet');\r\n } else if (error.message.includes('gas')) {\r\n throw new Error('Gas estimation failed. You may not have enough ETH for gas fees.');\r\n } else if (error.message.includes('invalid opcode')) {\r\n throw new Error('Transaction failed - invalid operation. This usually means insufficient token balance or contract interaction failed.');\r\n } else {\r\n throw new Error(error.message || 'Transaction failed');\r\n }\r\n }\r\n }\r\n\r\n isConnected() {\r\n return !!this.account;\r\n }\r\n}\r\n\r\n// Main Simple Payment Component\r\nconst SimpleCoinleyPayment = ({ \r\n apiKey, \r\n apiSecret, \r\n apiUrl, \r\n config,\r\n onSuccess, \r\n onError, \r\n onClose,\r\n isOpen,\r\n theme = 'light'\r\n}) => {\r\n const [currentStep, setCurrentStep] = useState('method');\r\n const [networks, setNetworks] = useState([]);\r\n const [tokens, setTokens] = useState([]);\r\n const [selectedNetwork, setSelectedNetwork] = useState(null);\r\n const [selectedToken, setSelectedToken] = useState(null);\r\n const [paymentMethod, setPaymentMethod] = useState(null);\r\n const [paymentData, setPaymentData] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState('');\r\n const [wallet, setWallet] = useState(new SimpleMetaMaskWallet());\r\n const [walletConnected, setWalletConnected] = useState(false);\r\n const [processing, setProcessing] = useState(false);\r\n\r\n const api = useRef(new SimplePaymentAPI(apiUrl, apiKey, apiSecret));\r\n\r\n // Load networks and tokens when modal opens\r\n useEffect(() => {\r\n if (isOpen) {\r\n loadData();\r\n resetState();\r\n }\r\n }, [isOpen]);\r\n\r\n const resetState = () => {\r\n setCurrentStep('method');\r\n setSelectedNetwork(null);\r\n setSelectedToken(null);\r\n setPaymentMethod(null);\r\n setPaymentData(null);\r\n setError('');\r\n setWalletConnected(false);\r\n setProcessing(false);\r\n setWallet(new SimpleMetaMaskWallet());\r\n };\r\n\r\n const loadData = async () => {\r\n try {\r\n setLoading(true);\r\n setError('');\r\n \r\n console.log('🔄 Loading networks and tokens...');\r\n const [networksRes, tokensRes] = await Promise.all([\r\n api.current.getNetworks(),\r\n api.current.getTokens()\r\n ]);\r\n \r\n setNetworks(networksRes.networks || []);\r\n setTokens(tokensRes.stablecoins || []);\r\n \r\n console.log('✅ Loaded networks:', networksRes.networks?.length);\r\n console.log('✅ Loaded tokens:', tokensRes.stablecoins?.length);\r\n \r\n } catch (err) {\r\n console.error('Failed to load data:', err);\r\n setError('Failed to load payment options. Using fallback data.');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n // Connect wallet\r\n const connectWallet = async () => {\r\n try {\r\n setLoading(true);\r\n setError('');\r\n \r\n const connection = await wallet.connect();\r\n setWalletConnected(true);\r\n \r\n console.log('✅ Wallet connected successfully:', connection.account);\r\n \r\n } catch (err) {\r\n console.error('Wallet connection failed:', err);\r\n setError(err.message);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n // Create payment\r\n const createPayment = async () => {\r\n try {\r\n setLoading(true);\r\n setError('');\r\n \r\n const paymentPayload = {\r\n amount: config.amount,\r\n currency: selectedToken.symbol,\r\n network: selectedNetwork.shortName,\r\n customerEmail: config.customerEmail,\r\n callbackUrl: config.callbackUrl,\r\n metadata: {\r\n ...config.metadata,\r\n merchantWalletAddresses: config.merchantWalletAddresses,\r\n paymentMethod,\r\n selectedNetwork: selectedNetwork.shortName,\r\n selectedToken: selectedToken.symbol\r\n }\r\n };\r\n\r\n console.log('🔄 Creating payment:', paymentPayload);\r\n const payment = await api.current.createPayment(paymentPayload);\r\n setPaymentData(payment.payment);\r\n \r\n console.log('✅ Payment created:', payment.payment.id);\r\n \r\n if (paymentMethod === 'wallet') {\r\n setCurrentStep('wallet');\r\n } else {\r\n setCurrentStep('qr');\r\n }\r\n \r\n } catch (err) {\r\n console.error('Payment creation failed:', err);\r\n setError(err.message);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n // Send transaction\r\n const sendTransaction = async () => {\r\n try {\r\n setProcessing(true);\r\n setError('');\r\n \r\n const recipientAddress = paymentData.metadata?.recipientWallet || \r\n config.merchantWalletAddresses?.[selectedNetwork.shortName];\r\n\r\n if (!recipientAddress) {\r\n throw new Error('Merchant wallet address not found');\r\n }\r\n\r\n console.log('🔄 Preparing transaction to:', recipientAddress);\r\n\r\n let txParams;\r\n\r\n if (selectedToken.contractAddress) {\r\n // ERC-20 transaction\r\n const decimals = selectedToken.decimals || 6;\r\n const amount = Math.floor(paymentData.totalAmount * Math.pow(10, decimals));\r\n \r\n const methodId = '0xa9059cbb'; // transfer(address,uint256)\r\n const recipientPadded = recipientAddress.slice(2).toLowerCase().padStart(64, '0');\r\n const amountPadded = amount.toString(16).padStart(64, '0');\r\n const data = `${methodId}${recipientPadded}${amountPadded}`;\r\n\r\n txParams = {\r\n to: selectedToken.contractAddress,\r\n data: data,\r\n value: '0x0'\r\n };\r\n \r\n console.log('🔄 ERC-20 Transaction:', {\r\n token: selectedToken.symbol,\r\n amount: paymentData.totalAmount,\r\n amountWithDecimals: amount,\r\n to: selectedToken.contractAddress,\r\n recipient: recipientAddress\r\n });\r\n \r\n } else {\r\n // Native transaction\r\n const value = Math.floor(paymentData.totalAmount * Math.pow(10, 18));\r\n txParams = {\r\n to: recipientAddress,\r\n value: `0x${value.toString(16)}`\r\n };\r\n \r\n console.log('🔄 Native Transaction:', {\r\n amount: paymentData.totalAmount,\r\n to: recipientAddress\r\n });\r\n }\r\n\r\n const txHash = await wallet.sendTransaction(txParams);\r\n \r\n console.log('✅ Transaction successful:', txHash);\r\n setCurrentStep('success');\r\n \r\n // Call success callback\r\n onSuccess?.(paymentData.id, txHash, {\r\n network: selectedNetwork.name,\r\n token: selectedToken.symbol,\r\n amount: paymentData.totalAmount,\r\n method: paymentMethod\r\n });\r\n\r\n } catch (err) {\r\n console.error('Transaction failed:', err);\r\n setError(err.message);\r\n } finally {\r\n setProcessing(false);\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n const isDark = theme === 'dark';\r\n\r\n return (\r\n <div className=\"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50\">\r\n <div className={`rounded-lg shadow-xl max-w-md w-full mx-4 ${isDark ? 'bg-gray-900 text-white' : 'bg-white text-gray-900'}`}>\r\n \r\n {/* Header */}\r\n <div className={`p-4 border-b flex justify-between items-center ${isDark ? 'border-gray-700' : 'border-gray-200'}`}>\r\n <div className=\"text-center flex-1\">\r\n <h2 className=\"text-lg font-semibold\">Pay with Crypto</h2>\r\n {config.amount && (\r\n <p className=\"text-2xl font-bold text-purple-600\">${config.amount.toFixed(2)}</p>\r\n )}\r\n </div>\r\n <button \r\n onClick={onClose} \r\n className={`ml-4 text-gray-500 hover:text-gray-700 ${isDark ? 'hover:text-gray-300' : ''}`}\r\n >\r\n ✕\r\n </button>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"p-4 min-h-[400px]\">\r\n {error && (\r\n <div className=\"mb-4 p-3 bg-red-100 text-red-700 rounded border border-red-200\">\r\n {error}\r\n <button \r\n onClick={() => setError('')}\r\n className=\"ml-2 text-red-500 hover:text-red-700\"\r\n >\r\n ✕\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Step 1: Select Method */}\r\n {currentStep === 'method' && (\r\n <div className=\"space-y-4\">\r\n <h3 className=\"font-medium text-center mb-6\">Choose Payment Method</h3>\r\n <div className=\"space-y-3\">\r\n <button\r\n onClick={() => { setPaymentMethod('wallet'); setCurrentStep('network'); }}\r\n className={`w-full p-4 border-2 rounded-lg hover:border-purple-500 text-left flex items-center space-x-3 transition-colors ${isDark ? 'border-gray-600 hover:bg-gray-800' : 'border-gray-200 hover:bg-gray-50'}`}\r\n >\r\n <span className=\"text-2xl\">🦊</span>\r\n <div>\r\n <div className=\"font-medium\">MetaMask Wallet</div>\r\n <div className={`text-sm ${isDark ? 'text-gray-400' : 'text-gray-500'}`}>Connect and pay instantly</div>\r\n </div>\r\n </button>\r\n <button\r\n onClick={() => { setPaymentMethod('qr'); setCurrentStep('network'); }}\r\n className={`w-full p-4 border-2 rounded-lg hover:border-purple-500 text-left flex items-center space-x-3 transition-colors ${isDark ? 'border-gray-600 hover:bg-gray-800' : 'border-gray-200 hover:bg-gray-50'}`}\r\n >\r\n <span className=\"text-2xl\">📱</span>\r\n <div>\r\n <div className=\"font-medium\">QR Code</div>\r\n <div className={`text-sm ${isDark ? 'text-gray-400' : 'text-gray-500'}`}>Scan with mobile wallet</div>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Step 2: Select Network */}\r\n {currentStep === 'network' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center space-x-2\">\r\n <button \r\n onClick={() => setCurrentStep('method')} \r\n className={`${isDark ? 'text-gray-400 hover:text-gray-200' : 'text-gray-500 hover:text-gray-700'}`}\r\n >\r\n ←\r\n </button>\r\n <h3 className=\"font-medium\">Select Network</h3>\r\n </div>\r\n <div className=\"space-y-2\">\r\n {networks.map((network) => (\r\n <button\r\n key={network.id}\r\n onClick={() => { setSelectedNetwork(network); setCurrentStep('token'); }}\r\n className={`w-full p-3 border rounded-lg hover:border-purple-500 text-left transition-colors ${isDark ? 'border-gray-600 hover:bg-gray-800' : 'border-gray-200 hover:bg-gray-50'}`}\r\n >\r\n <div className=\"font-medium\">{network.name}</div>\r\n <div className={`text-sm ${isDark ? 'text-gray-400' : 'text-gray-500'}`}>{network.shortName.toUpperCase()}</div>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Step 3: Select Token */}\r\n {currentStep === 'token' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center space-x-2\">\r\n <button \r\n onClick={() => setCurrentStep('network')} \r\n className={`${isDark ? 'text-gray-400 hover:text-gray-200' : 'text-gray-500 hover:text-gray-700'}`}\r\n >\r\n ←\r\n </button>\r\n <h3 className=\"font-medium\">Select Token on {selectedNetwork?.name}</h3>\r\n </div>\r\n <div className=\"space-y-2\">\r\n {tokens\r\n .filter(token => token.Network?.shortName === selectedNetwork?.shortName)\r\n .map((token) => (\r\n <button\r\n key={token.id}\r\n onClick={() => { setSelectedToken(token); createPayment(); }}\r\n disabled={loading}\r\n className={`w-full p-3 border rounded-lg hover:border-purple-500 text-left flex justify-between transition-colors disabled:opacity-50 ${isDark ? 'border-gray-600 hover:bg-gray-800' : 'border-gray-200 hover:bg-gray-50'}`}\r\n >\r\n <div>\r\n <div className=\"font-medium\">{token.name}</div>\r\n <div className={`text-sm ${isDark ? 'text-gray-400' : 'text-gray-500'}`}>{token.symbol}</div>\r\n </div>\r\n {token.isStablecoin && (\r\n <span className=\"px-2 py-1 bg-green-100 text-green-600 text-xs rounded\">\r\n Stablecoin\r\n </span>\r\n )}\r\n </button>\r\n ))\r\n }\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Step 4: Wallet Connect & Pay */}\r\n {currentStep === 'wallet' && (\r\n <div className=\"space-y-4\">\r\n <h3 className=\"font-medium text-center\">Connect & Pay</h3>\r\n \r\n {!walletConnected ? (\r\n <div className=\"text-center space-y-4\">\r\n <div className=\"w-16 h-16 bg-purple-100 rounded-full flex items-center justify-center mx-auto\">\r\n <span className=\"text-2xl\">🦊</span>\r\n </div>\r\n <p className={`${isDark ? 'text-gray-300' : 'text-gray-600'}`}>Connect MetaMask to continue</p>\r\n <button\r\n onClick={connectWallet}\r\n disabled={loading}\r\n className=\"w-full bg-purple-600 text-white py-3 px-4 rounded-lg hover:bg-purple-700 disabled:opacity-50 font-medium\"\r\n >\r\n {loading ? 'Connecting...' : 'Connect MetaMask'}\r\n </button>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-4\">\r\n <div className=\"p-3 bg-green-50 rounded-lg border border-green-200\">\r\n <p className=\"text-green-600 text-sm font-medium\">✅ Wallet Connected</p>\r\n <p className=\"font-mono text-xs text-green-700 mt-1\">{wallet.account?.slice(0, 6)}...{wallet.account?.slice(-4)}</p>\r\n </div>\r\n \r\n <div className={`p-4 rounded-lg space-y-2 ${isDark ? 'bg-gray-800' : 'bg-gray-50'}`}>\r\n <div className=\"flex justify-between text-sm\">\r\n <span>Amount:</span>\r\n <span className=\"font-medium\">{paymentData?.totalAmount} {selectedToken?.symbol}</span>\r\n </div>\r\n <div className=\"flex justify-between text-sm\">\r\n <span>Network:</span>\r\n <span className=\"font-medium\">{selectedNetwork?.name}</span>\r\n </div>\r\n <div className=\"flex justify-between text-sm\">\r\n <span>Token:</span>\r\n <span className=\"font-medium\">{selectedToken?.name}</span>\r\n </div>\r\n </div>\r\n\r\n <button\r\n onClick={sendTransaction}\r\n disabled={processing}\r\n className=\"w-full bg-green-600 text-white py-3 px-4 rounded-lg hover:bg-green-700 disabled:opacity-50 font-medium flex items-center justify-center space-x-2\"\r\n >\r\n {processing ? (\r\n <>\r\n <div className=\"animate-spin rounded-full h-4 w-4 border-b-2 border-white\"></div>\r\n <span>Sending Transaction...</span>\r\n </>\r\n ) : (\r\n <span>Send {paymentData?.totalAmount} {selectedToken?.symbol}</span>\r\n )}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* QR Code Step */}\r\n {currentStep === 'qr' && (\r\n <div className=\"text-center space-y-4\">\r\n <h3 className=\"font-medium\">Scan QR Code</h3>\r\n <div className={`p-8 rounded-lg ${isDark ? 'bg-gray-800' : 'bg-gray-100'}`}>\r\n <p className={`${isDark ? 'text-gray-400' : 'text-gray-500'}`}>QR Code will appear here</p>\r\n <p className=\"text-xs mt-2\">Send {paymentData?.totalAmount} {selectedToken?.symbol}</p>\r\n <p className=\"text-xs\">to merchant wallet</p>\r\n </div>\r\n <p className={`text-xs ${isDark ? 'text-gray-400' : 'text-gray-500'}`}>\r\n Waiting for payment confirmation...\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Success */}\r\n {currentStep === 'success' && (\r\n <div className=\"text-center space-y-4\">\r\n <div className=\"w-16 h-16 bg-green-100 rounded-full flex items-center justify-center mx-auto\">\r\n <span className=\"text-2xl\">✅</span>\r\n </div>\r\n <h3 className=\"font-medium text-green-600\">Payment Successful!</h3>\r\n <p className={`text-sm ${isDark ? 'text-gray-300' : 'text-gray-600'}`}>\r\n Your transaction has been sent successfully\r\n </p>\r\n <button\r\n onClick={onClose}\r\n className=\"w-full bg-purple-600 text-white py-3 px-4 rounded-lg hover:bg-purple-700 font-medium\"\r\n >\r\n Close\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Loading Spinner */}\r\n {loading && currentStep !== 'wallet' && (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-purple-600\"></div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default SimpleCoinleyPayment;","//src/components/EnhancedSimpleCoinleyPayment.jsx - Enhanced design with working logic\r\nimport React, { useState, useEffect, useRef } from 'react';\r\n\r\n// Keep your existing working API class\r\nclass SimplePaymentAPI {\r\n constructor(baseURL, apiKey, apiSecret) {\r\n this.baseURL = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL;\r\n this.apiKey = apiKey;\r\n this.apiSecret = apiSecret;\r\n }\r\n\r\n async request(endpoint, options = {}) {\r\n const url = `${this.baseURL}${endpoint}`;\r\n const headers = {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.apiKey,\r\n 'X-API-Secret': this.apiSecret,\r\n ...options.headers\r\n };\r\n\r\n const response = await fetch(url, {\r\n ...options,\r\n headers\r\n });\r\n\r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({}));\r\n throw new Error(error.error || `HTTP ${response.status}`);\r\n }\r\n\r\n return response.json();\r\n }\r\n\r\n async getNetworks() {\r\n try {\r\n return await this.request('/api/networks');\r\n } catch (error) {\r\n console.error('Failed to fetch networks:', error);\r\n return {\r\n networks: [\r\n { id: '1', name: 'Ethereum', shortName: 'ethereum', chainId: '0x1', type: 'ethereum' },\r\n { id: '56', name: 'BSC', shortName: 'bsc', chainId: '0x38', type: 'bsc' }\r\n ]\r\n };\r\n }\r\n }\r\n\r\n async getTokens() {\r\n try {\r\n return await this.request('/api/networks/stablecoins');\r\n } catch (error) {\r\n console.error('Failed to fetch tokens:', error);\r\n return {\r\n stablecoins: [\r\n {\r\n id: '1', name: 'Tether USD', symbol: 'USDT',\r\n contractAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n decimals: 6, networkId: '1',\r\n Network: { shortName: 'ethereum', name: 'Ethereum' }\r\n }\r\n ]\r\n };\r\n }\r\n }\r\n\r\n async createPayment(data) {\r\n return await this.request('/api/payments/create', {\r\n method: 'POST',\r\n body: JSON.stringify(data)\r\n });\r\n }\r\n\r\n async verifyQRPayment(paymentId) {\r\n return await this.request('/api/payments/verify-qr', {\r\n method: 'POST',\r\n body: JSON.stringify({ paymentId })\r\n });\r\n }\r\n}\r\n\r\n// Keep your existing working MetaMask class\r\nclass SimpleMetaMaskWallet {\r\n constructor() {\r\n this.account = null;\r\n this.chainId = null;\r\n }\r\n\r\n async connect() {\r\n if (!window.ethereum) {\r\n throw new Error('MetaMask not installed. Please install MetaMask extension.');\r\n }\r\n\r\n if (window.ethereum.providers) {\r\n console.log('🔍 Multiple wallets detected:', window.ethereum.providers.length);\r\n \r\n const metamaskProvider = window.ethereum.providers.find(provider => provider.isMetaMask);\r\n if (!metamaskProvider) {\r\n throw new Error('MetaMask not found among installed wallets');\r\n }\r\n \r\n console.log('🦊 Using MetaMask provider specifically');\r\n window.ethereum = metamaskProvider;\r\n } else if (!window.ethereum.isMetaMask) {\r\n throw new Error('Please use MetaMask wallet');\r\n }\r\n\r\n try {\r\n console.log('🦊 Requesting MetaMask account access...');\r\n \r\n const accounts = await window.ethereum.request({\r\n method: 'eth_requestAccounts'\r\n });\r\n\r\n if (!accounts || accounts.length === 0) {\r\n throw new Error('No accounts found in MetaMask');\r\n }\r\n\r\n const chainId = await window.ethereum.request({\r\n method: 'eth_chainId'\r\n });\r\n\r\n this.account = accounts[0];\r\n this.chainId = chainId;\r\n\r\n console.log('✅ MetaMask connected successfully:');\r\n console.log(' Account:', this.account);\r\n console.log(' Chain ID:', this.chainId);\r\n \r\n return { account: this.account, chainId: this.chainId };\r\n\r\n } catch (error) {\r\n console.error('MetaMask connection failed:', error);\r\n throw new Error(error.message || 'Failed to connect to MetaMask');\r\n }\r\n }\r\n\r\n async sendTransaction(txParams) {\r\n if (!this.account) {\r\n throw new Error('Wallet not connected');\r\n }\r\n\r\n try {\r\n console.log('🦊 Sending MetaMask transaction:', txParams);\r\n \r\n if (!window.ethereum.isMetaMask) {\r\n throw new Error('Not using MetaMask provider');\r\n }\r\n\r\n const fullTxParams = {\r\n ...txParams,\r\n from: this.account\r\n };\r\n\r\n try {\r\n const gasEstimate = await window.ethereum.request({\r\n method: 'eth_estimateGas',\r\n params: [fullTxParams]\r\n });\r\n \r\n const gasLimit = Math.floor(parseInt(gasEstimate, 16) * 1.2);\r\n fullTxParams.gas = `0x${gasLimit.toString(16)}`;\r\n \r\n console.log('⛽ Gas estimate:', parseInt(gasEstimate, 16));\r\n console.log('⛽ Gas limit (with buffer):', gasLimit);\r\n \r\n } catch (gasError) {\r\n console.warn('Gas estimation failed:', gasError);\r\n fullTxParams.gas = '0x15F90';\r\n }\r\n\r\n console.log('📤 Final transaction params:', fullTxParams);\r\n\r\n const txHash = await window.ethereum.request({\r\n method: 'eth_sendTransaction',\r\n params: [fullTxParams]\r\n });\r\n\r\n console.log('✅ Transaction sent successfully:', txHash);\r\n return txHash;\r\n\r\n } catch (error) {\r\n console.error('Transaction failed:', error);\r\n \r\n if (error.code === 4001) {\r\n throw new Error('Transaction cancelled by user');\r\n } else if (error.message.includes('insufficient funds')) {\r\n throw new Error('Insufficient funds in wallet');\r\n } else if (error.message.includes('gas')) {\r\n throw new Error('Gas estimation failed. You may not have enough ETH for gas fees.');\r\n } else {\r\n throw new Error(error.message || 'Transaction failed');\r\n }\r\n }\r\n }\r\n\r\n isConnected() {\r\n return !!this.account;\r\n }\r\n}\r\n\r\n// Enhanced QR Code Component with modern design\r\nconst EnhancedQRCode = ({ \r\n walletAddress, \r\n amount, \r\n currency, \r\n network,\r\n theme = 'light'\r\n}) => {\r\n const [qrData, setQrData] = useState('');\r\n const [isGenerating, setIsGenerating] = useState(true);\r\n\r\n useEffect(() => {\r\n // Simple QR data generation (you can enhance this)\r\n const generateQRData = () => {\r\n setIsGenerating(true);\r\n setTimeout(() => {\r\n setQrData(`${walletAddress}?amount=${amount}¤cy=${currency}&network=${network}`);\r\n setIsGenerating(false);\r\n }, 1000);\r\n };\r\n \r\n if (walletAddress) {\r\n generateQRData();\r\n }\r\n }, [walletAddress, amount, currency, network]);\r\n\r\n const formatWalletAddress = (address) => {\r\n if (!address || address.length <= 16) return address;\r\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col items-center\">\r\n <div className=\"p-4 rounded-lg bg-white mb-3 shadow-sm border\">\r\n {isGenerating ? (\r\n <div className=\"flex items-center justify-center\" style={{ width: 200, height: 200 }}>\r\n <div className=\"text-center\">\r\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-purple-600 mx-auto mb-2\"></div>\r\n <div className=\"text-sm text-gray-600\">Generating QR Code...</div>\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"flex items-center justify-center bg-gray-100 rounded-lg\" style={{ width: 200, height: 200 }}>\r\n <div className=\"text-center p-4\">\r\n <div className=\"text-2xl mb-2\">📱</div>\r\n <div className=\"text-sm text-gray-600\">QR Code</div>\r\n <div className=\"text-xs text-gray-500 mt-1\">Scan to pay</div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n \r\n <div className=\"text-center text-sm text-gray-700 mb-4\">\r\n <p className=\"font-semibold text-gray-800 flex items-center justify-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4 mr-1\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v1m6 11h2m-6 0h-2v4m0-11v3m0 0h.01M12 12h4.01M12 12h-4.01M12 12V8.01\" />\r\n </svg>\r\n Scan to Pay with {currency}\r\n </p>\r\n <p className=\"text-xs text-gray-500 mt-1\">\r\n Scan with your {network} wallet app\r\n </p>\r\n </div>\r\n \r\n <div className=\"w-full mb-4 p-3 bg-gray-50 rounded-lg\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm font-medium text-gray-700\">Amount to Pay:</span>\r\n <span className=\"text-lg font-bold text-[#7042D2]\">{amount} {currency}</span>\r\n </div>\r\n <div className=\"flex justify-between items-center mt-1\">\r\n <span className=\"text-xs text-gray-500\">Network:</span>\r\n <span className=\"text-xs font-medium text-gray-700\">{network}</span>\r\n </div>\r\n <div className=\"flex justify-between items-center mt-1\">\r\n <span className=\"text-xs text-gray-500\">Recipient:</span>\r\n <span className=\"text-xs font-mono text-gray-700\">{formatWalletAddress(walletAddress)}</span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"w-full\">\r\n <div className=\"p-3 rounded bg-blue-50 border border-blue-200\">\r\n <h4 className=\"text-sm font-medium mb-2 text-blue-800 flex items-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4 mr-1\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\r\n </svg>\r\n Payment Instructions\r\n </h4>\r\n <ol className=\"text-xs space-y-1 text-blue-700\">\r\n <li>1. Open your crypto wallet app</li>\r\n <li>2. Scan the QR code above</li>\r\n <li>3. Send exactly <strong>{amount} {currency}</strong></li>\r\n <li>4. Click \"I have sent the payment\" button below</li>\r\n </ol>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// Enhanced Payment Status Component\r\nconst EnhancedPaymentStatus = ({\r\n status,\r\n message,\r\n theme = 'light',\r\n payment = null,\r\n transactionHash = null,\r\n selectedPaymentMethod = null,\r\n merchantName = 'Merchant',\r\n onClose = null\r\n}) => {\r\n const [copiedHash, setCopiedHash] = useState(false);\r\n\r\n const copyTransactionHash = async () => {\r\n if (transactionHash) {\r\n try {\r\n await navigator.clipboard.writeText(transactionHash);\r\n setCopiedHash(true);\r\n setTimeout(() => setCopiedHash(false), 2000);\r\n } catch (err) {\r\n console.error('Failed to copy transaction hash:', err);\r\n }\r\n }\r\n };\r\n\r\n const formatTransactionHash = (hash) => {\r\n if (!hash) return '';\r\n if (hash.length <= 16) return hash;\r\n return `${hash.slice(0, 8)}...${hash.slice(-8)}`;\r\n };\r\n\r\n const renderIcon = () => {\r\n switch (status) {\r\n case 'processing':\r\n return (\r\n <div className=\"animate-spin rounded-full h-12 w-12 border-4 border-t-purple-600 border-blue-500/20\"></div>\r\n );\r\n case 'success':\r\n return (\r\n <div className=\"rounded-full h-16 w-16 bg-green-500 flex items-center justify-center\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n className=\"h-10 w-10 text-white\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n strokeWidth={3}\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n </div>\r\n );\r\n case 'error':\r\n return (\r\n <div className=\"rounded-full h-12 w-12 bg-red-100 flex items-center justify-center\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n className=\"h-8 w-8 text-red-500\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </div>\r\n );\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n if (status === 'success') {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-6 px-4\">\r\n <div className=\"mb-6\">{renderIcon()}</div>\r\n \r\n <h3 className=\"text-2xl font-bold mb-3 text-gray-900\">\r\n Payment Successful!\r\n </h3>\r\n \r\n {payment && selectedPaymentMethod && (\r\n <p className=\"text-center max-w-[235px] mb-6 text-gray-600\">\r\n Your payment of <span className='text-[#7042D2] font-semibold'>{payment.totalAmount || payment.amount} {selectedPaymentMethod.currency}</span> has been completed.\r\n </p>\r\n )}\r\n\r\n {transactionHash && (\r\n <div className=\"w-full mb-6 px-4\">\r\n <p className=\"text-sm font-medium mb-2 text-gray-700\">\r\n Transaction Hash:\r\n </p>\r\n <div \r\n className=\"flex items-center justify-between p-3 rounded-lg border cursor-pointer transition-colors bg-gray-50 border-gray-200 hover:bg-gray-100\"\r\n onClick={copyTransactionHash}\r\n >\r\n <span className=\"font-mono text-sm text-gray-700\">\r\n {formatTransactionHash(transactionHash)}\r\n </span>\r\n <div className=\"flex items-center\">\r\n {copiedHash ? (\r\n <span className=\"text-green-500 text-xs font-medium mr-2\">Copied!</span>\r\n ) : null}\r\n <svg \r\n xmlns=\"http://www.w3.org/2000/svg\" \r\n className=\"h-4 w-4 text-gray-500\"\r\n fill=\"none\" \r\n viewBox=\"0 0 24 24\" \r\n stroke=\"currentColor\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {onClose && (\r\n <button\r\n onClick={onClose}\r\n className=\"w-full py-3 px-4 bg-[#7042D2] text-white font-medium rounded-2xl text-lg shadow-md hover:bg-[#5b34b1] transition-colors\"\r\n >\r\n Close\r\n </button>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-6\">\r\n <div className=\"mb-4\">{renderIcon()}</div>\r\n <h3 className=\"text-xl font-bold mb-2 text-gray-900\">\r\n {status === 'processing' ? 'Processing Payment' : status === 'error' ? 'Payment Failed' : 'Unknown Status'}\r\n </h3>\r\n <p className=\"text-center text-gray-600\">{message}</p>\r\n </div>\r\n );\r\n};\r\n\r\n// Screen transition wrapper\r\nconst ScreenTransition = ({\r\n currentStep,\r\n targetStep,\r\n children,\r\n className = \"\",\r\n duration = 300\r\n}) => {\r\n const [isVisible, setIsVisible] = useState(currentStep === targetStep);\r\n const [shouldRender, setShouldRender] = useState(currentStep === targetStep);\r\n\r\n useEffect(() => {\r\n if (currentStep === targetStep) {\r\n setShouldRender(true);\r\n setTimeout(() => setIsVisible(true), 10);\r\n } else {\r\n setIsVisible(false);\r\n setTimeout(() => setShouldRender(false), duration);\r\n }\r\n }, [currentStep, targetStep, duration]);\r\n\r\n if (!shouldRender) return null;\r\n\r\n return (\r\n <div\r\n className={`\r\n transition-all duration-300 ease-out\r\n ${isVisible\r\n ? 'transform translate-y-0 opacity-100'\r\n : 'transform translate-y-full opacity-0'\r\n }\r\n ${className}\r\n `}\r\n style={{\r\n transitionDuration: `${duration}ms`\r\n }}\r\n >\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\n// Main Enhanced Component with modern design - Compatible with your checkout\r\nconst EnhancedSimpleCoinleyPayment = ({ \r\n apiKey, \r\n apiSecret, \r\n apiUrl, \r\n config,\r\n onSuccess, \r\n onError, \r\n onClose,\r\n isOpen,\r\n theme = 'light'\r\n}) => {\r\n const [currentStep, setCurrentStep] = useState('method');\r\n const [networks, setNetworks] = useState([]);\r\n const [tokens, setTokens] = useState([]);\r\n const [selectedNetwork, setSelectedNetwork] = useState(null);\r\n const [selectedToken, setSelectedToken] = useState(null);\r\n const [paymentMethod, setPaymentMethod] = useState(null);\r\n const [paymentData, setPaymentData] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState('');\r\n const [wallet, setWallet] = useState(new SimpleMetaMaskWallet());\r\n const [walletConnected, setWalletConnected] = useState(false);\r\n const [processing, setProcessing] = useState(false);\r\n const [paymentType, setPaymentType] = useState('wallet');\r\n\r\n const api = useRef(new SimplePaymentAPI(apiUrl, apiKey, apiSecret));\r\n\r\n useEffect(() => {\r\n if (isOpen) {\r\n loadData();\r\n resetState();\r\n }\r\n }, [isOpen]);\r\n\r\n const resetState = () => {\r\n setCurrentStep('method');\r\n setSelectedNetwork(null);\r\n setSelectedToken(null);\r\n setPaymentMethod(null);\r\n setPaymentData(null);\r\n setError('');\r\n setWalletConnected(false);\r\n setProcessing(false);\r\n setWallet(new SimpleMetaMaskWallet());\r\n setPaymentType('wallet');\r\n };\r\n\r\n const loadData = async () => {\r\n try {\r\n setLoading(true);\r\n setError('');\r\n \r\n console.log('🔄 Loading networks and tokens...');\r\n const [networksRes, tokensRes] = await Promise.all([\r\n api.current.getNetworks(),\r\n api.current.getTokens()\r\n ]);\r\n \r\n setNetworks(networksRes.networks || []);\r\n setTokens(tokensRes.stablecoins || []);\r\n \r\n console.log('✅ Loaded networks:', networksRes.networks?.length);\r\n console.log('✅ Loaded tokens:', tokensRes.stablecoins?.length);\r\n \r\n } catch (err) {\r\n console.error('Failed to load data:', err);\r\n setError('Failed to load payment options. Using fallback data.');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const connectWallet = async () => {\r\n try {\r\n setLoading(true);\r\n setError('');\r\n \r\n const connection = await wallet.connect();\r\n setWalletConnected(true);\r\n \r\n console.log('✅ Wallet connected successfully:', connection.account);\r\n \r\n } catch (err) {\r\n console.error('Wallet connection failed:', err);\r\n setError(err.message);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const createPayment = async () => {\r\n try {\r\n setLoading(true);\r\n setError('');\r\n \r\n const paymentPayload = {\r\n amount: config.amount,\r\n currency: selectedToken.symbol,\r\n network: selectedNetwork.shortName,\r\n customerEmail: config.customerEmail,\r\n callbackUrl: config.callbackUrl,\r\n metadata: {\r\n ...config.metadata,\r\n merchantWalletAddresses: config.merchantWalletAddresses,\r\n paymentMethod,\r\n selectedNetwork: selectedNetwork.shortName,\r\n selectedToken: selectedToken.symbol\r\n }\r\n };\r\n\r\n console.log('🔄 Creating payment:', paymentPayload);\r\n const payment = await api.current.createPayment(paymentPayload);\r\n setPaymentData(payment.payment);\r\n \r\n console.log('✅ Payment created:', payment.payment.id);\r\n \r\n setCurrentStep('confirm');\r\n \r\n } catch (err) {\r\n console.error('Payment creation failed:', err);\r\n setError(err.message);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const sendTransaction = async () => {\r\n try {\r\n setProcessing(true);\r\n setError('');\r\n \r\n const recipientAddress = paymentData.metadata?.recipientWallet || \r\n config.merchantWalletAddresses?.[selectedNetwork.shortName];\r\n\r\n if (!recipientAddress) {\r\n throw new Error('Merchant wallet address not found');\r\n }\r\n\r\n console.log('🔄 Preparing transaction to:', recipientAddress);\r\n\r\n let txParams;\r\n\r\n if (selectedToken.contractAddress) {\r\n const decimals = selectedToken.decimals || 6;\r\n const amount = Math.floor(paymentData.totalAmount * Math.pow(10, decimals));\r\n \r\n const methodId = '0xa9059cbb';\r\n const recipientPadded = recipientAddress.slice(2).toLowerCase().padStart(64, '0');\r\n const amountPadded = amount.toString(16).padStart(64, '0');\r\n const data = `${methodId}${recipientPadded}${amountPadded}`;\r\n\r\n txParams = {\r\n to: selectedToken.contractAddress,\r\n data: data,\r\n value: '0x0'\r\n };\r\n \r\n console.log('🔄 ERC-20 Transaction:', {\r\n token: selectedToken.symbol,\r\n amount: paymentData.totalAmount,\r\n amountWithDecimals: amount,\r\n to: selectedToken.contractAddress,\r\n recipient: recipientAddress\r\n });\r\n \r\n } else {\r\n const value = Math.floor(paymentData.totalAmount * Math.pow(10, 18));\r\n txParams = {\r\n to: recipientAddress,\r\n value: `0x${value.toString(16)}`\r\n };\r\n \r\n console.log('🔄 Native Transaction:', {\r\n amount: paymentData.totalAmount,\r\n to: recipientAddress\r\n });\r\n }\r\n\r\n const txHash = await wallet.sendTransaction(txParams);\r\n \r\n console.log('✅ Transaction successful:', txHash);\r\n setCurrentStep('success');\r\n \r\n // Call the onSuccess callback with the expected parameters that match your checkout\r\n onSuccess?.(paymentData.id, txHash, {\r\n network: selectedNetwork.name,\r\n currency: selectedToken.symbol,\r\n amount: paymentData.totalAmount,\r\n method: paymentMethod\r\n });\r\n\r\n } catch (err) {\r\n console.error('Transaction failed:', err);\r\n setError(err.message);\r\n // Call onError callback like in your checkout\r\n onError?.(err.message);\r\n } finally {\r\n setProcessing(false);\r\n }\r\n };\r\n\r\n const handleQRPaymentVerification = async () => {\r\n if (!paymentData) {\r\n setError('Payment information is missing');\r\n return;\r\n }\r\n\r\n setCurrentStep('processing');\r\n setError(null);\r\n\r\n try {\r\n console.log('🔄 Starting QR payment verification...');\r\n \r\n const verificationResult = await api.current.verifyQRPayment(paymentData.id);\r\n \r\n if (verificationResult.verified) {\r\n console.log('✅ QR payment verified successfully:', verificationResult);\r\n \r\n setCurrentStep('success');\r\n \r\n // Call onSuccess callback with the expected parameters for your checkout\r\n if (onSuccess) {\r\n onSuccess(paymentData.id, verificationResult.payment.transactionHash, {\r\n network: selectedNetwork.name,\r\n currency: selectedToken.symbol,\r\n amount: verificationResult.payment.amount,\r\n verificationType: 'QR_PAYMENT'\r\n });\r\n }\r\n } else {\r\n setError(verificationResult.message || 'Transaction not detected yet. Please wait a moment and try again.');\r\n setCurrentStep('confirm');\r\n }\r\n } catch (error) {\r\n console.error('QR payment verification error:', error);\r\n const errorMessage = error.message || 'Failed to verify payment. Please try again.';\r\n setError(errorMessage);\r\n setCurrentStep('confirm');\r\n // Call onError callback like in your checkout\r\n if (onError) onError(errorMessage);\r\n }\r\n };\r\n\r\n const formatAmount = (amount) => {\r\n return parseFloat(amount).toFixed(2);\r\n };\r\n\r\n const getNetworkDisplayName = (network) => {\r\n const names = {\r\n ethereum: 'Ethereum',\r\n bsc: 'BSC',\r\n tron: 'Tron',\r\n algorand: 'Algorand',\r\n solana: 'Solana'\r\n };\r\n return names[network] || network;\r\n };\r\n\r\n const getWalletAddressForNetwork = () => {\r\n if (!selectedNetwork) return 'No network selected';\r\n const networkAddress = config.merchantWalletAddresses?.[selectedNetwork.shortName];\r\n if (networkAddress) return networkAddress;\r\n if (paymentData?.recipientWallet) return paymentData.recipientWallet;\r\n return 'No wallet address configured for this network';\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n const isDark = theme === 'dark';\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50\">\r\n <div className=\"fixed inset-0 bg-black bg-opacity-50 transition-opacity\" onClick={onClose} aria-hidden=\"true\" />\r\n <div className=\"fixed inset-0 overflow-y-auto\">\r\n <div className=\"flex min-h-screen items-center justify-center p-4\">\r\n <div className=\"relative pt-6 w-full max-w-md mx-auto shadow-xl bg-gray-100 rounded-3xl overflow-hidden\">\r\n \r\n {/* Modern Header with Logo */}\r\n <div className=\"bg-white flex justify-between items-center mb-6 mr-3 ml-3 py-4 px-2 rounded-full\">\r\n <div className=\"flex-1 flex items-center gap-2 px-4\">\r\n <div className=\"w-8 h-8 bg-purple-600 rounded-full flex items-center justify-center\">\r\n <span className=\"text-white font-bold text-sm\">C</span>\r\n </div>\r\n <span className=\"text-lg font-semibold text-gray-800\">Payment Details</span>\r\n </div>\r\n {currentStep !== 'success' && currentStep !== 'processing' && (\r\n <button\r\n onClick={onClose}\r\n className=\"text-gray-500 hover:text-gray-700 focus:outline-none\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6 mr-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Payment Summary */}\r\n {paymentData && currentStep !== 'success' && (\r\n <div className=\"mb-6\">\r\n <div className=\"text-center\">\r\n <div className=\"text-sm text-gray-600\">Total Amount</div>\r\n <div className=\"text-3xl md:text-9xl lg:text-9xl font-bold text-[#7042D2] mt-2 leading-tight tracking-tight\">\r\n ${formatAmount(paymentData.totalAmount || paymentData.amount)}\r\n </div>\r\n \r\n {paymentData.feeChargedTo === 'customer' && paymentData.feeAmount > 0 && (\r\n <div className=\"mt-2 text-sm text-gray-500\">\r\n Processing fee included\r\n </div>\r\n )}\r\n \r\n {paymentData.feeChargedTo === 'merchant' && (\r\n <div className=\"mt-2 text-sm text-gray-500\">\r\n No additional fees\r\n </div>\r\n )}\r\n\r\n <div className=\"text-sm text-gray-600 mt-4\">Payment to:</div>\r\n <div className=\"text-base font-semibold mt-1 flex gap-2 items-center justify-center\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15.3 7.50065L15.8 10.0007H4.2L4.7 7.50065H15.3ZM16.6667 3.33398H3.33333V5.00065H16.6667V3.33398ZM16.6667 5.83398H3.33333L2.5 10.0007V11.6673H3.33333V16.6673H11.6667V11.6673H15V16.6673H16.6667V11.6673H17.5V10.0007L16.6667 5.83398ZM5 15.0007V11.6673H10V15.0007H5Z\" fill=\"#7042D2\" />\r\n </svg>\r\n {config.merchantName || 'Merchant'}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Main Content Area with Enhanced Animations */}\r\n <div className=\"relative\">\r\n \r\n {/* Step 1: Select Network & Token */}\r\n <ScreenTransition currentStep={currentStep} targetStep=\"method\">\r\n <div className=\"pb-6 pt-6 px-6 bg-white rounded-t-2xl\">\r\n <h3 className=\"font-medium text-center mb-6\">Choose Payment Method</h3>\r\n \r\n {/* Network Selection */}\r\n <div className=\"space-y-4 mb-6\">\r\n <label className=\"block text-sm font-medium text-gray-700\">Select Network</label>\r\n <div className=\"space-y-2\">\r\n {networks.map((network) => (\r\n <button\r\n key={network.id}\r\n onClick={() => setSelectedNetwork(network)}\r\n className={`w-full p-3 border rounded-lg text-left transition-colors ${\r\n selectedNetwork?.id === network.id\r\n ? 'border-purple-500 bg-purple-50'\r\n : 'border-gray-200 hover:bg-gray-50'\r\n }`}\r\n >\r\n <div className=\"font-medium\">{network.name}</div>\r\n <div className=\"text-sm text-gray-500\">{network.shortName.toUpperCase()}</div>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Token Selection */}\r\n {selectedNetwork && (\r\n <div className=\"space-y-4 mb-6\">\r\n <label className=\"block text-sm font-medium text-gray-700\">Select Token</label>\r\n <div className=\"space-y-2\">\r\n {tokens\r\n .filter(token => token.Network?.shortName === selectedNetwork?.shortName)\r\n .map((token) => (\r\n <button\r\n key={token.id}\r\n onClick={() => setSelectedToken(token)}\r\n className={`w-full p-3 border rounded-lg text-left flex justify-between transition-colors ${\r\n selectedToken?.id === token.id\r\n ? 'border-purple-500 bg-purple-50'\r\n : 'border-gray-200 hover:bg-gray-50'\r\n }`}\r\n >\r\n <div>\r\n <div className=\"font-medium\">{token.name}</div>\r\n <div className=\"text-sm text-gray-500\">{token.symbol}</div>\r\n </div>\r\n {token.isStablecoin && (\r\n <span className=\"px-2 py-1 bg-green-100 text-green-600 text-xs rounded\">\r\n Stablecoin\r\n </span>\r\n )}\r\n </button>\r\n ))\r\n }\r\n </div>\r\n </div>\r\n )}\r\n\r\n {selectedNetwork && selectedToken && (\r\n <button\r\n onClick={createPayment}\r\n disabled={loading}\r\n className=\"w-full bg-purple-600 text-white py-3 px-4 rounded-lg hover:bg-purple-700 disabled:opacity-50 font-medium\"\r\n >\r\n {loading ? 'Creating Payment...' : 'Continue'}\r\n </button>\r\n )}\r\n </div>\r\n </ScreenTransition>\r\n\r\n {/* Step 2: Confirm Payment */}\r\n <ScreenTransition currentStep={currentStep} targetStep=\"confirm\">\r\n {selectedNetwork && selectedToken && paymentData && (\r\n <div>\r\n {/* Payment Method Tabs */}\r\n <div className=\"mb-4 px-4\">\r\n <div className=\"flex border-b border-gray-200\">\r\n <button\r\n onClick={() => setPaymentType('wallet')}\r\n className={`py-2 px-4 text-sm font-medium ${\r\n paymentType === 'wallet'\r\n ? 'border-b-2 border-purple-600 text-purple-600'\r\n : 'text-gray-500 hover:text-gray-700'\r\n }`}\r\n >\r\n Connect Wallet\r\n </button>\r\n <button\r\n onClick={() => setPaymentType('qrcode')}\r\n className={`py-2 px-4 text-sm font-medium ${\r\n paymentType === 'qrcode'\r\n ? 'border-b-2 border-purple-600 text-purple-600'\r\n : 'text-gray-500 hover:text-gray-700'\r\n }`}\r\n >\r\n QR Code\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Payment Details */}\r\n {paymentType === 'wallet' && (\r\n <div className=\"p-4 rounded-2xl mb-4 bg-white\">\r\n <h3 className=\"text-lg font-medium mb-2 text-gray-800\">Payment Details</h3>\r\n <div className=\"space-y-2 bg-[#EDE4FF] p-3 rounded-xl\">\r\n <div className=\"flex justify-between\">\r\n <span className=\"font-medium\">Currency:</span>\r\n <span className=\"font-medium\">{selectedToken.symbol}</span>\r\n </div>\r\n <div className=\"border border-b border-gray-400\"></div>\r\n <div className=\"flex justify-between\">\r\n <span className=\"font-medium\">Network:</span>\r\n <span className=\"font-medium\">{getNetworkDisplayName(selectedNetwork.shortName)}</span>\r\n </div>\r\n <div className=\"border border-b border-gray-400\"></div>\r\n <div className=\"flex justify-between border-t pt-2 mt-1\">\r\n <span className=\"font-bold\">Total:</span>\r\n <span className=\"font-bold text-lg\">${formatAmount(paymentData.totalAmount)}</span>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Wallet Connection or QR Code */}\r\n {paymentType === 'qrcode' ? (\r\n <div className=\"mb-4\">\r\n <EnhancedQRCode\r\n walletAddress={getWalletAddressForNetwork()}\r\n amount={paymentData.totalAmount || paymentData.amount}\r\n currency={selectedToken.symbol}\r\n network={selectedNetwork.shortName}\r\n theme={theme}\r\n />\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3 mb-4 px-4\">\r\n {!walletConnected ? (\r\n <div className=\"text-center space-y-4\">\r\n <div className=\"w-16 h-16 bg-purple-100 rounded-full flex items-center justify-center mx-auto\">\r\n <span className=\"text-2xl\">🦊</span>\r\n </div>\r\n <p className=\"text-gray-600\">Connect MetaMask to continue</p>\r\n <button\r\n onClick={connectWallet}\r\n disabled={loading}\r\n className=\"w-full bg-purple-600 text-white py-3 px-4 rounded-lg hover:bg-purple-700 disabled:opacity-50 font-medium\"\r\n >\r\n {loading ? 'Connecting...' : 'Connect MetaMask'}\r\n </button>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-4\">\r\n <div className=\"p-3 bg-green-50 rounded-lg border border-green-200\">\r\n <p className=\"text-green-600 text-sm font-medium\">✅ Wallet Connected</p>\r\n <p className=\"font-mono text-xs text-green-700 mt-1\">\r\n {wallet.account?.slice(0, 6)}...{wallet.account?.slice(-4)}\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Error Display */}\r\n {error && (\r\n <div className=\"p-3 rounded-lg bg-red-50 mb-4 text-red-600 text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n {/* Action Buttons */}\r\n <div className=\"grid grid-cols-2 gap-3 mb-3 px-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setCurrentStep('method')}\r\n className=\"w-full py-2 px-4 bg-gray-200 hover:bg-gray-300 text-purple-600 font-medium rounded-md\"\r\n >\r\n Back\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={paymentType === 'qrcode' ? handleQRPaymentVerification : sendTransaction}\r\n className=\"bg-green-600 text-white w-full py-2 px-4 font-medium rounded-md\"\r\n disabled={paymentType === 'wallet' && !walletConnected}\r\n >\r\n {paymentType === 'qrcode' ? 'I have sent the payment' : 'Pay Now'}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n </ScreenTransition>\r\n\r\n {/* Step 3: Processing */}\r\n <ScreenTransition currentStep={currentStep} targetStep=\"processing\">\r\n <EnhancedPaymentStatus\r\n status=\"processing\"\r\n theme={theme}\r\n message=\"Processing your payment...\"\r\n />\r\n </ScreenTransition>\r\n\r\n {/* Step 4: Success */}\r\n <ScreenTransition currentStep={currentStep} targetStep=\"success\">\r\n <EnhancedPaymentStatus\r\n status=\"success\"\r\n theme={theme}\r\n message=\"Payment successful!\"\r\n payment={paymentData}\r\n transactionHash=\"0x123...abc\"\r\n selectedPaymentMethod={{ currency: selectedToken?.symbol }}\r\n merchantName={config.merchantName || 'Merchant'}\r\n onClose={onClose}\r\n />\r\n </ScreenTransition>\r\n </div>\r\n\r\n {/* Enhanced Footer */}\r\n {currentStep !== 'success' && (\r\n <div className=\"text-center text-xs text-gray-500 flex items-center justify-center gap-1 py-6 bg-white rounded-b-3xl\">\r\n <p>Powered by <span className='text-purple-600'>Coinley</span> - Secure Cryptocurrency Payments</p>\r\n <svg className=\"inline w-4 h-4 text-green-500 ml-1\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"2\" fill=\"none\" />\r\n <path d=\"M9 12l2 2 4-4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n </svg>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default EnhancedSimpleCoinleyPayment;","// // Main SDK exports\r\n// export {\r\n// CoinleyProvider,\r\n// CoinleyCheckout,\r\n// ThemeProvider,\r\n// useCoinley\r\n// } from './CoinleyProvider';\r\n\r\n// export { PaymentAPI } from './PaymentAPI';\r\n// export { default as CoinleyPayment } from './CoinleyPayment';\r\n\r\n// // Import styles\r\n// import './styles/index.css';\r\n\r\n// // Version\r\n// export const VERSION = '0.0.0';\r\n\r\n// // Utils\r\n// export const utils = {\r\n// formatAmount: (amount, decimals = 2) => amount.toFixed(decimals),\r\n \r\n// truncateAddress: (address, startChars = 6, endChars = 4) => {\r\n// if (!address) return '';\r\n// if (address.length <= startChars + endChars) return address;\r\n// return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\r\n// },\r\n\r\n// isValidAddress: (address, network) => {\r\n// if (!address) return false;\r\n \r\n// switch (network.toLowerCase()) {\r\n// case 'ethereum':\r\n// case 'bsc':\r\n// case 'polygon':\r\n// return /^0x[a-fA-F0-9]{40}$/.test(address);\r\n// case 'tron':\r\n// return /^T[a-zA-Z0-9]{33}$/.test(address);\r\n// case 'solana':\r\n// return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(address);\r\n// default:\r\n// return address.length > 0;\r\n// }\r\n// },\r\n\r\n// copyToClipboard: async (text) => {\r\n// try {\r\n// await navigator.clipboard.writeText(text);\r\n// return true;\r\n// } catch {\r\n// return false;\r\n// }\r\n// }\r\n// };\r\n\r\n// // Error classes\r\n// export class CoinleyError extends Error {\r\n// constructor(message, code) {\r\n// super(message);\r\n// this.name = 'CoinleyError';\r\n// this.code = code;\r\n// }\r\n// }\r\n\r\n// // Default config\r\n// export const DEFAULT_CONFIG = {\r\n// theme: 'light',\r\n// debug: false,\r\n// testMode: false,\r\n// autoOpen: false\r\n// };\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// // src/index.js - exports for coinley-test SDK\r\n\r\n// // Original exports (keep these for backward compatibility)\r\n// export {\r\n// CoinleyProvider,\r\n// CoinleyCheckout,\r\n// ThemeProvider,\r\n// useCoinley\r\n// } from './CoinleyProvider';\r\n\r\n// export { PaymentAPI } from './PaymentAPI';\r\n// export { default as CoinleyPayment } from './CoinleyPayment';\r\n\r\n// // NEW: Simple payment component (the one that actually works)\r\n// export { default as SimpleCoinleyPayment } from './components/SimpleCoinleyPayment';\r\n\r\n// // NEW: Simple provider for the new component\r\n// export const SimpleCoinleyProvider = ({ children, ...props }) => children;\r\n\r\n// // Import styles\r\n// import './styles/index.css';\r\n\r\n// // Version\r\n// export const VERSION = '0.0.1';\r\n\r\n// // Utils\r\n// export const utils = {\r\n// formatAmount: (amount, decimals = 2) => amount.toFixed(decimals),\r\n \r\n// truncateAddress: (address, startChars = 6, endChars = 4) => {\r\n// if (!address) return '';\r\n// if (address.length <= startChars + endChars) return address;\r\n// return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\r\n// },\r\n \r\n// isValidAddress: (address, network) => {\r\n// if (!address) return false;\r\n \r\n// switch (network.toLowerCase()) {\r\n// case 'ethereum':\r\n// case 'bsc':\r\n// case 'polygon':\r\n// return /^0x[a-fA-F0-9]{40}$/.test(address);\r\n// case 'tron':\r\n// return /^T[a-zA-Z0-9]{33}$/.test(address);\r\n// case 'solana':\r\n// return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(address);\r\n// default:\r\n// return address.length > 0;\r\n// }\r\n// },\r\n \r\n// copyToClipboard: async (text) => {\r\n// try {\r\n// await navigator.clipboard.writeText(text);\r\n// return true;\r\n// } catch {\r\n// return false;\r\n// }\r\n// }\r\n// };\r\n\r\n// // Error classes\r\n// export class CoinleyError extends Error {\r\n// constructor(message, code) {\r\n// super(message);\r\n// this.name = 'CoinleyError';\r\n// this.code = code;\r\n// }\r\n// }\r\n\r\n// // Default config\r\n// export const DEFAULT_CONFIG = {\r\n// theme: 'light',\r\n// debug: false,\r\n// testMode: false,\r\n// autoOpen: false\r\n// };\r\n\r\n\r\n\r\n\r\n// src/index.js - Updated exports for coinley-test SDK with enhanced design\r\n\r\n// Original exports (keep these for backward compatibility)\r\nexport {\r\n CoinleyProvider,\r\n CoinleyCheckout,\r\n ThemeProvider,\r\n useCoinley\r\n} from './CoinleyProvider';\r\n\r\nexport { PaymentAPI } from './PaymentAPI';\r\nexport { default as CoinleyPayment } from './CoinleyPayment';\r\n\r\n// Keep the original simple component (working version)\r\nexport { default as SimpleCoinleyPayment } from './components/SimpleCoinleyPayment';\r\n\r\n// NEW: Enhanced component with modern design from coinley-checkout\r\nexport { default as EnhancedSimpleCoinleyPayment } from './components/EnhancedSimpleCoinleyPayment';\r\n\r\n// NEW: Simple provider for both components\r\nexport const SimpleCoinleyProvider = ({ children, ...props }) => children;\r\n\r\n// Import styles\r\nimport './styles/index.css';\r\n\r\n// Version\r\nexport const VERSION = '0.0.2'; // Updated version\r\n\r\n// Utils (keep your existing utils)\r\nexport const utils = {\r\n formatAmount: (amount, decimals = 2) => amount.toFixed(decimals),\r\n \r\n truncateAddress: (address, startChars = 6, endChars = 4) => {\r\n if (!address) return '';\r\n if (address.length <= startChars + endChars) return address;\r\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\r\n },\r\n \r\n isValidAddress: (address, network) => {\r\n if (!address) return false;\r\n \r\n switch (network.toLowerCase()) {\r\n case 'ethereum':\r\n case 'bsc':\r\n case 'polygon':\r\n return /^0x[a-fA-F0-9]{40}$/.test(address);\r\n case 'tron':\r\n return /^T[a-zA-Z0-9]{33}$/.test(address);\r\n case 'solana':\r\n return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(address);\r\n default:\r\n return address.length > 0;\r\n }\r\n },\r\n \r\n copyToClipboard: async (text) => {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n};\r\n\r\n// Error classes (keep your existing error handling)\r\nexport class CoinleyError extends Error {\r\n constructor(message, code) {\r\n super(message);\r\n this.name = 'CoinleyError';\r\n this.code = code;\r\n }\r\n}\r\n\r\n// Default config\r\nexport const DEFAULT_CONFIG = {\r\n theme: 'light',\r\n debug: false,\r\n testMode: false,\r\n autoOpen: false\r\n};\r\n\r\n// NEW: Quick usage examples for both components\r\nexport const USAGE_EXAMPLES = {\r\n // Original simple component (still works)\r\n simple: `\r\nimport { SimpleCoinleyPayment } from 'coinley-test';\r\n\r\n<SimpleCoinleyPayment\r\n apiKey=\"your-api-key\"\r\n apiSecret=\"your-api-secret\"\r\n apiUrl=\"https://your-api-url.com\"\r\n isOpen={isOpen}\r\n config={{\r\n amount: 100,\r\n customerEmail: \"customer@example.com\",\r\n merchantWalletAddresses: {\r\n ethereum: \"0x...\",\r\n bsc: \"0x...\"\r\n }\r\n }}\r\n onSuccess={(paymentId, txHash, details) => console.log('Success!')}\r\n onError={(error) => console.error('Error:', error)}\r\n onClose={() => setIsOpen(false)}\r\n/>\r\n `,\r\n \r\n // Enhanced component with modern design\r\n enhanced: `\r\nimport { EnhancedSimpleCoinleyPayment } from 'coinley-test';\r\n\r\n<EnhancedSimpleCoinleyPayment\r\n apiKey=\"your-api-key\"\r\n apiSecret=\"your-api-secret\"\r\n apiUrl=\"https://your-api-url.com\"\r\n isOpen={isOpen}\r\n config={{\r\n amount: 100,\r\n customerEmail: \"customer@example.com\",\r\n merchantName: \"Your Store\",\r\n merchantWalletAddresses: {\r\n ethereum: \"0x...\",\r\n bsc: \"0x...\"\r\n }\r\n }}\r\n onSuccess={(paymentId, txHash, details) => console.log('Success!')}\r\n onError={(error) => console.error('Error:', error)}\r\n onClose={() => setIsOpen(false)}\r\n theme=\"light\" // or \"dark\"\r\n/>\r\n `\r\n};"],"names":["require$$0","jsxRuntimeModule","jsxs","jsx","Fragment","error","SimpleMetaMaskWallet","SimplePaymentAPI","_a","_b"],"mappings":"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","x_google_ignoreList":[0,1]}
|