diff --git a/app/admin/transactions/page.tsx b/app/admin/transactions/page.tsx index 8a3655a..143fe35 100644 --- a/app/admin/transactions/page.tsx +++ b/app/admin/transactions/page.tsx @@ -12,6 +12,7 @@ import { tr } from 'date-fns/locale'; import TransactionSearch from '@/components/admin/TransactionSearch'; import TransactionStatusFilter from '@/components/admin/TransactionStatusFilter'; import SyncPaymentsButton from '@/components/admin/SyncPaymentsButton'; +import TransactionWallets from '@/components/admin/TransactionWallets'; async function getTransactions(filters: { merchant_id?: string; q?: string; status?: string }) { let sql = ` @@ -118,6 +119,8 @@ export default async function TransactionsPage(props: { ) : ( {t.callback_url || 'Geri dönüş yok'} )} + {/* Render generated crypto wallets below the info */} + diff --git a/components/admin/TransactionWallets.tsx b/components/admin/TransactionWallets.tsx new file mode 100644 index 0000000..b730dd6 --- /dev/null +++ b/components/admin/TransactionWallets.tsx @@ -0,0 +1,70 @@ +'use client'; + +import React from 'react'; +import { ExternalLink, Copy, Check } from 'lucide-react'; + +interface TransactionWalletsProps { + metadata: any; +} + +export default function TransactionWallets({ metadata }: TransactionWalletsProps) { + const [copied, setCopied] = React.useState(null); + + if (!metadata || !metadata.wallets) return null; + + const wallets = metadata.wallets; + const networks = Object.keys(wallets); + + if (networks.length === 0) return null; + + const handleCopy = (e: React.MouseEvent, text: string) => { + e.stopPropagation(); + navigator.clipboard.writeText(text); + setCopied(text); + setTimeout(() => setCopied(null), 2000); + }; + + const getExplorerUrl = (network: string, address: string) => { + if (network === 'SOLANA') return `https://explorer.solana.com/address/${address}?cluster=devnet`; + if (network === 'POLYGON') return `https://polygonscan.com/address/${address}`; + if (network === 'TRON') return `https://tronscan.org/#/address/${address}`; + if (network === 'EVM') return `https://etherscan.io/address/${address}`; + return '#'; + }; + + return ( +
+ {networks.map(network => { + const walletData = wallets[network]; + const address = typeof walletData === 'string' ? walletData : walletData?.address; + + if (!address) return null; + + const shortAddress = `${address.substring(0, 5)}...${address.substring(address.length - 4)}`; + + return ( +
+ {network}: + + {shortAddress} + + + +
+ ); + })} +
+ ); +}