import React, { useState, useEffect } from 'react';
import {
createSession,
getSessionDetails,
checkPaymentStatus,
PaymentStatus
} from '@whisky-peak/whisky-pay-sdk';
import { useWallet } from '@solana/wallet-adapter-react';
import { WalletMultiButton } from '@solana/wallet-adapter-react-ui';
function CustomCheckout() {
const [sessionId, setSessionId] = useState(null);
const [sessionDetails, setSessionDetails] = useState(null);
const [status, setStatus] = useState('idle');
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const { publicKey, sendTransaction } = useWallet();
// Create a new payment session
const createPaymentSession = async () => {
setLoading(true);
setError(null);
try {
const session = await createSession(
'your-merchant-id',
'customer@example.com',
'premium-plan'
);
setSessionId(session);
// Fetch session details
const details = await getSessionDetails(session);
setSessionDetails(details);
setStatus('session_created');
} catch (error) {
console.error('Error creating session:', error);
setError('Failed to create payment session');
} finally {
setLoading(false);
}
};
// Process payment when wallet is connected
const processPayment = async () => {
if (!publicKey || !sessionId || !sessionDetails) {
return;
}
setStatus('processing');
setError(null);
try {
// Create the transaction
const { transaction, status } = await prepareTransaction(
sessionId,
publicKey.toString(),
'SOL' // Token to pay with
);
if (status === 'ready') {
// Send transaction to wallet for signing
const signature = await sendTransaction(transaction, 'finalized');
// Check payment status periodically
const intervalId = setInterval(async () => {
const result = await checkPaymentStatus(sessionId);
if (result.status === PaymentStatus.COMPLETED) {
clearInterval(intervalId);
setStatus('completed');
} else if (result.status === PaymentStatus.FAILED) {
clearInterval(intervalId);
setStatus('failed');
setError(result.message || 'Payment failed');
}
}, 3000);
}
} catch (error) {
console.error('Error processing payment:', error);
setStatus('failed');
setError('Failed to process payment');
}
};
// Render UI based on status
return (
<div className="custom-checkout">
<h1>Checkout</h1>
{status === 'idle' && (
<div>
<button
onClick={createPaymentSession}
disabled={loading}
>
{loading ? 'Creating Session...' : 'Checkout Now'}
</button>
</div>
)}
{status === 'session_created' && (
<div>
<h2>Payment Details</h2>
<p>Amount: {sessionDetails.amount} {sessionDetails.currency}</p>
<p>Plan: {sessionDetails.planId}</p>
{!publicKey ? (
<div>
<p>Connect your wallet to continue:</p>
<WalletMultiButton />
</div>
) : (
<button onClick={processPayment}>
Pay Now
</button>
)}
</div>
)}
{status === 'processing' && (
<div>
<h2>Processing Payment</h2>
<p>Please confirm the transaction in your wallet.</p>
<div className="spinner"></div>
</div>
)}
{status === 'completed' && (
<div>
<h2>Payment Complete!</h2>
<p>Thank you for your purchase.</p>
<button onClick={() => window.location.href = '/dashboard'}>
Go to Dashboard
</button>
</div>
)}
{status === 'failed' && (
<div>
<h2>Payment Failed</h2>
<p>Error: {error}</p>
<button onClick={createPaymentSession}>
Try Again
</button>
</div>
)}
</div>
);
}