diff --git a/.changeset/fix-otp-error-handling.md b/.changeset/fix-otp-error-handling.md new file mode 100644 index 000000000..b00f217ef --- /dev/null +++ b/.changeset/fix-otp-error-handling.md @@ -0,0 +1,6 @@ +--- +"@crossmint/client-sdk-wallets": patch +"@crossmint/client-sdk-react-ui": patch +--- + +Fix OTP verification error handling to properly propagate errors to UI. When users entered an incorrect OTP or hit rate limits, errors are now properly displayed instead of silently restarting the auth flow. diff --git a/packages/client/ui/react-ui/src/providers/CrossmintWalletProvider.tsx b/packages/client/ui/react-ui/src/providers/CrossmintWalletProvider.tsx index f1f8472b3..1c5eeec29 100644 --- a/packages/client/ui/react-ui/src/providers/CrossmintWalletProvider.tsx +++ b/packages/client/ui/react-ui/src/providers/CrossmintWalletProvider.tsx @@ -102,7 +102,7 @@ export function CrossmintWalletProvider({ setEmailSignerDialogStep("otp"); } catch (error) { console.error("Failed to send email OTP", error); - rejectRef.current(new Error("Failed to send email OTP")); + throw error; } }; @@ -112,7 +112,7 @@ export function CrossmintWalletProvider({ setEmailSignerDialogOpen(false); } catch (error) { console.error("Failed to verify OTP", error); - rejectRef.current(new Error("Failed to verify OTP")); + throw error; } }; @@ -123,7 +123,7 @@ export function CrossmintWalletProvider({ setPhoneSignerDialogStep("otp"); } catch (error) { console.error("Failed to send phone OTP", error); - rejectRef.current(new Error("Failed to send phone OTP")); + throw error; } }; @@ -133,7 +133,7 @@ export function CrossmintWalletProvider({ setPhoneSignerDialogOpen(false); } catch (error) { console.error("Failed to verify phone OTP", error); - rejectRef.current(new Error("Failed to verify phone OTP")); + throw error; } }; diff --git a/packages/wallets/src/signers/non-custodial/ncs-signer.ts b/packages/wallets/src/signers/non-custodial/ncs-signer.ts index 35f92a3f4..51d390662 100644 --- a/packages/wallets/src/signers/non-custodial/ncs-signer.ts +++ b/packages/wallets/src/signers/non-custodial/ncs-signer.ts @@ -206,7 +206,9 @@ export abstract class NonCustodialSigner implements Signer { if (response?.status === "error") { console.error("[sendMessageWithOtp] Failed to send OTP:", response); - this._authPromise?.reject(new Error(response.error || "Failed to initiate OTP process.")); + const error = new Error(response.error || "Failed to initiate OTP process."); + this._authPromise?.reject(error); + throw error; } }