Merge pull request '[MVP][READY] #175-B: Shared key-map + locale-kontrakt mellem backend/frontend' (#231) from feat/issue-226-shared-keymap-locale-contract into main
All checks were successful
CI / test-and-quality (push) Successful in 3m11s
All checks were successful
CI / test-and-quality (push) Successful in 3m11s
This commit was merged in pull request #231.
This commit is contained in:
@@ -2,6 +2,7 @@ import lobbyCatalog from '../../../shared/i18n/lobby.json';
|
|||||||
|
|
||||||
const frontendErrors = lobbyCatalog.frontend.errors;
|
const frontendErrors = lobbyCatalog.frontend.errors;
|
||||||
const localeConfig = lobbyCatalog.locales;
|
const localeConfig = lobbyCatalog.locales;
|
||||||
|
const backendToFrontendErrorKeys = lobbyCatalog.contract.backend_to_frontend_error_keys as Record<string, keyof typeof frontendErrors>;
|
||||||
|
|
||||||
type FrontendErrorKey = keyof typeof frontendErrors;
|
type FrontendErrorKey = keyof typeof frontendErrors;
|
||||||
type SupportedLocale = (typeof localeConfig.supported)[number];
|
type SupportedLocale = (typeof localeConfig.supported)[number];
|
||||||
@@ -40,9 +41,15 @@ export function lobbyMessageFromApiPayload(payload: unknown, fallbackKey: Fronte
|
|||||||
const record = payload as Record<string, unknown>;
|
const record = payload as Record<string, unknown>;
|
||||||
const code = typeof record.error_code === 'string' ? record.error_code : '';
|
const code = typeof record.error_code === 'string' ? record.error_code : '';
|
||||||
const payloadLocale = typeof record.locale === 'string' ? record.locale : locale;
|
const payloadLocale = typeof record.locale === 'string' ? record.locale : locale;
|
||||||
if (!isFrontendErrorKey(code)) {
|
const mappedKey = code ? backendToFrontendErrorKeys[code] : undefined;
|
||||||
return lobbyMessage(fallbackKey, payloadLocale);
|
|
||||||
|
if (mappedKey && isFrontendErrorKey(mappedKey)) {
|
||||||
|
return lobbyMessage(mappedKey, payloadLocale);
|
||||||
}
|
}
|
||||||
|
|
||||||
return lobbyMessage(code, payloadLocale);
|
if (isFrontendErrorKey(code)) {
|
||||||
|
return lobbyMessage(code, payloadLocale);
|
||||||
|
}
|
||||||
|
|
||||||
|
return lobbyMessage(fallbackKey, payloadLocale);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,11 +48,11 @@ describe('lobbyMessage locale handling', () => {
|
|||||||
).toBe('Sessionskoden er ugyldig, eller sessionen findes ikke længere.');
|
).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(
|
expect(
|
||||||
lobbyMessageFromApiPayload(
|
lobbyMessageFromApiPayload(
|
||||||
{ error_code: 'session_not_joinable', locale: 'da' },
|
{ error_code: 'session_not_joinable', locale: 'da' },
|
||||||
'join_failed',
|
'start_round_failed',
|
||||||
),
|
),
|
||||||
).toBe('Kunne ikke joine. Tjek kode eller kaldenavn og prøv igen.');
|
).toBe('Kunne ikke joine. Tjek kode eller kaldenavn og prøv igen.');
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -404,6 +404,7 @@
|
|||||||
"host_only_start_round": "start_round_failed",
|
"host_only_start_round": "start_round_failed",
|
||||||
"host_only_show_question": "start_round_failed",
|
"host_only_show_question": "start_round_failed",
|
||||||
"host_only_mix_answers": "start_round_failed",
|
"host_only_mix_answers": "start_round_failed",
|
||||||
|
"host_only_action": "start_round_failed",
|
||||||
"category_has_no_questions": "start_round_failed",
|
"category_has_no_questions": "start_round_failed",
|
||||||
"show_question_invalid_phase": "start_round_failed",
|
"show_question_invalid_phase": "start_round_failed",
|
||||||
"round_config_missing": "start_round_failed",
|
"round_config_missing": "start_round_failed",
|
||||||
|
|||||||
Reference in New Issue
Block a user