Implement Lightning payment handling in OrderHistory component

- Replace the existing openLightningWallet function with payWithLightning for improved payment processing.
- Introduce useLightningPayment composable to manage wallet payment logic and state.
- Update button text dynamically based on payment status and wallet availability.
- Enhance error handling and user feedback during payment attempts, ensuring a smoother user experience.
This commit is contained in:
padreug 2025-09-05 04:50:35 +02:00
parent f5ea2a8d5e
commit db9b50240d
2 changed files with 171 additions and 26 deletions

View file

@ -137,10 +137,10 @@
<!-- Payment Actions -->
<div class="flex gap-2">
<Button @click="openLightningWallet(order.paymentRequest || '')" variant="default" size="sm"
class="flex-1" :disabled="!order.paymentRequest">
<Button @click="payWithLightning(order)" variant="default" size="sm"
class="flex-1" :disabled="!order.paymentRequest || isPayingWithWallet">
<Zap class="w-3 h-3 mr-1" />
Pay with Lightning
{{ isPayingWithWallet ? 'Paying...' : hasWalletWithBalance ? 'Pay with Wallet' : 'Pay with Lightning' }}
</Button>
<Button @click="toggleQRCode(order.id)" variant="outline" size="sm">
<QrCode class="w-3 h-3" />
@ -230,10 +230,11 @@
<script setup lang="ts">
import { ref, computed, onMounted, watch } from 'vue'
import { useRouter } from 'vue-router'
import { useMarketStore } from '@/stores/market'
import { useMarketStore } from '../stores/market'
// import { useOrderEvents } from '@/composables/useOrderEvents' // TODO: Move to market module
import { injectService, SERVICE_TOKENS } from '@/core/di-container'
import { auth } from '@/composables/useAuth'
import { useLightningPayment } from '../composables/useLightningPayment'
import { Button } from '@/components/ui/button'
import { Badge } from '@/components/ui/badge'
import { Package, Store, Zap, Copy, QrCode } from 'lucide-vue-next'
@ -243,6 +244,8 @@ import type { OrderStatus } from '@/stores/market'
const router = useRouter()
const marketStore = useMarketStore()
const relayHub = injectService(SERVICE_TOKENS.RELAY_HUB)
const { handlePayment, isPayingWithWallet, hasWalletWithBalance } = useLightningPayment()
// const orderEvents = useOrderEvents() // TODO: Move to market module
const orderEvents = {
isSubscribed: ref(false),
@ -382,29 +385,12 @@ const copyPaymentRequest = async (paymentRequest: string) => {
}
}
const openLightningWallet = (paymentRequest: string) => {
// Try to open with common Lightning wallet protocols
const protocols = [
`lightning:${paymentRequest}`,
`bitcoin:${paymentRequest}`,
paymentRequest
]
// Try each protocol
for (const protocol of protocols) {
try {
window.open(protocol, '_blank')
toast.success('Opening Lightning wallet', {
description: 'If your wallet doesn\'t open, copy the payment request manually'
})
return
} catch (err) {
console.warn('Failed to open protocol:', protocol, err)
}
const payWithLightning = async (order: any) => {
try {
await handlePayment(order.paymentRequest, order.id)
} catch (error) {
console.error('Payment failed:', error)
}
// Fallback: copy to clipboard
copyPaymentRequest(paymentRequest)
}
const toggleQRCode = async (orderId: string) => {