Add PaymentService integration to enhance ticket purchasing and lightning payment functionality

- Introduce PAYMENT_SERVICE token in di-container for dependency injection.
- Update base module to register and initialize PaymentService, ensuring it is available for use.
- Refactor useTicketPurchase and useLightningPayment composables to utilize PaymentService for wallet management, payment processing, and QR code generation.
- Delegate payment handling and error management to PaymentService, streamlining the payment workflow and improving user experience.
This commit is contained in:
padreug 2025-09-05 15:17:51 +02:00
parent adf32c0dca
commit 0bced11623
5 changed files with 372 additions and 137 deletions

View file

@ -1,11 +1,14 @@
import { ref, computed, onUnmounted } from 'vue'
import { purchaseTicket, checkPaymentStatus, payInvoiceWithWallet } from '@/lib/api/events'
import { purchaseTicket, checkPaymentStatus } from '@/lib/api/events'
import { useAuth } from '@/composables/useAuth'
import { toast } from 'vue-sonner'
import { useAsyncOperation } from '@/core/composables/useAsyncOperation'
import { injectService, SERVICE_TOKENS } from '@/core/di-container'
import type { PaymentService } from '@/core/services/PaymentService'
export function useTicketPurchase() {
const { isAuthenticated, currentUser } = useAuth()
const paymentService = injectService(SERVICE_TOKENS.PAYMENT_SERVICE) as PaymentService
// Async operations
const purchaseOperation = useAsyncOperation()
@ -15,7 +18,6 @@ export function useTicketPurchase() {
const paymentRequest = ref<string | null>(null)
const qrCode = ref<string | null>(null)
const isPaymentPending = ref(false)
const isPayingWithWallet = ref(false)
// Ticket QR code state
const ticketQRCode = ref<string | null>(null)
@ -32,42 +34,28 @@ export function useTicketPurchase() {
}
})
const userWallets = computed(() => currentUser.value?.wallets || [])
const hasWalletWithBalance = computed(() =>
userWallets.value.some((wallet: any) => wallet.balance_msat > 0)
)
// Delegate to PaymentService
const userWallets = computed(() => paymentService.userWallets)
const hasWalletWithBalance = computed(() => paymentService.hasWalletWithBalance)
const isPayingWithWallet = computed(() => paymentService.isProcessingPayment)
// Generate QR code for Lightning payment
// Generate QR code for Lightning payment - delegate to PaymentService
async function generateQRCode(bolt11: string) {
try {
const qrcode = await import('qrcode')
const dataUrl = await qrcode.toDataURL(bolt11, {
width: 256,
margin: 2,
color: {
dark: '#000000',
light: '#FFFFFF'
}
})
qrCode.value = dataUrl
qrCode.value = await paymentService.generateQRCode(bolt11)
} catch (err) {
console.error('Error generating QR code:', err)
// Note: error handling is now managed by the purchaseOperation
}
}
// Generate QR code for ticket
// Generate QR code for ticket - delegate to PaymentService
async function generateTicketQRCode(ticketId: string) {
try {
const qrcode = await import('qrcode')
const ticketUrl = `ticket://${ticketId}`
const dataUrl = await qrcode.toDataURL(ticketUrl, {
const dataUrl = await paymentService.generateCustomQRCode(ticketUrl, {
width: 128,
margin: 2,
color: {
dark: '#000000',
light: '#FFFFFF'
}
margin: 2
})
ticketQRCode.value = dataUrl
return dataUrl
@ -77,16 +65,12 @@ export function useTicketPurchase() {
}
}
// Pay with wallet
// Pay with wallet - delegate to PaymentService
async function payWithWallet(paymentRequest: string) {
const walletWithBalance = userWallets.value.find((wallet: any) => wallet.balance_msat > 0)
if (!walletWithBalance) {
throw new Error('No wallet with sufficient balance found')
}
try {
await payInvoiceWithWallet(paymentRequest, walletWithBalance.id, walletWithBalance.adminkey)
await paymentService.payInvoiceWithUserWallet(paymentRequest, undefined, {
showToast: false // We'll handle success notifications in the ticket purchase flow
})
return true
} catch (error) {
console.error('Wallet payment failed:', error)
@ -119,7 +103,6 @@ export function useTicketPurchase() {
// Try to pay with wallet if available
if (hasWalletWithBalance.value) {
isPayingWithWallet.value = true
try {
await payWithWallet(invoice.payment_request)
// If wallet payment succeeds, proceed to check payment status
@ -127,7 +110,6 @@ export function useTicketPurchase() {
} catch (walletError) {
// If wallet payment fails, fall back to manual payment
console.log('Wallet payment failed, falling back to manual payment:', walletError)
isPayingWithWallet.value = false
await startPaymentStatusCheck(eventId, invoice.payment_hash)
}
} else {
@ -189,16 +171,15 @@ export function useTicketPurchase() {
paymentRequest.value = null
qrCode.value = null
isPaymentPending.value = false
isPayingWithWallet.value = false
ticketQRCode.value = null
purchasedTicketId.value = null
showTicketQR.value = false
}
// Open Lightning wallet
// Open Lightning wallet - delegate to PaymentService
function handleOpenLightningWallet() {
if (paymentRequest.value) {
window.open(`lightning:${paymentRequest.value}`, '_blank')
paymentService.openExternalLightningWallet(paymentRequest.value)
}
}