import { createEffect, createSignal, Show } from "solid-js" import QRCode from "qrcode" import Modal from "@/components/Modal" import { getInvoice, type Invoice } from "@/lib/api" type Tab = "bitcoin" | "card" type PayStatus = "idle" | "loading" | "success" | "error" type PaymentDialogProps = { invoice: Invoice open: boolean onClose: () => void } export default function PaymentDialog(props: PaymentDialogProps) { const [tab, setTab] = createSignal("bitcoin") const [qrDataUrl, setQrDataUrl] = createSignal("") const [payStatus, setPayStatus] = createSignal("idle") const [payError, setPayError] = createSignal("") createEffect(async () => { const bolt11 = props.invoice?.bolt11 if (!bolt11) return setQrDataUrl(await QRCode.toDataURL(bolt11, { width: 256, margin: 2 })) }) function copyBolt11() { void navigator.clipboard.writeText(props.invoice.bolt11) } async function checkPayment() { setPayStatus("loading") setPayError("") try { const invoice = await getInvoice(props.invoice.id) if (invoice.status === "paid") { setPayStatus("success") } 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("") props.onClose() } const totalSats = () => props.invoice.items.reduce((sum, item) => sum + item.sats, 0) const periodLabel = () => { const start = new Date(props.invoice.period_start * 1000) const end = new Date(props.invoice.period_end * 1000) return `${start.toLocaleDateString()} – ${end.toLocaleDateString()}` } return ( {/* Header */}

Pay Invoice

0}>

{totalSats().toLocaleString()} sats

{periodLabel()}

{/* Pay with label + Tabs */}

Pay with

{/* Tab content */}
Generating invoice...
} > Lightning invoice QR code
} >

Payment confirmed!

Thank you. Your relay is now active.

Coming soon

Card payments are not yet available.

{/* Error */}

{payError()}

{/* Footer */}
} >
) }