diff --git a/src/modules/events/components/PurchaseTicketDialog.vue b/src/modules/events/components/PurchaseTicketDialog.vue index 6617496..0d13601 100644 --- a/src/modules/events/components/PurchaseTicketDialog.vue +++ b/src/modules/events/components/PurchaseTicketDialog.vue @@ -70,6 +70,11 @@ function increaseQuantity() { const totalPrice = computed(() => props.event.price_per_ticket * quantity.value) +// Free events (price 0): no invoice is minted — the backend issues the +// tickets already-paid. Drop the payment-method selector and price line +// and label the CTA "Get ticket" instead of "Proceed". +const isFree = computed(() => props.event.price_per_ticket <= 0) + async function copyInvoice() { if (!paymentRequest.value) return try { @@ -259,7 +264,10 @@ onUnmounted(() => { {{ quantity }} tickets for {{ event.name }} · - {{ formatEventPrice(totalPrice, event.currency) }} + {{ isFree ? 'Free' : formatEventPrice(totalPrice, event.currency) }} + + + Get a free ticket for {{ event.name }} Purchase a ticket for {{ event.name }} for {{ formatEventPrice(event.price_per_ticket, event.currency) }} @@ -375,9 +383,9 @@ onUnmounted(() => {
- {{ quantity > 1 ? `${quantity} × ${formatEventPrice(event.price_per_ticket, event.currency)}` : 'Price' }} + {{ quantity > 1 && !isFree ? `${quantity} × ${formatEventPrice(event.price_per_ticket, event.currency)}` : 'Price' }} - {{ formatEventPrice(totalPrice, event.currency) }} + {{ isFree ? 'Free' : formatEventPrice(totalPrice, event.currency) }}
{ Lightning rather than collapsing into a single "Fiat" catch-all. Hidden entirely for Lightning-only events to keep the dialog uncluttered. --> -
+
Payment method

Both methods charge the same amount via different rails. @@ -437,6 +445,10 @@ onUnmounted(() => { class="w-full" > +