From ffa50f20a7cc72e019f057f87fd81b4ee6d6b67e Mon Sep 17 00:00:00 2001 From: lemintare Date: Mon, 20 Jul 2026 17:15:42 +0300 Subject: [PATCH] Fix preferred player name resolution Co-authored-by: Cursor --- frontend/src/App.test.tsx | 8 ++++++++ frontend/src/App.tsx | 9 +++++---- frontend/src/api/demo.ts | 4 ++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/frontend/src/App.test.tsx b/frontend/src/App.test.tsx index cdb4023..b6397db 100644 --- a/frontend/src/App.test.tsx +++ b/frontend/src/App.test.tsx @@ -100,6 +100,14 @@ describe('Mixmaker frontend', () => { expect(screen.getByRole('textbox', { name: 'Discord invite URL' })).toHaveValue('https://discord.gg/mixmaker') }) + it('resolves preferred player names outside the event registrations', async () => { + window.history.replaceState({}, '', '/admin') + render() + fireEvent.click(await screen.findByRole('tab', { name: 'Participants' })) + expect(await screen.findByText(/Preferred with Zenith/)).toBeInTheDocument() + expect(screen.queryByText(/Preferred with p12/)).not.toBeInTheDocument() + }) + it('edits player identity', async () => { window.history.replaceState({}, '', '/profile') render() diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 76ee4c4..b549972 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -321,7 +321,7 @@ function ProfilePage() { const language = useLanguage() const options = useMemo(() => rankOptions(language), [language]) const profile = useQuery({ queryKey: ['profile'], queryFn: api.profile, initialData: demoMode ? demoProfile : undefined }) - const players = useQuery({ queryKey: ['players'], queryFn: api.players, initialData: demoMode ? demoRegistrations.map((registration) => registration.player) : undefined }) + const players = useQuery({ queryKey: ['players'], queryFn: api.players, initialData: demoMode ? demoPlayerProfiles : undefined }) const [ratings, setRatings] = useState>({ tank: 20, damage: 20, support: 20 }) const [displayName, setDisplayName] = useState('') const [battleTag, setBattleTag] = useState('') @@ -498,6 +498,7 @@ function Participants({ eventId }: { eventId: string }) { const [status, setStatus] = useState('going') const [ratings, setRatings] = useState>({ tank: 13, damage: 13, support: 13 }) const rows = useQuery({ queryKey: ['registrations', eventId], queryFn: () => api.registrations(eventId), initialData: demoMode ? demoRegistrations : undefined }) + const players = useQuery({ queryKey: ['players'], queryFn: api.players, initialData: demoMode ? demoPlayerProfiles : undefined }) const create = useMutation({ mutationFn: () => { if (!demoMode) return api.createParticipant(eventId, displayName.trim(), ratings, status) @@ -540,9 +541,9 @@ function Participants({ eventId }: { eventId: string }) { if (!demoMode) void client.invalidateQueries({ queryKey: ['events'] }) }, }) - if (rows.isLoading) return - if (rows.isError || !rows.data) return void rows.refetch()} /> - const names = new Map(rows.data.map((registration) => [registration.player.id, registration.player.displayName])) + if (rows.isLoading || players.isLoading) return + if (rows.isError || players.isError || !rows.data || !players.data) return { void rows.refetch(); void players.refetch() }} /> + const names = new Map(players.data.map((player) => [player.id, player.displayName])) return
{ event.preventDefault(); create.mutate() }}>

Add participant

Create a guest player when they cannot sign in with Discord.

{(['tank', 'damage', 'support'] as PlayerRole[]).map((role) => )}
{create.isError &&

{create.error.message}

}

Participant responses

Admin overrides are attributed and audited.

{rows.data.filter((r) => r.status === 'going').length} going{rows.data.filter((r) => r.status === 'maybe').length} maybe
{rows.data.map((r) =>
{r.player.displayName.slice(0, 2).toUpperCase()}
{r.player.preferredRoles.map((role) => role[0].toUpperCase() + role.slice(1)).join(' · ') || 'No preferred roles'}{r.player.preferredPlayerIds.length > 0 && <> · Preferred with {r.player.preferredPlayerIds.map((id) => names.get(id) ?? id.slice(0, 6)).join(', ')}}{r.changedBy?.source === 'admin' && <> · set by {r.changedBy.displayName}}
T · {rankLabel(r.player.ratings.tank, language)}D · {rankLabel(r.player.ratings.damage, language)}S · {rankLabel(r.player.ratings.support, language)}
)}
{(override.isError || remove.isError) &&

{override.error?.message ?? remove.error?.message}

}
} diff --git a/frontend/src/api/demo.ts b/frontend/src/api/demo.ts index f81ca40..2fe2505 100644 --- a/frontend/src/api/demo.ts +++ b/frontend/src/api/demo.ts @@ -150,11 +150,11 @@ const players = [ makePlayer('p11', 'Echo', 26, 32, 31), makePlayer('p12', 'Zenith', 28, 30, 35), ] -players[1].preferredPlayerIds = ['p1'] +players[1].preferredPlayerIds = ['p12'] players[4].preferredPlayerIds = ['p1'] players[0].avoidedPlayerIds = ['p3'] -export const demoRegistrations: Registration[] = players.map((player, index) => ({ +export const demoRegistrations: Registration[] = players.slice(0, -1).map((player, index) => ({ id: `reg-${index + 1}`, player, status: index < 9 ? 'going' : index < 11 ? 'maybe' : 'not_going',