Skip to content

Commit 820c707

Browse files
author
HP
committed
fix: friendly error handling + faucet link on register page
- Replace [object Object] with human-friendly messages when MetaMask/Circle SDK throws plain objects - Add extractErrorMessage() helper in wallet-context.tsx and register/page.tsx - Add 'Get tUSDC from faucet' link under wallet bar on register page
1 parent cbbcf10 commit 820c707

2 files changed

Lines changed: 44 additions & 8 deletions

File tree

packages/web/app/register/page.tsx

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,16 @@ export default function RegisterPage() {
233233
)}
234234
</div>
235235
</div>
236+
<div className="mt-sm" style={{ textAlign: "right" }}>
237+
<a
238+
href="https://faucet.circle.com/"
239+
target="_blank"
240+
rel="noopener noreferrer"
241+
className="text-xs text-secondary hover:text-accent transition"
242+
>
243+
Get tUSDC from faucet →
244+
</a>
245+
</div>
236246
</section>
237247

238248
{/* Type Selector */}
@@ -378,14 +388,10 @@ export default function RegisterPage() {
378388
}
379389

380390
function readableError(err: unknown): string {
381-
const msg = err instanceof Error
382-
? err.message
383-
: (typeof err === "object" && err !== null && "message" in err)
384-
? String((err as { message: unknown }).message)
385-
: String(err);
391+
const msg = extractErrorMessage(err);
386392
const lower = msg.toLowerCase();
387393
if (lower.includes("insufficient usdc") || lower.includes("you need")) return msg;
388-
if (lower.includes("user rejected") || lower.includes("user denied")) return "You rejected the transaction in your wallet.";
394+
if (lower.includes("user rejected") || lower.includes("user denied") || lower.includes("user cancelled")) return "You cancelled the transaction in your wallet.";
389395
if (lower.includes("reserved")) return "This name is reserved and cannot be registered.";
390396
if (lower.includes("name not available") || lower.includes("namenotavailable")) return "This name is no longer available.";
391397
if (lower.includes("commit")) return "Timing issue with commit-reveal. Please wait a moment and try again.";
@@ -394,3 +400,18 @@ function readableError(err: unknown): string {
394400
if (lower.includes("network") || lower.includes("fetch")) return "Network error. Check your connection and try again.";
395401
return msg;
396402
}
403+
404+
/** Extract a human-readable string from any thrown value (plain object, Error, etc.). */
405+
function extractErrorMessage(err: unknown): string {
406+
if (typeof err === "string") return err;
407+
if (err instanceof Error) return err.message;
408+
if (typeof err === "object" && err !== null) {
409+
const obj = err as { message?: unknown; code?: unknown };
410+
if (typeof obj.message === "string") return obj.message;
411+
}
412+
const fallback = String(err);
413+
if (fallback === "[object Object]" || fallback === "[object Undefined]" || fallback === "[object Null]") {
414+
return "Something went wrong. Please try again.";
415+
}
416+
return fallback;
417+
}

packages/web/app/wallet-context.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,9 @@ export function WalletProvider({ children }: { children: React.ReactNode }) {
119119
setWalletError("Failed to add Arc Testnet to your wallet.");
120120
}
121121
} else {
122-
const msg = switchErr instanceof Error ? switchErr.message : String(switchErr);
122+
const msg = extractErrorMessage(switchErr);
123123
if (msg.toLowerCase().includes("user rejected")) {
124-
setWalletError("Network switch was rejected.");
124+
setWalletError("Network switch was cancelled.");
125125
} else {
126126
setWalletError(msg);
127127
}
@@ -169,3 +169,18 @@ export function WalletProvider({ children }: { children: React.ReactNode }) {
169169
</WalletContext.Provider>
170170
);
171171
}
172+
173+
/** Extract a human-readable string from any thrown value (MetaMask plain objects, Error, etc.). */
174+
function extractErrorMessage(err: unknown): string {
175+
if (typeof err === "string") return err;
176+
if (err instanceof Error) return err.message;
177+
if (typeof err === "object" && err !== null) {
178+
const obj = err as { message?: unknown };
179+
if (typeof obj.message === "string") return obj.message;
180+
}
181+
const fallback = String(err);
182+
if (fallback === "[object Object]" || fallback === "[object Undefined]" || fallback === "[object Null]") {
183+
return "Something went wrong. Please try again.";
184+
}
185+
return fallback;
186+
}

0 commit comments

Comments
 (0)