web-app/src/modules/market/composables/usePaymentStatusChecker.ts
padreug 861c032300 Refactor imports and enhance type handling across components
- Update import paths for useTicketPurchase in PurchaseTicketDialog.vue to reflect new module structure.
- Adjust type handling in Navbar.vue and various market components to use 'any' for improved compatibility with existing data structures.
- Enhance useLightningPayment composable to include shipping zone details, ensuring better order management.
- Remove unused pages (events.vue, MyTickets.vue, OrderHistory.vue) to streamline the codebase and improve maintainability.
2025-09-05 05:42:44 +02:00

141 lines
No EOL
4.4 KiB
TypeScript

import { ref } from 'vue'
import { useAuth } from '@/composables/useAuth'
import { useMarketStore } from '../stores/market'
// Simplified bolt11 parser to extract payment hash
function parseBolt11(_bolt11: string): { paymentHash?: string } {
try {
// Very basic bolt11 parsing - in a real app you'd use a proper library
// For now, we'll return empty since this requires complex bech32 decoding
// Note: Remove lightning: prefix if present: bolt11.replace(/^lightning:/, '')
return {}
} catch (error) {
console.error('Failed to parse bolt11:', error)
return {}
}
}
export function usePaymentStatusChecker() {
const { currentUser } = useAuth()
const marketStore = useMarketStore()
const isChecking = ref(false)
// Check payment status via LNbits API using payment hash
async function checkPaymentStatusByHash(paymentHash: string, walletId?: string): Promise<boolean> {
if (!currentUser.value || !paymentHash) {
return false
}
try {
// Get wallet with admin key
const wallet = walletId
? currentUser.value.wallets?.find((w: any) => w.id === walletId)
: currentUser.value.wallets?.find((w: any) => w.adminkey) // Use first wallet with admin key
if (!wallet || !wallet.adminkey) {
console.warn('No wallet with admin key found for payment status check')
return false
}
// Check payment status via LNbits API
const response = await fetch(`/api/v1/payments/${paymentHash}`, {
headers: {
'accept': 'application/json',
'X-API-KEY': wallet.adminkey,
},
})
if (response.ok) {
const payment = await response.json()
return payment.paid === true
} else {
console.warn('Payment not found or API error:', response.status)
return false
}
} catch (error) {
console.error('Failed to check payment status:', error)
return false
}
}
// Check payment status for a bolt11 invoice
async function checkPaymentStatusByBolt11(bolt11: string): Promise<boolean> {
const parsed = parseBolt11(bolt11)
if (parsed.paymentHash) {
return await checkPaymentStatusByHash(parsed.paymentHash)
}
return false
}
// Check and update payment status for an order
async function checkAndUpdateOrderPaymentStatus(orderId: string): Promise<boolean> {
if (isChecking.value) return false
const order = marketStore.orders[orderId]
if (!order || !order.paymentRequest) {
return false
}
try {
isChecking.value = true
console.log('🔍 Checking payment status for order:', orderId.slice(-8))
// Method 1: Check by bolt11 (if we can extract payment hash)
const isPaid = await checkPaymentStatusByBolt11(order.paymentRequest)
if (isPaid && order.paymentStatus !== 'paid') {
console.log('✅ Payment confirmed via API check for order:', orderId.slice(-8))
// Update order status
const updatedOrder = {
...order,
status: 'paid' as const,
paymentStatus: 'paid' as const,
paidAt: Math.floor(Date.now() / 1000),
items: [...order.items], // Convert readonly to mutable
shippingZone: order.shippingZone ? {
...order.shippingZone,
countries: order.shippingZone.countries ? [...order.shippingZone.countries] : undefined
} : order.shippingZone
}
marketStore.updateOrder(orderId, updatedOrder)
return true
}
return isPaid
} catch (error) {
console.error('Failed to check payment status:', error)
return false
} finally {
isChecking.value = false
}
}
// Check payment status for all pending orders
async function checkAllPendingOrders(): Promise<void> {
const pendingOrders = Object.values(marketStore.orders).filter(
order => order.paymentStatus === 'pending' && order.paymentRequest
)
if (pendingOrders.length === 0) {
return
}
console.log(`🔍 Checking payment status for ${pendingOrders.length} pending orders`)
for (const order of pendingOrders) {
await checkAndUpdateOrderPaymentStatus(order.id)
// Add small delay between requests to avoid overwhelming the API
await new Promise(resolve => setTimeout(resolve, 100))
}
}
return {
isChecking,
checkPaymentStatusByHash,
checkPaymentStatusByBolt11,
checkAndUpdateOrderPaymentStatus,
checkAllPendingOrders
}
}