UNPKG

lightning-auth-and-payment

Version:

Lightning Network authentication and payment processing library for modern web applications

168 lines 5.96 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useBTCPayPayment = useBTCPayPayment; const react_1 = require("react"); /** * BTCPay payment hook for managing Lightning payments */ function useBTCPayPayment() { const [paymentState, setPaymentState] = (0, react_1.useState)({ status: 'idle' }); const [copied, setCopied] = (0, react_1.useState)(false); /** * Create a Lightning invoice */ const createInvoice = (0, react_1.useCallback)(async (params) => { try { setPaymentState({ status: 'creating' }); const response = await fetch('/api/payment/create-invoice', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(params), }); if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.error || 'Failed to create invoice'); } const data = await response.json(); setPaymentState({ status: 'waiting', invoiceId: data.invoiceId, btcpayInvoiceId: data.btcpayInvoiceId, bolt11: data.bolt11, checkoutLink: data.checkoutLink, amountSats: data.amountSats, description: data.description, expiresAt: new Date(data.expiresAt), }); // Start polling for status updates console.log('🚀 Starting polling for invoice:', data.invoiceId); startStatusPolling(data.invoiceId); } catch (error) { console.error('Error creating invoice:', error); setPaymentState({ status: 'error', error: error instanceof Error ? error.message : 'Failed to create invoice', }); } }, []); /** * Check invoice status */ const checkStatus = (0, react_1.useCallback)(async (invoiceId) => { try { console.log('📡 Checking status for invoice:', invoiceId); const response = await fetch(`/api/payment/status?id=${invoiceId}`); if (!response.ok) { throw new Error('Failed to check status'); } const data = await response.json(); console.log('📊 Status response:', data); setPaymentState(prev => ({ ...prev, status: data.status === 'settled' ? 'settled' : data.status === 'expired' ? 'expired' : 'waiting', btcpayStatus: data.btcpayStatus, })); // Stop polling if payment is settled or expired if (data.status === 'settled' || data.status === 'expired') { console.log('✅ Payment completed, stopping polling'); stopStatusPolling(); } } catch (error) { console.error('❌ Error checking status:', error); } }, []); /** * Start polling for status updates */ const [pollingInterval, setPollingInterval] = (0, react_1.useState)(null); const startStatusPolling = (0, react_1.useCallback)((invoiceId) => { console.log('🔄 Starting payment polling for invoice:', invoiceId); // Clear any existing polling setPollingInterval(prev => { if (prev) { clearInterval(prev); } return null; }); // Start new polling const interval = setInterval(() => { console.log('🔍 Polling payment status for:', invoiceId); checkStatus(invoiceId); }, 3000); // Poll every 3 seconds setPollingInterval(interval); }, [checkStatus]); const stopStatusPolling = (0, react_1.useCallback)(() => { setPollingInterval(prev => { if (prev) { clearInterval(prev); } return null; }); }, []); /** * Copy BOLT11 to clipboard */ const copyBolt11 = (0, react_1.useCallback)(async () => { if (paymentState.bolt11) { try { await navigator.clipboard.writeText(paymentState.bolt11); setCopied(true); setTimeout(() => setCopied(false), 2000); } catch (error) { console.error('Failed to copy BOLT11:', error); } } }, [paymentState.bolt11]); /** * Calculate time left until expiration */ const timeLeft = (0, react_1.useMemo)(() => { if (!paymentState.expiresAt || paymentState.status !== 'waiting') { return 0; } const now = Date.now(); const expires = paymentState.expiresAt.getTime(); const remaining = Math.max(0, Math.floor((expires - now) / 1000)); return remaining; }, [paymentState.expiresAt, paymentState.status]); /** * Reset payment state */ const resetPayment = (0, react_1.useCallback)(() => { stopStatusPolling(); setPaymentState({ status: 'idle' }); setCopied(false); }, []); /** * Cleanup on unmount */ (0, react_1.useEffect)(() => { return () => { stopStatusPolling(); }; }, [stopStatusPolling]); return { // State paymentState, copied, timeLeft, // Actions createInvoice, checkStatus, copyBolt11, resetPayment, // Status helpers isCreating: paymentState.status === 'creating', isWaiting: paymentState.status === 'waiting', isSettled: paymentState.status === 'settled', isExpired: paymentState.status === 'expired', hasError: paymentState.status === 'error', }; } //# sourceMappingURL=use-btcpay-payment.js.map