coinley-test 0.0.13 → 0.0.15
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 +32 -22
- 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
CHANGED
|
@@ -259,8 +259,8 @@ const WalletIntegration = ({
|
|
|
259
259
|
const { connectWallet, isPending } = useWalletConnect();
|
|
260
260
|
const { detectedWallets, hasWallets, walletCount } = useWalletDetection();
|
|
261
261
|
const { sendTransaction } = useWalletTransaction();
|
|
262
|
-
useWalletModal();
|
|
263
|
-
|
|
262
|
+
const { openModal } = useWalletModal();
|
|
263
|
+
detectedWallets.filter(
|
|
264
264
|
(wallet) => wallet.name.toLowerCase().includes("metamask") || wallet.provider === "injected" || wallet.name.toLowerCase().includes("coinbase") || wallet.name.toLowerCase().includes("wallet connect")
|
|
265
265
|
);
|
|
266
266
|
const handleConnectSpecificWallet = async (walletType) => {
|
|
@@ -270,7 +270,17 @@ const WalletIntegration = ({
|
|
|
270
270
|
await disconnect();
|
|
271
271
|
await new Promise((resolve) => setTimeout(resolve, 1e3));
|
|
272
272
|
}
|
|
273
|
-
|
|
273
|
+
if (walletType === "metamask" && window.ethereum && window.ethereum.isMetaMask) {
|
|
274
|
+
try {
|
|
275
|
+
await window.ethereum.request({ method: "eth_requestAccounts" });
|
|
276
|
+
console.log("✅ Connected directly to MetaMask");
|
|
277
|
+
} catch (error) {
|
|
278
|
+
console.error("MetaMask connection failed:", error);
|
|
279
|
+
throw error;
|
|
280
|
+
}
|
|
281
|
+
} else {
|
|
282
|
+
await connectWallet(walletType);
|
|
283
|
+
}
|
|
274
284
|
} catch (error) {
|
|
275
285
|
console.error("Wallet connection failed:", error);
|
|
276
286
|
onError(error.message || "Failed to connect wallet");
|
|
@@ -278,6 +288,15 @@ const WalletIntegration = ({
|
|
|
278
288
|
setIsConnecting(false);
|
|
279
289
|
}
|
|
280
290
|
};
|
|
291
|
+
const handleOpenModal = () => {
|
|
292
|
+
try {
|
|
293
|
+
console.log("Attempting to open wallet modal...");
|
|
294
|
+
openModal();
|
|
295
|
+
} catch (error) {
|
|
296
|
+
console.error("Failed to open modal:", error);
|
|
297
|
+
handleConnectSpecificWallet("injected");
|
|
298
|
+
}
|
|
299
|
+
};
|
|
281
300
|
const handleSendPayment = async () => {
|
|
282
301
|
var _a;
|
|
283
302
|
if (!isConnected || !paymentData || !selectedToken) {
|
|
@@ -362,7 +381,7 @@ const WalletIntegration = ({
|
|
|
362
381
|
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
363
382
|
"button",
|
|
364
383
|
{
|
|
365
|
-
onClick: () => handleConnectSpecificWallet("
|
|
384
|
+
onClick: () => handleConnectSpecificWallet("metamask"),
|
|
366
385
|
disabled: isPending || isConnecting,
|
|
367
386
|
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",
|
|
368
387
|
children: [
|
|
@@ -377,36 +396,27 @@ const WalletIntegration = ({
|
|
|
377
396
|
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
378
397
|
"button",
|
|
379
398
|
{
|
|
380
|
-
onClick:
|
|
399
|
+
onClick: handleOpenModal,
|
|
381
400
|
disabled: isPending || isConnecting,
|
|
382
401
|
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",
|
|
383
402
|
children: [
|
|
384
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xl", children: "
|
|
403
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xl", children: "💼" }),
|
|
385
404
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-left flex-1", children: [
|
|
386
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-medium", children: "
|
|
387
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-gray-500", children: "
|
|
405
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-medium", children: "Other Wallets" }),
|
|
406
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-gray-500", children: "Choose from available wallets" })
|
|
388
407
|
] })
|
|
389
408
|
]
|
|
390
409
|
}
|
|
391
410
|
),
|
|
392
|
-
|
|
393
|
-
(wallet) => !wallet.name.toLowerCase().includes("metamask")
|
|
394
|
-
).map((wallet, index) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
411
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
395
412
|
"button",
|
|
396
413
|
{
|
|
397
414
|
onClick: () => handleConnectSpecificWallet("injected"),
|
|
398
415
|
disabled: isPending || isConnecting,
|
|
399
|
-
className: "w-full p-
|
|
400
|
-
children:
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-medium", children: wallet.name }),
|
|
404
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-gray-500", children: wallet.provider })
|
|
405
|
-
] })
|
|
406
|
-
]
|
|
407
|
-
},
|
|
408
|
-
index
|
|
409
|
-
))
|
|
416
|
+
className: "w-full p-2 text-sm border border-dashed border-gray-300 rounded-lg hover:border-[#7042D2] transition-colors disabled:opacity-50",
|
|
417
|
+
children: "Try Direct Connection"
|
|
418
|
+
}
|
|
419
|
+
)
|
|
410
420
|
] }),
|
|
411
421
|
isConnecting && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-center space-x-2 text-gray-600", children: [
|
|
412
422
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Loader2, { className: "w-4 h-4 animate-spin" }),
|
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/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 // Connect to specific wallet\r\n await connectWallet(walletType);\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 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('injected')}\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 {/* WalletConnect Button */}\r\n <button\r\n onClick={() => handleConnectSpecificWallet('walletConnect')}\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\">WalletConnect</div>\r\n <div className=\"text-xs text-gray-500\">Scan with mobile wallet</div>\r\n </div>\r\n </button>\r\n\r\n {/* Other Ethereum wallets */}\r\n {ethereumWallets.filter(wallet => \r\n !wallet.name.toLowerCase().includes('metamask')\r\n ).map((wallet, index) => (\r\n <button\r\n key={index}\r\n onClick={() => handleConnectSpecificWallet('injected')}\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\">{wallet.icon}</span>\r\n <div className=\"text-left flex-1\">\r\n <div className=\"font-medium\">{wallet.name}</div>\r\n <div className=\"text-xs text-gray-500\">{wallet.provider}</div>\r\n </div>\r\n </button>\r\n ))}\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 }\r\n };\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};","// Main SDK exports\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// Import styles\r\nimport './styles/index.css';\r\n\r\n// Version\r\nexport const VERSION = '0.0.0';\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"],"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/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 }\r\n };\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};","// Main SDK exports\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// Import styles\r\nimport './styles/index.css';\r\n\r\n// Version\r\nexport const VERSION = '0.0.0';\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"],"mappings":"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","x_google_ignoreList":[0,1]}
|