feat: 增强钱包 API 与玩家会话管理

- 新增钱包 API 函数:getWalletLogs(获取钱包日志)、postWalletTransferIn(充值)及 postWalletTransferOut(提现)
- 更新钱包相关类型定义,提升类型安全性
- 改进玩家会话管理:若当前无玩家资料,则自动拉取玩家信息
- 增强入口网关对过期会话的错误处理能力
- 更新 UI 组件,以适配新的结构与功能
This commit is contained in:
2026-05-09 15:22:08 +08:00
parent 14c297fe1a
commit 7743c14e83
28 changed files with 1719 additions and 33 deletions

37
src/lib/money.ts Normal file
View File

@@ -0,0 +1,37 @@
/**
* 与后端约定:金额存最小货币单位(如 NPR 2 位小数 → 分);展示时除以 10^decimals。
*/
const DEFAULT_DECIMAL_PLACES = 2;
export function formatMinorAsCurrency(
minor: number | string,
currencyCode: string,
decimalPlaces = DEFAULT_DECIMAL_PLACES,
): string {
const n = typeof minor === "string" ? Number(minor) : minor;
if (!Number.isFinite(n)) return `${currencyCode}`;
const divisor = 10 ** decimalPlaces;
const major = n / divisor;
return `${currencyCode} ${major.toLocaleString(undefined, {
minimumFractionDigits: decimalPlaces,
maximumFractionDigits: decimalPlaces,
})}`;
}
/**
* 用户输入如 `1000` 或 `1000.5` → 最小货币单位整数。
*/
export function parseDecimalInputToMinor(
raw: string,
decimalPlaces = DEFAULT_DECIMAL_PLACES,
): number | null {
const cleaned = raw.replace(/,/g, "").trim();
if (cleaned === "") return null;
const n = Number(cleaned);
if (!Number.isFinite(n) || n < 0) return null;
const factor = 10 ** decimalPlaces;
const minor = Math.round(n * factor);
if (!Number.isSafeInteger(minor)) return null;
return minor;
}