timezone via cookie
This commit is contained in:
parent
c03811e860
commit
960871f95a
@ -170,7 +170,7 @@ export default function GameBanner(props: Props) {
|
|||||||
<div className="flex-1 min-w-0">
|
<div className="flex-1 min-w-0">
|
||||||
<div className="text-sm flex items-center gap-2">
|
<div className="text-sm flex items-center gap-2">
|
||||||
<span className="inline-flex items-center gap-1 font-semibold px-2 py-0.5 rounded-md bg-white/10 ring-1 ring-white/15">
|
<span className="inline-flex items-center gap-1 font-semibold px-2 py-0.5 rounded-md bg-white/10 ring-1 ring-white/15">
|
||||||
{isConnected ? (serverLabel ?? 'CS2 Server') : t('disconnected')}
|
{isConnected ? (serverLabel ?? 'CS2 Server') : t('not-connected')}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<InfoRow />
|
<InfoRow />
|
||||||
|
|||||||
@ -401,11 +401,11 @@ export default function MapVotePanel({ match }: Props) {
|
|||||||
}, [match, state?.teams?.teamB?.players])
|
}, [match, state?.teams?.teamB?.players])
|
||||||
|
|
||||||
const teamAPlayersForRank = useMemo(
|
const teamAPlayersForRank = useMemo(
|
||||||
() => playersA.map(p => ({ premierRank: p.stats?.rankNew ?? 0 })) as any,
|
() => playersA.map(p => ({ premierRank: p.user.premierRank ?? 0 })) as any,
|
||||||
[playersA]
|
[playersA]
|
||||||
)
|
)
|
||||||
const teamBPlayersForRank = useMemo(
|
const teamBPlayersForRank = useMemo(
|
||||||
() => playersB.map(p => ({ premierRank: p.stats?.rankNew ?? 0 })) as any,
|
() => playersB.map(p => ({ premierRank: p.user.premierRank ?? 0 })) as any,
|
||||||
[playersB]
|
[playersB]
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -647,7 +647,7 @@ export default function MapVotePanel({ match }: Props) {
|
|||||||
side={teamLeftKey === 'teamA' ? 'A' : 'B'}
|
side={teamLeftKey === 'teamA' ? 'A' : 'B'}
|
||||||
name={p.user.name ?? 'Unbekannt'}
|
name={p.user.name ?? 'Unbekannt'}
|
||||||
avatar={p.user.avatar}
|
avatar={p.user.avatar}
|
||||||
rank={p.stats?.rankNew ?? 0}
|
rank={p.user.premierRank ?? 0}
|
||||||
matchType={match.matchType}
|
matchType={match.matchType}
|
||||||
onClick={() => router.push(`/profile/${p.user.steamId}`)}
|
onClick={() => router.push(`/profile/${p.user.steamId}`)}
|
||||||
isLeader={(state?.teams?.[teamLeftKey]?.leader?.steamId ?? teamLeft?.leader?.steamId) === p.user.steamId}
|
isLeader={(state?.teams?.[teamLeftKey]?.leader?.steamId ?? teamLeft?.leader?.steamId) === p.user.steamId}
|
||||||
@ -818,7 +818,7 @@ export default function MapVotePanel({ match }: Props) {
|
|||||||
side={teamRightKey === 'teamA' ? 'A' : 'B'}
|
side={teamRightKey === 'teamA' ? 'A' : 'B'}
|
||||||
name={p.user.name ?? 'Unbekannt'}
|
name={p.user.name ?? 'Unbekannt'}
|
||||||
avatar={p.user.avatar}
|
avatar={p.user.avatar}
|
||||||
rank={p.stats?.rankNew ?? 0}
|
rank={p.user.premierRank ?? 0}
|
||||||
matchType={match.matchType}
|
matchType={match.matchType}
|
||||||
onClick={() => router.push(`/profile/${p.user.steamId}`)}
|
onClick={() => router.push(`/profile/${p.user.steamId}`)}
|
||||||
isLeader={(state?.teams?.[teamRightKey]?.leader?.steamId ?? teamRight?.leader?.steamId) === p.user.steamId}
|
isLeader={(state?.teams?.[teamRightKey]?.leader?.steamId ?? teamRight?.leader?.steamId) === p.user.steamId}
|
||||||
|
|||||||
@ -381,9 +381,18 @@ export function MatchDetails({match, initialNow}: { match: Match; initialNow: nu
|
|||||||
|
|
||||||
<Table.Cell>
|
<Table.Cell>
|
||||||
<div className="flex items-center gap-[6px]">
|
<div className="flex items-center gap-[6px]">
|
||||||
{match.matchType === 'premier'
|
{match.matchType === 'premier' ? (
|
||||||
? <PremierRankBadge rank={p.stats?.rankNew ?? 0} />
|
// Premier-Match: Premier-Badge aus Stats (Fallback auf User)
|
||||||
: <CompRankBadge rank={p.stats?.rankNew ?? 0} />}
|
<PremierRankBadge rank={p.stats?.rankNew ?? p.user?.premierRank ?? 0} />
|
||||||
|
) : match.matchType === 'community' ? (
|
||||||
|
// Community-Match: IMMER Premier-Badge – Quelle primär User.premierRank
|
||||||
|
<PremierRankBadge rank={p.user?.premierRank ?? p.stats?.rankNew ?? 0} />
|
||||||
|
) : (
|
||||||
|
// Alle anderen (z. B. competitive): Comp-Badge
|
||||||
|
<CompRankBadge rank={p.stats?.rankNew ?? 0} />
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* Rangänderung nur für echte Premier-Matches anzeigen */}
|
||||||
{match.matchType === 'premier' && typeof p.stats?.rankChange === 'number' && (
|
{match.matchType === 'premier' && typeof p.stats?.rankChange === 'number' && (
|
||||||
<span
|
<span
|
||||||
className={`text-sm ${
|
className={`text-sm ${
|
||||||
|
|||||||
@ -1,20 +1,27 @@
|
|||||||
'use client'
|
'use client'
|
||||||
|
|
||||||
|
import { useMemo } from 'react'
|
||||||
import PremierRankBadge from './PremierRankBadge'
|
import PremierRankBadge from './PremierRankBadge'
|
||||||
import { Player } from '../../../types/team'
|
|
||||||
|
|
||||||
type Props = {
|
type PlayerLike = { premierRank?: number | null }
|
||||||
players: Player[]
|
type Props = { players: PlayerLike[] }
|
||||||
}
|
|
||||||
|
|
||||||
export default function TeamPremierRankBadge({ players }: Props) {
|
export default function TeamPremierRankBadge({ players }: Props) {
|
||||||
const totalRank = players.reduce((sum, p) => {
|
const avgRank = useMemo(() => {
|
||||||
return typeof p.premierRank === 'number' ? sum + p.premierRank : sum
|
const ranks = players
|
||||||
}, 0)
|
.map(p => p.premierRank ?? 0)
|
||||||
|
.filter(r => Number.isFinite(r) && r > 0) // 0/undef als "unbekannt" ignorieren
|
||||||
|
if (ranks.length === 0) return 0
|
||||||
|
const sum = ranks.reduce((a, b) => a + b, 0)
|
||||||
|
return Math.round(sum / ranks.length) // oder Math.floor / Math.ceil
|
||||||
|
}, [players])
|
||||||
|
|
||||||
|
// Optional: gar nichts anzeigen, wenn kein valider Rank vorhanden
|
||||||
|
// if (avgRank === 0) return null
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="mt-1">
|
<div className="mt-1">
|
||||||
<PremierRankBadge rank={totalRank} />
|
<PremierRankBadge rank={avgRank} />
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -74,7 +74,7 @@ export async function POST(req: NextRequest) {
|
|||||||
data: {
|
data: {
|
||||||
user : { connect: { steamId } },
|
user : { connect: { steamId } },
|
||||||
title : 'Team verlassen',
|
title : 'Team verlassen',
|
||||||
message : `Du wurdest aus dem Team „${teamName}” entfernt.`,
|
message : `Du wurdest aus dem Team „${teamName}” geworfen.`,
|
||||||
actionType : 'team-kick-self',
|
actionType : 'team-kick-self',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
@ -111,7 +111,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"game-banner": {
|
"game-banner": {
|
||||||
"disconnected": "Nicht verbunden",
|
"not-connected": "Nicht verbunden",
|
||||||
"player-connected": "Spieler verbunden",
|
"player-connected": "Spieler verbunden",
|
||||||
"open-game": "Spiel starten",
|
"open-game": "Spiel starten",
|
||||||
"quit": "Beenden",
|
"quit": "Beenden",
|
||||||
|
|||||||
@ -111,7 +111,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"game-banner": {
|
"game-banner": {
|
||||||
"disconnected": "Disconnected",
|
"not-connected": "Not connected",
|
||||||
"player-connected": "Players connected",
|
"player-connected": "Players connected",
|
||||||
"open-game": "Open Game",
|
"open-game": "Open Game",
|
||||||
"quit": "Quit",
|
"quit": "Quit",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user