Files
thebet365/packages/shared/src/initial-depositRemark.ts
Mars 03e72ca9b2 feat: 开户备注、账单展示优化与后台代理管理增强
- 新增初始上分备注(日常上分/开户赠金/自定义)及前后台校验与展示

- 优化钱包流水类型与备注显示,区分管理员/代理/玩家上下分

- 修复登录后语言被后端覆盖的问题,登录时同步当前语言到服务端

- 后台代理/玩家表格操作栏重构,充值订单增加备注列

- 前台个人中心、充值、账单与验证码组件体验优化

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-11 17:23:58 +08:00

46 lines
1.7 KiB
TypeScript

export type InitialDepositRemarkKind = 'daily' | 'opening_bonus' | 'custom';
export type InitialDepositOperator = 'admin' | 'agent';
export const OPENING_BONUS_REMARK = '开户初始余额';
export const ADMIN_DAILY_DEPOSIT_REMARK = '管理员上分';
export const AGENT_DAILY_DEPOSIT_REMARK = '代理上分';
export type InitialDepositRemarkValidationError =
| 'INITIAL_DEPOSIT_REMARK_REQUIRED'
| 'INITIAL_DEPOSIT_REMARK_CUSTOM_INVALID';
export function dailyDepositRemark(operator: InitialDepositOperator): string {
return operator === 'admin' ? ADMIN_DAILY_DEPOSIT_REMARK : AGENT_DAILY_DEPOSIT_REMARK;
}
export function resolveInitialDepositRemark(
kind: InitialDepositRemarkKind,
custom: string | undefined,
operator: InitialDepositOperator,
): string {
if (kind === 'daily') return dailyDepositRemark(operator);
if (kind === 'opening_bonus') return OPENING_BONUS_REMARK;
const trimmed = custom?.trim() ?? '';
if (trimmed.length < 2) {
throw new Error('INITIAL_DEPOSIT_REMARK_CUSTOM_INVALID');
}
return trimmed;
}
export function validateInitialDepositRemark(
initialDeposit: number,
remark: string | undefined,
operator: InitialDepositOperator,
): { ok: true; remark: string } | { ok: false; code: InitialDepositRemarkValidationError } {
if (initialDeposit <= 0) {
return { ok: true, remark: remark?.trim() ?? '' };
}
const r = remark?.trim();
if (!r) return { ok: false, code: 'INITIAL_DEPOSIT_REMARK_REQUIRED' };
const daily = dailyDepositRemark(operator);
if (r === daily || r === OPENING_BONUS_REMARK) return { ok: true, remark: r };
if (r.length < 2) return { ok: false, code: 'INITIAL_DEPOSIT_REMARK_CUSTOM_INVALID' };
return { ok: true, remark: r };
}