diff --git a/apps/api/src/applications/player/player.controller.ts b/apps/api/src/applications/player/player.controller.ts index ec16982..499b645 100644 --- a/apps/api/src/applications/player/player.controller.ts +++ b/apps/api/src/applications/player/player.controller.ts @@ -190,7 +190,7 @@ export class PlayerController { this.content.listActive('BANNER', locale), this.content.listActiveAnnouncements(locale), this.matches.listPublished(locale, undefined, { includeMarkets: false }), - this.matches.listUpcomingPublished(locale), + this.matches.listUpcomingPublished(locale, { includeMarkets: true }), this.systemConfig.getInboxFeatureEnabled(), ]); const timeZone = safeTimeZone(headerTimeZone); diff --git a/apps/api/src/domains/catalog/matches.service.ts b/apps/api/src/domains/catalog/matches.service.ts index e0139e1..cdb6456 100644 --- a/apps/api/src/domains/catalog/matches.service.ts +++ b/apps/api/src/domains/catalog/matches.service.ts @@ -1592,17 +1592,42 @@ export class MatchesService { ); } + /** 首页卡片快速下注所需的核心玩法类型 */ + private static readonly HOME_CARD_MARKET_TYPES = [ + 'FT_1X2', + 'FT_HANDICAP', + 'FT_OVER_UNDER', + ] as const; + /** 未来 N 天内开赛的已发布赛事(按开赛时间升序,不限 isHot) */ async listUpcomingPublished( locale = 'en-US', - options?: { limit?: number; days?: number }, + options?: { limit?: number; days?: number; includeMarkets?: boolean }, ) { const limit = options?.limit ?? 50; const days = options?.days ?? 3; + const includeMarkets = options?.includeMarkets ?? false; const now = new Date(); const end = new Date(now); end.setDate(end.getDate() + days); + const marketsRelation = includeMarkets + ? { + where: { + status: { in: ['OPEN', 'SUSPENDED', 'CLOSED'] }, + showOnPlayer: true, + marketType: { in: [...MatchesService.HOME_CARD_MARKET_TYPES] }, + }, + include: { + selections: { + where: { status: { in: ['OPEN', 'SUSPENDED', 'CLOSED'] } }, + orderBy: { sortOrder: 'asc' as const }, + }, + }, + orderBy: { sortOrder: 'asc' as const }, + } + : this.playerMarketStatusInclude; + const matches = await this.prisma.match.findMany({ where: { status: { in: ['PUBLISHED', 'CLOSED', 'PENDING_SETTLEMENT'] }, @@ -1625,14 +1650,14 @@ export class MatchesService { homeTeam: true, awayTeam: true, score: true, - markets: this.playerMarketStatusInclude, + markets: marketsRelation, }, orderBy: [{ startTime: 'asc' }, { displayOrder: 'asc' }], take: limit, }); return Promise.all( - matches.map((m) => this.enrichMatch(m, locale, { omitMarkets: true })), + matches.map((m) => this.enrichMatch(m, locale, { omitMarkets: !includeMarkets })), ); } diff --git a/apps/player/index.html b/apps/player/index.html index 237a9f2..92d3cba 100644 --- a/apps/player/index.html +++ b/apps/player/index.html @@ -12,6 +12,12 @@ + + + TheBet365 diff --git a/apps/player/src/components/FloatingMailbox.vue b/apps/player/src/components/FloatingMailbox.vue index 331f457..26f36ff 100644 --- a/apps/player/src/components/FloatingMailbox.vue +++ b/apps/player/src/components/FloatingMailbox.vue @@ -32,12 +32,27 @@ const showMessageActions = computed( () => inboxEnabled.value && activeTab.value === 'messages' && auth.token && hasMessages.value && !selectedMessageId.value, ); -const isBettingDesktop = computed(() => { - if (!isDesktop.value) return false; +const hideOnMessagesPage = computed( + () => isDesktop.value && route.path.startsWith('/messages'), +); + +const offsetForBetSlip = computed(() => { + if (!isDesktop.value || hideOnMessagesPage.value) return false; const p = route.path; - return p === '/bet' || p.startsWith('/match/') || p.startsWith('/outright/'); + if (p === '/bets' || p.startsWith('/bets/')) return false; + if (p.startsWith('/wallet') || p.startsWith('/profile')) return false; + return true; }); +watch( + () => route.path, + (path) => { + if (isDesktop.value && path.startsWith('/messages') && isOpen.value) { + close(); + } + }, +); + watch(isOpen, (opened) => { if (opened) { if (!inboxEnabled.value) activeTab.value = 'support'; @@ -86,7 +101,11 @@ onMounted(() => {