fix(player-desktop): 修复桌面端注单详情页时间 Invalid Date 及投注选项不显示的 Schema 绑定 bug
This commit is contained in:
@@ -93,7 +93,7 @@ watch(
|
|||||||
</div>
|
</div>
|
||||||
<div class="desktop-layout-betting">
|
<div class="desktop-layout-betting">
|
||||||
<aside class="desktop-betting-left">
|
<aside class="desktop-betting-left">
|
||||||
<LeagueSidebar v-if="!isMatchDetail" />
|
<LeagueSidebar v-if="!isBettingDetail" />
|
||||||
<MatchSidebar v-else />
|
<MatchSidebar v-else />
|
||||||
</aside>
|
</aside>
|
||||||
<main class="desktop-betting-center" :class="{ 'is-betting-detail': isBettingDetail }">
|
<main class="desktop-betting-center" :class="{ 'is-betting-detail': isBettingDetail }">
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { useRoute, useRouter, RouterLink } from 'vue-router';
|
|||||||
import api from '../../api';
|
import api from '../../api';
|
||||||
import GoldSpinner from '../../components/GoldSpinner.vue';
|
import GoldSpinner from '../../components/GoldSpinner.vue';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t, locale } = useI18n();
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
@@ -20,17 +20,16 @@ function goBack() {
|
|||||||
type BetDetail = {
|
type BetDetail = {
|
||||||
betNo: string;
|
betNo: string;
|
||||||
stake: string;
|
stake: string;
|
||||||
potentialPayout?: string;
|
potentialReturn?: string;
|
||||||
status: string;
|
status: string;
|
||||||
createdAt: string;
|
placedAt: string;
|
||||||
selections: Array<{
|
legs: Array<{
|
||||||
matchName?: string;
|
matchTitle?: string;
|
||||||
|
marketLabel?: string;
|
||||||
selectionName?: string;
|
selectionName?: string;
|
||||||
odds?: number;
|
odds?: number;
|
||||||
market?: string;
|
resultStatus?: string;
|
||||||
homeScore?: number;
|
score?: { ht: string | null; ft: string | null } | null;
|
||||||
awayScore?: number;
|
|
||||||
matchStatus?: string;
|
|
||||||
[key: string]: any;
|
[key: string]: any;
|
||||||
}>;
|
}>;
|
||||||
[key: string]: any;
|
[key: string]: any;
|
||||||
@@ -71,6 +70,32 @@ function statusLabel(status: string) {
|
|||||||
};
|
};
|
||||||
return map[status?.toUpperCase()] ?? status;
|
return map[status?.toUpperCase()] ?? status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const SEL_TRANS: Record<string, Record<string, string>> = {
|
||||||
|
'主胜': { 'en-US': 'Home Win', 'ms-MY': 'Rumah Menang' },
|
||||||
|
'客胜': { 'en-US': 'Away Win', 'ms-MY': 'Tandang Menang' },
|
||||||
|
'和局': { 'en-US': 'Draw', 'ms-MY': 'Seri' },
|
||||||
|
'主': { 'en-US': 'Home', 'ms-MY': 'Rumah' },
|
||||||
|
'客': { 'en-US': 'Away', 'ms-MY': 'Tandang' },
|
||||||
|
'大': { 'en-US': 'Over', 'ms-MY': 'Atas' },
|
||||||
|
'小': { 'en-US': 'Under', 'ms-MY': 'Bawah' },
|
||||||
|
'单': { 'en-US': 'Odd', 'ms-MY': 'Ganjil' },
|
||||||
|
'双': { 'en-US': 'Even', 'ms-MY': 'Genap' },
|
||||||
|
'冠军': { 'en-US': 'Winner', 'ms-MY': 'Juara' },
|
||||||
|
};
|
||||||
|
|
||||||
|
function translateSel(name: string): string {
|
||||||
|
if (locale.value === 'zh-CN') return name;
|
||||||
|
const exact = SEL_TRANS[name];
|
||||||
|
if (exact) return exact[locale.value] ?? exact['en-US'] ?? name;
|
||||||
|
const sp = name.indexOf(' ');
|
||||||
|
if (sp > 0) {
|
||||||
|
const head = name.slice(0, sp);
|
||||||
|
const m = SEL_TRANS[head];
|
||||||
|
if (m) return (m[locale.value] ?? m['en-US'] ?? head) + name.slice(sp);
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -104,11 +129,11 @@ function statusLabel(status: string) {
|
|||||||
</div>
|
</div>
|
||||||
<div class="amount-item">
|
<div class="amount-item">
|
||||||
<span class="amount-label">{{ t('bet.potential_payout') || '预计派彩' }}</span>
|
<span class="amount-label">{{ t('bet.potential_payout') || '预计派彩' }}</span>
|
||||||
<span class="amount-val gold">{{ detail.potentialPayout || '-' }}</span>
|
<span class="amount-val gold">{{ detail.potentialReturn || '-' }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="amount-item">
|
<div class="amount-item">
|
||||||
<span class="amount-label">{{ t('bet.placed_at') || '下注时间' }}</span>
|
<span class="amount-label">{{ t('bet.placed_at') || '下注时间' }}</span>
|
||||||
<span class="amount-val date">{{ new Date(detail.createdAt).toLocaleString() }}</span>
|
<span class="amount-val date">{{ detail.placedAt ? new Date(detail.placedAt).toLocaleString() : '-' }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -116,12 +141,13 @@ function statusLabel(status: string) {
|
|||||||
<!-- Selections -->
|
<!-- Selections -->
|
||||||
<div class="detail-card">
|
<div class="detail-card">
|
||||||
<div class="card-title">{{ t('bet.selections') || '投注选项' }}</div>
|
<div class="card-title">{{ t('bet.selections') || '投注选项' }}</div>
|
||||||
<div v-for="(sel, idx) in detail.selections" :key="idx" class="sel-row">
|
<div v-for="(leg, idx) in detail.legs" :key="idx" class="sel-row">
|
||||||
<div class="sel-match">{{ sel.matchName || t('bet.match') }}</div>
|
<div class="sel-match">{{ leg.matchTitle || t('bet.match') }}</div>
|
||||||
<div class="sel-meta">
|
<div class="sel-meta">
|
||||||
<span class="sel-market">{{ sel.market || sel.marketName || '' }}</span>
|
<span class="sel-market">{{ leg.marketLabel || '' }}</span>
|
||||||
<span class="sel-name">{{ sel.selectionName || '' }}</span>
|
<span class="sel-name">{{ translateSel(leg.selectionName || '') }}</span>
|
||||||
<span class="sel-odds">@{{ sel.odds }}</span>
|
<span class="sel-odds">@{{ leg.odds }}</span>
|
||||||
|
<span v-if="leg.score?.ft" class="sel-score">({{ t('history.ft') }}: {{ leg.score.ft }})</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user