From 5849517a41a72b7e1284e3474cc320395845b9f6 Mon Sep 17 00:00:00 2001 From: userAdityaa Date: Wed, 15 Apr 2026 05:14:18 +0545 Subject: [PATCH] feat(frontend): handle bolt11 generation failures in payment dialog --- frontend/src/components/PaymentDialog.tsx | 80 ++++++++++++++++------- 1 file changed, 55 insertions(+), 25 deletions(-) diff --git a/frontend/src/components/PaymentDialog.tsx b/frontend/src/components/PaymentDialog.tsx index 111bdf3..9e3315a 100644 --- a/frontend/src/components/PaymentDialog.tsx +++ b/frontend/src/components/PaymentDialog.tsx @@ -6,6 +6,7 @@ import { getInvoice, getInvoiceBolt11 } from "@/lib/api" import { tenantNeedsPaymentSetup } from "@/lib/hooks" type PayStatus = "idle" | "loading" | "success" | "error" +type Bolt11Status = "idle" | "loading" | "ready" | "error" type PaymentInvoice = { id: string @@ -21,20 +22,34 @@ type PaymentDialogProps = { export default function PaymentDialog(props: PaymentDialogProps) { const [bolt11, setBolt11] = createSignal("") const [qrDataUrl, setQrDataUrl] = createSignal("") + const [bolt11Status, setBolt11Status] = createSignal("idle") + const [bolt11Error, setBolt11Error] = createSignal("") const [payStatus, setPayStatus] = createSignal("idle") const [payError, setPayError] = createSignal("") const [showSetup, setShowSetup] = createSignal(false) const [showPaymentSetup, setShowPaymentSetup] = createSignal(false) - createEffect(async () => { - if (!props.open || !props.invoice.id) return + async function loadBolt11() { + if (!props.invoice.id) return + setBolt11Status("loading") + setBolt11Error("") + setBolt11("") + setQrDataUrl("") + try { const { bolt11: invoice } = await getInvoiceBolt11(props.invoice.id) setBolt11(invoice) setQrDataUrl(await QRCode.toDataURL(invoice, { width: 256, margin: 2 })) - } catch { - // bolt11 generation may fail + setBolt11Status("ready") + } catch (e) { + setBolt11Status("error") + setBolt11Error(e instanceof Error ? e.message : "Failed to generate Lightning invoice") } + } + + createEffect(() => { + if (!props.open || !props.invoice.id) return + void loadBolt11() }) function copyBolt11() { @@ -62,6 +77,8 @@ export default function PaymentDialog(props: PaymentDialogProps) { function handleClose() { setPayStatus("idle") setPayError("") + setBolt11Status("idle") + setBolt11Error("") setBolt11("") setQrDataUrl("") setShowSetup(false) @@ -104,33 +121,46 @@ export default function PaymentDialog(props: PaymentDialogProps) { when={payStatus() === "success"} fallback={
- Generating invoice...
} - > - Lightning invoice QR code + +
Generating invoice...
- -
- + +
+

Unable to generate invoice

+

{bolt11Error()}

+ + Lightning invoice QR code + +
+ + +
+
+
} > @@ -188,7 +218,7 @@ export default function PaymentDialog(props: PaymentDialogProps) {