From 24e22a3f2541fb05d96683369c34bf6bce6f4281 Mon Sep 17 00:00:00 2001 From: TerryM Date: Sat, 6 Jun 2026 01:24:27 +0800 Subject: [PATCH] fix: improve imToken wallet error prompts --- src/locales/en.ts | 4 ++++ src/locales/id.ts | 4 ++++ src/locales/ja.ts | 4 ++++ src/locales/ko.ts | 4 ++++ src/locales/ms.ts | 4 ++++ src/locales/vi.ts | 4 ++++ src/locales/zh-CN.ts | 4 ++++ src/wallet/injected.ts | 24 +++++++++++++++++++++++- 8 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/locales/en.ts b/src/locales/en.ts index ef79b74..35b63ce 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -252,6 +252,10 @@ export const enDict: Dict = { walletLoginFailed: "Wallet login failed", walletNoAccount: "No wallet account was returned. Unlock your wallet and select an account, then try again.", + walletRequestCanceled: + "Wallet connection was canceled. Unlock your wallet, choose an account, and authorize this site, then try again.", + walletBnbChainRequired: + "Create or switch to a BNB Smart Chain (BSC) wallet in imToken, then try again.", walletDisconnected: "Wallet disconnected", walletOtherMethods: "Other login methods", walletUseCurrent: "Use current wallet", diff --git a/src/locales/id.ts b/src/locales/id.ts index 583f9b0..34dfab3 100644 --- a/src/locales/id.ts +++ b/src/locales/id.ts @@ -254,6 +254,10 @@ export const idDict: Dict = { walletLoginFailed: "Login dompet gagal", walletNoAccount: "Dompet tidak mengembalikan akun apa pun. Buka kunci dompet, pilih akun, lalu coba lagi.", + walletRequestCanceled: + "Koneksi dompet dibatalkan. Buka kunci dompet, pilih akun, dan izinkan situs ini, lalu coba lagi.", + walletBnbChainRequired: + "Buat atau beralih ke dompet BNB Smart Chain (BSC) di imToken, lalu coba lagi.", walletDisconnected: "Dompet terputus", walletOtherMethods: "Metode login lainnya", walletUseCurrent: "Gunakan dompet saat ini", diff --git a/src/locales/ja.ts b/src/locales/ja.ts index 2a7943c..8945141 100644 --- a/src/locales/ja.ts +++ b/src/locales/ja.ts @@ -205,6 +205,10 @@ export const jaDict: Dict = { walletLoginFailed: "ウォレットログインに失敗しました", walletNoAccount: "ウォレットからアカウントが返されませんでした。ウォレットのロックを解除してアカウントを選択し、もう一度お試しください。", + walletRequestCanceled: + "ウォレット接続がキャンセルされました。ウォレットのロックを解除し、アカウントを選択してこのサイトを承認してから、もう一度お試しください。", + walletBnbChainRequired: + "imToken で BNB Smart Chain(BSC)ウォレットを作成または切り替えてから、もう一度お試しください。", walletDisconnected: "ウォレットを切断しました", walletNoBrowserWallet: "ブラウザウォレットが見つかりません", walletNoBrowserWalletDesc: diff --git a/src/locales/ko.ts b/src/locales/ko.ts index 4e5b395..6744bd1 100644 --- a/src/locales/ko.ts +++ b/src/locales/ko.ts @@ -251,6 +251,10 @@ export const koDict: Dict = { walletLoginFailed: "지갑 로그인에 실패했습니다", walletNoAccount: "지갑에서 계정이 반환되지 않았습니다. 지갑 잠금을 해제하고 계정을 선택한 후 다시 시도하세요.", + walletRequestCanceled: + "지갑 연결이 취소되었습니다. 지갑 잠금을 해제하고 계정을 선택한 뒤 이 사이트를 승인한 후 다시 시도하세요.", + walletBnbChainRequired: + "imToken에서 BNB Smart Chain(BSC) 지갑을 만들거나 전환한 후 다시 시도하세요.", walletDisconnected: "지갑 연결이 해제되었습니다", walletOtherMethods: "다른 로그인 방법", walletUseCurrent: "현재 지갑 사용", diff --git a/src/locales/ms.ts b/src/locales/ms.ts index f3761fc..6580dab 100644 --- a/src/locales/ms.ts +++ b/src/locales/ms.ts @@ -253,6 +253,10 @@ export const msDict: Dict = { walletLoginFailed: "Log masuk dompet gagal", walletNoAccount: "Dompet tidak mengembalikan sebarang akaun. Nyahkunci dompet, pilih akaun, kemudian cuba lagi.", + walletRequestCanceled: + "Sambungan dompet dibatalkan. Nyahkunci dompet, pilih akaun dan benarkan laman ini, kemudian cuba lagi.", + walletBnbChainRequired: + "Cipta atau tukar kepada dompet BNB Smart Chain (BSC) dalam imToken, kemudian cuba lagi.", walletDisconnected: "Dompet diputuskan", walletOtherMethods: "Kaedah log masuk lain", walletUseCurrent: "Guna dompet semasa", diff --git a/src/locales/vi.ts b/src/locales/vi.ts index 3e1d376..0b6e8b7 100644 --- a/src/locales/vi.ts +++ b/src/locales/vi.ts @@ -249,6 +249,10 @@ export const viDict: Dict = { walletLoginFailed: "Đăng nhập ví thất bại", walletNoAccount: "Ví không trả về tài khoản nào. Hãy mở khóa ví, chọn một tài khoản rồi thử lại.", + walletRequestCanceled: + "Kết nối ví đã bị hủy. Hãy mở khóa ví, chọn tài khoản và cấp quyền cho trang này rồi thử lại.", + walletBnbChainRequired: + "Hãy tạo hoặc chuyển sang ví BNB Smart Chain (BSC) trong imToken, rồi thử lại.", walletDisconnected: "Đã ngắt kết nối ví", walletOtherMethods: "Phương thức đăng nhập khác", walletUseCurrent: "Dùng ví hiện tại", diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index 356c09d..3feab61 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -233,6 +233,10 @@ export const zhDict: Dict = { walletLoginSuccess: "钱包已连接", walletLoginFailed: "钱包登录失败", walletNoAccount: "钱包没有返回账号。请先解锁钱包并选择一个账号后重试。", + walletRequestCanceled: + "钱包连接已取消。请解锁钱包,选择账号并授权本站后重试。", + walletBnbChainRequired: + "请先在 imToken 创建或切换到 BNB Smart Chain(BSC)钱包,然后重试。", walletDisconnected: "钱包已断开", walletOtherMethods: "其他登录方式", walletUseCurrent: "使用当前钱包登录", diff --git a/src/wallet/injected.ts b/src/wallet/injected.ts index bf96ecf..5ae9c48 100644 --- a/src/wallet/injected.ts +++ b/src/wallet/injected.ts @@ -47,13 +47,33 @@ function errorText(error: unknown): string { return parts.join("\n"); } +function errorCode(error: unknown): string { + if (!error || typeof error !== "object") return ""; + const code = (error as Record).code; + return typeof code === "string" || typeof code === "number" + ? String(code) + : ""; +} + function isNoAccountError(error: unknown): boolean { return /wallet must has at least one account|wallet must has one account|must have at least one account|no wallet account returned/i.test( errorText(error), ); } +function isUserCanceledError(error: unknown): boolean { + const text = errorText(error); + const code = errorCode(error); + return ( + code === "4001" || + /user[_ -]?cancell?ed|user rejected|request rejected|request denied|action rejected/i.test( + text, + ) + ); +} + function normalizeWalletError(error: unknown): Error { + if (isUserCanceledError(error)) return new Error("walletRequestCanceled"); if (isNoAccountError(error)) return new Error("walletNoAccount"); if (error instanceof Error) return error; const message = errorText(error); @@ -210,7 +230,9 @@ export async function connectInjectedWallet( console.info("[wallet-login] ensuring BNB Chain (0x38)…"); await ensureBnbChain(ethereum).catch((error: unknown) => { - console.warn("[wallet-login] BNB Chain switch skipped", error); + console.warn("[wallet-login] BNB Chain switch failed", error); + if (kind === "imToken") throw new Error("walletBnbChainRequired"); + throw normalizeWalletError(error); }); return address; }