- 将原移动端页面重命名为 Mobile*,新增 22 个 Desktop* 视图与 DesktopShell 布局体系 - 路由入口改为 Wrapper 视图,通过 useViewport(≥1024px)自动切换移动/桌面端 - 新增投注单面板、盘口弹层、联赛侧栏、数据表格等桌面组件及独立样式令牌 - 扩展 betSlip store、串关筛选、冠军盘、Toast/悬浮信箱等交互与三语 i18n - 公告/消息 Hub 拆分移动与桌面实现;API 投注/钱包/充值记录支持 pageSize 分页
50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
import type { Composer } from 'vue-i18n';
|
|
import type { SlipItem, SlipMode } from '../stores/betSlip';
|
|
|
|
export interface BetPlaceConfirmContext {
|
|
mode: SlipMode;
|
|
items: SlipItem[];
|
|
totalStake: number;
|
|
totalReturn: number;
|
|
totalOdds?: number;
|
|
formatMoney: (amount: number) => string;
|
|
getStake: (item: SlipItem) => number;
|
|
getOdds: (item: SlipItem) => number;
|
|
}
|
|
|
|
export function buildBetPlaceConfirmMessage(
|
|
t: Composer['t'],
|
|
ctx: BetPlaceConfirmContext,
|
|
): string {
|
|
if (ctx.mode === 'parlay') {
|
|
const odds =
|
|
ctx.totalOdds != null
|
|
? String(ctx.totalOdds)
|
|
.replace(/0+$/, '')
|
|
.replace(/\.$/, '')
|
|
: '';
|
|
return t('bet.place_confirm_parlay', {
|
|
count: ctx.items.length,
|
|
stake: ctx.formatMoney(ctx.totalStake),
|
|
odds,
|
|
return: ctx.formatMoney(ctx.totalReturn),
|
|
});
|
|
}
|
|
|
|
if (ctx.items.length === 1) {
|
|
const item = ctx.items[0];
|
|
return t('bet.place_confirm_single', {
|
|
pick: item.selectionName,
|
|
odds: ctx.getOdds(item).toFixed(2),
|
|
stake: ctx.formatMoney(ctx.getStake(item)),
|
|
return: ctx.formatMoney(ctx.totalReturn),
|
|
});
|
|
}
|
|
|
|
return t('bet.place_confirm_singles', {
|
|
count: ctx.items.length,
|
|
stake: ctx.formatMoney(ctx.totalStake),
|
|
return: ctx.formatMoney(ctx.totalReturn),
|
|
});
|
|
}
|