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", walletLoginFailed: "Wallet login failed",
walletNoAccount: walletNoAccount:
"No wallet account was returned. Unlock your wallet and select an account, then try again.", "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", walletDisconnected: "Wallet disconnected",
walletOtherMethods: "Other login methods", walletOtherMethods: "Other login methods",
walletUseCurrent: "Use current wallet", walletUseCurrent: "Use current wallet",

View File

@@ -254,6 +254,10 @@ export const idDict: Dict = {
walletLoginFailed: "Login dompet gagal", walletLoginFailed: "Login dompet gagal",
walletNoAccount: walletNoAccount:
"Dompet tidak mengembalikan akun apa pun. Buka kunci dompet, pilih akun, lalu coba lagi.", "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", walletDisconnected: "Dompet terputus",
walletOtherMethods: "Metode login lainnya", walletOtherMethods: "Metode login lainnya",
walletUseCurrent: "Gunakan dompet saat ini", walletUseCurrent: "Gunakan dompet saat ini",

View File

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

View File

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

View File

@@ -253,6 +253,10 @@ export const msDict: Dict = {
walletLoginFailed: "Log masuk dompet gagal", walletLoginFailed: "Log masuk dompet gagal",
walletNoAccount: walletNoAccount:
"Dompet tidak mengembalikan sebarang akaun. Nyahkunci dompet, pilih akaun, kemudian cuba lagi.", "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", walletDisconnected: "Dompet diputuskan",
walletOtherMethods: "Kaedah log masuk lain", walletOtherMethods: "Kaedah log masuk lain",
walletUseCurrent: "Guna dompet semasa", walletUseCurrent: "Guna dompet semasa",

View File

@@ -249,6 +249,10 @@ export const viDict: Dict = {
walletLoginFailed: "Đăng nhập ví thất bại", walletLoginFailed: "Đăng nhập ví thất bại",
walletNoAccount: 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.", "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í", walletDisconnected: "Đã ngắt kết nối ví",
walletOtherMethods: "Phương thức đăng nhập khác", walletOtherMethods: "Phương thức đăng nhập khác",
walletUseCurrent: "Dùng ví hiện tại", walletUseCurrent: "Dùng ví hiện tại",

View File

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

View File

@@ -47,13 +47,33 @@ function errorText(error: unknown): string {
return parts.join("\n"); 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 { 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( 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), 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 { function normalizeWalletError(error: unknown): Error {
if (isUserCanceledError(error)) return new Error("walletRequestCanceled");
if (isNoAccountError(error)) return new Error("walletNoAccount"); if (isNoAccountError(error)) return new Error("walletNoAccount");
if (error instanceof Error) return error; if (error instanceof Error) return error;
const message = errorText(error); const message = errorText(error);
@@ -210,7 +230,9 @@ export async function connectInjectedWallet(
console.info("[wallet-login] ensuring BNB Chain (0x38)…"); console.info("[wallet-login] ensuring BNB Chain (0x38)…");
await ensureBnbChain(ethereum).catch((error: unknown) => { 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; return address;
} }