|
10 | 10 | Array.from({ length: 24 }, () => ({ value: "" })), |
11 | 11 | ); |
12 | 12 |
|
| 13 | + // Flag to prevent double-triggering recovery on multiple blur events |
| 14 | + let recoveryInProgress = $state(false); |
| 15 | +
|
13 | 16 | // TODO: Use word validation instead of presence. |
14 | 17 | const submitEnabled = $derived( |
15 | 18 | words.every((word) => word.value.trim().length > 0), |
|
36 | 39 | }; |
37 | 40 |
|
38 | 41 | const handleRecoverWithPhrase = async () => { |
| 42 | + if (recoveryInProgress) { |
| 43 | + return; |
| 44 | + } |
| 45 | + recoveryInProgress = true; |
| 46 | +
|
39 | 47 | const phraseWords = words.map((word) => word.value); |
40 | | - const result = await recoverWithPhrase(phraseWords); |
41 | | - // TODO: Handle success and error |
42 | | - if (result.success) { |
43 | | - console.log("success", result.info); |
44 | | - } else { |
45 | | - console.log("error", result.error); |
| 48 | + try { |
| 49 | + const result = await recoverWithPhrase(phraseWords); |
| 50 | + // TODO: Handle success and error |
| 51 | + if (result.success) { |
| 52 | + console.log("success", result.info); |
| 53 | + } else { |
| 54 | + console.log("error", result.error); |
| 55 | + } |
| 56 | + } catch (error) { |
| 57 | + // TODO: Manage error |
| 58 | + console.error("error", error); |
| 59 | + } finally { |
| 60 | + // Reset flag on error to allow retry |
| 61 | + recoveryInProgress = false; |
46 | 62 | } |
47 | 63 | }; |
48 | 64 |
|
|
53 | 69 | const pastedText = event.clipboardData?.getData("text"); |
54 | 70 | if (!pastedText) return; |
55 | 71 |
|
56 | | - // Fill inputs starting from current index |
57 | | - const pastedWords = pastedText.split(" "); |
| 72 | + // Uses might paste text with multiple spaces, tabs, or newlines between words. |
| 73 | + const pastedWords = pastedText.trim().split(/\s+/); |
| 74 | + // Fill inputs starting from current index. |
58 | 75 | pastedWords.forEach((word, i) => { |
59 | 76 | const targetIndex = currentIndex + i; |
60 | 77 | if (targetIndex < words.length) { |
|
85 | 102 |
|
86 | 103 | const handleBlur = () => { |
87 | 104 | // Auto-submit when all 24 words are complete |
88 | | - if (submitEnabled) { |
| 105 | + if (submitEnabled && !recoveryInProgress) { |
89 | 106 | handleRecoverWithPhrase(); |
90 | 107 | } |
91 | 108 | }; |
|
0 commit comments