import React, {useMemo, useCallback} from 'react'; import {ConnectionProvider, WalletProvider} from '@solana/wallet-adapter-react'; import {WalletAdapterNetwork} from '@solana/wallet-adapter-base'; import {WalletModalProvider, WalletMultiButton} from '@solana/wallet-adapter-react-ui'; import {clusterApiUrl} from '@solana/web3.js'; import {createTransfer} from '@solana/pay'; import {WalletNotConnectedError} from '@solana/wallet-adapter-base'; import {useConnection, useWallet} from '@solana/wallet-adapter-react'; import { BackpackWalletAdapter, PhantomWalletAdapter, SolflareWalletAdapter, SolletExtensionWalletAdapter, SolletWalletAdapter, TorusWalletAdapter } from "@solana/wallet-adapter-wallets"; import {SolanaPaymentConfigType, SolanaPaymentWindow} from "./types"; import {generateTransaction} from "./helpers/transaction-generator"; require('@solana/wallet-adapter-react-ui/styles.css'); declare const window: SolanaPaymentWindow; const SolanaWalletPayment = (config: SolanaPaymentConfigType) => { let network; let endpoint; if (config.cluster === WalletAdapterNetwork.Devnet) { network = WalletAdapterNetwork.Devnet; endpoint = useMemo(() => clusterApiUrl(network), [network]); } else { network = WalletAdapterNetwork.Mainnet; endpoint = config.cluster; } const wallets = useMemo( () => [ new PhantomWalletAdapter(), new BackpackWalletAdapter(), new SolflareWalletAdapter(), new SolletWalletAdapter({ network }), new SolletExtensionWalletAdapter({ network }), new TorusWalletAdapter(), ], [network] ); return ( ); }; const PaymentButton = (props: { transaction: any }) => { const transaction = props.transaction; const { connection } = useConnection(); const { publicKey, sendTransaction } = useWallet(); const onClick = useCallback( async () => { if (!publicKey) { throw new WalletNotConnectedError(); } try { window.SOLANA_ERROR_PRESENTER.clear(); let transactionData = await generateTransaction(transaction); const tx = await createTransfer( connection, publicKey, { recipient: transactionData.recipient, amount: transactionData.amount, reference: transactionData.reference, splToken: transactionData.splToken, memo: transactionData.memo, } ); const signature = await sendTransaction(tx, connection); const result = await connection.confirmTransaction(signature, 'confirmed'); if (result.value.err === null) { window.SOLANA_PAYMENT_VERIFIER.clearVerificationTimer(); window.SOLANA_PAYMENT_VERIFIER.verifyTransaction(); } } catch (e) { if (e instanceof Error) { window.SOLANA_ERROR_PRESENTER.showError(e.message); } } }, [publicKey, sendTransaction, connection] ); return ( ); }; export default SolanaWalletPayment;