CreateEventDialog gains a collapsible "Buyer notifications" section
exposing the EventExtra fields added upstream in v1.4.0 / v1.6.0:
- email_notifications + nostr_notifications switches — opt buyers
into email and NIP-04 Nostr DM ticket confirmations.
- notification_subject + notification_body inputs — let organizers
customize the message. Empty falls back to extension defaults.
Submit handler builds `extra` by overlaying onto the existing
event.extra so unrelated fields the LNbits admin UI sets
(promo_codes, conditional, min_tickets) survive the round-trip
through the webapp. Populate-from-event mirrors the same.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Both sides of the fiat-payment surface introduced by events v1.4.0:
CreateEventDialog — organizer-side opt-in:
- New "Accept fiat payments" switch (allow_fiat) + fiat currency
picker (USD/EUR/GBP/CHF). Toggle is always shipped on
create/edit so a true→false flip propagates correctly.
- Hint copy notes that the host's LNbits admin needs a configured
fiat provider (Stripe etc.) for the toggle to actually work at
purchase time.
PurchaseTicketDialog — buyer-side method selector:
- Two-button selector (Lightning / Fiat) shown only when the event
has `allow_fiat=true`. Hidden entirely for Lightning-only events.
- Lightning path: unchanged (uses useTicketPurchase composable).
- Fiat path: posts to the API with `payment_method=fiat`, then
surfaces a "Open <provider> checkout" button that opens the
returned fiat_payment_request URL in a new tab. Payment
confirmation happens via webhook on the backend; ticket appears
in My Tickets on next reload.
EventsPage threads the new fiat fields through `selectedEvent` so
the dialog sees them.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The backend rebase brought in PR #50 (fiat checkout + email/Nostr
ticket notifications), v1.6.0 (custom notification subject/body), and
PR #51 (resend-email endpoint). The webapp types lagged.
Aligns the type surface in src/modules/activities/types/ticket.ts:
- EventExtra (with notification toggles + custom subject/body), promo
codes, conditional event config.
- ActivityTicketExtra mirroring backend's TicketExtra (nostr_identifier,
email/nostr notification_sent flags, refund state).
- TicketedEvent + CreateEventRequest gain allow_fiat, fiat_currency, extra.
- TicketPurchaseInvoice extended for fiat: paymentRequest now optional,
fiatPaymentRequest + fiatProvider + isFiat added. **Closes a latent
blocker**: a backend response with is_fiat=true would have lost the
fiat URL during deserialization (silent crash on QR generation).
- New CreateTicketRequest type for the POST /tickets/{id} body, with
the v1.6.1 payment_method + fiat_provider + nostr_identifier fields.
TicketApiService:
- requestTicket() accepts the new optional fields (paymentMethod,
fiatProvider, promoCode, refundAddress, nostrIdentifier) and
deserializes the full TicketPurchaseInvoice shape including fiat.
- fetchUserTickets() / validateTicket() / new resendTicketEmail()
thread the extra metadata through.
useTicketPurchase composable rejects fiat responses with a clear
error (the QR-and-bolt11 path doesn't know fiat); the eventual UI
selector will live in PurchaseTicketDialog.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Required for pnpm strict-hoisting builds (used by aiolabs/server-deploy
NixOS builds). Without it as a direct dep, Rollup can't resolve
`workbox-window` from vite-plugin-pwa's virtual:pwa-register module —
npm's flat hoisting masked this previously.
- Replace package-lock.json with pnpm-lock.yaml
- Add packageManager: pnpm@10.33.0
- Allowlist postinstall scripts for esbuild, sharp, vue-demi, electron,
electron-winstaller via pnpm.onlyBuiltDependencies
- Pin nostr-tools to 2.15.0 (was ^2.10.4 resolving to 2.15.0 via npm).
A fresh pnpm resolve drifted to 2.23.5, which the regtest nostrrelay
extension can't parse; upgrade deferred to a follow-up issue covering
the matching server-side fix.