From a5ff626228b35ef587f6b9493998184e3e8354fe Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Wed, 4 Nov 2026 14:29:35 -0700 Subject: settings: let users delete their account A Delete account entry on the security tab leads to /settings/delete, which warns what's lost, asks for the username (and PIN when set) and calls the server's POST /delete, then logs out. The page resets to the (app) layout so its form isn't nested in the settings save form. Co-Authored-By: Claude Opus 5.5 --- src/routes/(app)/settings/delete/+page.server.ts | 26 +++++++ .../(app)/settings/delete/+page@(app).svelte | 82 ++++++++++++++++++++++ src/routes/(app)/settings/security/+page.svelte | 11 +++ 3 files changed, 119 insertions(+) create mode 100644 src/routes/(app)/settings/delete/+page.server.ts create mode 100644 src/routes/(app)/settings/delete/+page@(app).svelte (limited to 'src/routes') diff --git a/src/routes/(app)/settings/delete/+page.server.ts b/src/routes/(app)/settings/delete/+page.server.ts new file mode 100644 index 00000000..05f4f026 --- /dev/null +++ b/src/routes/(app)/settings/delete/+page.server.ts @@ -0,0 +1,26 @@ +import { auth, post } from "$lib/utils"; +import { fail, redirect } from "@sveltejs/kit"; + +export async function load({ parent, url }) { + const { user } = await parent(); + if (!user) redirect(307, `/login?redirect=${encodeURIComponent(url.pathname)}`); +} + +export const actions = { + default: async ({ cookies, request }) => { + const form = await request.formData(); + const confirm = String(form.get("confirm") || ""); + const pin = String(form.get("pin") || ""); + + try { + // The server wipes everything (lib/deluser), including disabling the + // account's bolt12 offers, and refuses while a real balance remains. + await post("/delete", { confirm, ...(pin ? { pin } : {}) }, auth(cookies)); + } catch (e) { + return fail(400, { error: e?.message || String(e), confirm }); + } + + // The account is gone; /logout clears the session cookies. + redirect(303, "/logout"); + }, +}; diff --git a/src/routes/(app)/settings/delete/+page@(app).svelte b/src/routes/(app)/settings/delete/+page@(app).svelte new file mode 100644 index 00000000..e19a6604 --- /dev/null +++ b/src/routes/(app)/settings/delete/+page@(app).svelte @@ -0,0 +1,82 @@ + + +
+

+ {$t("user.settings.deleteAccount")} +

+ +
+

+ + {$t("user.settings.deleteAccountWarning")} +

+

{$t("user.settings.deleteAccountBalance")}

+
+ + {#if form?.error}

{form.error}

{/if} + +
{ + working = true; + return async ({ update }) => { + await update({ reset: false }); + working = false; + }; + }} + > + + + {#if user.haspin} + + {/if} + + + + {$t("payments.cancel")} + +
+
diff --git a/src/routes/(app)/settings/security/+page.svelte b/src/routes/(app)/settings/security/+page.svelte index b774d919..b8c71aa6 100644 --- a/src/routes/(app)/settings/security/+page.svelte +++ b/src/routes/(app)/settings/security/+page.svelte @@ -288,3 +288,14 @@ + +
+ {$t("user.settings.deleteAccount")} +

+ {$t("user.settings.deleteAccountDescription")} +

+ + + {$t("user.settings.deleteAccount")} + +
-- cgit v1.2.3