fix: improve imToken wallet error prompts
All checks were successful
Deploy to Frontend Servers / deploy (push) Successful in 1m8s

This commit is contained in:
TerryM
2026-06-06 01:24:27 +08:00
parent 2b5ec54896
commit 24e22a3f25
8 changed files with 51 additions and 1 deletions

View File

@@ -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",

View File

@@ -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",

View File

@@ -205,6 +205,10 @@ export const jaDict: Dict = {
walletLoginFailed: "ウォレットログインに失敗しました",
walletNoAccount:
"ウォレットからアカウントが返されませんでした。ウォレットのロックを解除してアカウントを選択し、もう一度お試しください。",
walletRequestCanceled:
"ウォレット接続がキャンセルされました。ウォレットのロックを解除し、アカウントを選択してこのサイトを承認してから、もう一度お試しください。",
walletBnbChainRequired:
"imToken で BNB Smart ChainBSCウォレットを作成または切り替えてから、もう一度お試しください。",
walletDisconnected: "ウォレットを切断しました",
walletNoBrowserWallet: "ブラウザウォレットが見つかりません",
walletNoBrowserWalletDesc:

View File

@@ -251,6 +251,10 @@ export const koDict: Dict = {
walletLoginFailed: "지갑 로그인에 실패했습니다",
walletNoAccount:
"지갑에서 계정이 반환되지 않았습니다. 지갑 잠금을 해제하고 계정을 선택한 후 다시 시도하세요.",
walletRequestCanceled:
"지갑 연결이 취소되었습니다. 지갑 잠금을 해제하고 계정을 선택한 뒤 이 사이트를 승인한 후 다시 시도하세요.",
walletBnbChainRequired:
"imToken에서 BNB Smart Chain(BSC) 지갑을 만들거나 전환한 후 다시 시도하세요.",
walletDisconnected: "지갑 연결이 해제되었습니다",
walletOtherMethods: "다른 로그인 방법",
walletUseCurrent: "현재 지갑 사용",

View File

@@ -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",

View File

@@ -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",

View File

@@ -233,6 +233,10 @@ export const zhDict: Dict = {
walletLoginSuccess: "钱包已连接",
walletLoginFailed: "钱包登录失败",
walletNoAccount: "钱包没有返回账号。请先解锁钱包并选择一个账号后重试。",
walletRequestCanceled:
"钱包连接已取消。请解锁钱包,选择账号并授权本站后重试。",
walletBnbChainRequired:
"请先在 imToken 创建或切换到 BNB Smart ChainBSC钱包然后重试。",
walletDisconnected: "钱包已断开",
walletOtherMethods: "其他登录方式",
walletUseCurrent: "使用当前钱包登录",

View File

@@ -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<string, unknown>).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;
}