From 5f7474140fd37ed86cd77d489768638e73fa2f8d Mon Sep 17 00:00:00 2001
From: Jon Staab
Date: Fri, 6 Mar 2026 14:58:25 -0800
Subject: [PATCH] Add StringMultiInput for OTPs
---
src/app/components/KeyRecoveryConfirm.svelte | 23 +-----
src/app/components/LogInOTPConfirm.svelte | 23 +-----
src/app/components/PasswordReset.svelte | 24 +-----
src/lib/components/StringMultiInput.svelte | 77 ++++++++++++++++++++
4 files changed, 89 insertions(+), 58 deletions(-)
create mode 100644 src/lib/components/StringMultiInput.svelte
diff --git a/src/app/components/KeyRecoveryConfirm.svelte b/src/app/components/KeyRecoveryConfirm.svelte
index 82ed7314..9aed79d4 100644
--- a/src/app/components/KeyRecoveryConfirm.svelte
+++ b/src/app/components/KeyRecoveryConfirm.svelte
@@ -15,10 +15,10 @@
import ModalTitle from "@lib/components/ModalTitle.svelte"
import ModalSubtitle from "@lib/components/ModalSubtitle.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte"
+ import StringMultiInput from "@lib/components/StringMultiInput.svelte"
import KeyDownload from "@app/components/KeyDownload.svelte"
import {pushToast} from "@app/util/toast"
import {pushModal, clearModals} from "@app/util/modal"
- import {POMADE_SIGNERS} from "@app/core/state"
type Props = {
peersByPrefix: Map
@@ -32,18 +32,6 @@
} = $session as SessionPomade
const confirmRecovery = async () => {
- const otps = input
- .split(/\n/)
- .map(x => x.trim())
- .filter(x => x.match(/^[0-9]{8}$/))
-
- if (otps.length < 2) {
- return pushToast({
- theme: "error",
- message: "Failed to recover, not enough valid recovery codes were provided.",
- })
- }
-
const request = await Client.recoverWithChallenge(email, peersByPrefix, otps)
if (!request.ok) {
@@ -82,7 +70,7 @@
const back = () => history.back()
let loading = $state(false)
- let input = $state("")
+ let otps = $state([])
@@ -96,17 +84,14 @@
For security reasons, you may receive three or more emails with recovery codes in them. Please
paste all recovery codes into the text box below, on separate lines.
-
+
-