import { createEffect, createSignal, Show } from "solid-js" import QRCode from "qrcode" import Modal from "@/components/Modal" import PaymentSetup from "@/components/PaymentSetup" 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 amount_due: number } type PaymentDialogProps = { invoice: PaymentInvoice open: boolean onClose: () => void } 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) 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 })) 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() { void navigator.clipboard.writeText(bolt11()) } async function checkPayment() { setPayStatus("loading") setPayError("") try { const invoice = await getInvoice(props.invoice.id) if (invoice.status === "paid") { setPayStatus("success") tenantNeedsPaymentSetup().then(needs => setShowSetup(needs)).catch(() => {}) } else { setPayStatus("error") setPayError("Payment not yet confirmed. Please try again after sending.") } } catch (e) { setPayStatus("error") setPayError(e instanceof Error ? e.message : "Failed to check payment status") } } function handleClose() { setPayStatus("idle") setPayError("") setBolt11Status("idle") setBolt11Error("") setBolt11("") setQrDataUrl("") setShowSetup(false) props.onClose() } const amountLabel = () => `$${(props.invoice.amount_due / 100).toFixed(2)}` return ( <> {/* Header */}

Pay Invoice

{amountLabel()}

{/* Content */}
Generating invoice...

Unable to generate invoice

{bolt11Error()}

Lightning invoice QR code
} >

Payment confirmed!

Thank you. Your account is up to date.

{/* Error */}

{payError()}

{/* Footer */}
} >
setShowPaymentSetup(false)} /> ) }