From b853fbce4b1e36db4bcc1c4fc470f209413cc0b7 Mon Sep 17 00:00:00 2001 From: Padreug Date: Sun, 6 Sep 2026 19:39:42 +0200 Subject: [PATCH] feat(events): public ticket page at /events/ticket/:ticketId MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Target of the emailed ticket link the extension now builds under the webapp root. Anonymous, like the LNbits UI's own /events/ticket/{id}: reads the PublicTicket, resolves the event name (Nostr store → scoped relay query → public REST as a last resort), and renders the logo QR with paid / pending / checked-in state. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01EYwoAkZZmXMMmaBp4WGUBo --- src/modules/events/index.ts | 12 ++ src/modules/events/views/TicketPage.vue | 155 ++++++++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 src/modules/events/views/TicketPage.vue diff --git a/src/modules/events/index.ts b/src/modules/events/index.ts index e592b7e..0a4d4a3 100644 --- a/src/modules/events/index.ts +++ b/src/modules/events/index.ts @@ -51,6 +51,18 @@ export const eventsModule = createModulePlugin({ requiresAuth: false, }, }, + { + // Public ticket page — target of the emailed ticket link. Listed + // before /events/:id for readability; the router can't confuse the + // two anyway (different segment counts). + path: '/events/ticket/:ticketId', + name: 'event-ticket', + component: () => import('./views/TicketPage.vue'), + meta: { + title: 'Ticket', + requiresAuth: false, + }, + }, { path: '/events/:id', name: 'event-detail', diff --git a/src/modules/events/views/TicketPage.vue b/src/modules/events/views/TicketPage.vue new file mode 100644 index 0000000..cb6e9e3 --- /dev/null +++ b/src/modules/events/views/TicketPage.vue @@ -0,0 +1,155 @@ + + +