From 3398aead7f52017f1c60ce503d220dddcdebed13 Mon Sep 17 00:00:00 2001 From: Asger Geel Weirsoee Date: Sun, 1 Mar 2026 22:34:53 +0000 Subject: [PATCH] frontend: consume shared backend->frontend error map at runtime --- frontend/src/spa/lobby-i18n.ts | 13 ++++++++++--- frontend/tests/lobby-i18n.contract.test.ts | 4 ++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/frontend/src/spa/lobby-i18n.ts b/frontend/src/spa/lobby-i18n.ts index f68e411..b3e31de 100644 --- a/frontend/src/spa/lobby-i18n.ts +++ b/frontend/src/spa/lobby-i18n.ts @@ -2,6 +2,7 @@ import lobbyCatalog from '../../../shared/i18n/lobby.json'; const frontendErrors = lobbyCatalog.frontend.errors; const localeConfig = lobbyCatalog.locales; +const backendToFrontendErrorKeys = lobbyCatalog.contract.backend_to_frontend_error_keys as Record; type FrontendErrorKey = keyof typeof frontendErrors; type SupportedLocale = (typeof localeConfig.supported)[number]; @@ -40,9 +41,15 @@ export function lobbyMessageFromApiPayload(payload: unknown, fallbackKey: Fronte const record = payload as Record; const code = typeof record.error_code === 'string' ? record.error_code : ''; const payloadLocale = typeof record.locale === 'string' ? record.locale : locale; - if (!isFrontendErrorKey(code)) { - return lobbyMessage(fallbackKey, payloadLocale); + const mappedKey = code ? backendToFrontendErrorKeys[code] : undefined; + + if (mappedKey && isFrontendErrorKey(mappedKey)) { + return lobbyMessage(mappedKey, payloadLocale); } - return lobbyMessage(code, payloadLocale); + if (isFrontendErrorKey(code)) { + return lobbyMessage(code, payloadLocale); + } + + return lobbyMessage(fallbackKey, payloadLocale); } diff --git a/frontend/tests/lobby-i18n.contract.test.ts b/frontend/tests/lobby-i18n.contract.test.ts index c75c6e8..0a20522 100644 --- a/frontend/tests/lobby-i18n.contract.test.ts +++ b/frontend/tests/lobby-i18n.contract.test.ts @@ -48,11 +48,11 @@ describe('lobbyMessage locale handling', () => { ).toBe('Sessionskoden er ugyldig, eller sessionen findes ikke længere.'); }); - it('uses shared backend→frontend key-map when backend key differs from frontend copy key', () => { + it('uses shared backend→frontend key-map at runtime even when fallback key differs', () => { expect( lobbyMessageFromApiPayload( { error_code: 'session_not_joinable', locale: 'da' }, - 'join_failed', + 'start_round_failed', ), ).toBe('Kunne ikke joine. Tjek kode eller kaldenavn og prøv igen.'); });