From 36a7d309fa797ed31f3e823a82d09e9c584f62f9 Mon Sep 17 00:00:00 2001 From: M1 Date: Wed, 18 Mar 2026 23:37:20 +0400 Subject: [PATCH] feat: /dashboard/checkout/:id route so invoices survive refresh --- apps/web/src/routes/dashboard.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/web/src/routes/dashboard.ts b/apps/web/src/routes/dashboard.ts index bf68a1c..0a2e5aa 100644 --- a/apps/web/src/routes/dashboard.ts +++ b/apps/web/src/routes/dashboard.ts @@ -213,7 +213,15 @@ export const dashboard = new Elysia() if (!resolved?.accountId) return redirect("/dashboard"); const [acc] = await sql`SELECT plan, plan_expires_at FROM accounts WHERE id = ${resolved.accountId}`; if (acc.plan === "lifetime") return redirect("/dashboard/settings"); - return html("checkout", { nav: "settings", account: acc, payApi: process.env.PAY_API || "https://pay.pingql.com" }); + return html("checkout", { nav: "settings", account: acc, payApi: process.env.PAY_API || "https://pay.pingql.com", invoiceId: null }); + }) + + // Existing invoice by ID — survives refreshes + .get("/dashboard/checkout/:id", async ({ cookie, headers, params }) => { + const resolved = await getAccountId(cookie, headers); + if (!resolved?.accountId) return redirect("/dashboard"); + const [acc] = await sql`SELECT plan, plan_expires_at FROM accounts WHERE id = ${resolved.accountId}`; + return html("checkout", { nav: "settings", account: acc, payApi: process.env.PAY_API || "https://pay.pingql.com", invoiceId: params.id }); }) // New monitor