From 4afc78d44d36650878728b7a6290504f1ac51fcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dni=20=E2=9A=A1?= Date: Tue, 5 May 2026 10:45:14 +0200 Subject: [PATCH] feat: register public page saves to localstorage (#48) * feat: register public page saves to localstorage previsously it fetched all tickets without much information. now it saves the full scanned ticket after it was scanned, so it can be checked by some1 without a login * add last scan * short id * prettier --- static/js/register.js | 58 +++++++++++++++++++++++------------------- static/js/register.vue | 22 ++++++++++++++++ views_api.py | 11 +------- 3 files changed, 55 insertions(+), 36 deletions(-) diff --git a/static/js/register.js b/static/js/register.js index 76ccbcb..f642493 100644 --- a/static/js/register.js +++ b/static/js/register.js @@ -6,17 +6,13 @@ window.PageEventsRegister = { ticketsTable: { columns: [ {name: 'name', align: 'left', label: 'Name', field: 'name'}, + {name: 'email', align: 'left', label: 'Email', field: 'email'}, { - name: 'registered', + name: 'id', align: 'left', - label: 'Registered', - field: 'registered' - }, - { - name: 'paid', - align: 'left', - label: 'Paid', - field: 'paid' + label: 'ID', + field: 'id', + format: val => this.shortId(val) } ], pagination: { @@ -26,12 +22,20 @@ window.PageEventsRegister = { sendCamera: { show: false, camera: 'auto' - } + }, + lastScan: null } }, methods: { - hoverEmail(tmp) { - this.tickets.data.emailtemp = tmp + storageKey() { + return `events_scanned_${this.eventId}` + }, + loadScannedTickets() { + this.tickets = Quasar.LocalStorage.getItem(this.storageKey()) || [] + }, + saveScannedTicket(ticket) { + this.tickets.unshift(ticket) + Quasar.LocalStorage.set(this.storageKey(), this.tickets) }, closeCamera() { this.sendCamera.show = false @@ -39,30 +43,32 @@ window.PageEventsRegister = { showCamera() { this.sendCamera.show = true }, + shortId(id) { + return id ? `${id.slice(0, 6)}...${id.slice(-4)}` : '' + }, decodeQR(res) { this.sendCamera.show = false const value = res[0].rawValue.split('//')[1] LNbits.api .request('PUT', `/events/api/v1/tickets/register/${value}`) - .then(() => { - Quasar.Notify.create({ - type: 'positive', - message: 'Registered!' - }) - }) - .catch(LNbits.utils.notifyApiError) - }, - getEventTickets() { - LNbits.api - .request('GET', `/events/api/v1/events/${this.eventId}/tickets`) .then(response => { - this.tickets = response.data + this.saveScannedTicket(response.data) + this.lastScan = {success: true, ticket: response.data} + Quasar.Notify.create({type: 'positive', message: 'Registered!'}) + }) + .catch(error => { + this.lastScan = { + success: false, + ticketId: value, + error: + error.response?.data?.detail || error.message || 'Unknown error' + } + LNbits.utils.notifyApiError(error) }) - .catch(LNbits.utils.notifyApiError) } }, created() { this.eventId = this.$route.params.id - this.getEventTickets() + this.loadScannedTickets() } } diff --git a/static/js/register.vue b/static/js/register.vue index 9b40537..8055348 100644 --- a/static/js/register.vue +++ b/static/js/register.vue @@ -16,6 +16,28 @@ + + +
+
Registered
+
Name: {{ lastScan.ticket.name }}
+
Email: {{ lastScan.ticket.email }}
+
Paid: {{ lastScan.ticket.paid }}
+
ID: {{ shortId(lastScan.ticket.id) }}
+
+
+
Failed
+
+ Ticket ID: {{ shortId(lastScan.ticketId) }} +
+
Error: {{ lastScan.error }}
+
+
+
+ list[Ticket]: - return await get_event_tickets(event_id) - - @tickets_api_router.get("") async def api_tickets( all_wallets: bool = Query(False), @@ -323,7 +314,7 @@ async def api_ticket_delete( await delete_ticket(ticket_id) -@tickets_api_router.put("/register/{ticket_id}", response_model=PublicTicket) +@tickets_api_router.put("/register/{ticket_id}") async def api_event_register_ticket(ticket_id) -> Ticket: ticket = await get_ticket(ticket_id)